ChatGLM-6B模型部署、微调实践记录
一、部署到服务器
-
另外准备
-
服务器连接:SSH协议和终端工具Xshell
-
想在学校宿舍访问SSH连接上公司的服务器,是否可以用反向端口转发来实现?https://zhuanlan.zhihu.com/p/21999778#%E7%BA%A6%E5%AE%9A>
已靠公司的VPN软件实现完成。
-
-
开始部署
参考帖子:ChatGLM2-6B清华最新开源语言模型免费安装部署下载教程-openAI维基百科
THUDM/ChatGLM2-6B: ChatGLM2-6B: An Open Bilingual Chat LLM | 开源双语对话语言模型 (github.com)
ChatGLM2-6b 避坑指南 - 知乎 (zhihu.com)
Anaconda+Pytorch+CUDA toolkit
-
部署后的运行
- Xshell连接服务器
- 虚拟环境激活conda activate py31013(虚拟环境名称)
- 采用 streamlit run web_demo2.py --server.port 8090运行网页版,不使用及时Ctrl+c关闭streamlit应用。
-
常用指令
cd … 返回上一级 pwd目录地址 netstat -an netstat -tunlp查看tcp端口
watch -n 1 nvidia-smi 显卡情况
history | grep XX 查找指令记录
二、微调实践介绍
实操案例:
1.ChatGLM-6B/ptuning/README.md at main · THUDM/ChatGLM-6B (github.com)广告词生成任务,官方教程
2.ChatGLM2微调保姆级教程~ - 知乎 (zhihu.com) 文本分类任务,lora微调
3.transformers_tasks/LLM/chatglm_finetune at main · HarderThenHarder/transformers_tasks (github.com) 文本分类+信息抽取(阅读理解、抽取三元组、输出json格式)
-
微调前的准备
库的准备:
运行微调需要4.27.1版本的
transformers
。一般高于4.23的都可以。除 ChatGLM-6B 的依赖之外,还需要安装以下依赖:pip install rouge_chinese nltk jieba datasets
三、官方案例1的实操
ChatGLM-6B/ptuning/README.md at main · THUDM/ChatGLM-6B (github.com)
训练
运行以下指令进行训练:
bash train.sh
train.sh
中的 PRE_SEQ_LEN
和 LR
分别是 soft prompt 长度和训练的学习率,可以进行调节以取得最佳的效果。P-Tuning-v2 方法会冻结全部的模型参数,可通过调整 quantization_bit
来被原始模型的量化等级,不加此选项则为 FP16 精度加载。
在默认配置 quantization_bit=4
、per_device_train_batch_size=1
、gradient_accumulation_steps=16
下,INT4 的模型参数被冻结,一次训练迭代会以 1 的批处理大小进行 16 次累加的前后向传播,等效为 16 的总批处理大小,此时最低只需 6.7G 显存。若想在同等批处理大小下提升训练效率,可在二者乘积不变的情况下,加大 per_device_train_batch_size
的值,但也会带来更多的显存消耗,请根据实际情况酌情调整。
如果你想要从本地加载模型,可以将 train.sh
中的 THUDM/chatglm-6b
改为你本地的模型路径。
推理
在 P-tuning v2 训练时模型只保存 PrefixEncoder 部分的参数,所以在推理时需要同时加载原 ChatGLM-6B 模型以及 PrefixEncoder 的权重,因此需要指定 evaluate.sh
中的参数:
--model_name_or_path THUDM/chatglm-6b
--ptuning_checkpoint $CHECKPOINT_PATH
仍然兼容旧版全参保存的 Checkpoint,只需要跟之前一样设定 model_name_or_path
:
--model_name_or_path $CHECKPOINT_PATH
评测指标为中文 Rouge score 和 BLEU-4。生成的结果保存在 ./output/adgen-chatglm-6b-pt-8-1e-2/generated_predictions.txt
。
2023.11.17自己遇到的问题:
运行脚本文件 bash train.sh进行微调,报错两个:
1.“RuntimeError: Library cudart is not initialized”
2.torch.distributed.elastic.multiprocessing.errors.ChildFailedError:
如图所示。
其中,第一个报错,网上查询说是因为由于缺少或损坏的 CUDA 库文件引起,需要下载 CUDA Toolkit 。参考帖子:ChatGLM-6B:构建本地离线知识库的绝佳选择! - 知乎 (zhihu.com)
但是下载CUDA Toolkit需要权限。
需要服务器主人的ROOT密码或者他本人操作
第二个报错待解决。