前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ChatGLM-6B大模型微调实战总结

ChatGLM-6B大模型微调实战总结

作者头像
MavenTalker
发布2023-09-06 12:36:29
2.8K0
发布2023-09-06 12:36:29
举报
文章被收录于专栏:歪脖贰点零歪脖贰点零

作者简介:赵辉,区块链技术专家,精通各种联盟链、公链的底层原理,拥有丰富的区块链应用开发经验。

上篇我们已经具备了 ChatGLM-6B 初步的运行环境,这为实现完全属于自己的模型奠定了基础(快速部署ChatGLM-6B大模型实战总结),接下来将针对模型进行微调,以便让它真正成为一个定制化智能助手。在这个过程中,我将直接使用官方的P-Tuning v2工具对ChatGLM-6B模型进行参数微调。

安装依赖

进入ptuning目录,通过pip安装依赖

代码语言:javascript
复制
root@VM-0-17-ubuntu:~# cd ChatGLM-6B/ptuning
root@VM-0-17-ubuntu:ptuning# pip install rouge_chinese nltk jieba datasets

使用自己的数据集

为了保证一次性成功,可以在公网上下载样例数据:

https://cloud.tsinghua.edu.cn/f/b3f119a008264b1cabd1/?dl=1

  1. 下载后解压
代码语言:javascript
复制
root@VM-0-17-ubuntu:ptuning# tar xvf AdvertiseGen.tar.gz
  1. 解压的目录AdvertiseGen中有两个json文件,一个train.json用于训练,一个dev.json用于推理,文件内容如下:

从图中可以看出来,训练文件是由多个json字符串数据行构建而成,主要包含两个字段,一个content,一个summary。这种格式组建成了问答模式:

代码语言:javascript
复制
<center>[
{ “content”: “问句1”,  “summary”: "答案1“}  
  { “content”: “问句1”, “summary”: "答案1“}
   {…}]</center>

训练

修改 train.sh成如下样式

代码语言:javascript
复制
PRE_SEQ_LEN=128
LR=2e-2

CUDA_VISIBLE_DEVICES=0 python3 main.py \
    --do_train \
    --train_file AdvertiseGen/train.json \     # 训练数据
    --validation_file AdvertiseGen/dev.json \  # 推理数据
    --prompt_column content \
    --response_column summary \
    --overwrite_cache \
    --model_name_or_path ../THUDM/chatglm-6b \  # 加载模型文件地址
    --output_dir output/adgen-chatglm-6b-pt-$PRE_SEQ_LEN-$LR \   # 保存训练模型文件地址
    --overwrite_output_dir \
    --max_source_length 64 \
    --max_target_length 64 \
    --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 1000 \
    --learning_rate $LR \
    --pre_seq_len $PRE_SEQ_LEN

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 的值,但也会带来更多的显存消耗,请根据实际情况酌情调整。

执行训练

代码语言:javascript
复制
root@VM-0-17-ubuntu:ptuning# bash train.sh

训练消耗的资源比较多,运行模型和运行训练不能同时开启,否则 GPU 现存资源不足,本次运行训练耗时11个多小时。开始训练效果如图:

推理

修改 evaluate.sh成如下样式

代码语言:javascript
复制
PRE_SEQ_LEN=128
CHECKPOINT=adgen-chatglm-6b-pt-128-2e-2
STEP=3000

CUDA_VISIBLE_DEVICES=0 python3 main.py \
    --do_predict \
    --validation_file AdvertiseGen/dev.json \   # 推理文件路径 
    --test_file AdvertiseGen/dev.json \         # 推理文件路径
    --overwrite_cache \
    --prompt_column content \
    --response_column summary \
    --model_name_or_path ../THUDM/chatglm-6b \
    --ptuning_checkpoint ./output/$CHECKPOINT/checkpoint-$STEP \ # 推理输出路径
    --output_dir ./output/$CHECKPOINT \
    --overwrite_output_dir \
    --max_source_length 64 \
    --max_target_length 64 \
    --per_device_eval_batch_size 1 \
    --predict_with_generate \
    --pre_seq_len $PRE_SEQ_LEN \
    --quantization_bit 4

运行推理

将 evaluate.sh 中的 CHECKPOINT 更改为训练时保存的 checkpoint 名称,运行以下指令进行模型推理和评测:

代码语言:javascript
复制
root@VM-0-17-ubuntu:ptuning# bash evaluate.sh

执行后,出现这张图说明训练成功了,train_runtime 是训练模型消耗的时间

效果

上面的训练、推理完成后,就可以运行训练的模型,来查看实际的微调效果到底如何。

修改ptuning/web_demo.sh如下:

代码语言:javascript
复制
PRE_SEQ_LEN=128

CUDA_VISIBLE_DEVICES=0 python3 web_demo.py \
    --model_name_or_path ../THUDM/chatglm-6b \
    --ptuning_checkpoint output/adgen-chatglm-6b-pt-128-2e-2/checkpoint-3000 \
    --pre_seq_len $PRE_SEQ_LEN

为了使外部网络可以访问,修改web_demo.py 文件,找到 demo. queue(). launch 这一行替换为:

代码语言:javascript
复制
demo.queue().launch(share=False, inbrowser=True, server_name='0.0.0.0', server_port=27777)

执行bash web_demo.sh,得到以下结果:

打开浏览器,可以看到如下效果:

开启一段对话:

输入根据输入生成一段广告词,输入为:类型#上衣材质#牛仔布颜色#白色风格#简约图案#刺绣衣样式#外套衣款式#破洞

得到结果如图:

从结果来看,效果不是很佳,但至少训练出了内容,剩下的就是丰富数据内容的问题,有了完整的大批量的数据集,微调后的模型才更有意义,否则还只是一个玩具,商用价值极低。

总结

通过对模型的微调和推理的上手体验,发现了一些问题和改进的方向,虽然离钢铁侠的贾维斯智能管家还有一定距离,但这个探索让我们更深入地了解了人工智能的奥秘,并为未来的学习和探索积累了宝贵的经验。

在实践中,我们使用了 ChatGLM-6B 模型,并经历了模型的训练和推理过程。训练模型消耗了相当多的时间,但也让我们体会到了模型训练的复杂性和挑战性。虽然在推理阶段,模型生成了一些内容,但体验效果并不完美,仍需要进一步改进和优化。

这个过程让我们更加深入了解人工智能的发展和应用,对模型微调和开发有了更清晰的认识,虽然成果尚不尽如人意,但它为我们未来探索人工智能和开发个性化助手铺平了道路,相信未来我们会越来越接近实现类似贾维斯的智能助手的愿景。

—扩 展 阅 读—

正在发生或即将发生的AI大模型应用,立帖为证

ChatGPT、Claude和Bard,三足鼎立之势已成

WPS Office AI实战总结,智能化办公时代已来

你对 ChatGPT 的所有疑问,看这这一篇文章就够

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-08-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 MavenTalk 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装依赖
  • 使用自己的数据集
  • 训练
    • 执行训练
    • 推理
      • 运行推理
      • 效果
      • 总结
      相关产品与服务
      区块链
      云链聚未来,协同无边界。腾讯云区块链作为中国领先的区块链服务平台和技术提供商,致力于构建技术、数据、价值、产业互联互通的区块链基础设施,引领区块链底层技术及行业应用创新,助力传统产业转型升级,推动实体经济与数字经济深度融合。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档