# Generative Pre-Training2(GPT2) ## 模型介绍 GPT2模型:第二代生成式预训练模型(Generative Pre-Training2)。 ## 模型结构 GPT2使用 Transformer 的 Decoder 结构,并对 Transformer Decoder 进行了一些改动,原本的 Decoder 包含了两个 Multi-Head Attention 结构,GPT2 只保留了 Mask Multi-Head Attention。 我们为了用户可以使用OneFlow-Libai快速验证GPT2模型预训练,统计性能或验证精度,提供了一个GPT2网络示例,主要网络参数: ``` model.cfg.num_attention_heads = 16 model.cfg.hidden_size = 384 model.cfg.ffn_hidden_size = 1536 model.cfg.hidden_layers = 6 model.cfg.max_seq_length = 1024 ``` 完整的GPT2网络配置在configs/common/model/gpt.py中 同时,我们提供了一个更大的GPT2-13B网络为了用户可以快速在DCU集群上使用OneFlow-Libai进行较大规模的混合并行分布式预训练验证(该网络可能并不具有实际训练价值),该网络结构在GPT2基础上进行扩充,主要网络参数如下,参数量共有13.1B: ``` model.cfg.num_attention_heads = 32 model.cfg.hidden_size = 4096 model.cfg.ffn_hidden_size = 4096*4 model.cfg.hidden_layers = 64 model.cfg.max_seq_length = 1024 ``` ## 数据集 我们在libai目录下集成了部分小数据集供用户快速验证: ./nlp_data ## GPT2预训练 ### 环境配置 推荐使用docker方式运行,提供[光源](https://www.sourcefind.cn/#/service-details)拉取的docker镜像:image.sourcefind.cn:5000/dcu/admin/base/oneflow:0.9.1-centos7.6-dtk-22.10.1-py39-latest 进入docker: cd libai pip3 install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple pip3 install pybind11 -i https://mirrors.aliyun.com/pypi/simple pip3 install -e . -i https://mirrors.aliyun.com/pypi/simple ### 训练 该预训练脚本运行环境为1节点,4张DCU-Z100-16G。 并行配置策略在configs/gpt2_pretrain.py中,使用自动混合精度: ``` train.amp.enabled = True train.train_micro_batch_size = 4 train.dist.data_parallel_size = 4 train.dist.tensor_parallel_size = 1 train.dist.pipeline_parallel_size = 1 ``` 预训练命令: cd libai bash tools/train.sh tools/train_net.py configs/gpt2_pretrain.py 4 ### 性能和收敛性 训练数据:[https://oneflow-static.oss-cn-beijing.aliyuncs.com/ci-files/dataset/libai/gpt_dataset](链接) 使用的GPGPU:4张DCU-Z100-16G。 模型性能及收敛性: | 卡数 | 分布式工具 | 性能 | 收敛性 | | :--: | :--------: | :--------------: | :---------------------------: | | 4 | Libai-main | 129.55 samples/s | total_loss: 4.336/10000 iters | ## GPT2-13B预训练 ### 环境配置 要求DCU集群Slurm环境正常。 推荐用户使用预编译好的python3.9包来快速建立python3虚拟环境: cd libai export PYTHON3_LIB_PATH=/python_lib_path virtualenv -p /python_bin_path/python3 --system-site-packages venv_oneflow source env.sh #进入venv_oneflow虚拟环境 pip3 install --upgrade pip -i https://mirrors.aliyun.com/pypi/simple #更新pip pip3 install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple pip3 install pybind11 -i https://mirrors.aliyun.com/pypi/simple pip3 install -e . -i https://mirrors.aliyun.com/pypi/simple pip3 install oneflow-0.9.1+dtk2210.git.8ea46d6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl ### 训练 该预训练脚本需要24个节点,每节点4张DCU-Z100-16G。 混合并行配置策略在configs/gpt2-13B_pretrain.py中,使用自动混合精度: ``` train.amp.enabled = True train.train_micro_batch_size = 2 train.num_accumulation_steps = 4 train.activation_checkpoint.enabled = True train.zero_optimization.enabled = True train.zero_optimization.stage = 1 train.dist.data_parallel_size = 6 train.dist.tensor_parallel_size = 4 train.dist.pipeline_parallel_size = 4 ``` 进入登陆节点,预训练命令: cd libai source submit_job.sh tail -f log/xxx.out.log #查看输出log tail -f log/xxx.err.log #查看错误log ### 性能和收敛性 训练数据:[https://oneflow-static.oss-cn-beijing.aliyuncs.com/ci-files/dataset/libai/gpt_dataset](链接) 使用的GPGPU:96张DCU-Z100-16G。 模型性能及收敛性: | 卡数 | 分布式工具 | 性能 | 收敛性 | | :------: | :------: | :------: |:------: | | 96 | Libai-main | 2.27 samples/s | total_loss: 5.56/1299 iters | ## 参考 * https://libai.readthedocs.io/en/latest/tutorials/get_started/quick_run.html * https://github.com/Oneflow-Inc/oneflow * https://github.com/Oneflow-Inc/libai/blob/main/docs/source/notes/FAQ.md