实验简介:
本文介绍如何使用GPU云服务器,使用Megatron-Deepspeed框架训练GPT-2模型并生成文本。
实验室地址:https://developer.aliyun.com/adc/scenario/exp/85b05a98c93049f198a4705bb59486e0
查看更多最佳实践:https://www.aliyun.com/daily-act/ecs/markets/aliyun/gpu/aigc
实验说明
1. 实验资源方式简介及开始
a.云起实验室支持个人账户资源一种实验资源方式。
- 个人账户资源
- 使用您个人的云资源进行操作,资源归属于个人。
- 所有实验操作将保留至您的账号,请谨慎操作。
- 平台仅提供手册参考,不会对资源做任何操作。
- 说明:使用个人账户资源,在创建资源时,可能会产生一定的费用,请您及时关注相关云产品资源的计费概述。
b.准备开始实验
- 在实验开始前,请您选择个人账户资源,单击确认开启实验。
2. 创建ECS实例
a.前往实例创建页。
b.按照界面提示完成参数配置,创建一台ECS实例。
- 需要注意的参数如下,其他参数的配置,请参见自定义购买实例。
- 实例:选择实例规格为ecs.gn7i-c8g1.2xlarge(单卡NVIDIA A10)。
- 镜像:使用云市场镜像,名称为aiacc-train-solution,您可以直接通过名称搜索该镜像,选择最新版本即可。
- 公网IP:选中分配公网IPv4地址,带宽计费模式选择按使用流量,带宽峰值设置为100 Mbps。以加快模型下载速度。
c.为当前ECS实例设置登录密码,登录凭证选择自定义密码,登录名选择root,输入登录密码和确认密码。
d.在云服务ECS购买页面右侧,选中服务协议,单击确认下单。
e.在创建成功对话框中,单击管理控制台。创建完成后,在ECS实例页面,获取公网IP地址。
f.在实例页面,等待状态变为运行中后,即可使用该云服务器ECS。
3. 安装Megatron-Deepspeed框架
a.在实验室页面右侧,单击图标,切换至Web Terminal。
- 输入ECS服务器登录用户名和密码,登录ECS。
b.执行以下命令,启动容器。
docker run -d -t --network=host --gpus all --privileged --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 --name megatron-deepspeed -v /etc/localtime:/etc/localtime -v /root/.ssh:/root/.ssh nvcr.io/nvidia/pytorch:21.10-py3
c.执行以下命令,进入容器终端。
docker exec -it megatron-deepspeed bash
d.执行以下命令,下载Megatron-DeepSpeed框架。
- 说明:由于网络原因,执行命令后可能会失败,建议您多次尝试。
git clone https://github.com/bigscience-workshop/Megatron-DeepSpeed
e.执行以下命令,安装Megatron-DeepSpeed框架。
cd Megatron-DeepSpeed pip install -r requirements.txt
4. 处理数据
- 本指南使用1GB 79K-record的JSON格式的OSCAR数据集。
a.执行以下命令,下载数据集。
wget https://huggingface.co/bigscience/misc-test-data/resolve/main/stas/oscar-1GB.jsonl.xz wget https://s3.amazonaws.com/models.huggingface.co/bert/gpt2-vocab.json wget https://s3.amazonaws.com/models.huggingface.co/bert/gpt2-merges.txt
b.执行以下命令,解压数据集。
xz -d oscar-1GB.jsonl.xz
c.执行以下命令,预处理数据。
python3 tools/preprocess_data.py \ --input oscar-1GB.jsonl \ --output-prefix meg-gpt2 \ --vocab gpt2-vocab.json \ --dataset-impl mmap \ --tokenizer-type GPT2BPETokenizer \ --merge-file gpt2-merges.txt \ --append-eod \ --workers 8
- 如果回显信息类似如下所示,表示预处理数据完成。
d.执行以下命令,新建data目录。
mkdir data
e.执行以下命令,将处理好的数据移动到data目录下。
mv meg-gpt2* ./data mv gpt2* ./data
5. 预训练
- 本示例使用单机单卡的GPU实例完成GPT-2 MEDIUM模型的预训练。
a.创建预训练脚本文件。
- 执行以下命令,创建预训练脚本文件。
vim pretrain_gpt2.sh
- 按i键,进入编辑模式,在文件中添加以下信息。
#! /bin/bash # Runs the "345M" parameter model GPUS_PER_NODE=1 # Change for multinode config MASTER_ADDR=localhost MASTER_PORT=6000 NNODES=1 NODE_RANK=0 WORLD_SIZE=$(($GPUS_PER_NODE*$NNODES)) DATA_PATH=data/meg-gpt2_text_document CHECKPOINT_PATH=checkpoints/gpt2 DISTRIBUTED_ARGS="--nproc_per_node $GPUS_PER_NODE --nnodes $NNODES --node_rank $NODE_RANK --master_addr $MASTER_ADDR --master_port $MASTER_PORT" python -m torch.distributed.launch $DISTRIBUTED_ARGS \ pretrain_gpt.py \ --tensor-model-parallel-size 1 \ --pipeline-model-parallel-size 1 \ --num-layers 24 \ --hidden-size 1024 \ --num-attention-heads 16 \ --micro-batch-size 4 \ --global-batch-size 8 \ --seq-length 1024 \ --max-position-embeddings 1024 \ --train-iters 5000 \ --lr-decay-iters 320000 \ --save $CHECKPOINT_PATH \ --load $CHECKPOINT_PATH \ --data-path $DATA_PATH \ --vocab-file data/gpt2-vocab.json \ --merge-file data/gpt2-merges.txt \ --data-impl mmap \ --split 949,50,1 \ --distributed-backend nccl \ --lr 0.00015 \ --lr-decay-style cosine \ --min-lr 1.0e-5 \ --weight-decay 1e-2 \ --clip-grad 1.0 \ --lr-warmup-fraction .01 \ --checkpoint-activations \ --log-interval 10 \ --save-interval 500 \ --eval-interval 100 \ --eval-iters 10 \ --fp16
- 按Esc键,输入:wq后,按Enter键保存文件。
htpasswd -bc /etc/nginx/password ${UserName} '${Password}'
b.修改测试代码。
- Megatron源码有一个断言需要注释掉,以保证代码正常运行。
- 执行以下命令,打开测试代码文件。
vim /workspace/Megatron-DeepSpeed/megatron/model/fused_softmax.py +191
- 按i键,进入编辑模式,在assert mask is None, "Mask is silently ignored due to the use of a custom kernel"前加#。
- 按Esc键,输入:wq后,按Enter键保存文件。
c.预训练。
- 执行以下命令,开始预训练。
nohup sh ./pretrain_gpt2.sh &
- 执行如下命令,可以持续的查看nohup.out的输出,达到监控程序的效果。
tail -f nohup.out
- 如果回显信息类似如下所示,表示预训练完成。
- 说明:预训练完成大概需要1小时30分钟,如果超时断开了ECS连接,重新远程登录ECS实例后,执行以下命令,继续查看预训练进度。预训练完成后,可以执行Ctrl+Z命令退出。
docker exec -it megatron-deepspeed bash cd Megatron-DeepSpeed tail -f nohup.out
d.(可选)执行以下命令,查看生成的模型checkpoint路径。
- 本示例生成的模型checkpoint路径设置在/workspace/Megatron-DeepSpeed/checkpoints/gpt2。
ll ./checkpoints/gpt2
6. 使用GPT-2模型生成文本
a.执行以下命令,安装相关依赖。
- 说明:由于网络原因,执行命令后可能会失败,建议您多次尝试。
pip install mpi4py
- 如果回显信息类似如下所示,表示依赖安装完成。
b.创建文本生成脚本。
- 执行以下命令,创建文本生成脚本。
vim generate_text.sh
- 按i键,进入编辑模式,在文件中增加以下内容。
#!/bin/bash CHECKPOINT_PATH=checkpoints/gpt2 VOCAB_FILE=data/gpt2-vocab.json MERGE_FILE=data/gpt2-merges.txt python tools/generate_samples_gpt.py \ --tensor-model-parallel-size 1 \ --num-layers 24 \ --hidden-size 1024 \ --load $CHECKPOINT_PATH \ --num-attention-heads 16 \ --max-position-embeddings 1024 \ --tokenizer-type GPT2BPETokenizer \ --fp16 \ --micro-batch-size 2 \ --seq-length 1024 \ --out-seq-length 1024 \ --temperature 1.0 \ --vocab-file $VOCAB_FILE \ --merge-file $MERGE_FILE \ --genfile unconditional_samples.json \ --num-samples 2 \ --top_p 0.9 \ --recompute
- 按Esc键,输入:wq后,按Enter键保存文件。
c.执行以下命令,生成文本。
sh ./generate_text.sh
- 如果回显信息类似如下所示,表示生成文本完成。
vim unconditional_samples.json
- 回显信息类似如下所示。
7. 清理及后续
- 清理
- 如果无需继续使用实例,可以登录ECS控制台,找到目标实例,在操作列单击,搜索并单击释放设置,根据界面提示释放实例。
- 如果需要继续使用实例,请您随时关注账户扣费情况,避免欠费。实例会因欠费而被自动停机,停机15天内实例将保留,15天后实例和数据都将被自动释放。
- 后续
- 了解更多AIGC实践和GPU优惠,活动入口:立即开启AIGC之旅