【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skillsname: model-infer-multi-stream description: 基于 PyTorch 框架的昇腾 NPU 模型推理多流整网优化技能。用于分析和实施模型的多流优化、双流、stream overlap、控核与 TorchAir 多流改造。先做整网模块 DAG 与模块间并行性分析再做每个模块的算子级分析、开发调试和验收。触发场景包括多流优化、双流、stream overlap、控核、整网 DAG、模块拆解、NPU 多流、TorchAir 多流、limit_core_num、多流改造调试。 user-invocable: trueNPU 多流整网优化技能面向本仓库的 NPU 多流整网优化任务按“分析 → 开发调试 → 验收”推进。优先参考仓库内已有案例、代码模式和官方 API 索引。概述本技能解决的是整网多流优化。工作主线固定如下先拆整网模块画模块级 DAG判断模块与模块哪些能并行。再对每个模块拆算子画模块内算子 DAG判断模块内哪些算子能并行。在依赖关系明确后再做多流开发、调试和验收。分析和实施结果统一落到multi-stream-analysis/network_or_case_name.md报告结构使用references/report-template.md。重要原则先整网后局部先回答整网主路径和模块间并行性再进入模块内算子。模块级目标明确模块拆解的目标是判断模块与模块哪些可并行。每个模块都要下钻第二层要对每个模块都补齐算子清单、算子 DAG 和模块内并行性结论。同步必须显式多流改造必须有清晰的event/wait/wait_stream/wait_tensor关系。开关必须可关闭多流路径要保留 enable 开关和原始回退路径方便调试与验收。先证明正确再追性能先验证依赖、功能和精度再看 overlap 和时延收益。overlap 不等于收益出现拖尾、资源争抢、host bound、shape 劣化时要继续评估控核、和图模式限制。不要混抄案例必须先确定当前模型的执行模式再选一套主 API 路径不要把 eager 和 graph 风格混着套。调试优化最优编排优化点分流编排不唯一调试时要多尝试不同的编排选择性能最优方案。官方约束优先看上游 docs/zh先读对应路径的multi_stream.md只有在 overlap 正确但出现资源争抢、拖尾或卡死风险时再读同路径的limit_cores.md。开发与调试穿插进行开发与调试穿插进行关注算子/模块是否在对应流上cube/vector的利用率核数/占用时间。使用profiler agent调试当profiler agent存在时使用profiler agent确认性能收益和资源使用情况。当profiler agent不存在时自行加打印判断。执行路径定界开始前先确认当前代码走哪条多流路径torchair.CompilerConfig()torchair.get_npu_backend() GE 图模式走 Ascend IR 路径。先看cann-recipes-infer/docs/zh/ascend_ir/features/advanced/multi_stream.md需要控核时再看cann-recipes-infer/docs/zh/ascend_ir/features/advanced/limit_cores.md。torch.compile(..., backendnpugraph_ex)走 npugraph_ex / aclgraph 路径。先看cann-recipes-infer/docs/zh/npugraph_ex/advanced/multi_stream.md需要控核时再看cann-recipes-infer/docs/zh/npugraph_ex/advanced/limit_cores.md。不要把 Ascend IR 的图内 API 和 aclgraph 的显式 stream API 混写到同一套实现里。GE 图模式通常通过CompilerConfig和get_npu_backend()定界不要把torch.compile(mode...)当成当前主入口写法。npugraph_ex路径本质上是显式 stream / event / 生命周期管理如果代码已经是这套风格优先顺着现有实现继续不要强改成 TorchAir 图内表达。工作流程第一步分析profiler agent当profiler agent存在时可以通过profiler agent获取以下信息提出模块拆解方案向profiler agent获取模块内的算子序列及对应代码片段先读取references/report-template.md在cann-recipes-infer/docs/common/multi-stream-analysis/model_name下创建或更新结果文件。按references/module-decomposition-spec.md完成整网模块拆解确定分析阶段是prefill还是decode产出整网模块清单、依赖清单、Mermaid 模块 DAG输出模块级并行性结论统一使用“主串行链 / 可并行组 / 待验证组 / 建议流分组”对每个模块继续做算子级拆解产出模块内算子清单、依赖清单、Mermaid 算子 DAG输出模块内并行性结论仍使用分组式描述可以根据模型结构参考案例选案例时先读examples/README.md按其中的“快速选型表”进入最接近的模式。第二步开发先根据当前使用的图模式后端确定适配路径使用torchair.CompilerConfig()torchair.get_npu_backend()走 Ascend IR / GE 图模式路径使用torch.compile(..., backendnpugraph_ex)走npugraph_ex/ aclgraph 路径开启多流表达Ascend IR / GE 图模式优先用npu_stream_switchnpugraph_ex/ aclgraph优先用torch.npu.Stream()torch.npu.stream()添加时序控制Ascend IR / GE 图模式优先用npu_wait_tensor已有 tagged event 风格时沿用npu_tagged_event_*npugraph_ex/ aclgraph优先用torch.npu.Event()、record_event()、wait_event()显式 stream 路径要单独检查内存生命周期如果短生命周期 tensor 会被其他 stream 继续消费补record_stream()模型权重、常驻 cache 这类长生命周期对象一般不需要补优先做最小可验证 overlap只改一个明确的并行点先补同步再扩大并行窗口先保留原路径和 enable 开关若 overlap 已成立但仍有明显拖尾再评估Ascend IR / GE 图模式limit_core_num或全局config.ge_config.aicore_numnpugraph_ex/ aclgraphtorch.npu.npugraph_ex.scope.limit_core_numset_stream_limit/get_stream_limit在放大改动前先做一次最小验证对比单流和多流 baseline用 profiler 确认是否真的出现 overlap而不是逻辑上分流但执行仍串行所有开发决策回写结果 md写清流分组、同步点、开关、回退路径和预期收益。第三步调试profiler agent当profiler agent存在时可以通过profiler agent获取以下信息获取某模块的算子序列和算子对应耗时获取某个算子的详细运行信息cube/vector占用核数MTE2/MTE3/Cube/Vector耗时等获取某个模块每个流的运行情况获取某个模块的运行耗时 确保调试过程中及时从profile数据获取确定信息不靠猜。如果多流编排方式不唯一多尝试不同的编排方式选择性能最优的方案。调试时按下面 4 类问题分开处理不要混在一起排查依赖错误 / 同步错误重点检查事件记录、等待顺序、跨流汇合点、共享状态写入次序典型现象读到未完成结果、死等、结果偶发错误精度或功能异常先对比优化前基线再按prefill/decode → 模块 → 算子缩小范围判断是否是多流引入的状态时序问题而不是算子本身问题性能无收益重点看 shape 变化、task 数量增加、host bound、带宽争抢、流间资源抢占、拖尾先判断是否是 Cube 资源本来就已基本吃满再决定是否继续评估控核或缩小 overlap 范围图模式 / runtime 限制重点看 graph break、图模式 API 约束、stream 语义差异、运行时不支持graph 场景优先按 TorchAir 路径排查不要回退成 eager 思路硬套aclgraph 生命周期错误重点检查短生命周期 tensor 是否跨流继续使用、是否遗漏record_stream()典型现象结果偶发错误、数据踩踏、段错误或异常内存问题第四步验收验收必须至少覆盖下面 4 类并把结果回写报告功能验收多流 enable 前后输出一致开关关闭后原路径可正常运行同步验收汇合点前后无缺失等待共享状态、KVCache、通信结果没有读写乱序性能验收记录优化前后关键时延、吞吐或单步耗时确认确实有 overlap 和时延改善确认优化点之外的算子或模块耗时没有劣化如果无收益要明确是实现问题还是场景不适合Profile 验收确认确实存在 overlap而不是逻辑上分流但执行上仍串行确认关键拖尾是否已缩短是否出现新的空洞或资源争抢API 选型规则eager / patch 风格优先使用torch.npu.Stream()record_event()wait_event()wait_stream()适用场景patch 形态改造现有代码已经显式使用torch.npu.current_stream()runtime 不走 TorchAir 图内多流表达graph / TorchAir 风格优先使用npu_stream_switchnpu_wait_tensornpu_record_tagged_streamnpu_tagged_event_wait适用场景ge_graph/ TorchAir 多流表达代码已经显式使用 scope / tagged event 风格需要把同步关系表达在图内拖尾与资源问题出现“已 overlap 但收益不稳定”时再评估limit_core_numtorch_npu.set_stream_limittorch_npu.get_stream_limit使用顺序先确认依赖和 overlap 正确再看是否存在拖尾或资源争抢最后再引入控核、stream limit 或预取详细路由见references/api-routing.md。实施检查清单已确认当前实现走的是 Ascend IR / GE 还是npugraph_ex已确认存在真实可并行分支而不是把串行链路硬拆成多流已把跨流依赖显式表达清楚而不是依赖隐式同步显式 stream 路径里短生命周期 tensor 的跨流使用已检查record_stream()overlap 已经成立后才继续评估控核、stream limit 或预取已通过 baseline 和 profiler 确认优化方向成立参考文档索引按需读取。整网模块拆解规范references/module-decomposition-spec.md文档与 API 路由references/api-routing.md案例总入口与选型表examples/README.md固定报告模板references/report-template.md【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考