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比较大,下载需要不少时间。
docker pull pytorch/pytorch:1.13.1-cuda11.6-cudnn8-devel
运行容器
# 这里我把下载好的模型挂载上去了
docker run --gpus all -it --name cpm_bee -d -v .\cpm-bee\:/root/models/cpm-bee/ -p 7860:7860 pytorch/pytorch:1.13.1-cuda11.6-cudnn8-devel
准备环境
安装必要的一些工具
# 更换软件源
sed -i 's/security.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
apt update
# 安装ninjia-build是因为镜像没有自带这个,但是有这个pip install会快一些
apt install -y git curl wget vim ninjia-build
# 设置国内pip源
pip config set global.index-url https://mirrors.cloud.tencent.com/pypi/simple
验证环境可用
- 验证CUDA可用
nvcc -V
输出如下说明可用
- 验证显卡挂载情况
nvidia-smi
- 跑一下代码看看
root@d77e1bb69e71:~# python
Python 3.10.8 (main, Nov 4 2022, 13:48:29) [GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> torch.cuda.is_available()
True
下载代码
这里我用了github的代理
git clone https://ghproxy.com/https://github.com/OpenBMB/CPM-Bee.git
安装依赖
cd src
pip install -r requirements.txt
这里可能会遇到如下报错:
这是因为没有指定CUDA_HOME
环境变量,修改.bashrc
配置文件,添加这个配置即可
export CUDA_HOME="/usr/local/cuda"
测试文本生成任务
修改text_generation.py
的模型路径配置,这里我是修改使用了2b的模型
config = CPMBeeConfig.from_json_file("config/cpm-bee-2b.json")
ckpt_path = "/root/models/cpm-bee/2b/cpm-bee-2b-ckpt.pt"
运行text_generation.py
python text_generation.py
可以看到输出
修改文本输入
data_list = [
{"document": "蜀道难:<mask_0>", "<ans>": {"<mask_0>": ""}},
]
重新运行text_generation.py
微调
准备数据集
以下是提供的整理好的数据集示例,我们将所有的json数据集放到data目录
{"input": "人常会不自觉地记下对自己有利的部分,这是形成委屈的重要原因。", "prompt":"问答", "question": "人们为何常常感到委屈?", "<ans>":"人常会不自觉地记下对自己有利的部分,这是形成委屈的重要原因。"}
数据如下:
原始数据为54条,我将其分隔为46条训练数据和8条验证数据,分别放到
bin_data/train
和bin_data/eval
文件夹
处理数据集
python preprocess_dataset.py --input data --output_path bin_data --output_name ccpm_data
处理后的数据如下:
进行微调
-
修改微调脚本
#! /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,所以直接停了啥都没输出,下一步准备还是在服务器上再试试,且听下回分解吧..
© 版权声明
文章版权归作者所有,未经允许请勿转载,侵权请联系 admin@trc20.tw 删除。
THE END