昇腾/ge自定义逻辑流分配Pass开发

发布时间:2026/9/10 20:39:18

昇腾/ge自定义逻辑流分配Pass开发 使用自定义逻辑流分配Pass定制并发【免费下载链接】geGEGraph Engine是面向昇腾的图编译器和执行器提供了计算图优化、多流并行、内存复用和模型下沉等技术手段加速模型执行效率减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的友好接入能力并同时支持 onnx、pb 等主流模型格式的解析与编译。项目地址: https://gitcode.com/cann/ge功能介绍由于算子执行时间、核占用、带宽等执行时的因素影响导致一套算法在不同硬件上并发效果不同并且在编译阶段无法准确预估目前并不存在一个完美的算法在任意网络、任意硬件上都能达到最佳并发。基于上述问题引入该章节的特性开放自定义逻辑流分配Pass的接入用户可以结合图的拓扑结构、根据Profiling来分析具体网络在具体硬件上的硬件利用率从而可以灵活地调整并发效果一网一策一卡一策达到最优性能。使用自定义逻辑流分配Pass定制并发一般有两种使用场景基于内置的逻辑流分配结果进行微调。基于图结构开发自研的流分配算法。相关概念逻辑流与物理流对应的概念在图上按某些条件拓扑序、引擎归属预分配的流这条逻辑流上的任务将按先后顺序执行本文讲述的流均为逻辑流。流分配指定某几个任务可以并行执行可以提升硬件利用率降低模型执行时间。本章节以场景一“基于内置的逻辑流分配结果进行微调”为例详细介绍如何使用自定义逻辑流分配Pass定制并发整体流程为首先用户可以调用REGISTER_CUSTOM_PASS注册宏按照指定的Pass名称完成Pass的注册其次通过把函数编译成动态库插件方式注册的Pass在逻辑流分配阶段之后被调用最终用户可以基于内置的流分配结果进行微调示例代码如下#include register_custom_pass.h // 用户自定义逻辑流分配函数 Status CustomStreamPassFunc(const ConstGraphPtr graph, StreamPassContext stream_context) { // 在此函数中定义逻辑流分配行为 return SUCCESS; } // Pass注册无需指定stage默认在逻辑流分配阶段之后执行 REGISTER_CUSTOM_PASS(pass_name).CustomAllocateStreamPassFn(CustomStreamPassFunc);register_custom_pass.h存储在“CANN软件安装目录/cann/include/register/”目录下包含该头文件可使用Pass注册相关类使用Pass注册相关接口。Status成功返回ge::GRAPH_SUCCESS返回其他全为失败。建议使用小于0的值作为返回的错误码大于0的值可能会和框架已使用的错误码产生冲突。CustomStreamPassFunc自定义Pass的执行函数详情请参见回调函数CustomAllocateStreamPassFunc。graph待分配逻辑流的图类型为ConstGraphPtr。stream_contextStreamPassContext类对象可参考StreamPassContext提供的方法。REGISTER_CUSTOM_PASS注册自定义Passpass_name可任意命名详情请参见REGISTER_CUSTOM_PASS。CustomAllocateStreamPassFn注册自定义的逻辑流分配Pass执行函数详情请参见CustomAllocateStreamPassFn。[!NOTE]说明开启强制单流开关时options参数说明中ge.enableSingleStream设置为true自定义逻辑流分配Pass不会被执行。开发示例前提条件结合下图结构和Profiling分析优化点图 1原图 ![图示](https://raw.gitcode.com/cann/ge/raw/243ea8d2d8f7623dd210c0867dde5782ec5594a9/docs/zh/user_guides/graph_dev/figures/original_image.png 原图?utm_sourcegitcode_repo_files)其Profiling分析结果如下图所示由Profiling分析结果可知**有并发条件无数据依赖和控制依赖**的算子1和2为串行执行在逻辑流分配以后算子1和2被分配了同一个Stream ID可以基于本节提供的功能修改为并行执行。[!NOTE]说明有并发条件的算子若使用相同的计算资源且存在资源的抢占和等待并不总是能够获得并发收益需要根据Profiling详细分析此处仅以此为例介绍如何调整。开发步骤包含如下头文件#include iostream // 自定义Pass接口头文件 #include register_custom_pass.h开发自定义Pass对节点1分配新的Stream ID。如下代码仅为示例不可执行说明用户获取待分配逻辑流的图后只能对当前图上的节点做改动即只能使用GetDirectNode接口获取本图中的所有节点。#include iostream #include register_custom_pass.h // 自定义流分配Pass graphStatus AllocateStreamPass(const ConstGraphPtr graph, StreamPassContext context) { // 遍历图中所有直接子节点即不递归子图 for (const auto node : graph-GetDirectNode()) { AscendString node_name; node.GetName(node_name); // 获取节点名称 // 判断节点是否为指定的Abs_1节点 if (std::string(node_name.GetString()) Abs_1/unary_ops_composition_0_SquareAbs_1/unary_ops_composition_1_Abs) { // 为该节点分配一个新的Stream ID context.SetStreamId(node, context.AllocateNextStreamId()); } } return GRAPH_SUCCESS; } // 注册自定义Pass REGISTER_CUSTOM_PASS(AllocateStreamPass).CustomAllocateStreamPassFn(AllocateStreamPass);如何使用自定义Pass完成上述自定义Pass后本节简单介绍如何把用户自定义逻辑流分配函数编译成动态库插件方式以便注册的Pass在逻辑流分配阶段之后被调用。前提条件请参见《CANN 软件安装》安装CANN软件包。程序编译参见样例使用指导获取其中的CMakeLists.txt编辑脚本并按照Sample中的目录结构将用户自定义逻辑流分配函数**AllocateStreamPass.cpp**文件放在src目录下。根据实际情况修改CMakeLists.txt文件中的如下信息ASCEND_PATH指定CANN软件安装后文件存储路径以root安装用户为例/usr/local/Ascend/cann。target_include_directories需要包含的头文件对于本示例无需修改。如果是用户自行开发的代码当需要添加头文件时在示例下方直接增加行即可注意不要删除原有项目。如果网络中有自定义算子请增加自定义算子的原型定义头文件。target_link_libraries需要链接的库对于本示例无需修改。如果是用户自行开发的代码当需要添加链接库时在示例下方直接增加行即可注意不要删除原有项目。执行如下命令进行编译mkdir build cd build cmake .. make编译结束后在build目录下生成动态库文件lib_AllocateStreamPass_.so。将lib_AllocateStreamPass_.so拷贝到${ASCEND_PATH}/opp/vendors/xxx/custom_fusion_passes/目录下。其中“xxx”为用户自定义目录。支持设置软链接的方式.so文件对可执行用户需要有可读权限多个${ASCEND_PATH}/opp/vendors/xxx目录按照文本序排序后遍历寻找custom_fusion_passes/子目录单个子目录内的.so按照文本序加载非.so结尾的文件在加载时跳过xxx有且仅有一层自定义目录。custom_fusion_passes该目录下不能有子目录。自定义Pass使用支持但不限于如下几种入口编译模型文件如果要查看上述自定义Pass有没有生效在编译模型前需要dump图进行查看在执行之前设置DUMP_GE_GRAPH详细说明请参见《环境变量参考》环境变量然后使用如下入口编译模型使用ATC工具进行模型转换。ATC工具使用方法请参见《ATC离线模型编译工具》。编译Graph为离线模型。编译并运行Graph。结果验证[!NOTE]说明若一个动态shape模型中有可下沉的部分框架内部会将模型拆分为动态调度和下沉调度静态子图两部分其中下沉调度可能有多个小模型因此在对一个动静混合模型做自定义流分配时自定义Pass前后的dump图将会有多份第一份对应根图后面若干份对应模型中的静态模型当希望通过dump图查看分配结果时最好通过查看build图之前最后一次自定义流分配的dump图。设置了dump环境变量后程序执行完毕会在当前路径生成ge_onnx*.pbtxt等图文件用户可以获取如下两张图然后使用Netron等可视化软件查看ge_onnx_xxx_RunCustomPass_BeforeAssignLogicStream*.pbtxtPass执行前的图*代表具体的Pass名称图结构请参见图1。ge_onnx_xxx_RunCustomPass_AfterAssignLogicStream*.pbtxtPass执行后的图*代表具体的Pass名称图结构为从图中可以看出算子1被分配了新的Stream ID。用户也可以基于模型编译完成的图并结合Profiling查看最终的效果从图2查看算子1前后产生了Send/Recv等流间同步算子执行生成Profiling图3可知算子1、2在两条流上并发执行。Profiling操作请参见Profiling性能数据采集。图 2编译完成的图 ![图示](https://raw.gitcode.com/cann/ge/raw/243ea8d2d8f7623dd210c0867dde5782ec5594a9/docs/zh/user_guides/graph_dev/figures/compiled_graph.png 编译完成的图?utm_sourcegitcode_repo_files)图 3Profiling结果 ![图示](https://raw.gitcode.com/cann/ge/raw/243ea8d2d8f7623dd210c0867dde5782ec5594a9/docs/zh/user_guides/graph_dev/figures/profiling_result.png Profiling结果?utm_sourcegitcode_repo_files)【免费下载链接】geGEGraph Engine是面向昇腾的图编译器和执行器提供了计算图优化、多流并行、内存复用和模型下沉等技术手段加速模型执行效率减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的友好接入能力并同时支持 onnx、pb 等主流模型格式的解析与编译。项目地址: https://gitcode.com/cann/ge创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/10 20:39:18

CANN/ge:基于Pattern匹配实现Pass

基于Pattern匹配实现Pass 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、T…

2026/9/10 20:39:18

Android性能优化实战:R8编译器与内存管理技巧

1. Android性能优化周:全面解析与实战指南 最近在开发者社区掀起了一股Android性能优化热潮,各大技术论坛都在讨论如何让应用跑得更快、更流畅。作为一名经历过多次性能优化战役的老兵,我想分享一些真正实用的经验。性能优化不是简单的参数调…

2026/9/10 22:19:33

CANN/ge 离线编译API文档

OfflineCompile 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、TensorFlow…

2026/9/10 22:14:32

Claude 官方系统提示词归档:34 个版本怎么读不迷路

Claude 官方系统提示词归档:34 个版本怎么读不迷路 【免费下载链接】system_prompts_leaks Extracted system prompts from Anthropic - Claude Fable 5.1, Opus 5, Claude Design, Claude Code. OpenAI - ChatGPT GPT-6-Astra, Codex. Google - Gemini 3.8 Flash, …

2026/9/10 16:39:38

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/10 11:16:38

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/10 0:00:55

目录对比去重实战:用哈希算法精准清理重复文件

我电脑里现在还有一块换了三次机的“数据墓地”硬盘,里面存着2016年以前所有旧笔记本的完整备份。平时不觉得有什么,直到前阵子想把它整理归档,发现同一个安装包、同一批照片、同一份论文草稿,在几个不同的备份目录里反复出现。更…

2026/9/10 0:00:55

Leaflet离线地图完整Demo合集:内网部署与坐标纠偏实战

简介:这是一份面向Web GIS开发者的LeafLet离线地图示例合集,帮助开发者快速掌握离线地图从搭建到交互的完整流程。压缩包共723个文件,大小14.06MB,以319个js脚本、175个html页面和29个css样式文件为主体,配合png/svg图…

2026/9/10 0:00:55

MATLAB读取Rinex 3.02观测文件:多系统GNSS数据解析实战

简介:基于MATLAB开发的Rinex3.02版观测文件(o文件)读取代码包,面向卫星定位导航方向的学习者与研究人员,用于解决新版观测文件的数据解析、历元提取与时间转换问题。压缩包共4个文件,包含两个m脚本、一个19…

2026/9/10 12:32:02

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/10 15:19:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/10 15:49:53

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码