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 显卡,这部分内容之前文章中有介绍。

免费部署一个开源大模型 MOSS

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

下载源码

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

API 模式启动

pip install fastapi uvicorn
python api.py

命令行模式启动

python cli_demo.py

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

基于 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-2CUDA_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

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=3000CUDA_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

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=32CUDA_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

结果对比

原始模型

微调后模型

P-Tuning 微调到此结束,后续树先生还会带大家进行 Lora 微调,敬请期待~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/15025.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

chatgpt赋能python:Python如何打开Word文档?

Python 如何打开 Word 文档? Python 是一种强大的编程语言,可以帮助我们完成各种重复性工作,其中包括自动化文件的处理。在这篇文章中,我们将学习如何使用 Python 打开 Word 文档。本文将介绍三种不同的方式:使用 Pyt…

chatgpt赋能python:Python创建Word文档指南

Python创建Word文档指南 在今天的数字时代,Word文档仍然是最常见和使用的文档类型之一。Python是一个强大的编程语言,可以用于自动化创建各种类型的文档,包括Word文档。在本篇文章中,我们将介绍如何使用Python创建Word文档&#…

奇舞周刊第486期:ChatGPT 的狂飙之路

记得点击文章末尾的“ 阅读原文 ”查看哟~ 下面先一起看下本期周刊 摘要 吧~ 奇舞推荐 ■ ■ ■ ChatGPT 的狂飙之路 最近随着 ChatGPT 爆火出圈,网络上各种关于 ChatGPT 的争论声也不断;有些人把它当成一个更高级的聊天机器人,有人兴奋地看到…

ChatGPT 如何应用于决策?Rationale 带你狂飙!

ChatGPT 回答多领域问题的能力之强悍,引发了全球关注。许多人将 ChatGPT 视为对话式 AI 或生成式 AI 发展史上的一个重要里程碑。从 ChatGPT 本身的生产力来看,它可以帮助人们完成很多事,比如写项目申报书、写股票查询代码,甚至写…

Nature | 奇病毒(Mirusviruses)将疱疹病毒与巨型病毒联系起来

奇病毒(Mirusviruses)将疱疹病毒与巨型病毒联系起来 Mirusviruses link herpesviruses to giant viruses 翻译:周之超UW-Madison Article,2023-4-19,Nature,[IF 69.504] DOI:10.1038/s41586-023…

HOG特征

01 什么是HOG特征 1.1 HOG特征简介 我们先来从字面入手分析一下HOG特征的名字。 HOG特征是图像的一种特征,图像的特征其实就是图像中某个区域的像素点在经过某种四则运算后所得到的结果。 它可以是一个具体的数值,可以是一个向量,可以是…

chatgpt赋能Python-python_span_抓取

介绍 随着互联网的不断发展,SEO(搜索引擎优化)已成为所有网站主人必须面对的问题。在SEO中,抓取是一个非常重要的环节,也是一个关键性的步骤,它直接影响到网站的排名。 在Python编程中,有很多…

chatgpt赋能python:Python获取微信群内聊天信息

Python获取微信群内聊天信息 微信是目前国内最受欢迎的即时通讯软件之一,它拥有着亿万用户。而微信群作为微信的一个重要功能,也是吸引了大量用户加入到其中的一个社交方式。但是,随着微信用户数量的增多,大量的聊天信息也会产生…

最容易被ChatGPT抢饭碗的科学家,竟然真的是数学家???

可用于 ChatGPT 的 11 个插件。图片来源:OpenAI 撰文 杜若云 编辑 吴兰、魏潇 北京时间 3 月 23 日,OpenAI 发布了第一批可接入 ChatGPT 的插件。这些插件由 11 个第三方提供,同时 OpenAI 官方也提供了两个官方插件 Browsing 和 Code Interpr…

80%白领危了!OpenAI发布GPT时代就业秘笈:34大铁饭碗保命

【导读】GPT-4发布没几天,OpenAI直接告诉所有人,GPTs是通用技术,80%的美国人的工作受到影响。想要保命,且看这34大「铁饭碗」。 前脚刚推出GPT-4,OpenAI后脚就发布了35页论文官宣: 80%的美国人&#xff0c…

字节正在内部测试对话类 AI 项目;Deepmind 推出新系统革新排序算法;ChatGPT iOS 应用更新|极客头条...

「极客头条」—— 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews) 一分钟速览新闻点&#…

自学了Python半年后,发现,这3本书能让你少走一半弯路!

Time will tell. 我是在疫情期间去开始接触Python的,唯一的一点代码基础就是在校时学的那一点皮毛。但在我这半年多的自学时间里,我发现它越来越有意思,Python是非常友好并且易于学习的! 它几乎可以做任何事,从简单的脚本创建、web 、到数据可视化以及 AI 人工智能,越来…

2022,AIGC元年?

文|世昕 编|石灿 2022年12月16日,Science杂志发布了2022年度科学十大突破,韦伯望远镜当选为年度最大科学突破,可谓实至名归。而在其他入选的科学突破中,AIGC也赫然在列。 这或许是当下最炙手可热的概念了。…

专业、简单、稳定,融云重新定义互联网通信云服务

艾瑞咨询《2023 年全球互联网通信云行业研究报告》(下简称《报告》)显示,79.1% 的开发者计划或已经出海,其中已将应用推到海外的开发者占比 43%。关注【融云全球互联网通信云】了解更多 后台回复【报告】获取完整版 消费群体成长…

PaddlePaddle中试用国人开源语言大模型RWKV Raven/Novel

★★★ 本文源自AlStudio社区精品项目,【点击此处】查看更多精品内容 >>> (开启本项目前,如果想尝试7B模型,请开启32GB以上的GPU环境) (本项目由我编写的rwkv-paddle提供推理代码支持&#xff0…

蓝桥杯赛前自救攻略,备赛抱佛脚指南

目录 前言一、复习语言知识1、代码起手框架2、vector初始化2、unordered_map3、输入输出问题 二、复习考试范围知识1、深度优先搜索(Depth-First-Search)模板2、随机字符、数字 三、复习比赛真题1、模拟题2、动态规划题 四、其他 前言 明天就要开始蓝桥杯…

AI 快被玩坏了!还不进来看看它能干些啥?

自从ChatGPT 掀起浪潮,不少人都在担心 AI 快要抢人类饭碗了。 就连央视财经也为此专门发过一个报道: 不得不承认,现在 ChatGPT 等 AIGC 工具已势不可挡——浪潮既来,不进则退。 有程序员这样说——这用过 Copilot 就会觉得&#x…

ChatGPT:与AI佛祖对话,探寻心灵的平静与自由!

现代人的生活充满了繁忙和压力,随之而来的是内心的焦虑和不安。为了追求真正的幸福和意义,越来越多的人开始寻求内心的平静和自由。而佛教的智慧和修行方法成为了许多人追寻心灵成长的重要途径。 然而,对于很多人来说,佛教的教义和…

使用 ChatGPT ,通过自然语言编写 eBPF 程序和追踪 Linux 系统

eBPF 是一项革命性的技术,起源于 Linux 内核,可以在操作系统的内核中运行沙盒程序。它被用来安全和有效地扩展内核的功能,而不需要改变内核的源代码或加载内核模块。今天,eBPF被广泛用于各类场景:在现代数据中心和云原…

ChatGPT三个关键技术

情景学习(In-context learning) 对于一些LLM没有见过的新任务,只需要设计一些任务的语言描述,并给出几个任务实例,作为模型的输入,即可让模型从给定的情景中学习新任务并给出满意的回答结果。这种训练方式能…