Bert

最近更新时间:2024-08-28 17:44:21

我的收藏
本指导适用于在 TencentOS Server 3上使用 DeepSpeed 训练框架运行 Bert 模型的官方 Demo,以 Docker 方式启动。

环境准备

1. 从 GitHub下载 DeepSpeed 的 Demo 开源仓库到本地。
git clone https://github.com/microsoft/DeepSpeedExamples.git
cd DeepSpeedExamples/
2. 由于 DeepSpeed 镜像已经长期没有更新,我们使用 Pytorch 的基础镜像即可包含大部分运行环境。这里我们拉取 Nvidia 的基础镜像来启动容器。
docker run -it --gpus all --name=deepspeed -e HF_ENDPOINT="https://hf-mirror.com" --ipc=host -v $PWD:/workspace nvcr.io/nvidia/pytorch:23.06-py3 /bin/bash
此时会从 nvcr 拉取 docker 镜像,请确保网络环境较好,直到镜像里所有层下载成功。成功后会直接进入容器内部。
注意:
使用 -e HF_ENDPOINT="https://hf-mirror.com" 是因为其中有些 examples 会从 Hugging Face 导入某些模型或者参数,我们需要保证与 Hugging Face 的通信是正常的。

安装 DeepSpeed 以及必要的包

1. 将 pip 换为国内清华源以加快下载速度。
#将pip换成清华源
#设为默认,永久有效
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
2. 安装运行 DeepSpeed 必要的包,通过 pip 下载。
#安装所有需要的包
pip install datasets fire loguru sh deepspeed transformers
所有需要的包安装成功之后,即可开始准备运行模型。

运行模型

1. 这里我们运行 HelloDeepSpeed 下的 Bert 模型。
cd training/HelloDeepSpeed/
2. 这里我们跑 train_bert_ds.py 文件,该文件可以直接调用 GPU 进行训练。该文件运行时还存在一些 bug,需要对第500行和第514行的代码进行一些修改。
#第500行
#原代码
handle.write(gitlog.stdout.decode("utf-8"))
#更改为
handle.write(gitlog)

#第514行
#原代码
handle.write(gitdiff.stdout.decode("utf-8"))
#更改为
handle.write(gitdiff)
3. 修改完成之后保存,我们就可以通过容器运行 Bert 的代码了。
#运行模型
deepspeed train_bert_ds.py --checkpoint_dir ./experiments
注意:
除了 checkpoint_dir 参数,可以将训练好的模型放在 experiments 文件夹下;还可以调整其他各种参数,如下所示,具体可参见:DeepSpeedExamples HelloDeepSpeed Bert
--mask_prob ${mask_prob} \\
--random_replace_prob ${random_replace_prob} \\
--unmask_replace_prob ${unmask_replace_prob} \\
--max_seq_length ${max_seq_length} \\
--tokenizer ${tokenizer} \\
--num_layers ${num_layers} \\
--num_heads ${num_heads} \\
--ff_dim ${ff_dim} \\
--h_dim ${h_dim} \\
--dropout ${dropout} \\
--batch_size ${batch_size} \\
--num_iterations ${num_iterations} \\
--checkpoint_every ${checkpoint_every} \\
--log_every ${log_every} \\
--local_rank ${local_rank}
4. 此时会根据拥有的 GPU 数量运行模型,可以看到如下内容:
[2024-08-23 10:26:00,572] [INFO] [logging.py:96:log_dist] [Rank 0] step=8300, skipped=0, lr=[0.0001], mom=[(0.9, 0.999)]
[2024-08-23 10:26:00,585] [INFO] [timer.py:259:stop] epoch=0/micro_step=8300/global_step=8300, RunningAvgSamplesPerSec=308.66381961861657, CurrSamplesPerSec=312.85119175664465, MemAllocated=0.07GB, MaxMemAllocated=1.71GB
2024-08-23 10:26:00.586 | INFO | __main__:log_dist:54 - [Rank 0] Loss: 6.6766
[2024-08-23 10:26:02,736] [INFO] [logging.py:96:log_dist] [Rank 0] step=8310, skipped=0, lr=[0.0001], mom=[(0.9, 0.999)]
[2024-08-23 10:26:02,743] [INFO] [timer.py:259:stop] epoch=0/micro_step=8310/global_step=8310, RunningAvgSamplesPerSec=308.66526213278956, CurrSamplesPerSec=314.5054045739528, MemAllocated=0.07GB, MaxMemAllocated=1.71GB
2024-08-23 10:26:02.744 | INFO | __main__:log_dist:54 - [Rank 0] Loss: 6.6762
[2024-08-23 10:26:04,874] [INFO] [logging.py:96:log_dist] [Rank 0] step=8320, skipped=0, lr=[0.0001], mom=[(0.9, 0.999)]
[2024-08-23 10:26:04,902] [INFO] [timer.py:259:stop] epoch=0/micro_step=8320/global_step=8320, RunningAvgSamplesPerSec=308.66605948195775, CurrSamplesPerSec=310.6948689220451, MemAllocated=0.07GB, MaxMemAllocated=1.71GB
2024-08-23 10:26:04.904 | INFO | __main__:log_dist:54 - [Rank 0] Loss: 6.6756
[2024-08-23 10:26:07,056] [INFO] [logging.py:96:log_dist] [Rank 0] step=8330, skipped=0, lr=[0.0001], mom=[(0.9, 0.999)]
[2024-08-23 10:26:07,060] [INFO] [timer.py:259:stop] epoch=0/micro_step=8330/global_step=8330, RunningAvgSamplesPerSec=308.66868241767776, CurrSamplesPerSec=307.43401607097644, MemAllocated=0.07GB, MaxMemAllocated=1.71GB
2024-08-23 10:26:07.061 | INFO | __main__:log_dist:54 - [Rank 0] Loss: 6.6751
[2024-08-23 10:26:09,219] [INFO] [logging.py:96:log_dist] [Rank 0] step=8340, skipped=0, lr=[0.0001], mom=[(0.9, 0.999)]
[2024-08-23 10:26:09,234] [INFO] [timer.py:259:stop] epoch=0/micro_step=8340/global_step=8340, RunningAvgSamplesPerSec=308.6679433643697, CurrSamplesPerSec=297.1419886451415, MemAllocated=0.07GB, MaxMemAllocated=1.71GB
5. 此时会看到 loss 在一直递减,默认运行10000个 step,运行完成之后,可以在 experiments 文件夹下看到 Bert 运行时保存的 log 和权重。


参考文档