# 内容 * [内容](#内容) * [环境配置](#环境配置) * [下载词汇文件](#下载词汇文件) * [下载训练数据](#下载训练数据) * [训练](#训练) * [数据预处理](#数据预处理) * [GPT预训练](#GPT预训练) * [单卡训练](#单卡训练) * [Deepspeed-PP和ZeRO-DP](#Deepspeed-PP和ZeRO-DP) * [分布式多卡训练](#分布式多卡训练) * [推理](#推理) * [模型转换](#模型转换) * [GPT文本生成](#GPT文本生成) * [参考](#参考) # 环境配置 1. 安装基础依赖包 pip install -r requirements.txt 2. 安装DCU相关whl包 DCU相关包下载目录:[https://cancon.hpccube.com:65024/4/main](https://cancon.hpccube.com:65024/4/main) pytorch whl包:pytorch ---> dtk-23.04 根据python版本,下载对应pytorch的whl包
pip install torch* (下载的torch的whl包)torchvision whl包:vision ---> dtk-23.04 根据python版本,下载对应torchvision的whl包
pip install torchvision* (下载的torchvision的whl包)apex whl包:apex ---> dtk-23.04 根据python版本,下载对应apex的whl包
pip install apex* (下载的apex的whl包)deepspeed whl包:deepspeed ---> dtk-23.04 根据python版本,下载对应apex的whl包
pip install deepspeed* (下载的apex的whl包)若使用 pip install 下载安装过慢,可添加源:-i https://pypi.tuna.tsinghua.edu.cn/simple/ # 下载词汇文件
wget https://s3.amazonaws.com/models.huggingface.co/bert/gpt2-vocab.json wget https://s3.amazonaws.com/models.huggingface.co/bert/gpt2-merges.txt# 下载训练数据 使用1GB 79K jsonl数据集
wget https://huggingface.co/bigscience/misc-test-data/resolve/main/stas/oscar-1GB.jsonl.xz xz -d oscar-1GB.jsonl.xz# 训练 ## 数据预处理
python tools/preprocess_data.py \
--input oscar-1GB.jsonl \
--output-prefix my-gpt2 \
--vocab gpt2-vocab.json \
--dataset-impl mmap \
--tokenizer-type GPT2BPETokenizer \
--merge-file gpt2-merges.txt \
--append-eod \
--workers 8
## GPT预训练
### 单卡训练
1. `examples/pretrain_gpt.sh`:运行单GPU 345M参数GPT预训练(单GPU训练主要用于调试目的,因为代码针对分布式训练进行了优化).
修改DATA_PATH和CHECKPOINT_PATH路径后运行.
参数说明: `--micro-batch-size`为单个前向-后向路径的批处理大小,`--global-batch-size`为每次迭代的批处理大小,`--lr`为学习率,数据按949:50:1的比例划分为训练/验证/测试集(默认为 969:30:1),`--train-iters`为训练的迭代次数,或者使用`--train-samples`(训练的样本总数),若使用`--train-samples`,则不需要指定`--lr-decay-iters`,而是需要指定`--lr-decay-samples`. `--lr-decay-iters`为学习率衰减迭代次数,`--fp16`为训练的数据类型,不设置默认使用fp32训练.
2. [pretrain_gpt_single_node.sh](example/pretrain_gpt_single_node.sh)
```
N_GPUS=1
CHECKPOINT_PATH=checkpoints/gpt2
VOCAB_FILE=gpt2-vocab.json
MERGE_FILE=gpt2-merges.txt
DATA_PATH=my-gpt2_text_document
RANK=0
WORLD_SIZE=$N_GPUS
GPT_ARGS=" \
--num-layers 24 \
--hidden-size 1024 \
--num-attention-heads 16 \
--seq-length 1024 \
--max-position-embeddings 1024 \
--micro-batch-size 4 \
--global-batch-size 8 \
--lr 0.00015 \
--train-iters 500000 \
--lr-decay-iters 320000 \
--lr-decay-style cosine \
--vocab-file $VOCAB_FILE \
--merge-file $MERGE_FILE \
--lr-warmup-fraction .01 \
--fp16 \
--rank ${RANK} \
--world_size ${WORLD_SIZE} \
--local_rank $RANK
"
OUTPUT_ARGS=" \
--log-interval 10 \
--save-interval 500 \
--eval-interval 100 \
--eval-iters 10 \
--checkpoint-activations \
"
DATA_ARGS=" \
--save $CHECKPOINT_PATH \
--load $CHECKPOINT_PATH \
--data-path $DATA_PATH \
"
CMD="pretrain_gpt.py $GPT_ARGS $OUTPUT_ARGS $DATA_ARGS"
N_GPUS=1
LAUNCHER="deepspeed --num_gpus $N_GPUS"
$LAUNCHER $CMD
```
对于多GPU训练,修改`--num_gpus`所使用的GPU数量.
3. 模拟`distributed`
```
MASTER_ADDR=localhost MASTER_PORT=9994 RANK=0 LOCAL_RANK=0 python pretrain_gpt.py ...
```
更多命令行参数见 [`arguments.py`](./megatron/arguments.py).
### Deepspeed-PP和ZeRO-DP
使用Deepspeed的PP代替Megatron的PP,DP使用ZERO-DP,与Megatron-LM启动类似,此外还需要有一个deepspeed的配置文件和一些参数:
```
CHECKPOINT_PATH=checkpoints/gpt2
VOCAB_FILE=gpt2-vocab.json
MERGE_FILE=gpt2-merges.txt
DATA_PATH=my-gpt2_text_document
TENSORBOARD_PATH=output_dir/tensorboard
CODECARBON_PATH=output_dir/codecarbon
MICRO_BATCH_SIZE=1
GLOBAL_BATCH_SIZE=16
TP_SIZE=1
PP_SIZE=1
N_GPUS=2
SAVE_INTERVAL=100
RANK=0
WORLD_SIZE=$N_GPUS
GPT_ARGS=" \
--num-layers 2 \
--hidden-size 64 \
--num-attention-heads 2 \
--seq-length 1024 \
--max-position-embeddings 1024 \
--micro-batch-size $MICRO_BATCH_SIZE \
--rampup-batch-size 2 2 1_000 \
--global-batch-size $GLOBAL_BATCH_SIZE \
--train-samples 100 \
--optimizer adam \
--adam-beta1 0.9 \
--adam-beta2 0.95 \
--adam-eps 1e-8 \
--lr 1e-4 \
--lr-warmup-samples 5 \
--clip-grad 1.0 \
--weight-decay 1e-1 \
--vocab-file $VOCAB_FILE \
--merge-file $MERGE_FILE \
--fp16 \
--rank ${RANK} \
--world_size ${WORLD_SIZE} \
--local_rank $RANK
"
OUTPUT_ARGS=" \
--log-interval 10 \
--save-interval $SAVE_INTERVAL \
--eval-interval 100 \
--eval-iters 10 \
--checkpoint-activations \
"
DATA_ARGS=" \
--save $CHECKPOINT_PATH \
--load $CHECKPOINT_PATH \
--data-path $DATA_PATH \
--tensorboard-dir $TENSORBOARD_PATH \
--tensorboard-queue-size 5 \
--log-timers-to-tensorboard \
--log-batch-size-to-tensorboard \
--log-validation-ppl-to-tensorboard \
"
ZERO_STAGE=1
config_json="./ds_config.json"
# Deepspeed figures out GAS dynamically from dynamic GBS via set_train_batch_size()
cat <