[{"data":1,"prerenderedAt":463},["ShallowReactive",2],{"content-query-DuENCIunBF":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"cover":11,"type":12,"category":13,"body":14,"_type":457,"_id":458,"_source":459,"_file":460,"_stem":461,"_extension":462},"\u002Ftechnology-blogs\u002Fzh\u002F2026-6-4","zh",false,"","MindSpore 推出动态图无图融合能力：为运行时实时融合提供新路径","自动算子融合是降低此类开销的关键手段。其目标是将分散的小算子组织为更大粒度的执行单元，减少下发次数、降低中间访存、提升执行效率。","2026-6-4","https:\u002F\u002Fobs-mindspore-file.obs.cn-north-4.myhuaweicloud.com\u002Ffile\u002F2024\u002F11\u002F28\u002F8e0e0150508a4c5ba4287fa3bec8ea3f.png","technology-blogs","技术解读",{"type":15,"children":16,"toc":439},"root",[17,25,31,35,46,51,56,63,68,73,93,98,104,109,116,121,126,149,155,160,183,190,195,201,206,211,218,223,246,251,257,262,285,290,295,302,307,313,318,323,328,335,340,346,351,357,367,372,378,383,391,396,401,406,412,417,422,427,432],{"type":18,"tag":19,"props":20,"children":22},"element","h1",{"id":21},"mindspore-推出动态图无图融合能力为运行时实时融合提供新路径",[23],{"type":24,"value":8},"text",{"type":18,"tag":26,"props":27,"children":28},"p",{},[29],{"type":24,"value":30},"在动态图训练与推理中，灵活性是其核心优势：网络沿真实执行路径逐步展开，shape 随输入实时变化。但灵活性的代价是运行时开销上升：算子以细粒度逐个下发，Host 侧需反复进行 shape 推导、显存申请与算子下发，Device 侧则执行大量碎片化 Kernel。模型越复杂、shape 越动态，开销越显著。",{"type":18,"tag":26,"props":32,"children":33},{},[34],{"type":24,"value":9},{"type":18,"tag":36,"props":37,"children":39},"div",{"style":38},"text-align: center;",[40],{"type":18,"tag":41,"props":42,"children":45},"img",{"src":43,"style":44,"alt":7},"\u002Fcategory\u002Finformation\u002Ftechnology-blogs\u002Fbanner\u002F2026-6-4\u002F1.jpg","display: block;margin: 0 auto;max-width:60%",[],{"type":18,"tag":26,"props":47,"children":48},{},[49],{"type":24,"value":50},"静态图场景下，融合依赖“先成图、再编译”的离线流程，相对容易落地。动态图中，框架拿到的并非预定义的完整计算图，而是一条随运行不断产生的算子流。若仍沿用整图编译思路，shape 变化即触发秒级重编译，而动态图算子下发为微秒级，两者时间尺度严重错位，传统方案难以直接适用。",{"type":18,"tag":26,"props":52,"children":53},{},[54],{"type":24,"value":55},"MindSpore 动态图“无图融合” 正是为此设计。它不依赖静态图缓存，而是在运行时沿真实算子流做增量捕捉与轻量构图，再交由底层实时编译组件完成融合编译与执行，使自动融合直接在动态图链路中生效。这里的“无图”并非内部没有图结构，而是不依赖传统静态图编译流程和整图缓存。",{"type":18,"tag":57,"props":58,"children":60},"h2",{"id":59},"_01-动态图融合为何困难",[61],{"type":24,"value":62},"01 动态图融合为何困难",{"type":18,"tag":26,"props":64,"children":65},{},[66],{"type":24,"value":67},"静态图和动态图都希望减少算子碎片、提升执行局部性，但它们面对的问题并不相同。静态图在编译阶段就拿到了稳定计算图，可以围绕整图做融合改写和代码生成；动态图拿到的则是一条持续出现的算子流，真实执行路径、真实输入 shape，甚至真实分支选择，往往都要等到运行时才能确定。",{"type":18,"tag":26,"props":69,"children":70},{},[71],{"type":24,"value":72},"进入 Ascend NPU 的动态 shape 场景后，这个问题会进一步放大，核心挑战主要有三类：",{"type":18,"tag":74,"props":75,"children":76},"ul",{},[77,83,88],{"type":18,"tag":78,"props":79,"children":80},"li",{},[81],{"type":24,"value":82},"多层级 local memory：算子必须根据实际 shape 做 tiling 切分，切分策略直接影响搬运开销和计算效率。",{"type":18,"tag":78,"props":84,"children":85},{},[86],{"type":24,"value":87},"SIMD 对齐约束：实际实现通常要区分 body 块和 tail 块，动态 shape 会让实现分支快速增多。",{"type":18,"tag":78,"props":89,"children":90},{},[91],{"type":24,"value":92},"算子结构可变性：例如 Add 的 broadcast，在不同 shape 组合下可能对应不同的底层执行结构。",{"type":18,"tag":26,"props":94,"children":95},{},[96],{"type":24,"value":97},"因此，动态图融合的难点不仅在于“没有静态图”，更在于算子生成、融合决策和执行路径必须随真实运行实例动态变化。若仍沿用秒级编译链路，图缓存命中率、重复编译开销与端到端时延将很快成为瓶颈。",{"type":18,"tag":57,"props":99,"children":101},{"id":100},"_02-mindspore-动态图无图融合的核心机制",[102],{"type":24,"value":103},"02 MindSpore 动态图无图融合的核心机制",{"type":18,"tag":26,"props":105,"children":106},{},[107],{"type":24,"value":108},"MindSpore 动态图本身采用多级流水执行机制。无图融合并不是另起一套运行时，而是精准接入到这条既有流水线上。",{"type":18,"tag":110,"props":111,"children":113},"h3",{"id":112},"mindspore-侧运行时捕捉与增量构图",[114],{"type":24,"value":115},"MindSpore 侧：运行时捕捉与增量构图",{"type":18,"tag":26,"props":117,"children":118},{},[119],{"type":24,"value":120},"在动态图运行过程中，MindSpore 会在 FrontendTask 等关键阶段，对满足条件的 Ascend 算子进行捕捉，并逐步组织成一张轻量级的运行时融合图。这个过程不是离线分析，而是顺着真实执行中的算子流边捕捉、边判断、边决定是否继续融合。",{"type":18,"tag":26,"props":122,"children":123},{},[124],{"type":24,"value":125},"当遇到以下时机时，MindSpore 会触发一次 flush，把当前运行时融合图交给后续阶段继续处理：",{"type":18,"tag":74,"props":127,"children":128},{},[129,134,139,144],{"type":18,"tag":78,"props":130,"children":131},{},[132],{"type":24,"value":133},"遇到当前不支持融合的算子，需要在该算子自己的 DeviceTask 下发前先 flush。",{"type":18,"tag":78,"props":135,"children":136},{},[137],{"type":24,"value":138},"遇到明确的融合边界，例如当前 Reduce 类算子主要支持前向融合。",{"type":18,"tag":78,"props":140,"children":141},{},[142],{"type":24,"value":143},"遇到值依赖或同步接口，例如 asnumpy()、print。",{"type":18,"tag":78,"props":145,"children":146},{},[147],{"type":24,"value":148},"遇到 stream 变化或显式同步边界。",{"type":18,"tag":110,"props":150,"children":152},{"id":151},"dvm-侧继续切图tiling字节码生成与执行",[153],{"type":24,"value":154},"DVM 侧：继续切图、Tiling、字节码生成与执行",{"type":18,"tag":26,"props":156,"children":157},{},[158],{"type":24,"value":159},"MindSpore 侧捕捉到的是一张运行时融合图，但它未必适合整体直接下沉为一个执行子图。进入 DVM 后，会结合当前支持的融合规则与编译能力继续切图，并完成：",{"type":18,"tag":74,"props":161,"children":162},{},[163,168,173,178],{"type":18,"tag":78,"props":164,"children":165},{},[166],{"type":24,"value":167},"基于实际 shape 和硬件约束做 Tile 切分。",{"type":18,"tag":78,"props":169,"children":170},{},[171],{"type":24,"value":172},"判断哪些子结构适合融合到同一个执行子图。",{"type":18,"tag":78,"props":174,"children":175},{},[176],{"type":24,"value":177},"为每个执行子图生成可执行字节码。",{"type":18,"tag":78,"props":179,"children":180},{},[181],{"type":24,"value":182},"在 Device 侧由虚拟机内核解释执行。",{"type":18,"tag":36,"props":184,"children":185},{"style":38},[186],{"type":18,"tag":41,"props":187,"children":189},{"src":188,"style":44,"alt":7},"\u002Fcategory\u002Finformation\u002Ftechnology-blogs\u002Fbanner\u002F2026-6-4\u002F2.jpg",[],{"type":18,"tag":26,"props":191,"children":192},{},[193],{"type":24,"value":194},"也就是说，MindSpore 侧负责把动态图里的算子流捕捉起来，DVM 侧负责把它继续切成一个或多个执行子图；每个执行子图最终对应一个 DVM 执行单元，也可理解为一个融合 Kernel。",{"type":18,"tag":57,"props":196,"children":198},{"id":197},"_03-真实案例看懂无图融合的执行链路",[199],{"type":24,"value":200},"03 真实案例：看懂无图融合的执行链路",{"type":18,"tag":26,"props":202,"children":203},{},[204],{"type":24,"value":205},"以 Add + Abs 为例，不开启无图融合时，Add 和 Abs 会分别完成设备任务与下发，最终对应两个独立 Kernel。",{"type":18,"tag":26,"props":207,"children":208},{},[209],{"type":24,"value":210},"开启无图融合后，这两个算子会先在 MindSpore 侧形成同一个运行时融合图，随后由 DVM 继续完成 Tile 切分和字节码生成；在这个示例里，最终只形成一个执行子图，对应一个 DVM 执行单元。",{"type":18,"tag":36,"props":212,"children":213},{"style":38},[214],{"type":18,"tag":41,"props":215,"children":217},{"src":216,"style":44,"alt":7},"\u002Fcategory\u002Finformation\u002Ftechnology-blogs\u002Fbanner\u002F2026-6-4\u002F3.jpg",[],{"type":18,"tag":26,"props":219,"children":220},{},[221],{"type":24,"value":222},"这个例子说明了几件事：",{"type":18,"tag":74,"props":224,"children":225},{},[226,231,236,241],{"type":18,"tag":78,"props":227,"children":228},{},[229],{"type":24,"value":230},"动态图算子流如何进入运行时捕捉窗口。",{"type":18,"tag":78,"props":232,"children":233},{},[234],{"type":24,"value":235},"运行时融合图如何继续下沉为 DVM 可处理的执行子图。",{"type":18,"tag":78,"props":237,"children":238},{},[239],{"type":24,"value":240},"Tile 切分和字节码生成如何把图结构落实为执行单元。",{"type":18,"tag":78,"props":242,"children":243},{},[244],{"type":24,"value":245},"为何“两次独立下发”最终可收敛成“一次融合执行”。",{"type":18,"tag":26,"props":247,"children":248},{},[249],{"type":24,"value":250},"也就是说，这条链路已经从“两个独立算子”变成了“一个运行时融合图 + 一个 DVM 执行单元”，同时仍保持动态图逐算子执行语义。",{"type":18,"tag":57,"props":252,"children":254},{"id":253},"_04-当前能力边界与-cv-融合扩展",[255],{"type":24,"value":256},"04 当前能力边界与 CV 融合扩展",{"type":18,"tag":26,"props":258,"children":259},{},[260],{"type":24,"value":261},"动态图无图融合不只是覆盖最简单的单算子替换，而是已经具备一套明确的融合规则与场景边界。\n当前能力可以概括为：",{"type":18,"tag":74,"props":263,"children":264},{},[265,270,275,280],{"type":18,"tag":78,"props":266,"children":267},{},[268],{"type":24,"value":269},"Elemwise 类算子可相互融合：例如 Abs、Add、Mul、Sub、Div、Exp、Sqrt、Sigmoid、SiLU、GeLU 等。",{"type":18,"tag":78,"props":271,"children":272},{},[273],{"type":24,"value":274},"Reduce 类算子支持前向融合：例如 SumExt。",{"type":18,"tag":78,"props":276,"children":277},{},[278],{"type":24,"value":279},"Inplace 类算子支持在对应边界内融合。",{"type":18,"tag":78,"props":281,"children":282},{},[283],{"type":24,"value":284},"部分 BatchNorm 相关算子已接入无图融合路径。",{"type":18,"tag":26,"props":286,"children":287},{},[288],{"type":24,"value":289},"此外，MatMul、BatchMatMul 等算子已具备接入路径，但默认不自动开启，需通过白名单显式使能。",{"type":18,"tag":26,"props":291,"children":292},{},[293],{"type":24,"value":294},"在此基础上，更高价值的扩展方向之一，是 CV 融合。这里的 C 指 MatMul 类算子，V 指 Elemwise 类算子。",{"type":18,"tag":36,"props":296,"children":297},{"style":38},[298],{"type":18,"tag":41,"props":299,"children":301},{"src":300,"style":44,"alt":7},"\u002Fcategory\u002Finformation\u002Ftechnology-blogs\u002Fbanner\u002F2026-6-4\u002F4.jpg",[],{"type":18,"tag":26,"props":303,"children":304},{},[305],{"type":24,"value":306},"以 MatMul + Add、MatMul + Add + 激活 这类链路为例，它们在训练和推理中都很常见。CV 融合扩展要解决的，就是让 MatMul 的结果继续向后与 Elemwise 结构协同融合。这说明无图融合并不局限于轻量 Elemwise，而是在向更复杂、更贴近真实网络热点路径的场景推进。",{"type":18,"tag":57,"props":308,"children":310},{"id":309},"_05-效果验证与性能数据",[311],{"type":24,"value":312},"05 效果验证与性能数据",{"type":18,"tag":26,"props":314,"children":315},{},[316],{"type":24,"value":317},"无图融合的收益可以从两个层面观察：一是整网端到端性能，二是典型融合链路在 Device 侧的执行收益。",{"type":18,"tag":26,"props":319,"children":320},{},[321],{"type":24,"value":322},"在已验证的训练场景中，开启无图融合后，整网端到端性能收益约为 1%~5%。这类数据覆盖完整训练流程中的 Host 调度、运行时管理和 Device 执行开销，更适合衡量真实网络的最终收益。",{"type":18,"tag":26,"props":324,"children":325},{},[326],{"type":24,"value":327},"下面给出两个已验证场景的 Device 侧算子执行耗时，收益会受到 shape、dtype 和算子组合影响：",{"type":18,"tag":36,"props":329,"children":330},{"style":38},[331],{"type":18,"tag":41,"props":332,"children":334},{"src":333,"style":44,"alt":7},"\u002Fcategory\u002Finformation\u002Ftechnology-blogs\u002Fbanner\u002F2026-6-4\u002F5.jpg",[],{"type":18,"tag":26,"props":336,"children":337},{},[338],{"type":24,"value":339},"这组数据说明，典型 Elemwise 与 CV 融合链路都能获得实质性收益。",{"type":18,"tag":57,"props":341,"children":343},{"id":342},"_06-如何开启无图融合",[344],{"type":24,"value":345},"06 如何开启无图融合",{"type":18,"tag":26,"props":347,"children":348},{},[349],{"type":24,"value":350},"通过环境变量 MS_DEV_PYNATIVE_FUSION_FLAGS 即可开启无图融合。",{"type":18,"tag":110,"props":352,"children":354},{"id":353},"_1开启基础无图融合能力",[355],{"type":24,"value":356},"1、开启基础无图融合能力",{"type":18,"tag":358,"props":359,"children":361},"pre",{"code":360},"export MS_DEV_PYNATIVE_FUSION_FLAGS=\"--opt_level=1\"\n",[362],{"type":18,"tag":363,"props":364,"children":365},"code",{"__ignoreMap":7},[366],{"type":24,"value":360},{"type":18,"tag":26,"props":368,"children":369},{},[370],{"type":24,"value":371},"默认主要覆盖 elemwise、reduce、inplace 等类别算子，以及部分已默认接入的相关算子。",{"type":18,"tag":110,"props":373,"children":375},{"id":374},"_2额外开启-matmul-类算子的无图融合",[376],{"type":24,"value":377},"2、额外开启 MatMul 类算子的无图融合",{"type":18,"tag":26,"props":379,"children":380},{},[381],{"type":24,"value":382},"MatMul、BatchMatMul 等算子默认不自动参与无图融合。如果希望它们也接入无图融合流程，可通过 --enable_ops 增量开启：",{"type":18,"tag":358,"props":384,"children":386},{"code":385},"export MS_DEV_PYNATIVE_FUSION_FLAGS=\"--opt_level=1 --enable_ops=MatMul,BatchMatMul\"\n",[387],{"type":18,"tag":363,"props":388,"children":389},{"__ignoreMap":7},[390],{"type":24,"value":385},{"type":18,"tag":26,"props":392,"children":393},{},[394],{"type":24,"value":395},"其中：",{"type":18,"tag":26,"props":397,"children":398},{},[399],{"type":24,"value":400},"--opt_level=1：开启动态图无图融合能力。",{"type":18,"tag":26,"props":402,"children":403},{},[404],{"type":24,"value":405},"--enable_ops=MatMul,BatchMatMul：额外打开默认不自动融合的 MatMul 类算子。",{"type":18,"tag":57,"props":407,"children":409},{"id":408},"_07-开源与参与",[410],{"type":24,"value":411},"07 开源与参与",{"type":18,"tag":26,"props":413,"children":414},{},[415],{"type":24,"value":416},"动态图无图融合的价值，不只是新增了一个优化开关，而是让 MindSpore 在动态图场景下形成了不依赖静态图缓存的原生自动融合能力。",{"type":18,"tag":26,"props":418,"children":419},{},[420],{"type":24,"value":421},"借助 DVM 的实时编译能力，MindSpore 把算子捕捉、运行时构图、实时字节码生成和虚拟机执行串成了一条完整链路，让自动融合不再只是静态图时代的专属能力。后续，随着更多高价值算子和融合模式持续接入，这条能力路线还会继续向更复杂、更贴近真实网络热点路径的场景推进。",{"type":18,"tag":26,"props":423,"children":424},{},[425],{"type":24,"value":426},"我们欢迎大家在昇腾NPU上的动态图训练场景中尝试使用无图融合能力，也欢迎在实际网络中反馈效果与建议，帮助我们一起把这条线路打磨得更实用、更完整。",{"type":18,"tag":26,"props":428,"children":429},{},[430],{"type":24,"value":431},"MindSpore是一个开源深度学习框架，动态图无图融合能力会在开源代码中持续推进，欢迎大家加入MindSpore开源社区，通过如下方式参与开发共建：",{"type":18,"tag":36,"props":433,"children":434},{"style":38},[435],{"type":18,"tag":41,"props":436,"children":438},{"src":437,"style":44,"alt":7},"\u002Fcategory\u002Finformation\u002Ftechnology-blogs\u002Fbanner\u002F2026-6-4\u002F6.jpg",[],{"title":7,"searchDepth":440,"depth":440,"links":441},4,[442,444,449,450,451,452,456],{"id":59,"depth":443,"text":62},2,{"id":100,"depth":443,"text":103,"children":445},[446,448],{"id":112,"depth":447,"text":115},3,{"id":151,"depth":447,"text":154},{"id":197,"depth":443,"text":200},{"id":253,"depth":443,"text":256},{"id":309,"depth":443,"text":312},{"id":342,"depth":443,"text":345,"children":453},[454,455],{"id":353,"depth":447,"text":356},{"id":374,"depth":447,"text":377},{"id":408,"depth":443,"text":411},"markdown","content:technology-blogs:zh:2026-6-4.md","content","technology-blogs\u002Fzh\u002F2026-6-4.md","technology-blogs\u002Fzh\u002F2026-6-4","md",1781776942700]