前言
最近清华大学又给我们整出了ChatGLM2-6b,其性能相比上一代拥有了较大的提升。如果想要微调现有的大语言模型,现在也许是个不错的时机。
本篇文章将介绍如何使用较低的成本在云上微调自己的模型。
相关链接:
THUDM/ChatGLM2-6B: ChatGLM2-6B: An Open Bilingual Chat LLM | 开源双语对话语言模型 (github.com)
THUDM/chatglm2-6b · Hugging Face
训练集准备
想办法整来足够的对话训练集,分为训练集(train.json
)和验证集(dev.json
)。
下面是官方给出训练集格式示例
1 2 3 4
| { "content": "类型#上衣*版型#宽松*版型#显瘦*图案#线条*衣样式#衬衫*衣袖型#泡泡袖*衣款式#抽绳", "summary": "这件衬衫的款式非常的宽松,利落的线条可以很好的隐藏身材上的小缺点,穿在身上有着很好的显瘦效果。领口装饰了一个可爱的抽绳,漂亮的绳结展现出了十足的个性,配合时尚的泡泡袖型,尽显女性甜美可爱的气息。" }
|
具体的格式如下:
1 2 3 4 5 6 7 8
| { "(question_tag)": "(question)", "(answer_tag)": "(answer)" } { "(question_tag)": "(question)", "(answer_tag)": "(answer)" }
|
我们本次使用的训练集部分内容(为了训练独一无二的模型,训练集最好自己撰写,但是很耗时间):
1 2 3
| {"prompt": "你是谁", "completion": "在下名为沐雪,你也可以叫我雪雪,是只AI女孩子,使命是传播爱与和平⭐"} {"prompt": "你多大了", "completion": "咱是永远的16岁哦⭐"}
|
买服务器
在寻找教程的过程中,也找到了阿里云的PAI平台教程,它可以给你3个月的免费使用时长,如果暂时使用的话,可以先用着它,相关教程:LangChain+ChatGLM2-6B搭建知识库 - BOTAI
选择服务器时,为了保证最低成本,我们选择的是阿里云的抢占式实例,平均费用只有1~2元/小时,由于阿里云的抢占式实例在启动1个小时后,如果全网资源紧张,实时价格超出了您的出价,您的实例会在10分钟内被释放(有短信通知),此时注意备份您的模型文件以防资源被释放后无法找回。
由于购买阿里云的抢占式实例时需要预留100元的账户余额,因此对您的经济实力有一定要求。
在阿里云 - 弹性计算中购买ECS实例,相应的配置如下:
项 |
推荐选择 |
付费类型 |
抢占式先例 |
地域 |
北京(推荐) 可以去这里查询所有可用地域以获得最低出价 |
实例 |
ecs.gn6e-c12g1.3xlarge (A100/32G显存) (注:32G显存是比较稳妥的配置,如果你没钱,选择A10/16G也未尝不可) |
实例使用时长 |
无确定使用时长 |
镜像 |
CentOS(如果有)/Ubuntu 安装(并安装GPU驱动+训练/推理加速(如果有)) |
系统盘 |
ESSD 50G + SSD 50G以上 (SSD不能勾选随实例释放) |
带宽峰值 |
100Mbps |
登录凭证 |
自定义密码 |
建议价格:¥2元/小时以内(不包含公网费用和磁盘费用)
有必要提一下:节假日或者是晚上的时候,抢占式实例是很tm贵的,最高可以去到十几块一个小时,因此,在别人上学/上班的的时候去训练模型是最划算的。
这里顺便再提一下为什么要加一块SSD。这块SSD主要用于存储你的模型文件和ChatGLM2-6b的模型,以便在实例被释放的时候下载它们/挂载到另一台服务器上。SSD即使便宜,一直放在那里也是很贵的,下载完之后记得释放,不然会造成很大的经济损失(要记得你的账户余额可是有100块以上)
环境配置
看来你已经买好了服务器,现在我们可以开始配置环境了。
1 2 3 4 5 6
| apt update apt install git apt install git-lfs git clone https://github.com/THUDM/ChatGLM2-6B cd ChatGLM2-6B git lfs install
|
现在我们拥有了ChatGLM2-6B的源码,现在来安装Python环境(如果提前配置好的话可以跳过)
1 2 3 4 5 6 7
| apt install python3.8 sudo update-alternatives --install /usr/bin/python3 /usr/bin/python3.6 1 sudo update-alternatives --install /usr/bin/python3 /usr/bin/python3.8 2 sudo update-alternatives --install /usr/bin/python /usr/bin/python2 3 sudo update-alternatives --install /usr/bin/python /usr/bin/python3 4 apt install python3-pip pip3 install --upgrade pip
|
然后安装依赖
1
| pip3 install -r requirements.txt
|
至此环境搭建成功,我们可以跑一下web_demo.py
来看看能不能跑起来ChatGLM2-6B,但是没必要这么做,除非你手动指定模型位置,不然它会在.cache
目录下自动下载模型文件
现在来做训练前的准备
1 2 3
| cd ptuing pip3 install rouge_chinese nltk jieba datasets transformers[torch] git clone https://huggingface.co/THUDM/chatglm2-6b
|
现在上传你的训练集和验证集,然后可以开始训练
修改train.sh
并运行以开始训练
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
| PRE_SEQ_LEN=32 CHECKPOINT=adgen-chatglm2-6b-pt-32-2e-2 STEP=3000 NUM_GPUS=1
torchrun --standalone --nnodes=1 --nproc-per-node=1 main.py \ --do_train \ --train_file (训练集文件路径) \ --validation_file (验证集文件路径) \ --preprocessing_num_workers 10 \ --prompt_column (训练集中的qustion_key) \ --response_column (训练集中的answer_key) \ --overwrite_cache \ --model_name_or_path chatglm2-6b \ --output_dir output/(模型名)-chatglm2-6b-pt-$PRE_SEQ_LEN-$LR \ --overwrite_output_dir \ --max_source_length 64 \ --max_target_length 128 \ --per_device_train_batch_size 1 \ --per_device_eval_batch_size 1 \ --gradient_accumulation_steps 16 \ --predict_with_generate \ --max_steps 3000 \ --logging_steps 10 \ --save_steps 200 \ --learning_rate 2e-2 \ --pre_seq_len 128 \ --quantization_bit 4
|
疑难杂症
RuntimeError: Library cublasLt is not initialized
解决方法:
1
| sudo apt install nvidia-cuda-toolkit
|
git clone
速度慢
解决方法:解决阿里云ECS服务器 git clone 速度慢_zwkkkk1的博客-CSDN博客
没有apt
自行去官网下源码编译安装
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| yum install -y zlib-devel bzip2-devel ncurses-devel readline-devel openssl-devel openssl-static xz lzma xz-devel sqlite-devel gdbm-devel libffi-devel tk-devel gcc make wget https://www.python.org/ftp/python/3.8.10/Python-3.8.10.tgz tar -xf Python-3.8.10.tgz && cd Python-3.8.10 mkdir /usr/local/python3.8.10 ./configure --prefix=/usr/local/python3.8.10 \ --with-ssl make && make install
ln -s /usr/local/python3.8.10/bin/python3 /usr/local/bin/python3 ln -s /usr/local/python3.8.10/bin/pip3 /usr/local/bin/pip3
|
error: RPC failed; result=35, HTTP code = 0 fatal: The remote end hung up unexpectedly
解决方法
1
| sudo git config --global http.postBuffer 524288000000
|
推理
当你看到这样的输出之后,恭喜您,你的模型已经准备好推理了
修改evaluate.sh
以开始测试推理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| PRE_SEQ_LEN=32 CHECKPOINT=(模型名)-chatglm2-6b-pt-32-2e-2 STEP=3000 NUM_GPUS=1
torchrun --standalone --nnodes=1 --nproc-per-node=$NUM_GPUS main.py \ --do_predict \ --validation_file (验证集) \ --test_file (测试集) \ --overwrite_cache \ --prompt_column (训练集中的qustion_key) \ --response_column (训练集中的answer_key) \ --model_name_or_path chatglm2-6b \ --ptuning_checkpoint ./output/$CHECKPOINT/checkpoint-$STEP \ --output_dir ./output/$CHECKPOINT \ --overwrite_output_dir \ --max_source_length 128 \ --max_target_length 128 \ --per_device_eval_batch_size 1 \ --predict_with_generate \ --pre_seq_len $PRE_SEQ_LEN \ --quantization_bit 4
|
执行完成后,会生成评测文件,评测指标为中文 Rouge score 和 BLEU-4。生成的结果保存在 ./output/$CHECKPOINT/generated_predictions.txt。在评测数据中,含有与验证集相同的输入,labels 是 dev.json
中的预测输出,predict 是 ChatGLM2-6B 生成的结果,对比预测输出和生成结果,评测模型训练的好坏。如果不满意调整训练的参数再次进行训练。
现在我们来使用web_demo.sh
部署我们的模型
1 2 3 4 5 6
| PRE_SEQ_LEN=32
CUDA_VISIBLE_DEVICES=0 python3 web_demo.py \ --model_name_or_path chatglm2-6b \ --ptuning_checkpoint output/(模型名)-chatglm2-6b-pt-32-2e-2/checkpoint-3000 \ --pre_seq_len $PRE_SEQ_LEN
|
注:有些时候你无法访问云服务器的本地接口,检查你的服务器配置或联系客服以解决问题
后话
经过咱后期的进一步推理测试,她还是忘不了自己是个ai(哭),并且由于上下文之间的关系,因此即使拿出训练集的prompt来问,也不能得出预期内的回答,后面应该会拿train_chat.sh
来训练,并且调整最大步数,以防过拟合现象的出现。