假设你是一家要承办万人宴席的超级厨房的总厨。几千道菜、几十口锅,光靠一个厨师根本做不完——就算找来一百个厨师,如果每个人都挤在一个灶台前抢锅铲,效率反而更低。真正聪明的做法是把活儿拆开:有人负责炖汤,有人负责切菜,有人按流水线传菜,还有人专门管理共享调料柜。ColossalAI 就是这位善于排兵布阵的总厨——它把大模型训练这件“大宴席”拆成多个并行维度,让成百上千张 GPU 各司其职、协同工作。 本文用大白话拆解 ColossalAI 的多维并行设计:数据并行、张量并行、流水线并行、ZeRO 优化如何像搭积木一样组合,并行策略怎么配置,训练中有哪些省显存、提吞吐的优化技巧,以及它和 DeepSpeed 相比孰优孰劣。读完你就能明白,为什么大模型训练不能靠“无脑加卡”。
掌握 ColossalAI 的多维并行框架,是分布式训练工程师的核心基本功。它能帮你在真实项目中把大模型的训练时间从“等不起”变成“跑得动”,是框架选型和性能调优的必备认知。
可视化演示
展示张量并行、流水线并行、数据并行的组合拓扑,Gemini显存分片与ColossalAI对比DeepSpeed选型。
本节配有交互动效(进入视口后自动加载,约 3KB)。
多维并行拓扑展示 张量并行切分模型层,流水线并行切分层间,数据并行切分批次 N = TP × PP × DP 总GPU数等于三种并行度的乘积
多维并行总览
超级厨房迎战万人宴席:光是把几千道菜做完,就需要安排多个厨师。可是,大厨房的活儿不是简单多找人就行——锅要分几口?一道菜谁来切?流程怎么排?调料怎么共享?安排不好,厨房里就会挤成一团,效率反而不如一个人干。ColossalAI 就是那位善于排兵布阵的总厨,他把“并行”拆成几个维度,像拼积木一样自由组合。
在技术世界里,GPU 就是厨师。当模型大到单卡放不下、或者训练慢到无法接受时,就要启动多卡并行。最朴素的思路是多复制几个模型副本,数据分开喂(数据并行);进一步,把一层网络的计算拆成几块(张量并行);再进一步,把不同层分给不同卡(流水线并行);最后,把模型状态分散存储(ZeRO 优化)。这四类操作并不互斥,可以叠加使用。
ColossalAI 的“多维并行”正是这套积木的收纳盒:它把数据并行、张量并行、流水线并行、ZeRO 等维度统一调度,让用户不必亲手处理通信原语和显存管理。扩展效率是衡量并行方案好坏的尺子——n 张卡带来的加速比永远不可能是畅通无阻的 n 倍,因为卡与卡之间的通信是额外成本。
回到厨房:如果请 8 个厨师却挤在一个灶台上互相抢锅,扩展效率就会急剧下滑。总厨的职责,是让每个厨师各占一灶、互不干扰、通信有序——这正是 ColossalAI 做的事情。
- T1 含义单张 GPU 训练完整任务的耗时,是并行加速的“理想基准”。
- Tn 含义n 张 GPU 协同训练同一任务的实际耗时,包含计算和通信。
- 分母构成理想情况下 n 张卡把时间缩短为 1/n,所以分母是 n × Tn。
- 效率归一分子除以分母得到 0 到 1 之间的值,越接近 1 扩展效果越好。
数据并行
最简单的分工方式:让 4 组厨师用同一本菜谱,各自开一灶,服务四桌客人。每个厨师手里都有完整的菜谱和全套刀铲,只是接到的订单(数据批次)不同。这就是数据并行——每张 GPU 上都放一份完整的模型副本,训练数据按批次切分,大家各算各的,最后把梯度拿到一起平均,再各自更新参数。
数据并行有两个明显的优点:实现简单、扩展直接。加卡就能增加吞吐,模型多大多小都能用。但缺点也很直观:每张卡都要复制一份完整模型,显存消耗是线性膨胀的。假如模型参数有 100 亿,单卡放不下,数据并行就无能为力了。
梯度同步是数据并行的关键环节。每张卡算完自己的小批次梯度后用 AllReduce 操作求和取平均,然后再更新参数。通信频率高,梯度越大通信越慢,这也是数据并行在大模型时代越发吃力的核心原因。
厨房里 4 组厨师做完菜后,还要把各自的调味心得汇总交流一遍,确保四桌菜味道一致。数据并行就是这么“民主”——每张卡都是完整厨师,通过频繁的梯度交换保持步伐统一。
- 梯度符号Δθᵏ 表示第 k 张卡独立算出的梯度,方向指向损失下降。
- 梯度平均把 n 张卡的梯度加起来除以 n,得到全局梯度方向。
- 学习率缩放全局梯度乘上学习率 η,决定参数每步迈多大。
- 参数更新用旧参数减去梯度×学习率,得到新一轮参数 θₜ₊₁。
张量并行
有时候一道菜太大,一个人根本端不动。比如那锅佛跳墙,得几个人分工:一个负责鲍鱼,一个负责海参,一个负责高汤,最后汇聚到一个锅里。张量并行就是这种“分食材”的玩法:把一层的权重矩阵切分成几块,每张 GPU 只存一块,负责计算其中一部分,最后通过通信合并结果。
在 ColossalAI 里,张量并行最常见的是对 Transformer 层中的矩阵乘法做切分。比如计算 Y = XW 时,如果把 W 按列切成两块 [W₁, W₂],那么 X 分别和两块相乘得到 [XW₁, XW₂],最后横向拼接起来。每张卡只算一半的乘法,显存和计算量都减半,但计算完必须通信一次把结果拼齐。
张量并行的通信频率极高——每一层 Transformer 的前向和后向都要做一次聚合通信。因此它通常只在单机多卡内使用(NVLink 高速互联),跨机器的张量并行会因为网络延迟得不偿失。这也是为什么张量并行规模一般不超过 8 张卡。
回到超级厨房:几位厨师各处理一种名贵食材,最后汇入同一锅汤。这套方法让单个 GPU 背不动的“大菜”也能做出来——但每次汇聚都要对齐火候(通信),所以沟通成本必须算进总耗时里。
- 原矩阵乘法X 是输入,W 是权重矩阵,两者相乘得到输出 Y。
- 按列切分把 W 切成两块 W₁ 和 W₂,各占一半列数。
- 分块计算每张卡用 X 乘自己那块权重,得到部分输出 XW₁。
- 拼接输出把两块结果横着拼起来,得到和原来一样的 Y。
流水线并行
厨房里最常见的场景其实是流水线:配菜师傅切好食材,掌勺师傅下锅翻炒,摆盘师傅负责装盘。三个人各司其职,菜一道道地流向下一个工位。流水线并行就是这么干的——把模型按层切成几段,每张 GPU 负责一段层,前一段算完把中间结果传给下一段。
流水线并行解决了张量并行通信频繁的问题:卡与卡之间只需在层边界传递一次激活值,通信量小、频率低,因此可以跨机器部署。但流水线有个天生的毛病——“气泡”。想象一下,第一道菜还在配菜师傅手里时,掌勺师傅和摆盘师傅都闲着。这种空闲时间就是流水线气泡。
为了填满气泡,ColossalAI 引入了微批次(micro-batch)机制:把一个大批次再切成多个小批次,让前一段算完一个小批次立刻传给下一段,多份数据像传送带上的菜品一样在流水线里交错流动。微批次越多,气泡占比越小,流水线越饱满。
就像流水线上传菜一样,只要传菜批次足够多,三位师傅几乎全程手不停——气泡被微批次“填”得满满当当。当然,微批次多了也会占碗碟(激活显存),这是总厨需要权衡的。
- p 含义流水线阶段的卡数,比如 4 卡就是 4 个工位。
- m 含义微批次数量,即一个大批次被切成几小份。
- 空闲周期前 p-1 个微批次在途中时,最后一个工位在等待,共 p-1 个空档。
- 总周期总共有 p-1+m 个时间段,气泡占比是空闲除以总时间。
ZeRO优化
数据并行里每个厨师都背着一整套完整调料包——即使他只用其中一两种。模型训练时,每张卡都要保存参数、梯度和优化器状态,一个 1750 亿参数的模型,光优化器状态就要吃掉几百 GB。于是总厨想了个主意:建一个中央调料库,大家按需取用,谁都不必背着全部家当。
ZeRO 正是这个“中央调料库”:把优化器状态、梯度、甚至参数本身分片存储到所有 GPU 上,谁需要哪一块,就在计算前动态取回来。按优化程度分三档:ZeRO-1 只切优化器状态,ZeRO-2 再切梯度,ZeRO-3 连参数也切掉。级别越高,显存越省,但通信开销也越大。
ZeRO-3 的原理是:每个 Transformer 层的参数在计算前通过广播收集到当前卡,算完就释放。这样单卡显存占用从“完整模型大小”降为“模型大小 ÷ 卡数”,几乎随卡数线性下降,让 1 万张 GPU 跑万亿参数模型成为可能。
调料库虽然省了空间,但每次炒菜都要跑一趟去取调料——通信变多了。所以 ZeRO 适合在意显存瓶颈、网络带宽充足的环境。总厨心里有杆秤:省到底,还是跑得快,得看条件。
- 参数量符号Φ 表示模型参数量,它是显存占用的核心变量。
- 系数 16 来源参数 2 字节 + 梯度 2 字节 + 优化器状态 12 字节,共约 16 字节/参数。
- 数据并行占用每张卡都要完整的 16Φ 字节,并不随卡数减少。
- ZeRO 分摊状态分到 K 张卡上,每卡只承担 16Φ/K。
策略配置
真正的万人宴席不会只用一种分工方式。总厨会同时安排:几组厨师各开一灶做不同桌的菜(数据并行),某道硬菜由几位厨师联合掌勺(张量并行),后厨按切配—烹炒—装盘三条流水线运作(流水线并行),调料统一进中央库(ZeRO)。ColossalAI 的策略配置,就是让总厨在一张“排班表”上写清楚这些安排。
ColossalAI 使用配置文件(config.py)声明并行方案。你只需在配置里指定数据并行大小、张量并行大小、流水线并行大小、是否开启混合精度等,框架会自动把模型切分、数据切分、通信调度全部铺好。所有并行维度的乘积必须等于 GPU 总数,这也是配置时必须满足的约束。
ColossalAI 还提供自动并行(Auto-Parallel)能力:你只需描述模型结构和 GPU 拓扑,框架自动搜索最优切分方案,把“哪个厨师该站哪个灶”这种麻烦事也省了。对新手总厨来说,这是极其友好的兜底选项。
- 数据并行度P_数据 表示数据被切成几路,对应几组厨师。
- 张量并行度P_张量 表示一层被切成几块,对应几位联合掌勺。
- 流水线并行度P_流水线 表示模型被切成几段,对应几条流水线。
- 乘积约束三者的乘积就是总 GPU 数,这是配置合法性的基本要求。
# 一个典型的 ColossalAI 配置示例parallel = dict( data=4, # 数据并行 4 路 tensor=2, # 张量并行 2 路 pipeline=2, # 流水线并行 2 路)TOTAL_GPUS = 4 * 2 * 2 # 共 16 张 GPU
优化技巧
宴席越大,资源越紧张。聪明的总厨有一篮子省水省电的烹饪技巧:有的做法是用时间换空间——把不常用的食材收进冷库,用到时再解冻(激活检查点);有的做法是把多桌订单攒起来一起做,减少来回开关灶的次数(梯度累积);还有的做法是趁菜在炖的时候去切下一道菜(通信与计算重叠)。
激活检查点(Activation Checkpointing)是 ColossalAI 最常用的省显存手段。训练时每层前向计算产生的中间激活值原本都要存下来供反向用,现在只存少数几个“检查点”,反向时再重新计算中间值。显存从随层数线性增长 O(L) 降为 O(√L),代价是多做一次前向计算。
梯度累积则是把多个小批次梯度累加后再统一更新参数。它不减少显存,但能有效增大“名义批量”,在数据并行的卡数有限时,依然可以凑出足够大的批量来稳定训练。通信压缩则通过降低梯度通信精度、只传部分重要梯度,来减少每步训练的网络开销。
这些技巧像极了聪明的厨师:把食材放进冷库节省台面空间,需要时再快速解冻;把零碎订单攒成一波集中处理。总厨的智慧不在于多花力气,而在于把每一分资源和时间都安排得恰到好处。
- 原峰值显存每层激活值都存,峰值显存随层数 L 线性增长。
- 检查点策略只保存每 √L 层的激活,其余丢弃,反向后再重新算。
- 时间代价反向时需重新前向一次,相当于多花约一倍前向时间。
- 收益权衡显存大幅下降,计算略增,适合显存紧张的大模型训练。
DeepSpeed对比
如果你要外包一场大宴席,市场上最出名的两家供应商分别是 ColossalAI 和 DeepSpeed。两者都能实现多维并行,但经营理念和强项不同。DeepSpeed 由微软打造,凭借 ZeRO 技术深入人心,生态成熟、文档齐全;ColossalAI 由新加坡团队开源,主打“多维并行 + 自动并行 + AI 优化”一体化方案。
从架构上看,DeepSpeed 的核心是 ZeRO 优化器和一系列高性能内核,它依赖 PyTorch 原生的流水线与张量并行进行组合;ColossalAI 则把并行维度统一抽象,内置张量、流水线、数据、序列并行和自动并行策略搜索,用户只需声明模型结构和资源,框架自动切分。这有点像 DeepSpeed 提供的是精品调料包,而 ColossalAI 提供的是整套中央厨房设计方案。
在易用性上,ColossalAI 的 colossalai.initialize() 一行代码就能启动混合并行训练;DeepSpeed 则需要通过 JSON 配置文件和 deepspeed.initialize() 接入。两者都支持混合精度、激活检查点、梯度累积。实测中 DeepSpeed 的 ZeRO 在已知模型上非常稳定,而 ColossalAI 的自动并行在异构模型和非标准架构上更有优势。
两家供应商各有拥趸。如果你的团队已经深耕 PyTorch 生态且模型结构标准,DeepSpeed 是稳妥之选;如果你需要面对多种并行策略的组合、希望自动并行降低上手门槛,ColossalAI 的综合方案更值得尝试。最终选谁,得拿自家模型在真实集群上跑一轮吞吐测试再拍板。
- 吞吐定义训练吞吐 = 处理样本数 ÷ 训练时长,是框架效率的统一度量。
- 样本数一个训练周期内处理完的样本总量,等于步数 × 批量大小。
- 训练时长完成这些样本所花的总时间,包含计算、通信、等待。
- 选型意义吞吐越高,说明框架在你的模型、集群、网络条件下效率越好。
AI 应用场景
千亿参数大模型训练
阶段:模型训练与资源调度
解决的问题:传统单卡训练在千亿参数模型面前直接“内存爆炸”,单机多卡数据并行虽然能跑,但每卡要复制完整模型,显存依然不够。ColossalAI 通过“数据并行 + 张量并行 + 流水线并行 + ZeRO”四维组合,让超大模型能在上千张 GPU 上稳定训练。
具体案例:某公司要训练一个 1750 亿参数的类 GPT 模型,使用 128 张 A100 组建训练集群。配置 DP=4、TP=4、PP=4、ZeRO-2 开启,模型参数与优化器状态分摊到各卡,单卡显存占用从超过 300GB 降到约 40GB,训练吞吐达 1800 tokens/s。
多卡集群利用率优化
阶段:训练性能调优
解决的问题:很多团队加了卡却提速不明显,问题往往出在通信瓶颈上。ColossalAI 的自动并行策略能根据 GPU 拓扑自动选择最优切分方案,帮团队省去手动调参的大量试错成本。
具体案例:某研究团队在 32 卡集群上训练一个 130 亿参数的对话模型,手动配置时扩展效率只有 0.52。改用 ColossalAI 自动并行搜索后,扩展效率提升到 0.83,训练时间从 14 天缩短到 9 天,GPU 利用率提升近 60%。
训练框架选型决策
阶段:技术选型与基础设施规划
解决的问题:团队准备建设大模型训练平台,需要在 ColossalAI 和 DeepSpeed 之间做出选择。传统做法是凭感觉或跟风,容易选到不适合自己集群的方案。通过吞吐量基准测试和特性对比,可以做出数据驱动的决策。
具体案例:某金融公司的 GPU 集群节点间是 25G 以太网而非 NVLink,张量并行收益有限。团队对比测试后发现,DeepSpeed 的 ZeRO-2 在该环境下吞吐更高,于是选择 DeepSpeed;而另一家网络条件优越的互联网公司,则在同样测试中选择了 ColossalAI 的自动并行方案。
Python 演示
"""ColossalAI multidimensional parallel strategy simulator.""" def data_parallel_split(total_samples, gpu_count): """Split samples evenly across GPUs.""" return [total_samples // gpu_count] * gpu_count def tensor_parallel_split(rows, cols, gpu_count): """Split weight matrix by column.""" return [(rows, cols // gpu_count)] * gpu_count def pipeline_parallel_split(num_layers, gpu_count): """Split layers to GPUs as evenly as possible.""" base, extra = num_layers // gpu_count, num_layers % gpu_count return [base + (1 if i < extra else 0) for i in range(gpu_count)] def pipeline_bubble(stages, micro_batches): """Bubble ratio = (p-1) / (p-1+m).""" return (stages - 1) / (stages - 1 + micro_batches) def main(): gpus = 8 print("=== ColossalAI parallel strategy simulator ===\n") samples = 2048 dp = data_parallel_split(samples, gpus) print("[Data Parallel] {} samples -> {} chunks, {} per GPU".format( samples, len(dp), dp[0])) rows, cols = 1024, 1024 tp = tensor_parallel_split(rows, cols, 4) print("[Tensor Parallel] {}x{} matrix -> sub-matrix {}".format( rows, cols, tp[0])) layers = 16 pp = pipeline_parallel_split(layers, gpus) print("[Pipeline Parallel] {} layers -> per GPU {}".format(layers, pp)) for m in [4, 16, 64]: ratio = pipeline_bubble(stages=gpus, micro_batches=m) print("[Bubble] p={}, m={}: {:.1f}% bubble".format( gpus, m, ratio * 100)) dp_size, tp_size, pp_size = 2, 2, 2 total = dp_size * tp_size * pp_size print("\n[Mixed Parallel] DP={} x TP={} x PP={} = {} GPUs".format( dp_size, tp_size, pp_size, total)) if __name__ == "__main__": main()
data_parallel_split(total_samples, gpu_count)模拟数据并行:总样本按 GPU 数均分,每卡拿到一份独立批次。tensor_parallel_split(rows, cols, gpu_count)模拟张量并行:把权重矩阵按列切分,返回每卡负责的子矩阵形状。pipeline_parallel_split(num_layers, gpu_count)模拟流水线并行:把网络层尽量均匀分给每张卡,余数按编号补发。pipeline_bubble(stages, micro_batches)用公式 (p-1)/(p-1+m) 计算气泡占比,m 越大气泡越小。pp = pipeline_parallel_split(layers, gpus)16 层分配到 8 卡,每卡得到 2 层。for m in [4, 16, 64]同一个流水线配置下,微批次从 4 增到 64,气泡占比从 63.6% 降到 8.5%。dp_size * tp_size * pp_size混合并行的总 GPU 数 = 各维度并行度之积,这是 ColossalAI 配置合法性的核心约束。
常见误区
误区既然并行能让训练变快,那我从 4 卡加到 64 卡,速度应该提升 16 倍。卡越多,心里越踏实。
正解扩展效率公式 E = T₁/(n×Tₙ) 告诉我们,卡数 n 增大时,T_n 的下降会越来越慢,甚至因为通信瓶颈而不再下降。当卡间通信成为瓶颈时,加卡可能完全没收益。就像厨房里再塞 50 个厨师,灶台只有 10 口,大家只能互相等着。加卡前一定要算通信开销和扩展效率。
为何常见:大家习惯性地把“并行”等同于“线性加速”,忽略了并行本身带来的协调成本。这种直觉在小时候分组搬砖时有效,但在分布式训练的复杂通信下完全不成立。
误区张量并行和流水线并行不都是把模型拆开放到多张卡上吗?实现方式应该差不多,效果也一样。
正解两者的切分粒度完全不同。张量并行是“层内切分”——把一层的矩阵切成小块,每张卡只算半个矩阵,通信频率极高(每层都要通信);流水线并行是“层间切分”——每张卡负责连续的若干层,层边界才通信一次,但会产生气泡。简单说:张量并行是几个人炒一道菜,流水线并行是几个人各做一道工序。
为何常见:表面上看两者都涉及“多卡协作”,容易混为一谈。只有深入理解切分粒度、通信频率、显存分摊方式这几个维度,才能把两者区分开。
误区ZeRO 把参数、梯度、优化器状态全部切分了,显存肯定最省,那我只用 ZeRO 不就行了?
正解ZeRO 省的是“冗余存储”,但它每层计算前都要动态收集参数,通信开销很大,极端情况下训练反而变慢。张量并行省的是“每层计算量”和“参数占卡数”,计算本身也被分摊了。两者解决的是不同问题:ZeRO 主打省显存,张量并行主打摊计算。实践中最优方案往往是 ZeRO + 张量并行 + 流水线并行组合使用。
为何常见:只盯着“显存数字”看,忽略了 ZeRO 引入的通信代价。省显存和提速度是两码事,总厨要考虑的是整场宴席的全局效率。
误区流水线并行就是把模型切成几段,每张卡算各自的层,段间传一次数据就行,应该很高效。
正解流水线并行确实通信频率低,但有两个隐藏成本:一是每个微批次都要在相邻卡间传激活值和梯度,数据量不小;二是启动和排空阶段会产生气泡,气泡占比 (p-1)/(p-1+m) 在 p 大、m 小时非常可观。8 卡流水线只传 4 个微批次时,气泡高达 63.6%,相当于大半时间在空转。
为何常见:“只看到段间传一次”的表象,却忽视了流水线本身的启动—稳态—排空三个阶段。就像流水线上的第一个工人开工时,后面的人都闲着——这种空闲在直觉上容易被忽略。
误区ColossalAI 擅长多维并行,DeepSpeed 擅长 ZeRO,两者是竞争关系,选了一个就不能用另一个。
正解两者都是基于 PyTorch 的训练框架,实际上可以互相借鉴和组合。ColossalAI 也有自己的 ZeRO 实现,DeepSpeed 也支持张量和流水线并行。选型的核心指标不是“谁的名气大”,而是你的模型结构、GPU 集群网络、显存瓶颈分别是什么。最好的做法是在真实集群上各跑一轮吞吐对比,用数据说话。
为何常见:技术社区的舆论常常会把两个框架标签化——"DeepSpeed=ZeRO"、“ColossalAI=并行”——这种简化标签让用户误以为功能互斥,实际上它们的边界远比想象中模糊。
面试题
Q1. 在 ColossalAI 中「每张 GPU 保存完整模型副本、数据按批次切分」属于哪种并行?
- A.数据并行← 正确答案
- B.张量并行
- C.流水线并行
- D.序列并行
答案:A。数据并行的核心特征就是每卡持完整模型副本,只切分数据。张量并行切分的是层内矩阵,流水线并行切分的是层间顺序,序列并行则是对序列维度切分。答案 A 与数据并行定义完全吻合。
Q2. 张量并行中若权重矩阵按「行」切分到两张卡,前向计算结果应如何合并?
- A.直接拼接
- B.逐元素相加← 正确答案
- C.取最大值
- D.无需通信
答案:B。权重按行切分时,XW = [X₁, X₂]·[W₁; W₂] = X₁W₁ + X₂W₂,两卡各自算出的部分结果需要逐元素相加。直接拼接对应的是按列切分的情况,取最大值和无需通信都是错误选项。
Q3. 流水线并行中增加微批次(micro-batch)数量会带来什么效果?
- A.增大气泡
- B.减小气泡← 正确答案
- C.降低精度
- D.增加层数
答案:B。气泡占比公式 (p-1)/(p-1+m) 中 m 是微批次数量,m 增大会让分母变大,气泡占比下降。微批次不会改变模型层数,也不会影响训练精度,所以正确答案是 B。
Q4. 以下哪些属于 ColossalAI 提供的并行能力?
- A.数据并行← 正确答案
- B.张量并行← 正确答案
- C.流水线并行← 正确答案
- D.对比学习
答案:ABC。ColossalAI 的多维并行框架涵盖数据并行、张量并行、流水线并行,此外还有 ZeRO 优化。对比学习是一种训练范式而非并行策略,不属于并行能力范畴,所以选 A、B、C。
Q5. ZeRO-3 相比普通数据并行最核心的区别是什么?
- A.学习率更大
- B.参数分片存储← 正确答案
- C.损失函数不同
- D.无需梯度同步
答案:B。ZeRO-3 把参数、梯度、优化器状态全部分片到各卡,按需动态收集,这是它与普通数据并行最本质的区别。学习率、损失函数不因 ZeRO 改变,梯度同步依然需要,所以只有 B 正确。
Q6. 流水线气泡占比公式 (p-1)/(p-1+m) 中,当 p=4、m=12 时占比约为多少?
- A.10%
- B.20%← 正确答案
- C.30%
- D.40%
答案:B。代入公式 (4-1)/(4-1+12) = 3/15 = 0.2,即 20%。p 是流水线卡数 4,m 是微批次 12,气泡占比五分之一,对应选项 B。
Q7. ColossalAI 中可用于节省显存的优化技巧包括哪些?
- A.混合精度← 正确答案
- B.激活检查点← 正确答案
- C.梯度累积← 正确答案
- D.数据增广
答案:ABC。混合精度用 FP16 存储减少显存,激活检查点放弃中间激活换显存,梯度累积用小批量凑大批量减少激活峰值,三者都是 ColossalAI 支持的优化技巧。数据增广只是数据处理手段,不涉及显存优化。
Q8. 扩展效率公式 E = T₁/(n×Tₙ) 中,4 卡训练测得 T₁=100s、T₄=30s,E 约为多少?
- A.0.83← 正确答案
- B.0.75
- C.0.50
- D.0.33
答案:A。E = 100/(4×30) = 100/120 ≈ 0.83,说明 4 卡并行达到理想加速的 83%,这是相当不错的扩展效率。若 E 只有 0.5,说明通信开销吃掉了近一半的理论加速。
Q9. 关于 ColossalAI 与 DeepSpeed 的对比,正确的说法有哪些?
- A.ColossalAI 有自动并行← 正确答案
- B.DeepSpeed 有 ZeRO← 正确答案
- C.两者都支持混合精度← 正确答案
- D.ColossalAI 只用单卡
答案:ABC。ColossalAI 主打多维并行并内置自动并行策略搜索,DeepSpeed 以 ZeRO 为核心,两者都支持混合精度训练。ColossalAI 当然支持多卡并行,D 说法错误,所以选 A、B、C。
Q10. 若配置 DP=4、TP=4、PP=2,则总 GPU 数和每组流水线内张量并行卡数分别是多少?
- A.卡数 32/张量卡数 4← 正确答案
- B.卡数 32/张量卡数 2
- C.卡数 16/张量卡数 4
- D.卡数 16/张量卡数 2
答案:A。总并行度 = DP×TP×PP = 4×4×2 = 32 张卡,TP=4 意味着每个流水线阶段内部有 4 张卡做张量并行。选项 A 的两个数值都正确,其余选项的卡数或张量并行卡数有误。