
演讲嘉宾|郑加利
编辑 |Kitty
策划 |QCon 全球软件开发大会
大模型的训练过程极其复杂,不仅涵盖了众多技术层面,同时也面临着巨大的挑战。面对巨大规模的模型参数量与计算量,单靠一张计算卡难以满足需求,必须依赖多张计算卡进行并行计算。然而大规模集群计算带来的复杂性显著增加,在一定程度上拖慢了模型训练的速度。
在 2025 年 InfoQ 举办的 QCon 全球软件开发大会 上,华为工程师郑加利分享了《昇腾 MindSpeed:分布式训练加速库的创新实践与突破》,他介绍了昇腾 MindSpeed 分布式训练加速库通过在计算、通信以及显存等多个维度上的优化措施,来加速模型的训练过程,有效提升了训练效率,为大模型的训练提供了强有力支持的实践案例。
预告:将于 2026 年 4 月 16 - 18 召开的 QCon 北京站策划了「AI 原生基础设施」专题,重点交流探讨如何构建 AI 原生基础设施,包括业界容器 / Serverless 等云原生基础设施如何朝 AI 演进,以及如何利用一些新兴分布式技术构建 AI 原生基础设施等等。如果你也有相关方向案例想要分享,欢迎提交至 https://jinshuju.com/f/Cu32l5。
以下是演讲实录(经 InfoQ 进行不改变原意的编辑整理)。
大模型训练的趋势与挑战
从 ChatGPT 开始,模型的规模越来越大,从千亿参数的稠密模型一直到万亿参数的稀疏模型,越来越大的参数量对算力的需求也是越来越大的。以 GPT-3 为例,训练 300B 的 tokens,3000 张卡差不多要 10 天左右;到了 GPT-4,13000B 的数据量,3000 张卡就差不多要两年时间,这是非常夸张的。业界为了应对这些挑战也推出了很多并行方式去解决这些问题,包括 DP、TP、PP 等等。
![]()
MindSpeed 也是支持这些最基础加速并行技术。
除了之前我们做的传统的技术摸高,另一个方向是 DeepSeek 的发布开创了新的范式,我们叫做工程创新。之前我们做模型训练加速时一般都是算法优先,就是说我不能改变模型训练的效果,它是第一优先级的,我只能在对等的情况下去做各种修改。而 DeepSeek 开创了一个新的路线,它通过一些精度上的可接受的损失极快降低模型训练的成本,这也是未来业界需要挖掘的新方向。
业界加速库
当前业界比较有名的加速库最主要的就是这两个,一个是英伟达的 Megatron,另一个就是微软的 DeepSpeed,这两个是最基础的。下面也有一些像国内潞晨科技的 Colossal-AI 以及最基础的 Pytorch。
![]()
在训练领域,这些并行加速库主要做的都是各种并行算法、算子优化、融合算子,还有内存和通信的优化。在推理领域它们会支持各种并行推理、融合算子以及量化压缩。以经典的 Megatron 为例,它支持了各种经典的并行技术,也支持各种主流的大模型。另外它的模型架构非常合理,社区也挺活跃,非常易于改造成自己自有的框架,相信各位公司里肯定也有一部分代码是从 Megatron 里薅过来的。
MindSpeed 架构设计
![]()
MindSpeed 分布式训练加速库架构主要有三个模块组成,上面两个是语言模块,一个是大语言,另一个是多模态。这里我们两个套件会对主流的模型,包括千问、LLama、DeepSeek,多模态这边类 Sora、LLaVA 这些系列全都会做支持。另外 MindSpeed 也提供了一套端到端的训练方案,从最开始的数据处理、流程训练,到后面的后训练、偏好对齐,以及各种评价体系,这些我们都有支持。
本次分享要讲的重点就是 MindSpeed Core 亲和加速模块。我们会通过在不同维度上对模型去做优化,来提升模型训练的效率。MindSpeed Core 除了对上面两个模型仓库做使能外,它也支持单独用在客户自有的框架上。它使用时非常简单,只用下载、安装,然后一键代码就能使能了。
![]()
我们这里是通过各种装饰器替换接口,就能做到和用户的框架解耦,可以非侵入式地修改用户框架,使用我们这些加速特性。
MindSpeed 优化策略
接下来的重点讲讲通信、显存、计算、并行几个维度上我们分别做了哪些优化。
首先是通信优化,第一个是计算通信掩盖技术。
![]()
我们知道在 TP、SP 的场景下我们会多两个通信,一个是 Allgather+Matmul,另一个是 Matmul+Reduce-scatter。在传统的并行上它们是串行执行的,就是我先做一个计算,然后再做一个通信,或者反过来我先做一个通信,再做一个计算。这样我们就想到这个任务其实我可以把一个大任务拆成多个小任务,可以先做一个计算任务 0,然后再做通信任务 0,然后在做通信任务 0 的时候,可以并行执行计算任务 1,这样就能实现计算和通信并行起来的效果,从而减少通信耗时,提升模型训练的效率。我们实测下来,在大部分的模型上它性能的收益都有百分之七八,是非常不错的一个优化点。
![]()
下一个思路上是类似的,是对 DualPipe 的一个改进。幻方开源了 DualPipe,我们知道它是利用不同 microbatch 之间做掩盖,然后在 1F1B 上做掩盖。但它会有两个阶段,分别是 Warmup 和 Cooldown 阶段,它们是没法通过 microbatch 之间去做通信掩盖的。
这样我们就提出,我发现计算流上我的共享专家的计算和我 A2A 的通信其实是没有依赖关系的,这样我们就可以把共享专家的计算和 A2A 的通信并起来,就像上图下面画的这样。我在做共享专家前向的时候同时去做 A2A 的通信,反向的时候也是一样,我做通信的时候同时去做共享专家的两个反向。以及 MLP 里对权重梯度的计算也是可以同时并行的,这样做完之后就可以在 1F1B 的基础上再额外掩盖 50% 的异步通信,也有不错的收益。
接下来是从显存上做优化。
当前在模型训练时我们用的大部分都是混合精度。之前用的是 fp16,现在几乎所有人都会用 bf16 做训练。混合精度训练有一个问题,会导致我的权重有两份,因为模型更新的时候要求更高的精度,所以在优化器里我的权重是 fp32 的。到了模型前反向训练时我没有那么高的精度要求,我可以把它换成 bf16 做计算,反向算完后我再把梯度转回 fp32,再做优化器的更新,这样就会多出两份权重。
![]()
我们看到 bf16 和 fp32 的数据格式很像,最开始都有一个 1 位的符号位,然后 8 位的指数位,唯一不同就是后面的尾数 fp32 是 23 位的尾数位,bf16 是 7 位。这样我们想到可以申请一块显存,让它同时表示 fp32 和 bf16。我会申请两个 tensor,其中 bf16 tensor 的指针也是指向 fp32 的内存地址上,这样我就可以用同一块内存地址同时表达两个数据格式。
而在实际训练场景下,由于四舍五入的问题,它会多引入一个残差。具体逻辑就会变成在梯度累积前反向计算的时候,我会把残差值给它加上,然后变成 bf16,去做前反向的计算。前反向做完了之后我再把这个剪掉,变回 fp32 的数据,再做优化器的更新,这样我们就可以把 bf16 的这一份权重节省掉了。以 70B 的模型为例,在 TP 开到 8 的时候,每张卡大约可以节省 17G 的显存,收益非常不错。
下一个也是显存上的优化,刚讲的是对静态显存的优化,这里是对动态显存的优化。我们做了一个分析,激活函数的输出是非常大的,但它的计算又非常小,非常快,天然适合重计算的技术。传统的重计算有个问题,它没法把我的输出释放掉,我的输出必须是要在的。如果想要做的话,我必须把下面的 Matmul 给它合在一起去做重计算,这样又会导致我需要多做一份 Matmul 的计算,又会拖累模型的训练时间。
![]()
这里我们就想到可以在我的输出 B 给 Matmul 计算完后释放它的显存,但我保留它的逻辑视图,通过 storage resize 等于 0,这样就能把它的显存占用释放掉,但逻辑视图还是在的。然后再挂一个 hook,在它做反向的时候触发它的前向计算,然后重新得到 B,再这样去做激活函数的反向,这样就能省掉这一块显存。由于激活函数的计算是非常快的,所以对整个模型训练的影响可以说是微乎其微。省的显存也非常大,是一个性价比非常高的优化特性。
接下来是一个虚拟显存的技术,在这里我们做了一个接口,支持对显存上做一个转发。我们知道 Host 内存要比 Device 显存要大很多,便宜很多,我们就想到可以在这里做一个内存转发。对算子来说它访问的就是 Device 显存,但这块显存会转发到 Host 侧,这样就可以减少我们显存的占用。
![]()
大家肯定就会说这不就是传统的 offload?但我们对比 offload 有两个优势。一个是非常简单,因为我是对申请的显存做更改,它不需要我自己手动帮助搬回 Device 侧,然后再搬回 Host 侧,因为对算子来说它访问的就是一个 Device 的显存。还有一个优点是算子本身会做数据的搬运和计算的流水。由于它认为自己访问的就是一块 Device 显存,这一块搬运天然支持 H2D、D2H 的并行,能减少搬运耗时。我们在 DeepSeek V3 上做了实验,在梯度累积比较大的情况下,测试下来端到端的性能损耗大概在 1% 左右,但能节省的显存却有十几 G,也是非常好用的一个特性。
接下来是计算优化,我们也提供各种融合算子,还有一些激活函数的融合,这些我们都是支持的。打开一个参数开关就能使能上了。
![]()
另外一种优化是等价改写。我们发现这边有一个对 Mask 赋值的操作,这个操作其实是可以等价改写成我对 Mask 取反,变成一个纯计算操作,这样我就可以把一个赋值操作变成一个纯计算操作,对性能的提升也是挺大的。
下一个计算优化是矩阵和向量的优化。我们的矩阵计算单元和向量计算单元是分开的,这样我们就想到我可以同时去做矩阵计算以及向量计算。
举一个例子,这个是 DualPipe 里 1F1B 阶段的流水排布,和幻方开源的会有一点差别,因为我们是根据自己硬件的特点重新排了一下。
![]()
这里我们发现它最开始有一个 Unpermute 的反向,接着马上是一个 Attention 的计算。Attention 计算里首先是一个矩阵计算,再接 FA 的计算。这里我们可以把 Permute 的计算再开一条向量的流,原来的这条流就留给矩阵计算,下面这一块就只给向量的计算,这样我们就可以做到矩阵计算和向量计算并在一起。后面的这些 Permute 和 Unpermute 也是一样,可以和共享专家的前反向并在一起,也能大大减少时间消耗。
但这个优化点有一个比较大的局限性,就是在同时做矩阵和向量计算时对访存的压力是比较大的。这会导致在比较大的计算量的情况下会导致算子劣化,所以这块优化点适合比较小点的,对访存没什么压力的计算,就能得到非常不错的收益。
下面是并行优化。
![]()
首先上面这个是原始的 VPP 虚拟流水并行,我们知道它会有一个 Warmup 阶段和一个 1F1B 阶段, Warmup 的数量等于设备的数量。以这边的图为例,这边我有 4 个设备,就必须要做 4 次前向。接下来进入 1F1B 阶段,做一次前向做一次反向。这样会有一个问题就是这个反向必须要依赖前向,前向做完之后才能做反向,造成了它们之间的通信等待,都不能做掩盖。这里我们提出了一个非常巧妙的思路,就是只要多做一个 Warmup,就可以把前向和反向之间的依赖关系拆开来。
在下面我做了 5 个 Warmup,到第六个的时候,我的前向是 2,反向是 1,这样它们之间就没有依赖关系,我就可以像幻方的 Dualpipe 一样去使能 1F1B 的掩盖了。
对比 DualPipe 它有两个优势,一个是简单,就是你自己开发一个 DualPipe 肯定要改一大堆代码,但我这边只用对 Warmup 的数量加 1 就能实现这样的流水排布。另外一个,DualPipe 是双向并行的,使用的卡要多一倍才能使能 1F1B 的流水。
接下来是一个 MoE 里的并行优化。我们做了一些实验,发现 MoE 速度缓慢的主要原因就是负载不均,不管是在 EP 之间还是 Layer 之间还是 Stage 之间,它都会存在不同的负载不均,这样就会造成不均衡的 A2A 通信,会拖慢 EP 通信。不均衡的计算会导致计算快的卡要等慢的卡,计算效率会劣化。Layer 之间的不均衡又会导致整个 PP Stage 之间都在互相等待,等待又会传导到 PP 的空泡,向后传导下去,这样就会拖慢整个模型的训练。
![]()
在这里幻方做了一个二级路由,在一定程度上掩盖 MoE 负载不均的情况。而 MindSpeed 作为一个底层的加速库,我们会面对很多客户,有些客户就会说我不想用二级路由,觉得我二级路由会对模型的效果有影响,他只想用一级路由,怎么办?
我们提出了数参互寻特性,它有两个思路,一个是传统的数据找计算,我的 tokens 要分发给对应专家所在的那张卡,然后这里去做通信。另外一个,负载不均肯定是有一些热门专家和一些冷门专家,冷门专家算得比较少,热门专家算得比较多,我其实可以不通信 tokens,而是通信专家,这样就一定程度上缓解负载不均的现象。
这里还利用了一个我们昇腾超节点的优势,就是超节点可以把几百张卡当做是同一个节点内,节点间性能劣化的劣势我们是没有的。这样我们就可以做到拿冷门专家的计算去掩盖热门专家的通信,通信完了之后马上接着就是热门专家的计算,相当于没有额外的通信开销,只有计算的耗时。
我们做了实验,在当前训练前期大概能拿到 7% 的收益,也是非常不错。
接下来有更多的并行技术。
![]()
首先是 Swap Attention 技术。我在 Attention 做完后,这些激活在反向之前其实是用不到了,我就可以把这些激活 swap 到 Host 侧再反向。反向的时候,在 MLP 开始的时候,我同时去做取回来的动作,这样就可以把 D2H 和 H2D 的计算和 MLP 的计算给并行起来。这样就能对模型训练的效率几乎没有影响,然后也能节省 Attention 的这部分激活。对比重计算,没有额外的计算,也不会对模型的效率有影响,所以这一块是比较优的减少动态显存的一块技术点。
左边这个是 Ulysses 融合 RingAttention 的技术,我们把这两个长序列的并行做了融合。我们知道在 Ulysses 里它是通过 A2A 去做通信的,节点内的通信比较快,节点间的通信就比较慢了。比如说我一个机器只有 8 张卡,Ulysses 最多就只能开到 8。另一个是 RingAttention,它的通信是 P2P 通信,比较适合在节点间做通信。我们就想到把这两个做融合,节点内通过 A2A 做通信,节点间通过 P2P 做,这样就可以把两个并行的优势全都合在一起,训练一个非常长的长序列模型。
下面重计算独立调度是说我在 PP 流水之间还开了重计算的情况下,我知道 PP 的流水其实是有很多空泡的,我可以把这些重计算的部分拿出来去填 PP 流水的空泡,这样就能压缩 PP 的空泡,也能提升模型训练的效率。
最后一个是 MoE 的 EDP 模式。就是说我在开了 TP 的情况下,原本它是会对专家的权重也做切分,特别是在小专家的情况下,做了切分之后会影响 Matmul 的计算效率。这会导致整个模型到了这里之后计算就慢下来了。
这样我就想到我其实是可以把 TP 的并行只在 Attention 的部分去做,然后 MLP 的这部分不去做 TP 通信,把 TP 通信的域分给 EP。这样由于 EP 扩大了,每个专家分的数量还是一样的,也就是说我的显存并没有增多,还是同样的显存,但我的专家并没有被切分,Matmul 的计算效率并没有降低。这也是一个比较优的特性,是小专家场景必开的。
以上就是本次的分享,谢谢各位。
嘉宾介绍
郑加利,华为高级工程师,主导 MindSpeed 框架基础架构设计构建,推动大模型训练效率的显著提升。主导微软大模型训练框架 DeepSpeed 原生支持华为昇腾软件栈,进一步拓展昇腾生态的兼容性。深度参与了华为昇腾的重点模型开发和客户项目攻关,多次获得昇腾领域总裁嘉奖令。
2026,AI 正在以更工程化的方式深度融入软件生产,Agentic AI 的探索也将从局部试点迈向体系化工程建设!
QCon 北京 2026 已正式启动,本届大会以“Agentic AI 时代的软件工程重塑”为核心主线,推动技术探索从「AI For What」真正落地到可持续的「Value From AI」。从前沿技术雷达、架构设计与数据底座、效能与成本、产品与交互、可信落地、研发组织进化六大维度,系统性展开深度探索。QCon 北京 2026,邀你一起,站在拐点之上。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.