本文记录在AutoDL平台上部署和微调ChatGLM3-6B模型的过程。
基本模型部署
租用算力
在AutoDL平台租用一张3090/4090单卡(24G)即可,PyTorch镜像选尽量新的。
进入到JupyterLab,使用清华大学提供的PyPI镜像,加快下载速度:
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
安装必要的库,包括modelscope库和transformers库。modelscope库用于下载、缓存和加载预训练的AI模型,transformers库则包含了大量预训练模型,用于自然语言理解和生成任务:
pip install modelscope
pip install transformers
模型下载
写一个download_model.py:
> import torch from modelscope import snapshot_download, AutoModel,
> AutoTokenizer import os
# 指定模型缓存的目录。这个目录是AutoDL的临时目录。
cache_dir = '/root/autodl-tmp'
# 使用Modelscope库中的snapshot_download函数下载ZhipuAI提供的名为'chatglm3-6b'的预训练语言模型。
# 如果模型已经下载过了,它将使用缓存的版本,而不是重新下载。
# 'revision'参数指定要下载的模型的版本;'master'通常指向最新稳定版本的代码。
model_dir = snapshot_download('ZhipuAI/chatglm3-6b', cache_dir=cache_dir, revision='master')
# 'model_dir'变量现在包含了下载的模型文件的路径。
# 接下来可以使用这个目录来加载模型和分词器(tokenizer)。
运行download_model.py脚本来下载ChatGLM3-6B模型。如果提示下载目录非空,可以rm -rf清空该目录:
python download_model.py
克隆仓库
为了确保模型下载和后续步骤的速度,执行AutoDL提供的网络加速脚本:
source /etc/network_turbo
克隆ChatGLM3的Git仓库,并安装相关依赖:
git clone https://github.com/THUDM/ChatGLM3
pip install -r requirements.txt
此时已可部署进行推理,可以运行web_demo.py。
之后,取消设置的镜像加速代理:
unset http_proxy && unset https_proxy
AdvertiseGen数据集微调
数据集
上传并解压数据集,数据集链接见ChatGLM3微调的Guide:
sudo apt-get update sudo apt-get install unzip unzip AdvertiseGen
然后将数据集处理成特定的格式,以便微调脚本能够正确读取:
./scripts/format_advertise_gen.py --path "AdvertiseGen/train.json"
# 如果遇到权限问题,添加执行权限:
# chmod u+x ./scripts/format_advertise_gen.py
最终实际训练格式为:
[
{
"prompt": "<prompt text>",
"response": "<response text>"
}
// ...
]
微调相关依赖
安装微调过程中需要的依赖:
pip install transformers==4.30.2 accelerate sentencepiece astunparse deepspeed
微调脚本执行
微调脚本finetune_pt.sh包含了一系列的参数设置,用于控制微调过程。这些参数包括学习率、GPU数量、批处理大小、梯度累积步数等。可以根据需要调整这些参数:
# 简单修改参数,非常粗糙,仅验证微调代码能跑:
MAX_STEP=50
SAVE_INTERVAL=25
# 开始 P-Tuning v2 微调
./scripts/finetune_pt.sh
微调过程中,以下的输出显示了训练的进度和耗时:
50%|██████████████████████████████████████████████████████████████████ | 25/50 [12:14<12:14, 29.36s/it]
100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 50/50 [24:27<00:00, 29.36s/it]
基本推理
微调完成后需要验证模型的效果。通过运行inference.py脚本,可以对微调后的模型进行基本的推理测试,注意改路径:
python inference.py \
--pt-checkpoint "/root/autodl-tmp/ChatGLM3/finetune_chatmodel_demo/output/advertise_gen_pt-20231128-160019-128-2e-2/checkpoint-50" \
--model /root/autodl-tmp/ZhipuAI/chatglm3-6b
验证结果
以下是原模型权重的推理结果,作为基准对照:
用户:你好
ChatGLM:你好👋!我是人工智能助手 ChatGLM3-6B,很高兴见到你,欢迎问我任何问题。
用户:返回C++的helloworld程序
ChatGLM:当然可以,以下是一个简单的 C++ `helloworld` 程序:
#include <iostream>
int main() {
std::cout << "Hello, World!" << std::endl;
return 0;
}
这是一个包含 `main` 函数的文件,当你编译并运行它时,它会输出 "Hello, World!"。
用户:类型#上衣*材质#牛仔布*颜色#白色*风格#简约*图案#刺绣*衣样式#外套*衣款式#破洞
ChatGLM:您提供的信息看起来像是一个商品描述或服装参数,其中包含以下内容:
- 类型:#上衣
- 材质:#牛仔布
- 颜色:#白色
- 风格:#简约
- 图案:#刺绣
- 衣样式:#外套
- 衣款式:#破洞
这些信息可能用于描述一种或多种服装 item,例如一种白色牛仔外套,上面有刺绣图案,衣款式为破洞风格,材质为牛仔布,风格为简约。
在粗糙的微调后,灾难性遗忘非常严重,但说明了微调的可行性。微调后的推理结果:
Prompt:你好
Response: ,你不知道。
Prompt:返回C++的helloworld程序
Response: 而在生活中,我们也可以看到很多的设计,而 為了满足大家对于时尚的喜爱,我们推出了这一款时尚的拖地长裙,拖地长裙采用纯色设计,整体简约大气,拖地设计,穿起来更加优雅,拖地长度适中,穿起来更加舒适,拖地设计,穿起来更加有气质。
Prompt:类型#上衣*材质#牛仔布*颜色#白色*风格#简约*图案#刺绣*衣样式#外套*衣款式#破洞
Response: 这款牛仔外套,采用牛仔面料,穿起来很有力量感。衣身采用刺绣设计,增加了视觉上的层次感,而破洞的装饰,更增添一份酷感。整体简约大气,穿起来很有气质。