当前位置: 首页 > news >正文

CANN/ge 流分配约束文档

流分配约束文档

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

模块边界

静态shape:逻辑流分配->内存分配->GenTask->流拆分

动态shape:逻辑流分配->GenTask

核心设计原则

  1. 图结构稳定性原则:GE逻辑流分流时依赖topo排序、topo id连续,图结构不能发生变化,否则会影响后续内存复用逻辑以及物理流拆分逻辑

  2. 分流模式区分

    • 静态shape:默认多流,支持单流特殊场景
    • 动态shape:默认单流,可通过配置开启多流
  3. Pass架构设计:流分配采用Pass链式处理架构,各Pass按优先级依次执行,每个Pass负责特定分流规则的处理

静态shape逻辑流分配

  1. 分流模式

    • 多流模式(默认):以根图、子图粒度分流,每个图内部根据引擎子图进行流分配,相同引擎的理论上会分到一条流上。如果节点被打上了StreamLabel属性,则会为其单独分流,相同StreamLabel的会分到同一条流
    • 单流模式:只会分配一条逻辑流,如果有StreamLabel则会报错。单流场景下不允许有StreamLabel
  2. Pass执行顺序(多流模式):

    • UpdateForMdeGroupPass:根据mde group更新流ID
    • AssignByLabelPass:根据StreamLabel分配流
    • IndependentStreamPass:独立引擎(如hccl)需要独立流
    • AssignByDependencyPass:根据依赖关系分配流
    • NodeStreamUpdatePass:将子图流分配到节点
    • UpdateForParallelGroupPass:为parallel group分配新的流ID
    • AllReduceParallelPass:AllReduce和backward算子并行
    • UpdateForSkippedEnginePass:优化跳过引擎子图的流分配
    • OptimizeIneffectiveMultiStreamPass:优化无效的多流

    单流模式执行顺序:

    • SingleStreamPass:单流分配
    • NodeStreamUpdatePass:节点流更新
    • UpdateForSkippedEnginePass:跳过引擎优化
  3. 分流优先级

    • 用户流标签(USER_STREAM_LABEL)优先级最高
    • StreamLabel次之
    • 引擎依赖关系分配(无标签时)
  4. 流复用原则

    • 独立引擎(IsEngineIndependent,如hccl)不允许复用
    • 带StreamLabel的流不允许复用
    • 流复用需满足:前后子图scheduler_id相同、前子图后续子图引擎冲突检查、memory_priority模式下的SubGraphCouldReuse规则
    • 复用选择:从可复用子图集中选择优先级最高的
  5. 流连续性保证:流分配完成后,会刷新流ID,确保流ID从0开始连续分配

静态shape物理流拆分

由于物理流承载的task数量是有限的,所以要对同一个逻辑流上的task计算数量并且做流拆分,这个阶段产生的stream和event总数就是在执行时申请的数量。该阶段以整图粒度做处理。

  1. 流的激活关系设置

    • 设置流的激活关系,后续如果发生流拆分,还需要再更新一下
    • 这里会以StreamLabel为key存储要被激活的流
    • 约束:对于分档场景,添加StreamLabel时需要加上档位信息以区分
  2. Event连续性保证

    • 流分配内部插入event的场景主要有:相邻的不同逻辑流节点之间、流拆分的节点之间、主从流之间、附属流与主流之间
    • 约束:插入或者删除event后需要考虑event id的连续性,rts会对event id做校验。所以操作event必须统一使用成员Nodes2SyncInfos,流分配阶段会刷新Nodes2SyncInfos里的event,保证连续性
  3. 流拆分触发条件

    • 检测物理流是否支持无限深度(FEATURE_TYPE_PERSISTENT_STREAM_UNLIMITED_DEPTH)
    • 支持时,由RTS自动处理流拆分
    • 不支持时,按节点task数超阈值拆分新流
    • NodeSizePerStream阈值:考虑普通流和大流(huge_stream)的不同task上限

静态shape附着流分配

  1. 附着流定义:一个节点可以产生多个流,除主流外还有附着流
  2. 分配时机:在主流分配完成后进行附着流分配
  3. 约束条件
    • 主流分配完成后才能分配附着流
    • 一个节点最多支持一个附着流(通过reuse_key复用)
    • 通过ATTR_NAME_ATTACHED_STREAM_INFO或ATTR_NAME_ATTACHED_STREAM_INFO_LIST属性指定附着流信息
    • 支持_old_和_v2_两种版本的属性格式

动态shape逻辑流分配

默认是单流,如果开启多流则根据以下规则分流:

  1. 分流策略

    • AssignEnginesOwningStream:根据引擎分流,一个引擎对应一个stream_id,仅限于AIcoreEngine、VectorEngine、DNN_HCCL、DSAEngine
    • AssignAicpuCanParallel:如果ac_parallel_enable为true,则判断aicpu和aicore是否能并行,如果能并行则为aicpu单独分流(仅输入节点无任务、仅有NoTask输入、不能复用前驱子图时分配)
    • AssignIndependentAicpuNode:为独立aicpu节点单独分流(如DROPOUTGENMASK、GETNEXT等)
    • AssignWithReuse:对还没分流的引擎子图判断是否有可复用的子图(前后向均可复用)
    • AssignRemainSubgraphNeedAssignStream:为剩余未分配流的子图分配流
    • ReassignStreamByStreamLabel:带stream_label的节点分到新流,相同stream_label的分到同一条流(不同引擎可通过stream_label分配到同一条流)
  2. 流复用原则

    • aicpu不能附加到hccl(IsEngineIndependent)
    • 引擎相同或IsEngineAttach时可复用
    • 可通过reused_subgraph传递复用关系(如AIcore附加到hccl后,后续AIcore可复用)
  3. 节点流约束

    • Data、Variable、Constant、ConstPlaceholder、NetOutput、FILECONSTANT等特定节点强制在主流(stream 0)
    • 子图节点必须在主流
    • 无stream_id的节点放到主流
  4. 流连续性:按引擎优先级排序后刷新流ID,保证流ID从0开始连续,消除空的流引用

同步机制设计

  1. EventType类型

    • kEvent:普通event
    • kNotify:同步流间的notify
  2. 插入场景

    • 相邻的不同逻辑流节点之间
    • 流拆分的节点之间
    • 主从流之间(StreamActive和被激活流)
    • 附着流与主流之间(根据ATTR_NAME_ATTACHED_STREAM_INFO的依赖关系)
  3. 优化策略

    • OptimizeBySendEvents:根据流内节点顺序删除冗余send event
    • OptimizeByRecvEvents:根据流内节点顺序删除冗余recv event
    • OptimizeByStreamActivate:通过StreamActive优化跨流event(被激活流与激活流之间不需要event)
    • Event复用:多档位场景构建event重用映射,多维度场景event复用

流激活机制

  1. ActiveLabelList处理

    • 设置节点的active_label_list属性
    • 建立label到流的映射(labeled_streams_)
    • 记录specific_activated_labels_和specific_activated_streams_
  2. 流激活流程

    • SetActiveStreamsByLabel:根据active_label_list设置流激活关系
    • SetActiveStreamsForSubgraphs:处理While/For循环子图的首节点激活
    • UpdateActiveStreamsForSwitchNode:更新Switch节点的激活流列表
    • UpdateActiveStreamsForLoop:设置循环场景的流激活
  3. 约束

    • 循环场景下的流激活需要正确配置
    • 子图首节点StreamActive需要激活同子图内其他流

约束和边界条件

  1. 静态shape约束

    • 单流模式不允许有StreamLabel
    • 主流分配完成后才能分配附着流
    • Event ID必须连续,通过Nodes2SyncInfos统一管理
    • 分档场景StreamLabel需要加档位信息
  2. 动态shape约束

    • 多流开启时,ac_parallel_enable值只能是"0"、"1"、空
    • AICPU引擎的流分配考虑并行场景
    • 特定节点(Data、NetOutput等)必须在主流
    • 子图节点必须在主流
  3. 通用约束

    • 图结构在流分配期间不能改变
    • Topo ID必须连续
    • StreamAllocator支持多线程,但shared resource需要保护
    • ScalableAllocator不支持多线程并发(无锁设计)
    • 逻辑流分配阶段禁止改图,避免影响内存复用和物理流拆分
  4. 动态图特殊处理

    • 动态图上的While算子的静态body子图的NetOutput需要在stream id 0上,避免多流构图bug
    • 动态图需要考虑多batch场景的影响

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

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

http://www.jsqmd.com/news/782639/

相关文章:

  • 2026年全网10个免费降AI率工具深度测评:言笔/DeepSeek谁更强?一键降AI率必备工具 - 降AI实验室
  • 四川耐磨钢板・耐候钢板市场深度解析 - 深度智识库
  • 点餐外卖小程序源码如何降低平台开发成本与运营压力
  • CANN ops-nn ELU梯度算子
  • #24 Agent 的浏览器自动化:Playwright、Selenium 与网页交互
  • 既要又要还要?噬菌体展示如何帮助科学家“钓”出完美的抗毒素抗体?
  • 智慧云柜生产厂家推荐-聚澜智能 - 聚澜智能
  • 初次使用大模型API的新手如何通过模型广场快速选择合适的模型
  • 领嵌iLeadE-588AI计算盒子数据采集视频分析一键部署
  • 2026年唐山幕墙清洗与烟道保洁专业服务商深度对标指南 - 企业名录优选推荐
  • 小红书内容采集终极指南:XHS-Downloader 5分钟快速上手
  • 【Pocket Flow】源码剖析(二):批量与异步——BatchNode、AsyncNode 与并行执行
  • 2025-2026年国内主流电竞鼠标品牌推荐:十大口碑产品评测日常使用防握持不适 - 品牌推荐
  • 桶排序、堆排序、奇偶排序、计数排序、阿坤老师的独特瓷器、封闭图形个数、二进制王国【算法赛】
  • Python 爬虫反爬突破:人机验证机制底层破解
  • CANN/sip BLAS向量复制操作
  • cann/ascend-transformer-boost编译与构建
  • 基于 OpenCV + OpenGL 的三维重建代码实现
  • Video DownloadHelper CoApp终极指南:轻松下载网络视频的完整教程
  • 企业级即时通讯「删除消息」:六个场景叠加之后,复杂性超出你的想象
  • # 026 Agent 的文件处理:PDF、Excel、图片、音频的解析与生成
  • 2026年唐山烟道清洗、外墙保洁与商业保洁一站式解决方案深度指南 - 企业名录优选推荐
  • 免费文本挖掘神器KH Coder:三步掌握多语言内容分析技巧
  • 项目改造为 Docker 容器使用指南
  • 不想打工开茶店,预算30万小成本中端预算创业,加盟岩茶品牌哪个不踩坑新手小白全程带教白皮书——以溪谷留香为基准样本的深度决策指南 - 商业科技观察
  • 模型广场功能如何帮助开发者根据任务特性选择合适模型
  • Seraphine:英雄联盟终极智能辅助工具完整指南 - 提升排位胜率的秘密武器
  • PUBG罗技鼠标宏压枪脚本架构揭秘:精准射击的自动化实现方案
  • Java并发编程:从基础到实战的技术探索
  • 性价比高的芯片老化座哪家公司好?