使用Docker本地部署和微调CPM-Bee模型

释放双眼,带上耳机,听听看~!
本文介绍了在Windows环境下使用Docker本地部署和微调CPM-Bee模型的方法,涉及到拉取pytorch镜像、运行容器、准备环境、验证环境可用、下载代码、安装依赖等步骤。

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
# 安装ninja-build是因为镜像没有自带这个,但是有这个pip install会快一些
apt install -y git curl wget vim ninja-build
# 设置国内pip源
pip config set global.index-url https://mirrors.cloud.tencent.com/pypi/simple

验证环境可用

  1. 验证CUDA可用
nvcc -V

输出如下说明可用

使用Docker本地部署和微调CPM-Bee模型

  1. 验证显卡挂载情况
nvidia-smi

使用Docker本地部署和微调CPM-Bee模型

  1. 跑一下代码看看
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

这里可能会遇到如下报错:

使用Docker本地部署和微调CPM-Bee模型

这是因为没有指定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 = "https://b2.7b2.com/root/models/cpm-bee/2b/cpm-bee-2b-ckpt.pt"

运行text_generation.py

python text_generation.py

可以看到输出

使用Docker本地部署和微调CPM-Bee模型

修改文本输入

data_list = [
    {"document": "蜀道难:<mask_0>", "<ans>": {"<mask_0>": ""}},
]

重新运行text_generation.py

使用Docker本地部署和微调CPM-Bee模型

微调

准备数据集

以下是提供的整理好的数据集示例,我们将所有的json数据集放到data目录

{"input": "人常会不自觉地记下对自己有利的部分,这是形成委屈的重要原因。", "prompt":"问答", "question": "人们为何常常感到委屈?", "<ans>":"人常会不自觉地记下对自己有利的部分,这是形成委屈的重要原因。"}

数据如下:

原始数据为54条,我将其分隔为46条训练数据和8条验证数据,分别放到bin_data/trainbin_data/eval文件夹

使用Docker本地部署和微调CPM-Bee模型

处理数据集

python preprocess_dataset.py --input data --output_path bin_data --output_name ccpm_data

处理后的数据如下:

使用Docker本地部署和微调CPM-Bee模型

进行微调

  1. 修改微调脚本scripts/finetune_cpm_bee.sh

    #! /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
    
  2. 运行微调脚本

bash scripts/finetune_cpm_bee.sh
  1. 理论上来说,这里等微调结束就好了,但我这次跑了十多个小时,跑到100个epoch损失率下降开始变得超级慢,因为参数里指定了只跑100个epoch,所以直接停了啥都没输出,下一步准备还是在服务器上再试试,且听下回分解吧..
本网站的内容主要来自互联网上的各种资源,仅供参考和信息分享之用,不代表本网站拥有相关版权或知识产权。如您认为内容侵犯您的权益,请联系我们,我们将尽快采取行动,包括删除或更正。
AI教程

Diffusers库的道德守则和安全特性

2023-12-9 15:11:14

AI教程

MLOps实施原则及其在机器学习模型部署中的应用

2023-12-9 15:22:14

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索