Megatron 代码分析
megatron 阅读笔记
入口部分
graph TD
n1(main)
subgraph pretrain_gpt.py
n1---n3[/forward_step\]
end
subgraph pretrain.py
n2(pretrain)
end
n3-->n2
pretrain
的 参数如下
1 |
|
pretrain 做四件事情
- 初始化 megatron
- 设置模型,优化器,学习率
- 获取数据集
- 训练模型
训练部分
在函数 pretrain
(training.py) 内部,两个重要的函数,一个函数 setup_model_and_optimizer
设置模型的各项配置,另外一个函数 train
真正训练
graph LR
n1(setup_model_and_optimizer)-->n2(train)
函数 train
(training.py) 内部 函数 update_num_microbatches
和 train_step
(training.py) 是iteration 控制的 while 循环
flowchart TB
subgraph whileloop_iter
n2(update_num_microbatches)-->n3(train_step)
end
n1(train)-->whileloop_iter
在函数 train_step
内部
flowchart TB
subgraph after_other_function
n1(forward_backward_func)-->n2(allreduce_gradients)
n2-->n4(...)
end
n3(train_step)-->after_other_function
1 |
|
函数 forward_backward_func
实际上是 分支成是否使用 pipeline parallel
, 对于使用 pipline parallel
的情况,还会分成时候使用 interleaved
(交错)
flowchart LR
n1(forward_backward_func)-->n2(with pipline)
n1-->n3(no pipline)
n2-->n4(interleaved)
n2-->n5(no interleaved)
n3-->n6(interleaved)
n3-->n7(no interleaved)
n4---n8[branch1]
n5---n9[branch2]
n6---n10[branch3]
n7---n11[branch4]
在 branch1
中
对于 microbatchsize
的解释,是从 README.md 中 # BERT Pretraining 这部分摘录
While this is single GPU training, the batch size specified by
--micro-batch-size
is a single forward-backward path batch-size and the code will perform gradient accumulation steps until it reachesglobal-batch-size
which is the batch size per iteration.
意思是指每一次真正前向反向传播的 batch_size
大小,这就是,如果到达一定数量之后再把梯度求和
forward_backward_func
有个重要的参数, forward_step_func
这个参数被一路传递,最上面实参是在 pretrain
(pretrain_gpt.py) 内部被定义的是 forword_step
(pretrain_gpt.py) 这个函数,这个函数也是在 pretrain_gpt.py 内部
1 |
|
flowchart TB
subgraph schedule.py
direction TB
n1(forward_backward_pipelining_with_interleaving)-->n2(forward_step_helper self-func)
n2-->n3(forward_step)
end
1 |
|
这里 forward_step
1 |
|
然后寻找 model
这个参数的由来
flowchart TB
subgraph training.py
direction TB
n1(pretrain)-->n2(setup_model_and_optimizer)
end
1 |
|
观察函数 setup_model_and_optimizer
flowchart TB
subgraph training.py
direction TB
n1(setup_model_and_optimizer)-->n2(get_model)
end
通过 get_model
函数获得 model
而在 getmodel
里面有一个重要的参数 model_provider
这个参数是在 pretrain_gpt.py 里面被实例化的.
1 |
|
而这个函数是在 pretain_gpt.py
1 |
|