文件最后提交记录最后更新时间
fix: ES接口ABI兼容性修复,新增pimpl形式的V2结构体和接口 Co-authored-by: kobemini<gengchao4@huawei.com> # message auto-generated for no-merge-commit merge: !2306 merge es_bugfix00005 into develop fix: ES接口ABI兼容性修复,新增pimpl形式的V2结构体和接口 Created-by: kobemini Commit-by: kobemini Merged-by: cann-robot Description: 20250710评审通过 # Pull Request ## 描述 修复 ES (Eager Style) 对外接口中 std::string 导致的 ABI 不兼容问题。 **问题**: IrAttrDef/IrInputDef/IrOutputDef 结构体包含 std::string 字段,当外部使用者与 GE 库使用不同的编译器 ABI(如不同的 _std::__cxx11 命名空间配置)时,会导致 std::string 内存布局不一致,引发内存访问异常。 **修复内容**: - 新增 IrAttrDefV2/IrInputDefV2/IrOutputDefV2 pimpl 结构体,对外仅暴露稳定大小的 Impl 指针,内部拷贝字符串内容,确保 ABI 安全 - 新增 IrDefInputsV2/IrDefOutputsV2/IrDefAttrsV2 接口,支持指针+长度和 initializer_list 两种调用方式 - V2 结构体使用 std::nothrow 分配内存,setter/getter 均做判空保护 - 参数化构造函数使用初始化列表形式,避免默认构造+赋值的开销 - 旧接口使用 ATTRIBUTED_DEPRECATED 宏标记废弃,保持向后兼容 - 旧结构体文档标注非 ABI 兼容说明,接口文档同时保留新旧原型 - codegen 和单元测试已迁移至 V2 接口 ## 变更类型 - [x] Bug 修复 - [ ] 新功能 - [ ] 代码风格更新 - [ ] 重构 - [ ] 构建过程或辅助工具的变动 - [x] 文档内容更新 ## 修改文件 - compliant_node_builder.h - 新增 V2 结构体声明和 V2 接口,旧接口标记废弃 - compliant_node_builder.cc - 实现 V2 结构体的 pimpl 逻辑 - c_generator.h - codegen 迁移到 V2 接口 - docs/graph_engine_api/*.md - 文档更新 - tests/ - 单元测试迁移到 V2 接口 - examples/ - 示例迁移到 V2 接口 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签 See merge request: cann/ge!23061 个月前
Initial commit 5 个月前
Initial commit 5 个月前
【PR】: readable dump支持子图展示,优化节点输入、图输出显示,补充dump文档 Co-authored-by: du-hua1024<duhua2@huawei.com> # message auto-generated for no-merge-commit merge: !121 merge master into master 【PR】: readable dump支持子图展示,优化节点输入、图输出显示,补充dump文档 Created-by: du-hua1024 Commit-by: du-hua1024 Merged-by: cann-robot Description: # Pull Request ## 描述 1、子图展示 包含子图的节点,在属性里声明子图(其他属性之前) 如attrs = { <subgraph_ir_name_0>: %<subgraph_instance_name_0>, <subgraph_ir_name_1>: %<subgraph_instance_name_1>, ... } 子图的具体内容在当前图主体输出结束后,按顺序统一展开。子图递归深度上限为 10,超过上限返回失败 2、节点输入显示参数名 所有节点的输入格式为(inputs = (输入名称1=%<输入实例1>, 输入名称2=%<输入实例2>, ...) 如果是动态输入参数,参数命名为 输入名称_#cnt,按照 输入名称_0, 输入名称_1, 输入名称_2的格式递增。 带有子图的节点,其动态输入参数input_#cnt 映射为子图中 index 属性为cntData 节点输入。 3、图输出显示表示输出位置的参数名 只有一个输出,直接返回 return (%<图输出>) 包含多个输出的图,统一使用output_#cnt来表示多输出情况,按照output_0、output_1、output_2的格式递增。 ex:return (output_0=%<图输出1>, output_1=%<图输出2>, ...) 子图输出参数output_#cnt 表示该输出映射到父节点的第 cnt个输出(即 get_element 的输出index为cnt) 4、新增Dump说明文档 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [x] 📝 文档内容更新 ## 关联的Issue NA ## 如何测试 描述测试此变更的步骤和前提条件: 1.使用pytorch或者ge API构图,包含子图,dump readable模式图结构,子图正常展示 2. ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/ge!1214 个月前
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 个月前
README.md

简介

因为ES构图API是基于IR原型生成, 部分算子IR无法支撑所有信息表达(Conv)或者IR表达有冗余信息(IdentityN), 所以推荐用户自行封装ES API, 同时支持用户自定义行为。
该Sample旨在指导用户如何自定义ES API
注: Conv2D等算子在默认生成API中, 直接使用会有Format问题, 需要自行添加逻辑并生成自定义ES API(见 Sample 1)

快速开始

  1. 通过安装指导正确安装toolkitops包, 并正确配置环境变量
  2. 通过命令bash run_sample.sh 运行脚本 run_sample.sh

预期结果

项目build目录下生成pbtxt格式dump图

实现步骤

步骤一. [可选] 生成ES API代码参考

通过gen_esb可执行程序生成ES_API代码 (参考 gen_esb_readme.md)

步骤二. 自定义ES API代码

参考步骤一生成的代码编写自定义API代码, 以下为代码样例

  • Sample 1. 合法性补全 Conv2D
    Conv2D类型算子的Format需要自行设置, 可以增加逻辑保证算子有效

  • Sample 2. 冗余属性消除 ConcatD
    由于历史原因,部分 IR 中定义的属性存在冗余
    例如在 ConcatD 算子中,属性 N 表示输入 x 的数量
    优化方式是将属性 N 注册为可推导属性,使其由 x_num 自动推导。通过如下语句注册推导逻辑:int64_t N = x_num;

  • Sample 3. 动态输出参数消除 IdentityN
    在生成 API 时将内嵌算子注册动态输出数量的推导逻辑,从而自动确定输出数量,无需显式传参
    例如IdentityN可以新增推导代码,表达动态输出 y 的数量可以由"x_num"表达式获得: int64_t y_num = x_num;

  • Sample 4. 传递自定义属性

步骤三. 构图

自定义构图代码逻辑 (参照 main.cc)

步骤四. 构建工程

关键流程如下 (参照 CMakeLists.txt)

  1. 设置变量 && 引入cmake函数

  2. 定义算子原型库

    # 注意: 
    # 当前为开箱即用示例, 即定义INTERFACE使用已有的原型so
    # 正常使用不会是用现有的so,更普遍的方式是直接使用项目中已有的so的target
    # 使用项目中已有的so方式:
    # 1. add_library(opgraph_all SHARED)
    # 2. 设置PROPERTIES LIBRARY_OUTPUT_DIRECTORY
    add_library(opgraph_all INTERFACE)
    set_target_properties(opgraph_all PROPERTIES
        INTERFACE_LIBRARY_OUTPUT_DIRECTORY "${ASCEND_INSTALL_PATH}/opp/built-in/op_proto"
    )
    
  3. 通过add_es_library_and_whl 或者 add_es_library 生成ES API包, 如果需要屏蔽部分算子ES API生成, 则加入参数EXCLUDE_OPS

    add_es_library(
        ES_LINKABLE_AND_ALL_TARGET es_all
        OPP_PROTO_TARGET  opgraph_all
        OUTPUT_PATH       ${CMAKE_BINARY_DIR}/output
        EXCLUDE_OPS       Conv2D,ConcatD
    )
    
  4. 引入构建自定义ES API包

    file(GLOB CPP_FILES CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/custom/*.cpp")
    add_library(self_defined_es_lib SHARED ${CPP_FILES})
    
    find_library(GRAPH_LIB NAMES graph)
    
    # 添加头文件路径
    target_include_directories(self_defined_es_lib
        PUBLIC
            ${CMAKE_CURRENT_SOURCE_DIR}/custom
    )
    
  5. 自定义 API包 link

    target_link_libraries(self_defined_es_lib PUBLIC es_all)
    
    add_dependencies(self_defined_es_lib es_all)
    

注意事项

  1. 确保环境变量已正确设置
  2. 确保有足够的磁盘空间存储生成的代码文件
  3. 生成的代码文件数量取决于系统中注册的算子数量