多流与控核 API 路由【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills本文件用于把“执行路径 / 问题类型”映射到上游文档和推荐 API。上游文档入口路径先读文档再读文档适用场景Ascend IR / GE 图模式cann-recipes-infer/docs/zh/ascend_ir/features/advanced/multi_stream.mdcann-recipes-infer/docs/zh/ascend_ir/features/advanced/limit_cores.md图内多流表达、npu_stream_switch、npu_wait_tensor、GE 图模式控核npugraph_ex / aclgraphcann-recipes-infer/docs/zh/npugraph_ex/advanced/multi_stream.mdcann-recipes-infer/docs/zh/npugraph_ex/advanced/limit_cores.mdtorch.npu.Stream/Event/record_stream、Stream 级控核路径要点Ascend IR / GE 图模式多流主要面向 Cube 资源未完全使用的场景若 Cube 已吃满不要默认开启多流。仅适用于 GE 图模式场景。优先接口是npu_stream_switch和npu_wait_tensor。控核分两层torchair.scope.limit_core_num是算子级config.ge_config.aicore_num是全局 session 级算子级优先级更高。静态 shape 下不要和enable_single_stream混用也不要直接在 SuperKernel 内手搓多流。动态 shape 默认单流如果依赖ENABLE_DYNAMIC_SHAPE_MULTI_STREAM1开启多流脚本内显式多流表达优先级更高。npugraph_ex / aclgraph多流主要面向 aclgraph 间资源并发官方路径围绕torch.npu.Stream、torch.npu.stream、torch.npu.Event、tensor.record_stream。record_stream只在短生命周期 tensor 会被其他流继续使用时才需要补权重等长生命周期对象一般不需要。控核是 Stream 级接口为torch.npu.npugraph_ex.scope.limit_core_num。仅 Ascend C 算子支持控核micro-batch 多流场景如果夹杂不支持控核的算子收益可能下降严重时可能卡死。配置结果优先通过 profiler 结果中的kernel_details.csv查看核使用情况。先判执行路径当前场景推荐 API 风格首选 API先读文档eager / patch 改造显式流对象torch.npu.Stream()、record_event()、wait_event()、wait_stream()、record_stream()先看仓库案例如果要对齐显式 stream 语义参考cann-recipes-infer/docs/zh/npugraph_ex/advanced/multi_stream.mdge_graph/ TorchAir 图内多流图内 scopenpu_stream_switch、npu_wait_tensor先看cann-recipes-infer/docs/zh/ascend_ir/features/advanced/multi_stream.md需要控核时再看cann-recipes-infer/docs/zh/ascend_ir/features/advanced/limit_cores.mdnpugraph_ex/ aclgraph显式 stream Eventtorch.npu.Stream()、torch.npu.stream()、torch.npu.Event()、record_stream()先看cann-recipes-infer/docs/zh/npugraph_ex/advanced/multi_stream.md需要控核时再看cann-recipes-infer/docs/zh/npugraph_ex/advanced/limit_cores.md再判问题类型问题类型推荐 API什么时候用注意事项先读文档需要把一段计算切到副流torch.npu.Stream()或npu_stream_switch已确认两段路径没有直接data依赖只在后面汇合先明确汇合点再决定是补Event、wait_stream还是npu_wait_tensor对应路径的multi_stream.md需要显式控制跨流时序Ascend IR 路径优先npu_wait_tensor显式 stream 路径优先record_event()/wait_event()已有 tagged event 风格时沿用npu_record_tagged_stream/npu_tagged_event_wait两条流之间存在控制依赖但后继不直接吃前驱输出 tensor不要为了“统一风格”强行把已有 tagged event 代码改写成另一套语义对应路径的multi_stream.md需要延长 tensor 生命周期record_stream()短生命周期 tensor 会在别的流继续使用主要看 aclgraph / eager / capture 阶段权重等长生命周期对象一般不需要cann-recipes-infer/docs/zh/npugraph_ex/advanced/multi_stream.mdoverlap 已成立但一条流明显拖尾limit_core_num已看到两条流资源争抢或一条流长期占满 CoreAscend IR 是算子级 / 全局级npugraph_ex 是 Stream 级不要混着理解对应路径的limit_cores.md需要进一步查看或设置 stream 资源限制torch_npu.get_stream_limit/torch_npu.set_stream_limit已进入控核或 stream 资源调优阶段这不是第一手多流 API通常在资源调优阶段再用本文件中的“上游文档入口” 本 skill 案例需要扩大计算窗口掩盖权重搬运torch_npu.npu_prefetchoverlap 正确但仍有访存或带宽空洞可被前序轻算子掩盖只在前序算子不明显抢带宽时使用常和多流 控核联动本 skill 案例推荐决策顺序先确定当前是 eager / patch 还是 graph / TorchAir。先选一套主 API 路径不要混着写。先把依赖和同步做对再确认是否真的有 overlap。只有在 overlap 正确但拖尾明显时才进入控核、stream limit、预取调优。常见误区不要在 eager 路径里照搬 TorchAir 的 tagged event 风格。不要把limit_core_num当成默认步骤它只解决资源分配问题不解决依赖错误。不要用npu_prefetch掩盖一个本来就不该并行的链路先证明链路没有错误依赖。不要在 aclgraph / eager 路径里省略record_stream()的生命周期判断只切流不管内存同样会出错。npu_tagged_event_record这类高级同步原语优先跟随仓库现有案例代码不要脱离上下文自己猜语义。【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考