尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

CANN/GE流分配约束文档

CANN/GE流分配约束文档 流分配约束文档【免费下载链接】geGEGraph Engine是面向昇腾的图编译器和执行器提供了计算图优化、多流并行、内存复用和模型下沉等技术手段加速模型执行效率减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的友好接入能力并同时支持 onnx、pb 等主流模型格式的解析与编译。项目地址: https://gitcode.com/cann/ge模块边界静态shape逻辑流分配-内存分配-GenTask-流拆分动态shape逻辑流分配-GenTask核心设计原则图结构稳定性原则GE逻辑流分流时依赖topo排序、topo id连续图结构不能发生变化否则会影响后续内存复用逻辑以及物理流拆分逻辑分流模式区分静态shape默认多流支持单流特殊场景动态shape默认单流可通过配置开启多流Pass架构设计流分配采用Pass链式处理架构各Pass按优先级依次执行每个Pass负责特定分流规则的处理静态shape逻辑流分配分流模式多流模式默认以根图、子图粒度分流每个图内部根据引擎子图进行流分配相同引擎的理论上会分到一条流上。如果节点被打上了StreamLabel属性则会为其单独分流相同StreamLabel的会分到同一条流单流模式只会分配一条逻辑流如果有StreamLabel则会报错。单流场景下不允许有StreamLabelPass执行顺序多流模式UpdateForMdeGroupPass根据mde group更新流IDAssignByLabelPass根据StreamLabel分配流IndependentStreamPass独立引擎如hccl需要独立流AssignByDependencyPass根据依赖关系分配流NodeStreamUpdatePass将子图流分配到节点UpdateForParallelGroupPass为parallel group分配新的流IDAllReduceParallelPassAllReduce和backward算子并行UpdateForSkippedEnginePass优化跳过引擎子图的流分配OptimizeIneffectiveMultiStreamPass优化无效的多流单流模式执行顺序SingleStreamPass单流分配NodeStreamUpdatePass节点流更新UpdateForSkippedEnginePass跳过引擎优化分流优先级用户流标签USER_STREAM_LABEL优先级最高StreamLabel次之引擎依赖关系分配无标签时流复用原则独立引擎IsEngineIndependent如hccl不允许复用带StreamLabel的流不允许复用流复用需满足前后子图scheduler_id相同、前子图后续子图引擎冲突检查、memory_priority模式下的SubGraphCouldReuse规则复用选择从可复用子图集中选择优先级最高的流连续性保证流分配完成后会刷新流ID确保流ID从0开始连续分配。任何可能修改节点 stream_id 的 Pass包括迁移节点到新流、重排流ID等都可能导致某些 stream_id 上不再有算子而产生空洞。因此流ID连续性刷新必须在所有可能修改 stream_id 的 Pass 之后执行作为逻辑流分配阶段的最后一步才能正确消除空洞避免运行时为空洞的 stream_id 额外申请物理流造成资源浪费静态shape物理流拆分由于物理流承载的task数量是有限的所以要对同一个逻辑流上的task计算数量并且做流拆分这个阶段产生的stream和event总数就是在执行时申请的数量。该阶段以整图粒度做处理。流的激活关系设置设置流的激活关系后续如果发生流拆分还需要再更新一下这里会以StreamLabel为key存储要被激活的流约束对于分档场景添加StreamLabel时需要加上档位信息以区分Event连续性保证流分配内部插入event的场景主要有相邻的不同逻辑流节点之间、流拆分的节点之间、主从流之间、附属流与主流之间约束插入或者删除event后需要考虑event id的连续性rts会对event id做校验。所以操作event必须统一使用成员Nodes2SyncInfos流分配阶段会刷新Nodes2SyncInfos里的event保证连续性流拆分触发条件检测物理流是否支持无限深度FEATURE_TYPE_PERSISTENT_STREAM_UNLIMITED_DEPTH支持时由RTS自动处理流拆分不支持时按节点task数超阈值拆分新流NodeSizePerStream阈值考虑普通流和大流huge_stream的不同task上限静态shape附着流分配附着流定义一个节点可以产生多个流除主流外还有附着流分配时机在主流分配完成后进行附着流分配约束条件主流分配完成后才能分配附着流一个节点最多支持一个附着流通过reuse_key复用通过ATTR_NAME_ATTACHED_STREAM_INFO或ATTR_NAME_ATTACHED_STREAM_INFO_LIST属性指定附着流信息支持_old_和_v2_两种版本的属性格式动态shape逻辑流分配默认是单流如果开启多流则根据以下规则分流分流策略AssignEnginesOwningStream根据引擎分流一个引擎对应一个stream_id仅限于AIcoreEngine、VectorEngine、DNN_HCCL、DSAEngineAssignAicpuCanParallel如果ac_parallel_enable为true则判断aicpu和aicore是否能并行如果能并行则为aicpu单独分流仅输入节点无任务、仅有NoTask输入、不能复用前驱子图时分配AssignIndependentAicpuNode为独立aicpu节点单独分流如DROPOUTGENMASK、GETNEXT等AssignWithReuse对还没分流的引擎子图判断是否有可复用的子图前后向均可复用AssignRemainSubgraphNeedAssignStream为剩余未分配流的子图分配流ReassignStreamByStreamLabel带stream_label的节点分到新流相同stream_label的分到同一条流不同引擎可通过stream_label分配到同一条流流复用原则aicpu不能附加到hcclIsEngineIndependent引擎相同或IsEngineAttach时可复用可通过reused_subgraph传递复用关系如AIcore附加到hccl后后续AIcore可复用节点流约束Data、Variable、Constant、ConstPlaceholder、NetOutput、FILECONSTANT等特定节点强制在主流stream 0子图节点必须在主流无stream_id的节点放到主流流连续性按引擎优先级排序后刷新流ID保证流ID从0开始连续消除空的流引用同步机制设计EventType类型kEvent普通eventkNotify同步流间的notify插入场景相邻的不同逻辑流节点之间流拆分的节点之间主从流之间StreamActive和被激活流附着流与主流之间根据ATTR_NAME_ATTACHED_STREAM_INFO的依赖关系子图入口边界子图内无前驱的入口节点与父节点的输入源节点之间若处于不同流则必须插入event。任何修改stream_id的Pass如CustomStreamPass都可能导致子图入口节点与父节点输入源被分到不同流上缺少同步event会导致子图在输入数据未就绪时提前启动引发精度问题优化策略OptimizeBySendEvents根据流内节点顺序删除冗余send eventOptimizeByRecvEvents根据流内节点顺序删除冗余recv eventOptimizeByStreamActivate通过StreamActive优化跨流event被激活流与激活流之间不需要eventEvent复用多档位场景构建event重用映射多维度场景event复用流激活机制ActiveLabelList处理设置节点的active_label_list属性建立label到流的映射labeled_streams_记录specific_activated_labels_和specific_activated_streams_流激活流程SetActiveStreamsByLabel根据active_label_list设置流激活关系SetActiveStreamsForSubgraphs处理While/For循环子图的首节点激活UpdateActiveStreamsForSwitchNode更新Switch节点的激活流列表UpdateActiveStreamsForLoop设置循环场景的流激活约束循环场景下的流激活需要正确配置子图首节点StreamActive需要激活同子图内其他流约束和边界条件静态shape约束单流模式不允许有StreamLabel主流分配完成后才能分配附着流Event ID必须连续通过Nodes2SyncInfos统一管理分档场景StreamLabel需要加档位信息打了ATTR_NAME_RTS_LABEL_NODE属性的节点必须分配在默认流上根图主流0或子图父节点所在的流不能跟随子图的stream_id。该约束在NodeStreamUpdatePass中执行确保控制流标签节点如LabelSet、LabelGotoEx、LabelSwitchByIndex等与其父节点在同一流上执行避免跨流控制流语义错误动态shape约束多流开启时ac_parallel_enable值只能是0、1、空AICPU引擎的流分配考虑并行场景特定节点Data、NetOutput等必须在主流子图节点必须在主流通用约束图结构在流分配期间不能改变Topo ID必须连续StreamAllocator支持多线程但shared resource需要保护ScalableAllocator不支持多线程并发无锁设计逻辑流分配阶段禁止改图避免影响内存复用和物理流拆分动态图特殊处理动态图上的While算子的静态body子图的NetOutput需要在stream id 0上避免多流构图bug动态图需要考虑多batch场景的影响【免费下载链接】geGEGraph Engine是面向昇腾的图编译器和执行器提供了计算图优化、多流并行、内存复用和模型下沉等技术手段加速模型执行效率减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的友好接入能力并同时支持 onnx、pb 等主流模型格式的解析与编译。项目地址: https://gitcode.com/cann/ge创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表