news 2026/9/10 2:57:47

CANN/GE自定义算子融合Pass样例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CANN/GE自定义算子融合Pass样例

样例使用指导

【免费下载链接】geGE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的友好接入能力,并同时支持 onnx、pb 等主流模型格式的解析与编译。项目地址: https://gitcode.com/cann/ge

功能描述

本样例为自定义算子AddCustom的自定义pass样例,此用例针对用户可以获取到自定义算子原型的情况本例中的pass实现:对于存在一个输入为 0 的AddCustom,进行删除操作。 提供在线推理与atc工具离线编译模型两种方式演示框架如何调用自定义pass完成图优化。 本样例使用eager style api和融合接口实现。

目录结构

├── src │ ├──addcustom_zero_pass.cpp // pass实现文件 ├── CMakeLists.txt // 编译脚本 ├── data | ├──torch_forward.py // torch脚本用于在线推理 |—— gen_es_api | |——CMakeLists.txt // 生成eager style api的编译脚本 |—— proto // 存放自定义算子的算子原型 | |——add_custom_proto.cc | |——add_custom_proto.h

环境要求

  • 编译器:GCC >= 7.3.x
  • 使用python及其依赖库版本:python>=3.9 、pytorch>=2.1
  • 已完成相关环境准备。

准备工作

  1. 创建自定义算子工程:编写自定义算子的自定义 pass 的前提是用户已创建自定义算子工程,可参考自定义算子入图。在此阶段,用户需要完成:自定义算子实现、自定义算子包编译与部署、自定义算子适配开发。
  2. 获取算子原型:编译成功后将自定义算子工程中 build_out/autogen 路径下的自定义算子原型定义复制到当前工程的 proto 目录下。本样例中 proto 目录下已添加 AddCustom 自定义算子的原型,用户可按需替换或增加。

程序编译

  1. 配置环境变量。

    • 运行软件包中设置环境变量脚本,命令如下:

      source ${ASCEND_PATH}/set_env.sh

      ${ASCEND_PATH}为CANN软件包安装目录下的cann路径。请替换相关软件包的实际安装路径,例如${INSTALL_PATH}/cann

  2. 根据实际情况修改gen_es_api/CMakeLists文件:

    • 修改自定义算子原型文件路径:add_library(custom_op_proto SHARED .../proto/your_proto_name.cc)
  3. 根据实际情况修改CMakeLists.txt文件中的如下信息。

  • ASCEND_PATH:可以设置默认的软件包路径,如果通过set_env.sh设置了$ASCEND_HOME_PATH,无需修改。

  • PASS_SO_DIR:可以设置自定义融合pass动态库安装目录名,默认为pass_so_dir

  • target_include_directories:需要包含的头文件,对于本示例,无需修改。如果是用户自行开发的代码,当需要添加头文件时,在示例下方直接增加行即可,注意不要删除原有项目。如果网络中有自定义算子,请增加自定义算子的原型定义头文件。

  • target_link_libraries:需要链接的库,对于本示例,无需修改。如果是用户自行开发的代码,当需要添加链接库时,在示例下方直接增加行即可,注意不要删除原有项目。

禁止链接软件包中的其他so,否则后续升级可能会导致兼容性问题。

  1. 执行如下命令 生成eager style api

    依次执行:

    mkdir build && cd build cmake ..

    执行后,在build目录下产生的es_all_build/generated_code目录中包含es构图api的头文件及源码。

  2. 完成pass的编写后,执行如下命令编译自定义pass so,并将编译后的动态库文件libadd_zero_pass.so拷贝到自定义融合pass目录下,其中“xxx”为用户自定义目录。 可以在make后增加可选参数-j$(nproc)用于并行执行构建任务,$(nproc)动态获取CPU核心数。

    make -j$(nproc) add_custom_zero_pass make install

pass编写

  1. 定义类AddCustomZeroPass继承PatternFusionPass
  2. 重写基类PatternFusionPass中的3个函数:
    • Patterns定义匹配模板,用于在整图中获取与该模板相同的拓扑。
    • MeetRequirements对模板匹配到的拓扑进行筛选。
    • Replacement定义替换部分。
  3. 注册AddCustomZeroPass为自定义融合pass,执行阶段为BeforeInferShape。

验证

  1. 配置环境变量。

    • 运行软件包中设置环境变量的脚本,命令如下:

      source ${ASCEND_PATH}/set_env.sh

      ${ASCEND_PATH}为CANN软件包安装目录下的cann路径。请替换相关软件包的实际安装路径,例如${INSTALL_PATH}/cann

  2. 在线推理

    • 设置环境变量,dump出编译过程中的模型图:
      export DUMP_GE_GRAPH=1
    • 进入data目录执行.py文件进行在线推理:
      python torch_forward.py
    • 日志中出现如下打印:
      Define pattern for AddCustomZeroPass Define MeetRequirements for AddCustomZeroPass Define replacement for AddCustomZeroPass
  3. 查看运行结果

    • 执行完成后,目录下生成一系列.pdtxt文件。 对比以下dump图:

      • ge_onnx_xxxxx_PreRunBegin.pdtxt执行前dump图
      • ge_onnx_xxxxx_RunCustomPassBeforeInferShape.pdtxt执行InferShape前的自定义pass dump图

      可以发现模型已按预期优化,即加零节点被删除。

    • 若未获得预期结果,可设置如下环境变量(如使用atc命令,还需添加参数--log=debug)让日志打印到屏幕,来定位原因。

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

【免费下载链接】geGE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的友好接入能力,并同时支持 onnx、pb 等主流模型格式的解析与编译。项目地址: https://gitcode.com/cann/ge

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 2:56:10

Kahn算法详解:拓扑排序原理、C语言实现与工程场景应用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/10 2:55:21

半导体洁净室微粒子超标:区分人员与设备污染源的实战方法

洁净室粒子超标是Fab里让人头疼的问题之一。粒子超标了,良率跟着跌,工程师得花大量时间去排查,但排查的过程本身就很折磨人——因为粒子看不见摸不着,它是从哪个环节进来的,很难直接观测到。很多工厂的做法是简单粗暴地…

作者头像 李华
网站建设 2026/9/10 2:54:04

AI代理上下文开发生命周期(CDLC):从提示词到可运维软件资产

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/10 2:53:11

YOLOv7道路裂缝检测全流程实战:从数据标注到TensorRT部署

简介:面向道路与桥梁病害巡检场景,这份YOLOv7裂缝检测资源集成了训练好的模型权重、千余张标注图像及配套训练代码,适合有一定深度学习基础、希望快速复现或二次开发裂缝检测方案的读者,也便于在路桥养护项目中直接部署使用。资源…

作者头像 李华
网站建设 2026/9/10 2:52:40

张雪峰现象背后:信息差、学历焦虑与普通家庭的志愿选择

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华