ChatGLM-6B 部署与 P-Tuning 微调实战

自从 ChatGPT 爆火以来,树先生一直琢磨想打造一个垂直领域的 LLM 专属模型,但学习文本大模型的技术原理,从头打造一个 LLM 模型难度极大,所以这事儿就一直搁置了。

但最近一个月,开源文本大模型如雨后春笋般接踵而至,例如 LLaMA、Alpaca、Vicuna、 ChatGLM-6B 等。树先生觉得这个事有着落了,毕竟站在巨人的肩膀上,离成功就会更近一步。

经过比较,我选择了ChatGLM-6B 作为预训练模型,一方面是它的中文支持效果好,另一方面是它的参数是 62 亿,对 GPU 性能要求相对较低,可以压缩成本。

概念科普

ChatGLM-6B 是什么?

ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。ChatGLM-6B 使用了和 ChatGPT 相似的技术,针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答。

为了方便下游开发者针对自己的应用场景定制模型,同时实现了基于 P-Tuning v2 的高效参数微调方法,INT4 量化级别下最低只需 7GB 显存即可启动微调

不过,由于 ChatGLM-6B 的规模较小,目前已知其具有相当多的局限性,如事实性/数学逻辑错误,可能生成有害/有偏见内容,较弱的上下文能力,自我认知混乱,以及对英文指示生成与中文指示完全矛盾的内容。更大的基于 1300 亿参数 GLM-130B 的 ChatGLM 正在内测开发中。

硬件需求
量化等级最低 GPU 显存(推理)最低 GPU 显存(高效参数微调)
FP16(无量化)13 GB14 GB
INT88 GB9 GB
INT46 GB7 GB

最低只需 7GB 显存即可启动微调,就问你香不香~

这样个人和小公司都可以部署自己的语言模型,用自有的数据集训练出对行业领域和业务场景有着深刻理解的语言模型,还避免了用户的数据可能泄露到第三方,公司训练自己的语言模型可以在专业性、差异性、可控性等多方面为产品和业务带来很大的优势和价值。

P-Tuning 微调是什么?

P-Tuning 是一种对预训练语言模型进行少量参数微调的技术。所谓预训练语言模型,就是指在大规模的语言数据集上训练好的、能够理解自然语言表达并从中学习语言知识的模型。P-Tuning 所做的就是根据具体的任务,对预训练的模型进行微调,让它更好地适应于具体任务。相比于重新训练一个新的模型,微调可以大大节省计算资源,同时也可以获得更好的性能表现。

ChatGLM-6B 部署

这里我们还是白嫖阿里云的机器学习 PAI 平台,使用 A10 显卡。

环境准备好了以后,就可以开始准备部署工作了。

下载源码

git clone https://github.com/THUDM/ChatGLM-6B

安装依赖

cd ChatGLM-6B   # 其中 transformers 库版本推荐为 4.27.1,但理论上不低于 4.23.1 即可   pip install -r requirements.txt

下载模型

# 这里我将下载的模型文件放到了本地的 chatglm-6b 目录下   git clone https://huggingface.co/THUDM/chatglm-6b /mnt/workspace/chatglm-6b

参数调整

# 因为前面改了模型默认下载地址,所以这里需要改下路径参数   # 分别修改 web_demo.py、cli_demo.py、api.py 文件   tokenizer = AutoTokenizer.from_pretrained("/mnt/workspace/chatglm-6b", trust_remote_code=True)   model = AutoModel.from_pretrained("/mnt/workspace/chatglm-6b", trust_remote_code=True).half().cuda()      # 如果想要暴露在公网上,需要修改 web_demo.py 文件   demo.queue().launch(share=True, inbrowser=True, server_name='0.0.0.0', server_port=7860)

Web 模式启动

pip install gradio   python web_demo.py

web 模式启动

在这里插入图片描述

web 页面

API 模式启动

pip install fastapi uvicorn   python api.py

API 模式启动

在这里插入图片描述

Curl 测试

命令行模式启动

python cli_demo.py

在这里插入图片描述

命令行模式交互

PS:因为这里使用的是 A10 GPU,显存绰绰有余,所以使用的是 FP16(无量化)精度,INT8 与 INT4 精度的量化加载方式可以参考官方文档。

基于 P-Tuning 微调 ChatGLM-6B

ChatGLM-6B 环境已经有了,接下来开始模型微调,这里我们使用官方的 P-Tuning v2 对 ChatGLM-6B 模型进行参数微调,P-Tuning v2 将需要微调的参数量减少到原来的 0.1%,再通过模型量化、Gradient Checkpoint 等方法,最低只需要 7GB 显存即可运行。

安装依赖

# 运行微调需要 4.27.1 版本的 transformers   pip install rouge_chinese nltk jieba datasets

禁用 W&B

# 禁用 W&B,如果不禁用可能会中断微调训练,以防万一,还是禁了吧   export WANDB_DISABLED=true

准备数据集

这里为了简化,我只准备了5条测试数据,分别保存为 train.json 和 dev.json,放到 ptuning 目录下,实际使用的时候肯定需要大量的训练数据。

{"content": "你好,你是谁", "summary": "你好,我是树先生的助手小6。"}   {"content": "你是谁", "summary": "你好,我是树先生的助手小6。"}   {"content": "树先生是谁", "summary": "树先生是一个程序员,热衷于用技术探索商业价值,持续努力为粉丝带来价值输出,运营公众号《程序员树先生》。"}   {"content": "介绍下树先生", "summary": "树先生是一个程序员,热衷于用技术探索商业价值,持续努力为粉丝带来价值输出,运营公众号《程序员树先生》。"}   {"content": "树先生", "summary": "树先生是一个程序员,热衷于用技术探索商业价值,持续努力为粉丝带来价值输出,运营公众号《程序员树先生》。"}

参数调整

修改 train.shevaluate.sh 中的 train_filevalidation_filetest_file为你自己的 JSON 格式数据集路径,并将 prompt_columnresponse_column 改为 JSON 文件中输入文本和输出文本对应的 KEY。可能还需要增大 max_source_lengthmax_target_length 来匹配你自己的数据集中的最大输入输出长度。并将模型路径 THUDM/chatglm-6b 改为你本地的模型路径。

1、train.sh 文件修改
PRE_SEQ_LEN=32   LR=2e-2      CUDA_VISIBLE_DEVICES=0 python3 main.py \       --do_train \       --train_file train.json \       --validation_file dev.json \       --prompt_column content \       --response_column summary \       --overwrite_cache \       --model_name_or_path /mnt/workspace/chatglm-6b \       --output_dir output/adgen-chatglm-6b-pt-$PRE_SEQ_LEN-$LR \       --overwrite_output_dir \       --max_source_length 128 \       --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 1000 \       --learning_rate $LR \       --pre_seq_len $PRE_SEQ_LEN \       --quantization_bit 4

train.sh 中的 PRE_SEQ_LENLR 分别是 soft prompt 长度和训练的学习率,可以进行调节以取得最佳的效果。P-Tuning-v2 方法会冻结全部的模型参数,可通过调整 quantization_bit 来被原始模型的量化等级,不加此选项则为 FP16 精度加载。

2、evaluate.sh 文件修改
PRE_SEQ_LEN=32   CHECKPOINT=adgen-chatglm-6b-pt-32-2e-2   STEP=3000      CUDA_VISIBLE_DEVICES=0 python3 main.py \       --do_predict \       --validation_file dev.json \       --test_file dev.json \       --overwrite_cache \       --prompt_column content \       --response_column summary \       --model_name_or_path /mnt/workspace/chatglm-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

CHECKPOINT 实际就是 train.sh 中的 output_dir

训练

bash train.sh

5 条数据大概训练了 40 分钟左右。

训练结果

推理

bash evaluate.sh

推理结果

执行完成后,会生成评测文件,评测指标为中文 Rouge score 和 BLEU-4。生成的结果保存在 ./output/adgen-chatglm-6b-pt-32-2e-2/generated_predictions.txt。我们准备了 5 条推理数据,所以相应的在文件中会有 5 条评测数据,labels 是 dev.json 中的预测输出,predict 是 ChatGLM-6B 生成的结果,对比预测输出和生成结果,评测模型训练的好坏。如果不满意调整训练的参数再次进行训练。

{"labels": "你好,我是树先生的助手小6。", "predict": "你好,我是树先生的助手小6。"}   {"labels": "你好,我是树先生的助手小6。", "predict": "你好,我是树先生的助手小6。"}   {"labels": "树先生是一个程序员,热衷于用技术探索商业价值,持续努力为粉丝带来价值输出,运营公众号《程序员树先生》。", "predict": "树先生是一个程序员,热衷于用技术探索商业价值,持续努力为粉丝带来价值输出,运营公众号《程序员树先生》。"}   {"labels": "树先生是一个程序员,热衷于用技术探索商业价值,持续努力为粉丝带来价值输出,运营公众号《程序员树先生》。", "predict": "树先生是一个程序员,热衷于用技术探索商业价值,持续努力为粉丝带来价值输出,运营公众号《程序员树先生》。"}   {"labels": "树先生是一个程序员,热衷于用技术探索商业价值,持续努力为粉丝带来价值输出,运营公众号《程序员树先生》。", "predict": "树先生是一个程序员,热衷于用技术探索商业价值,持续努力为粉丝带来价值输出,运营公众号《程序员树先生》。"}

部署微调后的模型

这里我们先修改 web_demo.sh 的内容以符合实际情况,将 pre_seq_len 改成你训练时的实际值,将 THUDM/chatglm-6b 改成本地的模型路径。

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

然后再执行。

bash web_demo.sh

结果对比

原始模型

原模型交互

微调后模型

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

在这里插入图片描述

  • 25
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值