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

news2025/1/18 7:01:41

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

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

安装依赖

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

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. 下载后解压

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

be154e45bda9a0a647e9d1c16d202016.png

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

<center>[
{ “content”: “问句1”,  “summary”: "答案1“}  
  { “content”: “问句1”, “summary”: "答案1“}
   {…}]</center>

训练

修改 train.sh成如下样式

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

执行训练

root@VM-0-17-ubuntu:ptuning# bash train.sh

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

89a6b72bf220cb4b4b54d0d079b0a5a4.png

推理

修改 evaluate.sh成如下样式

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 名称,运行以下指令进行模型推理和评测:

root@VM-0-17-ubuntu:ptuning# bash evaluate.sh

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

50739265e604dd240e1025b8bff133bb.png

效果

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

修改ptuning/web_demo.sh如下:

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 这一行替换为:

demo.queue().launch(share=False, inbrowser=True, server_name='0.0.0.0', server_port=27777)

执行bash web_demo.sh,得到以下结果:bdbc9a358fc866b73b44581f57a97611.png打开浏览器,可以看到如下效果:

2434e8681a2609df5bc2a3d6119f5052.png

开启一段对话:

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

得到结果如图:

d5d06f0b4de90873ed76896fbfe567ff.png

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

总结

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

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

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


写作难下笔写不好?/ 课程制作难缺灵感?/ 营销文案没吸引力?/ PPT制作耗时费力?/ 短视频脚本没创意?

基于以上写作中常见的困扰,我编写了一个《AI 写作 30 秒上手》手册,系统性讲解 AI 在写作中可以为你带来的赋能,不管你是扎根于小红书、抖音、快手、视频号、公众号,还是知乎、微博、B站,又或者是自建博客、自运营平台,都可以专栏内容中找到合适自己的AI创作技巧,快速提升自己的生产力,有了 AI 的加持,谁说一个人,不可以活的像一支队伍?

b55e2519dd3a25a8bfc58aa9e7a97bc3.png原价¥299,限时现价¥49,随着订阅量增加,后续将恢复原价销售。2fa0ee2f25d88e8f33e546105893b443.png【长按二维码识别】


公众号回复“Claude实战”,“ChatGPT实战”,“WPSAI实战”,获取相应的电子书。

—扩 展 阅 读—

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

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

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

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

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

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

相关文章

LeetCode·每日一题·722. 删除注释·模拟

题目 示例 思路 题意 -> 给定一段代码&#xff0c;将代码中的注释删除并返回。 由于注释只有两种类型&#xff1a; 字符串// 表示行注释&#xff0c;表示//和其右侧的其余字符应该被忽略。字符串/* 表示一个块注释&#xff0c;它表示直到下一个&#xff08;非重叠&#x…

怎么设置文件夹密码?文件夹密码设置方法合集

为文件夹设置密码可以有效地保护文件夹的数据安全&#xff0c;那么该怎么设置文件夹密码呢&#xff1f;下面我们来一起了解一下。 文件夹保护3000 想要简单快捷的为文件夹设置密码&#xff0c;那么&#xff0c;文件夹保护3000就是最佳的选择。它提供了3种文件夹保护方式&#…

基于SpringBoot+Vue的CSGO赛事管理系统设计与实现(源码+LW+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

微信小程序使用editor富文本编辑器 以及回显 全屏弹窗的模式

<!--富文本接收的位置--><view class"white-box"><view class"title"><view class"yellow-fence"></view><view class"v1">教研记录</view></view><view class"add-btn"…

C语言基础知识——结构体和共用体

1. 结构体 1.1 初识结构体 C语言的结构体是一种自定义的 数据类型&#xff0c;它允许你将不同类型的数据组合在一起&#xff0c;形成一个新的数据类型&#xff0c;以便更方便地管理和操作这些数据。结构体可以包含多个成员&#xff08;也称为字段或属性&#xff09;&#xff0…

使命、愿景、价值观到底有什么区别

以前的企业都是在发展到一定成熟阶段&#xff0c;才开始考虑这三个问题。但今天人们越来越多的意识到&#xff0c;哪怕在企业发展的初期&#xff0c;对于创业企业来说&#xff0c;确定公司的使命、愿景和核心价值观也是非常重要的。 明确的使命、愿景和核心价值观对于企业的好…

搭建k8s集群!!!

注意 k8s集群第一次搭建的话是麻烦且又繁琐的,大家不要着急,静下心来,一步一步搭建即可 linux网关及虚拟机下载不会弄的问题请详细看 linux的搭建及网关配置 这篇文章【也在此专栏】 环境规划 硬件环境 cpu 至少2核 内存 至少3G 硬盘 至少40G 软件环境 操作…

从录取成绩的角度来看,浙大MPA面试的客观公正性是有一定依据的

时间即将来到八月份&#xff01;不知道目前考生们今年的备考情况怎么样了&#xff0c;度过比较煎熬的三伏天&#xff0c;距离考研冲刺的时间越来越近&#xff01; 提前批面试申请对于不同的项目以及不同的考生意义都不一样。比如真正的学霸人物对于提面的申请与不申请一般差别不…

自建HTTP代理池的四大优势

对于爬虫技术人员来说&#xff0c;使用http代理ip可以解决网页访问受限的问题。有人会直接购买成品的HTTP代理池&#xff0c;也有很多人会自己搭建http代理ip进行使用&#xff0c;自建HTTP代理池具有许多特点&#xff0c;为爬虫技术人员提供了有别于使用第三方代理服务的优势。…

【雕爷学编程】MicroPython动手做(30)——物联网之Blynk 3

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

Unity 引擎做残影效果——2、屏幕后处理方式

Unity实现残影效果 大家好&#xff0c;我是阿赵。 这里继续介绍Unity里面做残影的方法。之前介绍了BakeMesh的方法做残影&#xff0c;这一期介绍的是用屏幕后处理的方法做残影。 一、原理 之前的BakeMesh方法&#xff0c;是真的生成了很多个网格模型在场景里面。如果用后处理做…

Linux学习之周期性计划任务cron和crontab

crontab -e可以编辑周期性计划任务。在使用此命令编辑的时候&#xff0c;需要要注意每一行有六个字段&#xff0c;使用空格或者Tab键进行隔开&#xff1a; Min Hour Day Month Day_Week commandToExecute - - - - - | | | | | | | | | --…

optee支持哪些密码学算法

GP规范强制要求 GP规范定义可选实现的 optee os实现的 参考:optee_os-3.20.0/lib/libutee/include/tee_api_defines.h 206 /* Algorithm Identifiers */ 207 #define TEE_ALG_AES_ECB_NOPAD 0x10000010 208 #define TEE_ALG_AES_CBC_NOPAD

【面试题】位图

文章目录 位图如何添加数据如何删除数据代码实现给100亿个整数&#xff0c;如何找到只出现一次的数字代码实现给两个文件&#xff0c;分别有100亿个整数&#xff0c;但只有1g内存&#xff0c;如何找到文件的交集&#xff1f;1个文件有100亿个int&#xff0c;1G内存&#xff0c;…

如何使用ArcGIS Pro制作建筑立体效果

虽然ArcGIS Pro已经将二三维场景融合于一个软件之中&#xff0c;但是在某些使用场景下&#xff0c;我们只需要看到建筑的立体效果就行&#xff0c;不用实际的三维建筑效果&#xff0c;毕竟三维的效果对硬件的要求更高&#xff0c;地图的加载效率也没有二维好&#xff0c;所以这…

【雕爷学编程】Arduino动手做(181)---Maixduino AI开发板6

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

住宅小区门禁管理,居然还能这样做!

安全是我们生活中最重要的一环。而在现代社会&#xff0c;门禁监控系统成为了保障居民安全的重要措施之一。 门禁系统利用先进的人脸识别技术&#xff0c;为小区居民带来了更高效、更安全的出入管理体验&#xff0c;更为居民创造了便捷、智能的生活方式。 客户案例 东莞市某花…

Flask项目打包为exe(附带项目资源,静态文件)

1.在项目根目录创建my_app.spec文件&#xff0c;内容如下&#xff1a; # -*- mode: python ; coding: utf-8 -*-block_cipher Nonea Analysis([server.py], # flask入口pathex[],binaries[], datas[("E:/**/templates","/templates"),("E:/**/s…

SpringBoot3 整合Prometheus + Grafana

通过Prometheus Grafana对线上应用进行观测、监控、预警… 健康状况【组件状态、存活状态】Health运行指标【cpu、内存、垃圾回收、吞吐量、响应成功率…】Metrics… 1. SpringBoot Actuator 1. 基本使用 1. 场景引入 <dependency><groupId>org.springframew…

大数据之Hadoop(一)

目录 一、准备三台服务器 二、虚拟机间配置免密登录 三、安装JDK 四、关闭防火墙 五、关闭安全模块SELinux 六、修改时区和自动时间同步 一、准备三台服务器 我们先准备三台服务器&#xff0c;可以通过虚拟机的方式创建&#xff0c;也可以选择云服务器。 关于如何创建虚…