项目简介
本项目是基于OneFlow计算框架和BERT预训练模型的分布式训练项目。利用大规模数据集对BERT模型进行预训练,并通过Fine-tuning在特定任务上进行微调,涵盖模型定义、数据加载、优化器构建以及分布式训练策略。
项目的主要特性和功能
- BERT模型训练:支持在Wikipedia和BookCorpus数据集上预训练BERT模型,在SQuAD数据集上进行Fine-tuning。
- 分布式训练:支持多机多卡混合并行训练,包含数据并行、模型并行和流水并行。
- 灵活的并行策略:提供intra_first和inter_first等并行策略,可依模型参数量和GPU资源灵活配置。
- OneFlow框架:借助OneFlow计算框架实现高效的分布式计算。
- 实验结果:提供详细实验环境和结果,展示不同并行策略下的训练性能。
安装使用步骤
假设用户已经下载了本项目的源码文件。
1. 安装OneFlow:
shell
pip install oneflow
2. 准备数据集:
- 下载Wikipedia和BookCorpus数据集用于预训练。
- 下载SQuAD数据集用于Fine-tuning。
3. 配置参数:
- 根据需求修改配置文件,如config.yaml
,设置参数如nproc_per_node
、node_rank
、master_addr
等。参数说明如下:
| 参数名 | 描述 | 示例 |
|--------|------|------|
| 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 或 inter_first |
4. 运行训练脚本:
shell
./run_ppl.sh ${node_rank}
分布式训练策略
- intra_first:模型并行优先放置在节点内(机器内的多个GPU上,节点间数据并行)。
- inter_first:模型并行优先放置在节点间(节点内数据并行)。
实验结果
| 并行策略 | 参数量 | 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 |
注意事项
- 确保已正确安装OneFlow计算框架。
- 根据实际需求修改配置文件和数据路径。
- 在分布式环境中运行时,确保节点间的通信和网络连接正常。
下载地址
点击下载 【提取码: 4003】【解压密码: www.makuang.net】