-
Notifications
You must be signed in to change notification settings - Fork 36
Expand file tree
/
Copy pathquiz.json
More file actions
78 lines (78 loc) · 3.62 KB
/
Copy pathquiz.json
File metadata and controls
78 lines (78 loc) · 3.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
{
"lesson": "46-gradient-accumulation",
"title": "顶点课 46 —— 梯度累积",
"questions": [
{
"stage": "pre",
"question": "梯度累积表达的 effective batch 等式是什么?",
"options": [
"effective_batch = micro_batch / accum_steps",
"effective_batch = micro_batch * accum_steps",
"effective_batch = micro_batch + accum_steps",
"effective_batch = world_size only"
],
"correct": 1,
"explanation": "Micro batch 是显存能装下的大小;accumulation steps 是在一次 optimizer step 之前把梯度堆进同一个 buffer 的 forward + backward 次数。"
},
{
"stage": "pre",
"question": "为什么每个 micro batch backward 之前要把 loss 除以 accum_steps?",
"options": [
"让 loss 曲线更好看。",
"PyTorch 默认把梯度累加到 param.grad 里,不除的话累积梯度会大 N 倍,optimizer step 也会激进 N 倍。",
"为了避免 NaN。",
"只在混合精度下才需要。"
],
"correct": 1,
"explanation": "累积 buffer 是求和的。每个 micro batch 乘以 1/N,就把求和结果拉回到单次全 batch backward 产生的相同尺度。"
},
{
"stage": "check",
"question": "在累积循环里,optimizer step 什么时候执行?",
"options": [
"每个 micro batch 之后。",
"只在累积窗口的最后一个 micro batch 之后。",
"每个窗口执行两次以确保安全。",
"永远不执行;optimizer 被替换了。"
],
"correct": 1,
"explanation": "在累积中途 step 会污染后续依赖的所有参数。Optimizer step 每个 effective batch 只触发一次。"
},
{
"stage": "check",
"question": "在真正的多 GPU run 上,no_sync context 包裹的是什么?",
"options": [
"前向传播。",
"Optimizer step。",
"非最后一个 micro batch,这样 gradient all-reduce 只在最后一次 backward 之后触发,而不是触发 N 次。",
"Data loader。"
],
"correct": 2,
"explanation": "DDP 的 no_sync 跳过梯度 collective。把除最后一个之外的 micro batch 都包起来,就把每个 effective step 的 N 次 collective 变成了一次。"
},
{
"stage": "check",
"question": "main.py 中的 equivalence_check 函数断言了什么?",
"options": [
"Loss 收敛了。",
"单次全 batch backward 和 accum_steps 次分块 backward(loss 除以 N)产生相同的梯度 buffer 和相同的 step 后参数,在一个小容差内。",
"吞吐量是常量。",
"梯度为零。"
],
"correct": 1,
"explanation": "断言界限是 max-abs-diff 低于 1e-4。不做 loss 缩放时差值会爆炸;做了缩放后差值停留在浮点噪声水平。"
},
{
"stage": "post",
"question": "从吞吐量随 effective batch 的变化曲线上看,什么基本不变、什么在缩放?",
"options": [
"Samples per second 随更大的 effective batch 下降。",
"Samples per second 在硬件上限附近饱和,而每次 optimizer step 的 wall time 随 accum_steps 线性增长;真正下降的是 optimizer steps per second。",
"两个指标都随 accum 线性增长。",
"吞吐量会上升因为模型变快了。"
],
"correct": 1,
"explanation": "每个 micro batch 的 forward + backward 开销不变。累积买到的是每次 optimizer step 的统计平滑,而非原始吞吐量;这条曲线是对流行说法的有效现实检验。"
}
]
}