想象你是一家大型食堂的老板,手里握着 128 份相同的套餐订单。如果要求 4 个打菜窗口一次性把 128 份全部做完再交给下一个窗口,结果就是:第一个窗口忙得满头大汗,后面三个窗口闲着嗑瓜子——这就是“大 Batch”在流水线并行中的尴尬。聪明的你很快想到了办法:把 128 份订单切成 8 批,每批 16 份,让每个窗口做完一批立刻传给下一个窗口。这样一来,所有窗口几乎同时开动,谁也不用干等。这个“切小份、依次传”的思维,正是大模型分布式训练中微批次(Micro-batch)技术的核心。它就像流水线上的传送带,让每个 GPU(窗口)都能持续“有活干”,大幅提升整个训练系统的吞吐效率。

岗位关联

掌握微批次技术,是每位大模型训练工程师优化流水线并行效率的必修课,它能直接决定你的训练速度是“蜗牛爬”还是“火箭飞”。

目录
  1. 可视化演示
  2. 初识微批次
  3. 微批次大小选择
  4. 气泡形成与消除
  5. 显存影响分析
  6. 填充策略设计
  7. 梯度累积配合
  8. 工程调优要点
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态演示微批次Micro-batch的核心机制,通过入门/进阶/实战/优化四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

微批次Micro-batch:微批次核 微批次核心概念与流水线填充原理 微批次大小选择与配置策略 核心机制可视化 微批次Micro-batch整体架构与关键组件

初识微批次

食堂老板把 128 份套餐切成 8 批、每批 16 份,这个“16 份一摞”就是微批次。在分布式训练的世界里,一个大的训练 Batch(比如 1024 条样本)如果直接交给流水线并行的多卡系统,就会像前面说的那样——第一张卡算到天荒地老,后面的卡闲得发慌。所以,我们需要先把大 Batch 切成若干个更小的 Batch,每个小 Batch 就叫一个微批次(Micro-batch)。

微批次是流水线并行的基本调度单位。假设我们有 4 张 GPU(相当于 4 个打菜窗口),把 1024 条样本切成 16 个微批次(每个 64 条),那么 GPU1 处理完微批次 1 后,立即把结果传给 GPU2,同时自己开始处理微批次 2。这样一来,四张卡都能“手中有活”,系统的整体吞吐量大幅提升。

微批次的本质是把“大而整”的计算任务拆成“小而碎”的独立单元,让流水线的每一级都能以最短的等待时间接续工作。它不改变总计算量,但改变了计算在时间和空间上的分布方式——这正是“切小份”魔力的来源。

1. 大 Batch 切分:将原始 Batch 分成等份小段

Batch=Micro-batch×chunks\text{Batch} = \text{Micro-batch} \times \text{chunks}

2. 依次送入流水线:每个微批次独立经过所有流水线级

M1→M2→⋯→Mk\text{M}_1 \to \text{M}_2 \to \cdots \to \text{M}_k

3. 各卡并行计算:不同微批次在不同 GPU 上同时处理

GPUi processes Mj at time t\text{GPU}_i \text{ processes } \text{M}_j \text{ at time } t

回到食堂:切得越小,每个窗口手里的活越碎,但传送带上的“在途”份数也越多,需要更多的台面空间(显存)来临时存放半成品。这个权衡,就是微批次调优的核心。

微批次大小选择

食堂老板发现:如果每批只切 4 份,传送带上虽然跑得勤快,但每传一次都要“吆喝一声”(通信开销),窗口频繁切换反而手忙脚乱;如果每批切 64 份,又回到最初“第一个窗口累死”的窘境。所以微批次大小的选择,是一场“切多碎才顺手”的工程权衡。

从吞吐量角度看,微批次越大,每个 GPU 上计算密度越高,算术效率(计算资源利用率)越好。因为 GPU 擅长“吃大块肉”,小块肉会让它的并行单元饿肚子。但微批次太大会导致流水线内各个阶段的负载不均衡——前一个阶段算得太久,后面就干等,气泡变大。

从显存角度看,微批次越大,每个微批次需要的中间激活值(前向传播中暂存的结果)越多,显存压力越大。因此微批次大小通常受限于单卡显存容量。实践中的常见做法是:在显存允许的范围内,尽量选较大的微批次,同时保证微批次数目不少于流水线级数的 2 倍,以减小气泡占比。

1. 吞吐计算:总吞吐与微批次大小正相关

Throughput≈micro-batch sizetime per micro-batch\text{Throughput} \approx \frac{\text{micro-batch size}}{\text{time per micro-batch}}

2. 气泡占比:气泡率与流水线级数和微批次数相关

Bubble Ratio=p−1p−1+m\text{Bubble Ratio} = \frac{p-1}{p-1+m}

3. 显存约束:激活值占用正比于微批次大小

Memory∝micro-batch size\text{Memory} \propto \text{micro-batch size}

食堂老板的经验总结:窗口(GPU)喜欢“大块肉”,但台面(显存)有限;传送带(流水线)喜欢“勤传递”,但吆喝(通信)太频也累。最优解永远是跑几轮实验,找到那个“肉够大、台面放得下、传送带不闲着”的甜蜜点。

气泡形成与消除

流水线最让人头疼的,就是气泡(Bubble)——GPU 无事可做的空闲时间。食堂刚开门时:第一个窗口做好第一批菜,第二个窗口才能开工;等第一个窗口做到第三批时,第四个窗口才第一次开火。这段时间里,后面的窗口都在干等,这就是“前向气泡”。收工阶段:最后一个窗口还在处理最后一批,前面的窗口已经无菜可做,这就是“排空气泡”。

气泡率(Bubble Ratio)是衡量流水线并行效率的关键指标。假设流水线有 p 级(4 个 GPU),共 m 个微批次,那么理想情况下气泡占比为:

可以看到:微批次数 m 越大,气泡占比越小。当 m=16、p=4 时,气泡率只有约 3/18 ≈ 16.7%;如果 m=4,气泡率高达 3/7 ≈ 42.9%。这就是为什么实践中要求微批次数远大于流水线级数。

食堂老板的解法是:多切几批!虽然开门和收工时总有些窗口空闲,但只要中间“满负荷运转”的时间足够长,空闲的比例就被摊薄了。这就像高速公路收费站——打开的车道越多、排队的车越多,每条车道的“闲置率”就越低。

Bubble Ratio=p−1p−1+m\text{Bubble Ratio} = \frac{p-1}{p-1+m}
气泡率是衡量流水线效率的核心指标,与微批次数成反比。
  1. 流水线级数 pGPU 数量,决定流水线深度
    p=number of pipeline stagesp = \text{number of pipeline stages}
  2. 微批次数 m切分出的微批次总数
    m=Batch SizeMicro-batch Sizem = \frac{\text{Batch Size}}{\text{Micro-batch Size}}
  3. 气泡率计算填充与排空阶段的空闲占比
    Bubble Ratio=p−1p−1+m×100%\text{Bubble Ratio} = \frac{p-1}{p-1+m} \times 100\%

显存影响分析

食堂的台面空间(显存)是有限的,上面要同时摆放:正在下锅的菜(当前微批次的激活值)、切好的备菜(参数和梯度)、以及各种调料配方(优化器状态)。微批次技术之所以好用,恰恰是因为它把大 Batch 切成小份后,每次只需要在显存里放一小份菜的“中间状态”。

具体来说,激活值(Activations) 是显存占用的头号大户。在流水线并行中,为了在反向传播时计算梯度,需要保留前向传播的中间结果。如果微批次很大,激活值就占得特别多;微批次越小,需要的激活值显存就越少。这是微批次能降低显存峰值的关键机制。

不过,微批次的数量增多,也意味着每个 GPU 上需要为多个“在途”微批次保留激活值。所以显存开销的完整公式是:

食堂老板的策略是“小份多批”:每一份菜占的台面小了,但台面上同时摆的份数多了。如果台面实在不够,还可以把部分“半成品”(激活值)存到仓库、用时再取——这就是后文要讲的重计算(Recomputation) 技术。

Memory=activations×in-flight micro-batches+params+grads+optimizer states\text{Memory} = \text{activations} \times \text{in-flight micro-batches} + \text{params} + \text{grads} + \text{optimizer states}
微批次通过减少单批激活值来降低显存峰值,但增多批次会抬高在途占用。
  1. 单批激活值每个微批次前向传播的中间结果
    Act=hidden_size×layers×micro-batch\text{Act} = \text{hidden\_size} \times \text{layers} \times \text{micro-batch}
  2. 在途数量同时处于计算中的微批次数
    in-flight≈pipeline stages\text{in-flight} \approx \text{pipeline stages}
  3. 总显存各部分之和
    Mem=Act×in-flight+P+G+O\text{Mem} = \text{Act} \times \text{in-flight} + \text{P} + \text{G} + \text{O}

填充策略设计

食堂老板发现,即使切了 16 批菜,开门时最后两个窗口依然要空等好一会儿。于是他想到一个新招:有些菜(比如凉菜)可以先做好放在边上,等主菜出锅的间隙先递出去——这就是填充策略(Padding) 的思路。

填充策略的核心是:在正式的前向/反向传播开始之前,用一些“虚拟的微批次”把流水线预填充(Prefill),让每个 GPU 在正式计算开始时都有活干。这样,气泡不发生在开头和结尾,而是被均匀地“挤”到了计算间隙中。

常见的填充方案有两种:零填充(Zero Padding) 和跨批次填充(Cross-batch Padding)。零填充是简单地在头部补几个空批次,牺牲一点点计算量减少气泡;跨批次填充则是把下一轮迭代的微批次提前塞进空闲时段,让流水线几乎没有空转。后者的气泡率理论上可以逼近 0,但实现复杂度更高,对内存也有额外要求。

1. 零填充:在流水线头部插入空批次

Pad=(p−1)×empty micro-batches\text{Pad} = (p-1) \times \text{empty micro-batches}

2. 跨批次填充:从下一迭代借微批次

Pad=next iteration’s micro-batches\text{Pad} = \text{next iteration's micro-batches}

3. 气泡下降:有效气泡率随填充而降低

Bubblepad≈0\text{Bubble}_{\text{pad}} \approx 0

填充策略就像餐厅的“预摆盘”:不等客人点完菜再备料,而是提前把常用食材放在备餐台上,客人一下单就能开火。虽然牺牲了一点“台面空间”(显存),但换来了所有厨师(GPU)的满负荷运转。

梯度累积配合

在大模型训练中,我们通常希望用较大的 Batch Size 来保证梯度估计的稳定性。但显存和流水线效率又不允许单次塞进太大 Batch——怎么办?食堂老板的答案:梯度累积(Gradient Accumulation)。

梯度累积的思路是:每个微批次独立计算梯度,但暂时不更新权重,而是把梯度“攒起来”;攒够若干个微批次后,再用累积的总梯度统一更新一次权重。这样,从数学上看,最终等效于一次处理了一个大 Batch;从物理上看,显存里始终只有一个小微批次的激活值。

食堂老板明白了:与其让所有客人一次性点一大桌菜(大 Batch 撑爆后厨),不如让客人分几次下单(微批次),后厨把“备菜要求”(梯度)记在本子上,最后一次性把全套菜(权重更新)做出来。味道一样,后厨却不慌不忙。

gradtotal=∑i=1kgradi,weight=weight−lr×gradtotal\text{grad}_{\text{total}} = \sum_{i=1}^{k} \text{grad}_i, \quad \text{weight} = \text{weight} - \text{lr} \times \text{grad}_{\text{total}}
梯度累积让微批次在数学上等价于大 Batch,而显存占用只有小 Batch 的水平。
  1. 微批次梯度每个微批次独立反向传播
    gradi=∇L(micro_batchi)\text{grad}_i = \nabla L(\text{micro\_batch}_i)
  2. 梯度累积累加所有微批次梯度
    gradtotal=∑i=1kgradi\text{grad}_{\text{total}} = \sum_{i=1}^{k} \text{grad}_i
  3. 权重更新用累积梯度统一更新
    W←W−η⋅gradtotal\text{W} \leftarrow \text{W} - \eta \cdot \text{grad}_{\text{total}}

工程调优要点

微批次技术真正落地时,还有一些工程细节需要关注。食堂老板的最终心得,浓缩成三条黄金法则:

第一,负载均衡。每个 GPU 分到的层(流水线级)计算量要相近,否则算得快的 GPU 会空等算得慢的 GPU,产生“木桶效应”(全局气泡由最慢的卡决定)。在切分模型层时,要尽量让每一级的计算量均衡。

第二,通信隐藏。GPU 之间的数据传递(通信)是有时间开销的。优秀的实现会把通信和计算重叠起来——在计算当前微批次的同时,预取下一个微批次的通信数据。这就像食堂老板在炒菜的同时让服务员先把下一桌的菜单递过来。

第三,混合使用。微批次不是孤立技术,它和重计算(Recomputation)、激活检查点(Activation Checkpointing)等技术搭配使用效果更好。比如用微批次降低激活值占用后,再用重计算进一步压显存,可以支撑更大的微批次,反哺吞吐量。

1. 均衡负载:各流水线级计算时间趋于一致

timestage1≈timestage2≈⋯\text{time}_{stage_1} \approx \text{time}_{stage_2} \approx \cdots

2. 重叠通信计算:通信时间被计算时间覆盖

total_time≤compute_time+comm_time\text{total\_time} \leq \text{compute\_time} + \text{comm\_time}

3. 综合收益:气泡率与显存的联合优化

Efficiency=f(bubble,memory,comm)\text{Efficiency} = f(\text{bubble}, \text{memory}, \text{comm})

食堂老板的总结:开一家高效的流水线食堂,光知道“切小份”还不够,还得让每个窗口工作量差不多(负载均衡)、让传菜和炒菜同时进行(通信隐藏)、并且灵活搭配各种工具(技术协同)。做到这三点,你的流水线食堂就能永远客满、永不空转。

AI 应用场景

大模型分布式训练框架调优

阶段:模型训练与性能优化

解决的问题:在大规模 GPU 集群上训练百亿、千亿参数模型时,传统的单 Batch 训练会导致 GPU 利用率低下、显存溢出。微批次技术通过将大 Batch 切分为小份,配合流水线并行,让每张 GPU 都保持高利用率,同时控制显存峰值。

具体案例:某团队在训练 130B 参数的大语言模型时,使用 32 张 A100 GPU 搭建 4 级流水线并行。通过将 Global Batch 设为 2048、微批次设为 16(每批 128 条样本),配合梯度累积(累积 8 步后更新权重),训练吞吐提升了 3.2 倍,显存峰值下降 40%。

推理服务中的微批次调度

阶段:模型推理与部署

解决的问题:在线推理服务中,请求到达时间不固定,大 Batch 会导致单次请求响应延迟过高。借鉴微批次思想,将请求动态切分为小批次放入推理流水线,可以显著提升吞吐并控制单请求延迟。

具体案例:某 AI 翻译服务在 GPU 上部署 transformer 模型,使用动态微批次调度(Continuous Batching),将等待中的请求动态组成微批次送入流水线。相比静态批处理,吞吐量提升了 2.8 倍,GPU 利用率从 45% 提升到 88%。

推荐系统训练的数据流水线优化

阶段:数据预处理与特征工程

解决的问题:推荐系统中训练数据量巨大且特征稀疏,数据加载往往是瓶颈。将数据流水线与模型流水线并行结合,用微批次思想切分数据流,让 CPU 端数据预处理和 GPU 端训练计算重叠进行。

具体案例:某推荐系统团队在训练 CTR 预估模型时,将数据按用户行为序列切分为微批次,CPU 负责特征拼接和 embedding 查询,GPU 负责模型前反向计算,两阶段通过有界队列衔接,训练吞吐提升 2.5 倍。

Python 演示

python36 行
def bubble_ratio(stages, micro_batches):    """计算流水线并行的气泡率"""    return (stages - 1) / (stages - 1 + micro_batches) def throughput_score(stages, micro_batches, batch_size, peak_mem_limit):    """估算吞吐量得分(越高越好),考虑显存约束"""    micro_batch_size = batch_size // micro_batches    # 显存占用估算:每级需要保存的激活值大致与微批次大小成正比    mem_per_mb = micro_batch_size * stages    if mem_per_mb > peak_mem_limit:        return 0.0    # 计算效率:微批次越大,GPU 算术效率越高,设为 0.6 ~ 0.95    compute_eff = min(0.95, 0.6 + 0.01 * micro_batch_size)    bubble = bubble_ratio(stages, micro_batches)    return compute_eff * (1 - bubble) def simulate():    """模拟不同微批次配置的效果"""    stages = 4    batch_size = 1024    mem_limit = 128  # 单位:MB     best_config = (0, 0.0)    for micro_batches in [2, 4, 8, 16, 32, 64, 128]:        ratio = bubble_ratio(stages, micro_batches)        score = throughput_score(stages, micro_batches, batch_size, mem_limit)        print(f"微批次数={micro_batches:3d} | "              f"气泡率={ratio:.2%} | 吞吐得分={score:.3f}")        if score > best_config[1]:            best_config = (micro_batches, score)     print(f"\n最佳配置:微批次数={best_config[0]},"          f"最高得分={best_config[1]:.3f}") if __name__ == "__main__":    simulate()
目的:模拟流水线并行中不同微批次配置对气泡率和吞吐量的影响,帮助工程师直观理解调参方向。
  1. def bubble_ratio(stages, micro_batches)定义气泡率计算函数,对应文中的公式 (p-1)/(p-1+m)
  2. mem_per_mb = micro_batch_size * stages估算多级流水线同时驻留的激活值显存占用
  3. compute_eff = min(0.95, 0.6 + 0.01 * micro_batch_size)模拟 GPU 计算效率随微批次增大而提升
  4. score = compute_eff * (1 - bubble)综合考虑计算效率和气泡的吞吐得分
  5. if score > best_config[1]寻找给定显存约束下的最佳配置

常见误区

误区既然 GPU 喜欢大块计算,那微批次是不是设得越大越好?反正我显存够大,直接把整个 Batch 塞进去不就行了?

正解微批次过大会导致流水线内各阶段负载不均——第一个 GPU 算 10 秒,后面 3 个 GPU 干等 10 秒。气泡率反而上升。就像食堂里一个窗口做佛跳墙(要很久),其他窗口做完自己的菜只能干等。只有微批次大小和各阶段计算量匹配时,流水线才能满负荷运转。

为何常见:人们天然觉得“大 = 高效”,忽略了流水线并行中负载均衡的重要性,误把单卡最优当成全局最优。

误区气泡率公式说明微批次越多气泡越少,那我是不是可以把微批次切得非常碎、切一万个?这样气泡率不就趋近于零了?

正解微批次过多会导致两个问题:一是显存中“在途”的激活值太多,显存爆炸;二是每两个微批次之间的通信、调度开销变得不可忽略。实际中微批次数一般设为流水线级数的 2~4 倍即可,再多收益微乎其微。就像传送带上如果每一秒都传一颗豆子,传送带本身成了瓶颈。

为何常见:只盯着气泡率一个指标,忽略了显存和通信开销等其他约束——全局最优不是单指标最优。

误区微批次已经把 Batch 切小了,梯度累积又把梯度攒起来再更新,这不是脱裤子放屁、多此一举吗?

正解两者解决的是不同维度的问题。微批次解决的是“空间”上的流水线调度——让不同 GPU 同时干不同的活;梯度累积解决的是“时间”上的权重更新策略——让多个微批次的梯度合起来做一次更新,以模拟大 Batch 的训练效果。两者配合使用:微批次保证流水线效率,梯度累积保证训练质量。

为何常见:混淆了“计算调度”和“优化策略”两个层面,看到两者都涉及“切分”就以为功能重复。

面试题

Q1. 微批次(Micro-batch)在流水线并行中的核心作用是什么?

单选题 · easy

  • A.减少模型参数量
  • B.将大Batch切分后依次送入流水线← 正确答案
  • C.加快单张GPU的浮点运算速度
  • D.降低学习率收敛速度

答案:B。微批次的核心作用是把大 Batch 切分为小份,让它们依次流过流水线各级,使每个 GPU 都有活可干。它不改变模型参数量(A错),也不改变单卡算力(C错),更不会减慢收敛(D错)。就像食堂把大订单切小份,不是为了改变菜谱,而是为了让所有窗口同时开工。

Q2. 流水线并行中,气泡(Bubble)指的是什么?

单选题 · easy

  • A.GPU 显存溢出的错误
  • B.GPU 空闲等待的时间← 正确答案
  • C.通信超时的报错信息
  • D.模型训练收敛时的波动

答案:B。气泡是流水线并行中 GPU 无数据可算的空闲时间。它出现在流水线的填充阶段和排空阶段,类似食堂刚开门时后面的窗口无菜可做。它不是错误(A、C错),也不是训练收敛现象(D错),而是并行调度中的固有开销。

Q3. 4 级流水线、16 个微批次,气泡率约为多少?

单选题 · mid

  • A.3/18 ≈ 16.7%← 正确答案
  • B.3/16 ≈ 18.8%
  • C.4/16 = 25%
  • D.16/4 = 400%

答案:A。气泡率公式为 (p-1)/(p-1+m),p=4、m=16,所以气泡率 = 3/(3+16) = 3/18 ≈ 16.7%。B 选项漏掉了分子上的 p-1;C 是算反了比例;D 完全错误。就像 4 个窗口传 16 批菜,只有开头的 3 批时间有窗口是空着的。

Q4. 微批次大小对显存的影响是什么?

单选题 · mid

  • A.微批次越大,显存占用越小
  • B.微批次越小,激活值占用越少← 正确答案
  • C.微批次大小与显存无关
  • D.微批次越大,优化器状态越少

答案:B。微批次越小,每个微批次前向传播的中间结果(激活值)越少,单批显存占用越低。但微批次数量增多会增加“在途”激活值总量。A 说反了;C 明显不对;D 中优化器状态与模型参数量相关,与微批次无关。

Q5. 增大微批次数目的好处有哪些?

多选题 · mid

  • A.降低气泡率← 正确答案
  • B.提升流水线利用率← 正确答案
  • C.减少显存占用
  • D.增大单批次激活值

答案:AB。由气泡率公式 (p-1)/(p-1+m),增大微批次 m 会降低气泡率,提升流水线利用率。但 C 错误——更多微批次意味着更多“在途”激活值,显存占用可能增加;D 也不对——单批激活值由微批次大小决定,数目增多时每个微批次的大小反而变小。

Q6. 梯度累积的数学本质是什么?

单选题 · mid

  • A.将多个微批次的梯度求平均后再更新
  • B.将多个微批次的梯度求和后再更新← 正确答案
  • C.每步都更新权重但学习率翻倍
  • D.随机丢弃部分微批次的梯度

答案:B。梯度累积把多个微批次各自计算的梯度累加起来,然后用总梯度统一更新权重,等效于一次处理一个大 Batch。A 说“平均”不对——通常是大 Batch 梯度的平均值而非求和,但严格来是求和再除以累积步数。C 和 D 都是常见的错误做法。这就像把几桌客人的账单加起来一起结,不是每桌单独结。

Q7. 关于填充策略(Padding),以下说法正确的有?

多选题 · hard

  • A.零填充会引入额外的计算开销← 正确答案
  • B.跨批次填充可以借用下一迭代的微批次← 正确答案
  • C.填充策略可以完全消除所有气泡
  • D.填充策略不需要额外显存

答案:AB。零填充确实会插入虚拟计算,引入少量额外开销(A 对)。跨批次填充是从下一轮迭代借微批次来填补空闲(B 对)。C 过于绝对——填充可以大幅降低气泡率,但通信、同步等仍有微小开销,无法完全消除。D 错——跨批次填充需要为提前进入的微批次预留显存。

Q8. 某团队训练 175B 模型,4 级流水线 + 32 个微批次,Global Batch 为 2048,则每个微批次包含多少样本?

单选题 · hard

  • A.64← 正确答案
  • B.128
  • C.512
  • D.2048

答案:A。每个微批次的样本数 = Global Batch / 微批次数 = 2048 / 32 = 64 条样本。这就像 2048 份外卖订单分成 32 批配送,每批就是 64 份。其他选项都是对除法关系理解错误——128 是除以 16 的结果,512 是除以 4 的结果。

Q9. 微批次数量从 4 增大到 16(流水线 4 级),气泡率如何变化?

单选题 · hard

  • A.从 42.9% 降至 16.7%← 正确答案
  • B.从 25% 降至 6.25%
  • C.从 50% 降至 12.5%
  • D.不变,仍是 42.9%

答案:A。p=4、m=4 时,气泡率 = 3/(3+4) ≈ 42.9%;p=4、m=16 时,气泡率 = 3/(3+16) ≈ 16.7%。气泡率从 42.9% 降到 16.7%,说明增加微批次数量能有效摊薄气泡。其他选项的计算方式都不符合公式 (p-1)/(p-1+m)。

Q10. 工程实践中,微批次调优需要考虑哪些因素的平衡?

多选题 · hard

  • A.吞吐量与显存占用← 正确答案
  • B.气泡率与通信开销← 正确答案
  • C.负载均衡与计算密度← 正确答案
  • D.模型参数量与训练数据量

答案:ABC。微批次调优是系统工程,需要平衡吞吐量 vs 显存(A 对)、气泡率 vs 通信调度开销(B 对)、各阶段负载均衡 vs 单卡计算密度(C 对)。D 中的模型参数量和训练数据量是模型的固有属性,不是微批次的调优参数。就像开食堂要同时考虑台面大小、传菜效率和厨师工作量,而不是考虑菜谱有多少页。