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

CANN预填充微批次双流

案例:Prefill Micro-Batch 双流流水

【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体,本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills

概述

这个案例解决的是 prefill 阶段“计算和通信串行,通信空洞明显”的问题。做法是把输入拆成两个 micro-batch,让两条流分别承载不同 micro-batch,并通过record_event/wait_event把 dispatch、expert、combine 等阶段流水化,最适合计算和通信都比较重的 prefill 场景。

背景与问题

prefill 常常是计算 bound,但在大模型的 EP 场景里,MoE 的 dispatch 和 combine 也会带来显著通信开销。如果这些阶段完全串行,芯片在等待通信或等待计算时都会出现空洞,造成端到端吞吐下降。

把 prefill 切成两个 micro-batch 后,虽然单次 shape 会变化,但如果计算和通信的线性度足够好,就能用一条流做当前 micro-batch 的计算,用另一条流穿插上一个或下一个 micro-batch 的通信,从而实现通信隐藏。

核心思路

  • 创建主流cur_stream和副流stream1
  • micro-batch 0 和 micro-batch 1 在不同流上生成输入。
  • Attention、gate、dispatch、expert、combine、finalize 不再线性执行,而是借助 event 形成流水。
  • 这种案例的重点不是“简单双流”,而是“多阶段事件编排”。

执行编排图

关键代码

第一段代码是双流入口,最核心的是先创建副流:

self.micro_batch_mode = MicroBatchMode(...) if self.micro_batch_mode != MicroBatchMode.DISABLE: self.stream1 = torch.npu.Stream()

第二段代码展示最基础的两条流分别处理两个 micro-batch:

cur_stream = torch.npu.current_stream() with torch.npu.stream(cur_stream): hidden_states_mb0, residual_mb0, _, cos_sin_mb0, slot_mapping_mb0, actual_seq_lengths_kv_mb0 = \ self.prepare_inputs_for_layer(input_ids_mb0, kv_len_mb0, position_ids, actual_seq_lengths_kv_mb0, is_prefill) with torch.npu.stream(self.stream1): hidden_states_mb1, residual_mb1, _, cos_sin_mb1, slot_mapping_mb1, actual_seq_lengths_kv_mb1 = \ self.prepare_inputs_for_layer(input_ids_mb1, kv_len_mb1, position_ids, actual_seq_lengths_kv_mb1, is_prefill)

第三段代码展示事件驱动的 dispatch/expert/combine 流水:

event_routing_dispatch_mb0 = cur_stream.record_event() with torch.npu.stream(self.stream1): self.stream1.wait_event(event_routing_dispatch_mb0) tokens_per_expert_group_mb0, gathered_tokens_mb0, gathered_pertoken_scale_mb0, input_splits_mb0, \ output_splits_mb0 = decode_layer.forward_dispatch_double_routing( tokens_per_expert_mb0, expanded_x_mb0, pertoken_scale_mb0 ) event_dispatch_expert_mb0 = self.stream1.record_event() cur_stream.wait_event(event_dispatch_expert_mb0) new_x_mb0 = decode_layer.forward_expert( gathered_tokens_mb0, tokens_per_expert_group_mb0, gathered_pertoken_scale_mb0 ) event_expert_combine_mb0 = cur_stream.record_event()

复用参考

  • 代表实现:DeepSeek-R1 prefill。
  • 相似实现:其他 EP + micro-batch 场景可参考其事件编排方式。
  • 特化实现:SP-TP-EP 与 DP-EP 可能采用不同流水版本。

注意事项

  • shape 切半后如果算子性能显著劣化,双流可能收益变差。
  • event 顺序稍有错误就可能造成死等、早读或精度异常。
  • 双流只是手段,真正关键是 dispatch、expert、combine 的排列顺序。

关键词

torch.npu.Streamrecord_eventwait_eventmicro-batchdispatchcombine

【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体,本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills

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

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

相关文章:

  • 2026年比较好的大连超精密轴承/高端精密轴承/精密轴承优质供应商推荐 - 行业平台推荐
  • CANN/asc-devkit MrgSort合并排序函数
  • 2026年4月彩钢瓦除锈源头厂家口碑推荐,图书馆防水维修/钢结构防水堵漏/混凝土防水补漏,彩钢瓦除锈源头厂家哪家靠谱 - 品牌推荐师
  • Lusca CSP策略完全指南:构建安全的内容安全策略
  • 大型项目批量重构实战:OpenAI Codex CLI 云端沙盒的 7 步长任务工程方案
  • 深入解析Arm Cortex-A53 Cache架构:从原理到性能优化实战
  • 2026年口碑好的长兴智能电动脚踏板/长兴带灯电动脚踏板/自动伸缩智能电动脚踏板/长兴电动脚踏板精选厂家推荐 - 行业平台推荐
  • Knot高级技巧:局域网设备抓包和跨设备数据同步
  • 加密货币交易的AI革命:awesome-deep-trading中的区块链量化策略终极指南 [特殊字符]
  • 2026年知名的精密轴承/双列短圆柱精密轴承主流厂家对比评测 - 品牌宣传支持者
  • PolyHook 2.0导入导出表钩子:IatHook和EatHook的10个核心技巧
  • WenQuanYi Micro Hei 开源字体终极指南:解决嵌入式设备中文显示难题
  • CANN/cann-bench稀疏注意力算子
  • 2026年热门的商务车MPV侧滑电动踏板/不降底盘侧滑电动踏板推荐厂家精选 - 品牌宣传支持者
  • Spring Cloud Sleuth 迁移指南:从 3.1 到 Micrometer Tracing 的终极路径
  • DPM-Solver代码架构解析:从模型包装器到求解器核心
  • AI Agent Harness Engineering 后端架构选型:微服务 vs 单体架构的取舍
  • 倍仕得电气科技(杭州)股份有限公司2026通用工业连接器厂商优选:圆形/M12/储能/流体/传感器连接器厂家甄选倍仕得电 - 栗子测评
  • Keil C51字符数组初始化错误解析与解决方案
  • 紧急预警:Perplexity即将下线课程语义模糊匹配模式!最后48小时掌握高精度查询黄金语法
  • CANN/cannbot-skills模型推理融合算子优化
  • Knot项目实战:从零构建一个完整的iOS抓包工具
  • TinyExpr快速入门:5分钟学会在C语言中解析和计算数学表达式
  • Knot部署指南:真机调试与App Store上架完整流程
  • CANN稀疏FlashAttention反向算子
  • Keil开发环境下的CANopen与DeviceNet协议实现指南
  • CANN/ops-blas Ssyr算子实现
  • NCE外汇:服务体验与平台稳定性的协同提升
  • svelte-preprocess 性能优化最佳实践:提升构建速度的10个技巧
  • CANN社区Sign算子优化设计