文件最后提交记录最后更新时间
feat: 新增离线图编译执行 C++ 样例并修复 allocator 回调释放问题 Co-authored-by: du-hua1024<duhua2@huawei.com> # message auto-generated for no-merge-commit merge: !1955 merge tmp2 into develop feat: 新增离线图编译执行 C++ 样例并修复 allocator 回调释放问题 Created-by: du-hua1024 Commit-by: du-hua1024 Merged-by: cann-robot Description: # Pull Request ## 描述 本 PR 包含三类变更: ### 1. 新增 GE C++ 离线图编译执行样例(examples/offline_compile_run/cpp/) - 覆盖单模型(Add 图)和 Bundle 模型(Add + Mul 图)两种场景 - 提供完整的 CMake 构建脚本(CMakeLists.txt)和一键执行脚本(run_sample.sh),支持 build_modelrun_infersample_and_run 等多个 target - 核心 API 流程:aclgrphBuildInitializeaclgrphBuildModel/aclgrphBundleBuildModelaclgrphSaveModel/aclgrphBundleSaveModelaclgrphBuildFinalize,推理通过 aclmdlLoadFromFile/aclmdlBundleLoadFromFile 执行 - 补充 README,与 Python 样例文档结构对齐 ### 2. 编码规范整改 - **ge_api_c_wrapper/c_offline_compile.cc + ge_api_c_wrapper_utils.h**:为离线编译 C Wrapper 接口的指针参数补充 const 修饰(char**const char**Graph*const Graph*int*const int*),同时修正函数声明的参数对齐格式,提升接口语义准确性 - **ir_proto_codec.cc**:将 GET_ATTR_JSON_FUNC(Str, std::string) 宏展开为显式函数,增加 AttrUtils::GetStr 返回空指针时的 null 检查,避免潜在的空指针解引用 - **examples/custom_es_api/run_sample.sh**:添加 set -e,确保脚本在任意命令失败时立即退出,增强健壮性 ### 3. 修复 allocator 回调对象提前释放的问题(_allocator_callback_adapter.py) - 原代码在 _on_allocator_destroy 中直接 pop 丢弃回调对象,未触发回调自身的析构逻辑 - 修复后先取出回调对象再显式调用清理,确保 C++ 侧 ~PyCallbackAllocator 触发时 Python 资源正常释放 ## 变更类型 - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [x] 📝 文档内容更新 ## 关联的Issue 暂无 ## 如何测试 1. 安装 CANN toolkit 和 ops 包,执行 source /usr/local/Ascend/cann/set_env.sh 2. 进入 examples/offline_compile_run/cpp/ 目录 3. 运行 bash run_sample.sh -t sample_and_run,验证单模型编译与推理成功 4. 运行 bash run_sample.sh -t sample_and_run_bundle,验证 Bundle 编译与推理成功 5. 验证 add_sample.ombundle_sample.om 文件生成 6. 验证 allocator 回调修复:在有自定义 allocator 的场景下,析构时不再出现资源泄漏 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 - C++ 样例与 Python 样例生成的 om 文件同名(add_sample.ombundle_sample.om),请勿在同一目录下混用 - run_sample.sh 使用 CMake 增量编译,多次执行不会清空构建目录 See merge request: cann/ge!19551 个月前
docs: 修正 example README 中 quick_install 链接路径 Co-authored-by: du-hua1024<duhua2@huawei.com> # message auto-generated for no-merge-commit merge: !2423 merge master into develop docs: 修正 example README 中 quick_install 链接路径 Created-by: du-hua1024 Commit-by: du-hua1024 Merged-by: cann-robot Description: # Pull Request ## 描述 本次 PR 修正 examples/es/operator_overload_async/python/README.md 中安装指导链接的相对路径。 README 位于 examples/es/operator_overload_async/python/ 目录下,原文使用 ../../../docs/quick_install.md 无法正确跳转到仓库根目录下的 docs/quick_install.md。 本次将链接统一修正为 ../../../../docs/quick_install.md,确保读者可以从样例文档直接打开安装指导。 ## 变更类型 - [ ] 🐛 Bug 修复 - [ ] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [x] 📝 文档内容更新 ## 关联的Issue 无 ## 如何测试 1. 打开 examples/es/operator_overload_async/python/README.md。 2. 检查“3.1、准备cann包”中的两个“安装指导”链接,确认相对路径均为 ../../../../docs/quick_install.md。 3. 在 Markdown 预览中验证链接可正确跳转到仓库根目录下的 docs/quick_install.md。 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 本次变更仅涉及文档链接修正,不涉及功能代码逻辑。 See merge request: cann/ge!24231 个月前
feat: 提供 Python 异步图执行接口 Co-authored-by: du-hua1024<duhua2@huawei.com> # message auto-generated for no-merge-commit merge: !947 merge tmp2 into develop feat: 提供 Python 异步图执行接口 Created-by: du-hua1024 Commit-by: du-hua1024 Merged-by: cann-robot Description: 20260326评审通过 # Pull Request ## 描述 本 PR 补充 GE Python 在异步图执行场景下的关键封装,覆盖基于 stream 的异步运行、输出内存分配策略以及 Host/Device Tensor 互转能力,并同步完善样例、文档和单元测试。 ## 主要修改 - Session 新增 run_graph_with_stream_async(graph_id, stream, inputs)remove_graph(graph_id) 接口,支持基于指定 stream 的异步图执行与图卸载,register_external_allocatorunregister_external_allocator接口,支持基于 stream 的外置 allocator 注册与反注册。 - 新增 ge.allocator.Allocator / MemBlock 抽象,以及 _allocator_callback_adapter.py,支持 Python 自定义 external allocator 注册到 GE。 - 当用户未为 stream 注册 external allocator 时,run_graph_with_stream_async 路径自动注册 default allocator;session 析构时清理当前会话注册的 default allocator。 - C wrapper 补充 async run、allocator 注册/反注册、allocator 查询和 GE 初始化状态查询等接口。 - Tensor 新增 Placement 枚举、placement 属性、to_device() / to_host() 能力,支持异步执行场景下的 Device Tensor 输入输出。 - 更新 model_manager.cc,将异步执行静态图场景的输出 Tensor placement 修改为 Device。 - 更新 examples/es/operator_overload_async/python 样例,拆分默认 allocator 与自定义 allocator 两个执行路径,并补充运行说明。 - 补充 session_test.pytensor_test.pytypes_test.py,覆盖新增接口、参数校验和 Placement 相关能力。 ## 变更类型 - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [x] 📝 文档内容更新 ## 如何测试 1. 运行 examples/es/operator_overload_async/python 路径下异步样例 2. 运行 Python 单元测试: pytest tests/ge/ut/ge/graph/pyge_tests/session_test.py pytest tests/ge/ut/ge/graph/pyge_tests/tensor_test.py pytest tests/ge/ut/ge/graph/pyge_tests/types_test.py ## 其他信息 - 自定义 allocator 按 stream 维度注册;异步执行时 GE 优先使用该 stream 上已注册的 external allocator,否则注册 default allocator。 - 异步执行返回的输出 Tensor 默认位于 Device,需在对应 stream 同步完成后调用 to_host() 再读取数据。 See merge request: cann/ge!9471 个月前
README.md

样例使用指导

1、功能描述

本样例使用操作符重载进行构图,旨在帮助构图开发者快速理解操作符重载的定义。 与 operator_overload 不同,本目录在执行阶段使用 Session.run_graph_with_stream_async 接口。 关于异步执行更多信息,请参考 异步执行

2、目录结构

python/
├── src/
|   ├── common.py                            // 公共逻辑:常量、图构建、输入张量、GE 生命周期
|   ├── make_add_graph.py                    // 异步执行样例
|   └── make_add_graph_custom_allocator.py   // 注册自定义 SamplePoolAllocator 异步执行样例
├── README.md               // README文件
├── run_sample.sh           // 执行脚本

3、使用方法

3.1、准备cann包

  • 本样例需要同时安装两套 CANN:最新开发包用于图编译,官网正式发布包提供 pyACL 模块用于图执行。本文中的“编译”和“执行”均特指图编译和图执行,不指 GE 工程源码编译。
  • 安装请参考:
    • 最新开发包,用于图编译,提供本样例依赖的最新 GE/Python 能力。安装请参考 环境准备 中“方式三:手动安装软件包 > 场景1:体验master版本能力或基于master版本进行开发”,安装最新版本的 toolkitops
    • 官网正式发布的 CANN toolkitops 包,用于图执行,提供 pyACL。安装请参考 环境准备 中“方式三:手动安装软件包 > 场景2:体验已发布版本能力或基于已发布版本进行开发”,安装官网正式发布版本的软件包
  • 设置环境变量 (假设最新开发包安装在/usr/local/Ascend/,官网正式发布包安装在/usr/local/Ascend-release/)
source /usr/local/Ascend/cann/set_env.sh
export PYTHONPATH="$PYTHONPATH:/usr/local/Ascend-release/cann/python/site-packages"

3.2、执行

本目录提供两个可选 target:

3.2.1、默认 allocator 样例

bash run_sample.sh -t sample_and_run_python

该命令会:

  1. 生成 dump 图并使用 GE 内置 allocator 异步执行该图

执行成功后会看到:

[Success] sample 执行成功,pbtxt dump 已生成在当前目录。该文件以 ge_onnx_ 开头,可以在 netron 中打开显示

3.2.2、自定义 allocator 样例

bash run_sample.sh -t sample_and_run_python_custom_allocator

该命令在默认样例基础上,通过 Session.register_external_allocator 向 GE 注册自定义 SamplePoolAllocator。该类继承 ge.allocator.Allocator 基类:按精确字节数维护空闲块列表,命中则复用,否则 acl.rt.malloc 申请;free 时将块放回池内(不立即 acl.rt.free)。对象被回收时在 __del__ 中统一 acl.rt.free 缓存块。

执行成功后,终端会出现以下格式的打印(具体行数取决于 GE 对输出 Tensor 的分配/释放;地址与 size 以实际运行为准):

[Info] SamplePoolAllocator 已注册到 stream
[SamplePool] new   : addr=0x<设备内存地址>  size=<字节数> B
[Info] 异步执行 Graph 成功!
[SamplePool] cache : addr=0x<设备内存地址>  size=<字节数> B
[Info] SamplePoolAllocator 已注销
[SamplePool] destroy: freed <N> cached blocks
[Info] 运行环境已清理
[Success] sample 执行成功,pbtxt dump 已生成在当前目录。该文件以 ge_onnx_ 开头,可以在 netron 中打开显示

输出文件说明

执行成功后会在当前目录生成以下文件:

  • ge_onnx_*.pbtxt - 图结构的protobuf文本格式,可用netron查看

3.3、日志打印

可执行程序执行过程中如果需要日志打印来辅助定位,可以在bash run_sample.sh -t sample_and_run_python之前设置如下环境变量来让日志打印到屏幕

export ASCEND_SLOG_PRINT_TO_STDOUT=1 #日志打印到屏幕
export ASCEND_GLOBAL_LOG_LEVEL=0 #日志级别为debug级别

3.4、图编译流程中DUMP图

可执行程序执行过程中,如果需要DUMP图来辅助定位图编译流程,可以在 bash run_sample.sh -t sample_and_run_python 之前设置如下环境变量来DUMP图到执行路径下

export DUMP_GE_GRAPH=2 

4、核心概念介绍

4.1、构图步骤如下:

  • 创建图构建器(用于提供构图所需的上下文、工作空间及构建相关方法)
  • 添加起始节点(起始节点指无输入依赖的节点,通常包括图的输入(如 Data 节点)和权重常量(如 Const 节点))
  • 添加中间节点(中间节点为具有输入依赖的计算节点,通常由用户构图逻辑生成,并通过已有节点作为输入连接)
  • 设置图输出(明确图的输出节点,作为计算结果的终点)

4.2、操作符重载

概念说明: 操作符重载是 ES API 提供的语法糖,针对AI算子做语法封装,使构图代码更加简洁和直观

构图 API 特点:

  • 操作符重载保持与函数调用相同的类型检查和约束