【大模型】基于ChatGLM进行微调及应用 [更新中......]

文章目录

  • 一、前言
  • 二、说明
    • 2.1 代码结构
    • 2.2 依赖包版本
  • 三、启动对话演示
    • 3.1 命令行交互 cli_demo.py
    • 3.2 网页交互 web_demo.py
  • 四、微调模型
    • 4.1 基于 P-Tuning v2 微调模型
      • 4.1.1 软件依赖
      • 4.1.2 下载数据集
      • 4.1.3 下载模型文件
      • 4.1.4 操作步骤
    • 4.2 基于 Full Parameter 微调模型
    • 4.3 基于LoRA微调模型
  • 参考资料

一、前言

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

  • 智谱AI官方内测网站:ChatGLM

  • 项目地址:https://github.com/THUDM/ChatGLM-6B/tree/main

  • 模型文件:https://huggingface.co/THUDM/chatglm-6b/tree/main

  • B站讲解视频:【官方教程】ChatGLM-6B 微调:P-Tuning,LoRA,Full parameter

  • 七月在线博客:ChatGLM两代的部署/微调/实现:从基座GLM、ChatGLM的LoRA/P-Tuning微调、6B源码解读到ChatGLM2的微调与实现

二、说明

2.1 代码结构

在这里插入图片描述

2.2 依赖包版本

由于大模型相关的各种依赖包版本更新较快,会导致各种报错,如:

'ChatGLMTokenizer' object has no attribute 'sp_tokenizer'

这里主要是由transformers 版本问题导致的,解决方案可以参考博客:https://blog.csdn.net/Tink_bell/article/details/137942170

三、启动对话演示

ChatGLM-6B下提供了cli_demo.py和web_demo.py两个文件来启动模型:

  • cli_demo.py:使用命令行进行交互。
  • web_demo.py:使用gradio库使用本机服务器进行网页交互。

这里,依赖包的版本会影响到代码的运行。经过多次报错与尝试,我这里使用的依赖包版本为:

transformers==4.33.0
gradio==3.39.0

3.1 命令行交互 cli_demo.py

[待补充]

3.2 网页交互 web_demo.py

web_demo.py中基于gradio库使用本机服务器进行网页交互,具体运行步骤如下:

(1)模型路径测试。

首先需要将模型地址配置为本地模型路径
原代码:

tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()

修改为本地模型路径后的代码:

model_path = './model/chatglm-6b'
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
model = AutoModel.from_pretrained(model_path, trust_remote_code=True).half().cuda()
model = model.eval()

(2)模型量化。

这里,由于我的GPU内存不够,所以对模型做量化操作:

model_path = './model/chatglm-6b'bnb_config = BitsAndBytesConfig(load_in_4bit=True,bnb_4bit_quant_type="nf4",bnb_4bit_compute_dtype=torch.bfloat16
)tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
model = AutoModel.from_pretrained(model_path, quantization_config=bnb_config, device_map={"":0}, trust_remote_code=True)
model = model.eval()

(3)运行 web_demo.py

可以看到控制台输出
在这里插入图片描述

说明网页交互服务已在本地 http://127.0.0.1:7860 运行起来。

查看GPU显存占用情况,可以看到使用模型量化,最后只占用了不到5GB的显存:
在这里插入图片描述

(4)端口映射。

这里,由于我们是在远程服务器上运行的服务,如果想在本地浏览器访问,需要做一个端口映射,具体命令如下:

ssh -L 1234:localhost:7860 root@172.xxx.yyy.zzz

基于上述命令,将远程服务器的 7860 端口映射至本地 1234 端口。

(5)本地访问服务。

然后我们在本地浏览器打开 http://localhost:1234/ 即可访问该页面,如下所示:
在这里插入图片描述

在输入窗口输入文本信息并提交即可实现调用ChatGLM的对话功能。

四、微调模型

ChatGLM模型的fine-tune有多种模式:

  • P-Tuning v2
  • LoRA
  • Full parameter

其中ChatGLM官方代码仓库中给出了基于 P-Tuning v2Full parameter 的方法,具体微调模型的方式可以参考B站视频:【官方教程】ChatGLM-6B 微调:P-Tuning,LoRA,Full parameter

LoRA的微调方法可以参考:https://github.com/yuanzhoulvpi2017/zero_nlp/tree/main/chatglm_v2_6b_lora

4.1 基于 P-Tuning v2 微调模型

官方给出的微调教程:https://github.com/THUDM/ChatGLM-6B/blob/main/ptuning/README.md

本仓库实现了对于 ChatGLM-6B 模型基于 P-Tuning v2 的微调。P-Tuning v2 将需要微调的参数量减少到原来的 0.1%,再通过模型量化、Gradient Checkpoint 等方法,最低只需要 7GB 显存即可运行。

下面以 ADGEN (广告生成) 数据集为例介绍代码的使用方法。

4.1.1 软件依赖

这里,基于P-Tuning v2 微调模型对于transformers的版本有限制,需要4.27.1版本的transformers

pip install transformers==4.27.1

此外,还需要安装以下依赖

pip install rouge_chinese nltk jieba datasets

4.1.2 下载数据集

ADGEN 数据集任务为根据输入(content)生成一段广告词(summary)。

{"content": "类型#上衣*版型#宽松*版型#显瘦*图案#线条*衣样式#衬衫*衣袖型#泡泡袖*衣款式#抽绳","summary": "这件衬衫的款式非常的宽松,利落的线条可以很好的隐藏身材上的小缺点,穿在身上有着很好的显瘦效果。领口装饰了一个可爱的抽绳,漂亮的绳结展现出了十足的个性,配合时尚的泡泡袖型,尽显女性甜美可爱的气息。"
}

ADGEN 数据集可以从 Google Drive 或者 Tsinghua Cloud 来下载。

4.1.3 下载模型文件

模型文件:https://huggingface.co/THUDM/chatglm-6b/tree/main

可以选择 git clone 或者 手动 的方式来下载模型文件。

4.1.4 操作步骤

(1)文件及数据准备

使用 ptuning 文件夹下的代码进行微调,这里我们在当前目录下创建:

  • model目录存放下载的模型文件
  • data 目录存放ADGEN 数据文件
    在这里插入图片描述

(2)修改 train.sh 代码

根据本地模型及数据文件目录,修改train.sh 中的相应参数:

PRE_SEQ_LEN=128
LR=2e-2CUDA_VISIBLE_DEVICES=0 python3 main.py \--do_train \--train_file './data/AdvertiseGen/train.json' \--validation_file './data/AdvertiseGen/dev.json' \--prompt_column content \--response_column summary \--overwrite_cache \--model_name_or_path './model/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 \--quantization_bit 4

【参数说明】:
train.sh 中的 PRE_SEQ_LENLR 分别是 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 的值,但也会带来更多的显存消耗,请根据实际情况酌情调整。

(3)运行脚本

bash train.sh

在这里插入图片描述

这里,我们对模型做了量化处理,可以看到占用的显存占用情况:
在这里插入图片描述

迭代3000次:
在这里插入图片描述

可以通过wandb 查看运行中的参数变化情况:
在这里插入图片描述

wandb中可以看到 train_loss 的变化情况:
在这里插入图片描述

4.2 基于 Full Parameter 微调模型

如果需要进行全参数的 Finetune,需要安装 Deepspeed,然后运行以下指令:

bash ds_train_finetune.sh

4.3 基于LoRA微调模型

ChatGLM官方仓库中的部分微调使用的是基于 P Tuning v2的微调方式,并未给出基于LoRA的微调。

LoRA的微调方法可以参考:https://github.com/yuanzhoulvpi2017/zero_nlp/tree/main/chatglm_v2_6b_lora

参考资料

  • ChatGLM两代的部署/微调/实现:从基座GLM、ChatGLM的LoRA/P-Tuning微调、6B源码解读到ChatGLM2的微调与实现

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

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

相关文章

从进程到协程,浅谈Java提高CPU利用率的发展

综合CPU利用率来讲,计算机远古时期,为提高CPU利用率,有以下概念 串行进程->并行进程->线程->线程池>->虚拟线程(协程) 一,串行进程, 早期的操作系统对任务调度,往往从最简单的实现开端,串型进程意思是对分配的一个任务,其任务能百分百占用CPU,哪怕…

前程无忧滑块

声明(lianxi a15018601872) 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 前言(lianxi …

日期时间显示网页

SweetOrange_Clock 🕘 一、简介 1、这个项目包括一个HTML文件,其中包含页面的样式和脚本。 2、页面以优雅的黑白配色为主题,突出了实用性和视觉冲击力,使得显示内容在视觉上更为突出和易于阅读。 3、这是一个日期时间显示器。通…

高通源代码版本ADK工具版本源代码release版本MDE版本介绍

0 Preface/Foreword 1 版本介绍 高通代码存放在chipcode中,网址URL:Chipcode 1.1 高通源代码版本 Bluetooth Audo芯片的高通源代码版本号(类似于分类的类名):ADK.SRC.1.0 (最新qcc307x系列及之后的芯片如…

Pycharm安装依赖

1. IDE集成的错误解决 鼠标悬停,点击 install 2. 配置环境 ctrlalts 3. 终端运行pip (要求有先有一个pip) 最好用最简单

NSE and KGE

NSE(Nash-Sutcliffe Efficiency): 解释:NSE 是衡量水文模型模拟结果与观测值之间拟合程度的指标。它计算模拟值与观测值之间的均方误差,并将其与观测值的方差进行比较。NSE 的取值范围为-∞至 1,值越接近 1…

切片的基础知识

文章目录 ● Slice 的底层实现原理?● array 和 Slice 的区别?● 拷贝大切片一定比小切片代价大吗?● Slice 深拷贝和浅拷贝?● 零切片、空切片、nil切片?● Slice 的扩容机制?● Slice 为什么不是线程安全…

WCCI 2024开幕,横滨圣地巡礼,畅游动漫与美食的世界

惊喜!WCCI 2024开幕,横滨圣地巡礼!畅游动漫与美食的世界 会议之眼 快讯 会议介绍 IEEE WCCI(World Congress on Computational Intelligence)2024,即2024年IEEE世界计算智能大会,于6月30日至…

windows USB 设备驱动开发-Host端和Device端

Windows 中的 USB 宿主端驱动程序 下图显示了适用于 Windows 的 USB 驱动程序堆栈的体系结构框图。 此图显示了适用于 USB 2.0 和 USB 3.0 的单独 USB 驱动程序堆栈。 当设备连接到 xHCI 控制器时,Windows 加载 USB 3.0 驱动程序堆栈。 Windows 为连接到 EHCI、OHC…

星辰计划01-动态代理

会话1: 什么是动态代理? 👧 什么是代理啊?👨来来来,听我细细来说 代理这个词在不同的上下文中有不同的含义,主要可以归纳为以下几类解释: 计算机网络中的代理服务器(Proxy Server&#xff0…

跨平台Ribbon UI组件QtitanRibbon全新发布v6.7.0——支持Qt 6.6.3

没有Microsoft在其办公解决方案中提供的界面,就无法想象现代应用程序,这个概念称为Ribbon UI,目前它是使应用程序与时俱进的主要属性。QtitanRibbon是一款遵循Microsoft Ribbon UI Paradigm for Qt技术的Ribbon UI组件,QtitanRibb…

Linux_生产消费模型_Block_Queue

目录 一、互斥锁 1.1 错误的抢票 1.1.1 类的成员函数与构造 1.1.2 start 函数 1.1.3 线程的回调函数 1.1.4 main 函数 1.1.5 结果 1.2 概念 1.3 相关系统调用 1.3.1 锁的创建 1.3.2 锁的初始化 1.3.2.1 动态初始化 1.3.2.2 静态初始化 1.3.3 锁的销毁 1.3.4…

看不懂懂车大爆炸,你就错过了国产小车的王炸!

咦?咋的啦?咱中国自己的汽车品牌前几天在汽车工业协会公布的数据里一跃而起,真的是威风凛凛啊!2023年咱们自家的乘用车品牌市场份额硬生生地占了个56%,这可是半壁江山啊!特别是那些10万块钱以下的家用小车&…

32.哀家要长脑子了!

1.299. 猜数字游戏 - 力扣(LeetCode) 公牛还是挺好数的,奶牛。。。妈呀,一朝打回解放前 抓本质抓本质,有多少位非公牛数可以通过重新排列转换公牛数字,意思就是,当这个数不是公牛数字时&#x…

C++多态~~的两个特殊情况

目录 1.多态的概念 2.简单认识 (1)一个案例 (2)多态的两个满足条件 (3)虚函数的重写 (4)两个特殊情况 1.多态的概念 (1)多态就是多种形态; …

SQL 29 计算用户的平均次日留存率题解

问题截图如下: SQL建表代码: drop table if exists user_profile; drop table if exists question_practice_detail; drop table if exists question_detail; CREATE TABLE user_profile ( id int NOT NULL, device_id int NOT NULL, gender varchar…

小白也能懂:逆向分析某网站加速乐Cookie参数流程详解

加速乐作为一种常见的反爬虫技术,在网络上已有大量详尽深入的教程可供参考。然而,对于那些初次接触的人来说,直接面对它可能仍会感到困惑。 声明 本文仅用于学习交流,学习探讨逆向知识,欢迎私信共享学习心得。如有侵权…

【区块链+基础设施】珠三角征信链 | FISCO BCOS应用案例

“珠三角征信链”是中国人民银行广州分行、中国人民银行深圳市中心支行按照中国人民银行总行工作部署,积 极贯彻珠三角一体化发展、粤港澳大湾区建设等国家战略而建设的跨区域征信一体化数据中心枢纽,以 FISCO BCOS 为底链构建应用平台,并由微…

springboot接口防抖【防重复提交】

什么是防抖 所谓防抖,一是防用户手抖,二是防网络抖动。在Web系统中,表单提交是一个非常常见的功能,如果不加控制,容易因为用户的误操作或网络延迟导致同一请求被发送多次,进而生成重复的数据记录。要针对用…

Docker 镜像导出和导入

docker 镜像导出 # 导出 docker 镜像到本地文件 docker save -o [输出文件名.tar] [镜像名称[:标签]] # 示例 docker save -o minio.tar minio/minio:latest-o 或 --output:指定导出文件的路径和名称[镜像名称[:标签]]:导出镜像名称以及可选的标签 dock…