Windows环境使用Docker本地部署和微调CPM-Bee
本文最后更新于:2023年8月15日 晚上
Windows环境使用Docker本地部署和微调CPM-Bee
这几天想尝试下OPENBMB的的CPM-Bee模型,本来打算在临时买的腾讯云GPU服务器上跑一下,但是安装依赖的时候发现一堆奇怪的问题,看了下github的issue,大部分都是bmtrain安装出现问题,且由于他使用的torch版本比较旧,不支持2.0.0+,所以只能改为尝试在本地docker隔离环境跑通再说.
拉取pytorch镜像
CPM-Bee要求torch版本为torch>=1.10,<2.0.0,所以我们选用pytorch/pytorch:1.13.1-cuda11.6-cudnn8-devel这个镜像,容器有8.69GB比较大,下载需要不少时间。
1 | |
运行容器
1 | |
准备环境
安装必要的一些工具
1 | |
验证环境可用
- 验证CUDA可用
1 | |
输出如下说明可用

- 验证显卡挂载情况
1 | |

- 跑一下代码看看
1 | |
下载代码
这里我用了github的代理
1 | |
安装依赖
1 | |
这里可能会遇到如下报错:

这是因为没有指定CUDA_HOME环境变量,修改.bashrc配置文件,添加这个配置即可
1 | |
测试文本生成任务
修改text_generation.py的模型路径配置,这里我是修改使用了2b的模型
1 | |
运行text_generation.py
1 | |
可以看到输出

修改文本输入
1 | |
重新运行text_generation.py

微调
准备数据集
以下是提供的整理好的数据集示例,我们将所有的json数据集放到data目录
1 | |
数据如下:
原始数据为54条,我将其分隔为46条训练数据和8条验证数据,分别放到
bin_data/train和bin_data/eval文件夹

处理数据集
1 | |
处理后的数据如下:

进行微调
修改微调脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59#! /bin/bash
# 使用哪些gpu训练
export CUDA_VISIBLE_DEVICES=0
# export CUDA_VISIBLE_DEVICES=0,1,2,3
# 每个节点多少个gpu
GPUS_PER_NODE=4
NNODES=1
MASTER_ADDR="localhost"
MASTER_PORT=12345
OPTS=""
# 增量微调
OPTS+=" --use-delta"
# 模型配置
OPTS+=" --model-config config/cpm-bee-2b.json"
# 训练集位置
OPTS+=" --dataset /root/CPM-Bee/src/bin_data/train"
# 验证集位置
OPTS+=" --eval_dataset /root/CPM-Bee/src/bin_data/eval"
# 训练epoch数
OPTS+=" --epoch 1000"
# 数据批次大小
OPTS+=" --batch-size 5"
# 用于lr_schedular
OPTS+=" --train-iters 100"
# 保存名称
OPTS+=" --save-name cpm_bee_2b_finetune"
# 最大长度
OPTS+=" --max-length 2048"
# 保存路径
OPTS+=" --save results/"
# 学习率
OPTS+=" --lr 0.0001"
# 每100个step进行一次检查(bmtrain inspect)
OPTS+=" --inspect-iters 100"
# 预热学习率的步数为1
OPTS+=" --warmup-iters 1"
# 每50步验证一次
OPTS+=" --eval-interval 1000"
# 如果验证集loss连续5次不降,停止微调
OPTS+=" --early-stop-patience 5"
# 选择noam方式调度学习率
OPTS+=" --lr-decay-style noam"
# 优化器权重衰减率为0.01
OPTS+=" --weight-decay 0.01"
# 半精度训练的grad clip
OPTS+=" --clip-grad 1.0"
# 半精度训练的loss scale
OPTS+=" --loss-scale 32768"
# 用于加载lr_schedular的中间状态
OPTS+=" --start-step 0"
# 模型参数文件
OPTS+=" --load /root/models/cpm-bee/2b/cpm-bee-2b-ckpt.pt"
CMD="torchrun --nnodes=${NNODES} --nproc_per_node=${GPUS_PER_NODE} --rdzv_id=1 --rdzv_backend=c10d --rdzv_endpoint=${MASTER_ADDR}:${MASTER_PORT} finetune_cpm_bee.py ${OPTS}"
echo ${CMD}
$CMD理论上来说,这里等微调结束就好了,但我这次跑了十多个小时,跑到100个epoch损失率下降开始变得超级慢,因为参数里指定了只跑100个epoch,所以直接停了啥都没输出,下一步准备还是在服务器上再试试,且听下回分解吧..