Training BERT on Wikipedia and BookCorpus for Pre-training and SQuAD for Fine-tuning using OneFlow
BERT 2018 BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding Paper URL : https://arxiv.org/abs/1810.04805
https://github.com/Oneflow-Inc/oneflow https://github.com/Oneflow-Inc/models
多机多卡混合并行方式训练(数据并行、模型并行、流水并行);当前项目采用oneflow计算框架,对bert模型进行按层进行划分,进而实现混合并行训练
- 支持GPT2、Robart等主流模型
- 更加灵活的并行训练
- 其他模型切分方式
./run_ppl.sh ${node_rank}注意:在oneflow中node_rank和local_rank是分开编码的
| 参数名 | 描述 | example |
|---|---|---|
| nproc_per_node | 每个节点的进程数目 | 3 |
| node_rank | 节点的rank | 0 |
| master_addr | master的ip地址 | cn1(可以使用域名) |
| master_port | master端口 | 7788 |
| num_hidden_layers | encoder layer的层数 | 24 |
| num_attention_heads | attention的头数,默认每一个头是64维 | 16 |
| gpu_num_per_node | 每个节点使用的GPU数量 | 3 |
| grad-acc-steps | 梯度累积 | 3 |
| seq_length | 序列长度 | 128 |
| train-global-batch-size | 全局batch_size | 24 |
| learning_rate | 学习率 | 0.00005 |
| nums_split | 模型切分数目 | 3 |
| ofrecord_path | 训练数据集目录 | ../data/wiki_ofrecord_seq_len_128 |
| strategy | 模型并行策略 | intra_first or inter_first |
根据模型参数量均分划分到多个节点上(以encoder layer为基本划分单位)
intra_first:模型并行优先放置的节点内(机器内的多个GPU上,节点间数据并行)
inter_first: 模型并行优先放置在节点间 (节点内数据并行)
服务器:Intel(R) Xeon(R) Silver 4216 CPU @ 2.10GHz
GPU:Tesla M40(24G)
oneflow:0.6.0+cu111
| 并行策略 | 参数量 | GPU数量 | 单个step执行时间(s) |
|---|---|---|---|
| intra_first | 24层16头 | 双机双卡(4GPU) | 1.20 |
| inter_first | 24层16头 | 双机双卡(4GPU) | 0.80 |
| intra_first | 24层32头 | 三机三卡(9GPU) | 5.25 |
| inter_first | 24层32头 | 三机三卡(9GPU) | 2.84 |
| intra_first | 48层32头 | 四机四卡(16GPU) | 10.96 |
| inter_first | 48层32头 | 四机四卡(16GPU) | 5.23 |