GPT实战系列-如何用自己数据微调ChatGLM2模型训练

GPT实战系列-如何用自己数据微调ChatGLM2模型训练

目录

  • GPT实战系列-如何用自己数据微调ChatGLM2模型训练
    • 1、训练数据
        • 广告文案生成模型
        • 训练和测试数据组织:
    • 2、训练脚本
    • 3、执行训练
        • 调整
        • 运行
    • 4、问题解决
        • 问题一
        • 问题二
        • 问题三
        • 问题四

1、训练数据

广告文案生成模型

输入文字:类型#裙颜色#蓝色风格#清新*图案#蝴蝶结

输出文案:裙身处采用立体蝴蝶结装饰辅以蓝色条带点缀,令衣身造型饱满富有层次的同时为其注入一丝甜美气息。将女孩清新娇俏的一面衬托而出。

训练和测试数据组织:
{"content": "类型#裙*颜色#蓝色*风格#清新*图案#蝴蝶结", "summary": "裙身处采用立体蝴蝶结装饰辅以蓝色条带点缀,令衣身造型饱满富有层次的同时为其注入一丝甜美气息。将女孩清新娇俏的一面衬托而出。"}{"content": "类型#裙*颜色#白色*风格#清新*图案#碎花*裙腰型#松紧腰*裙长#长裙*裙衣门襟#拉链*裙款式#拉链", "summary": "这条颜色素雅的长裙,以纯净的白色作为底色,辅以印在裙上的点点小碎花,<UNK>勾勒出一幅生动优美的“风景图”,给人一种大自然的清新之感,好似吸收新鲜空气的那种舒畅感。腰间贴心地设计成松紧腰,将腰线很好地展现出来,十分纤巧,在裙子的侧边,有着一个隐形的拉链,能够让你穿脱自如。"}

数据可以从 下载链接,test.json
或者Tsinghua Cloud 下载处理好的 ADGEN 完整数据集。可以看到解压后的文件有两个,分别是train.json和dev.json。

2、训练脚本

ChatGLM2的训练源代码:https://github.com/THUDM/ChatGLM2-6B

文件目录结构:

├── FAQ.md
├── MODEL_LICENSE
├── README.md   说明文档
├── README_EN.md
├── api.py
├── cli_demo.py
├── evaluation
│  ├── README.md
│  └── evaluate_ceval.py
├── openai_api.py
├── ptuning
│  ├── README.md 说明文档
│  ├── arguments.py
│  ├── deepspeed.json
│  ├── ds_train_finetune.sh
│  ├── evaluate.sh
│  ├── evaluate_finetune.sh
│  ├── main.py
│  ├── train.sh  训练脚本
│  ├── train_chat.sh
│  ├── trainer.py
│  ├── trainer_seq2seq.py
│  ├── web_demo.py
│  └── web_demo.sh 测试脚本
├── requirements.txt 环境依赖文件
├── resources
│  ├── WECHAT.md
│  ├── cli-demo.png
│  ├── knowledge.png
│  ├── long-context.png
│  ├── math.png
│  ├── web-demo.gif
│  ├── web-demo2.gif
│  └── wechat.jpg
├── utils.py
├── web_demo.py
└── web_demo2.py

# 安装python3.10
pyenv install 3.10.4

# 安装相关依赖

pip install rouge_chinese nltk jieba datasets

pip install -f requirements.txt

p-tuning

P-tuning的全称是Prefix-tuning,意为“前缀调优”。它通过在模型输入前添加小段Discrete prompt(类似填空句),并只优化这个prompt来实现模型微调。P-tuning-v2是基于Prompt-tuning方法的NLP模型微调技术。总体来说,P-tuning-v2是Prompt tuning技术的升级版本,使得Prompt的表示能力更强,应用也更灵活广泛。它被认为是Prompt tuning类方法中效果最优且易用性最好的版本。

进入ptuning目录

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

将训练和测试数据解压后的 AdvertiseGen 目录放到ptuning目录下。

3、执行训练

训练之前,需要根据自己的训练需求,训练数据和机器配置情况修改代码。

调整

修改训练配置

修改train.sh

# 这两处改为自己数据集的路径
–train_file AdvertiseGen/train.json
–validation_file AdvertiseGen/dev.json
# 数据集少的话,训练步数可以调整
–max_steps 3000

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

–模型目录。如果你想要从本地加载模型,可以将 train.sh 中的 THUDM/chatglm2-6b 改为你本地的模型路径。

修改main.py

在代码的351行,代码注释掉了 trainer.save_model(),这是保存模型的语句。当训练完成后就会生成一个pytorch_model.bin文件,后面测试时会用到。

运行

执行以下指令进行训练:

./train.sh

当出现以下信息后,模型训练迭代开始。

{'loss': 3.0614, 'learning_rate': 0.018000000000000002, 'epoch': 4.21}
{'loss': 2.2158, 'learning_rate': 0.016, 'epoch': 8.42}

训练完成后,屏幕将打印这类信息:

***** train metrics *****epoch          =   xxtrain_loss        =   xxtrain_runtime      = xxtrain_samples      =   xxtrain_samples_per_second =   xxtrain_steps_per_second  =   xx

4、问题解决

问题一
from rouge_chinese import Rouge
ModuleNotFoundError: No module named 'rouge_chinese'

解决:

没有安装rouge模块,pip安装即可。

pip install rouge_chinese

问题二
[W socket.cpp:558] [c10d] The client socket has failed to connect to [localhost]:12355 (errno: 99 - Cannot assign requested address).

解决:
因为之前安装云容器,云主机访问不到,hosts把相应的配置注释掉即可。

问题三
 RuntimeError: Default process group has not been initialized, please make sure to call init_process_group.

解决:

检查transforms版本,调整transformers版本即可。

问题四
ValueError: Unable to create tensor, you  should probably activate truncation and/or padding with 'padding=True'  'truncation=True' to have batched tensors with the same length. Perhaps  your features 。。ERROR:torch.distributed.elastic.multiprocessing.api:failed (exitcode: 1) local_rank: 0 (pid: 16858) of binarytorch.distributed.elastic.multiprocessing.errors.ChildFailedError: 

解决:

显存不够,调小batch_size等调低显存的方式。

End

相关文章:

GPT实战系列-ChatGLM2部署Ubuntu+Cuda11+显存24G实战方案

GPT实战系列-Baichuan2本地化部署实战方案

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

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

相关文章

vue导出功能

<a-buttontype"primary"class"search-btn"click"downLoadClick">下载导出结果</a-button> // 下载导出结果 const downLoadClick async () > {try {const response await axios({url: ${getBaseUrl()}/gpt/admin/messageExport…

分布式:一文吃透分布式事务和seata事务

目录 一、事务基础概念二、分布式事务概念什么是分布式事务分布式事务场景CAP定理CAP理论理解CAPCAP的应用 BASE定理强一致性和最终一致性BASE理论 分布式事务分类刚性事务柔性事务 三、分布式事务解决方案方案汇总XA规范方案1&#xff1a;2PC第一阶段&#xff1a;准备阶段第二…

【计算机网络】什么是HTTPS?HTTPS为什么是安全的?

【面试经典题】 前言&#xff1a; HTTP最初的设计就是用于数据的共享和传输&#xff0c;并没有考虑到数据的安全性&#xff0c;如窃听风险&#xff0c;篡改风险和冒充风险。HTTPS是在 HTTP 的基础上引入了一个加密层。HTTPS通过数据加密&#xff0c;数据完整性检验和身份认证…

【Java 进阶篇】Java登录案例详解

登录是Web应用程序中常见的功能&#xff0c;它允许用户提供凭证&#xff08;通常是用户名和密码&#xff09;以验证其身份。本文将详细介绍如何使用Java创建一个简单的登录功能&#xff0c;并解释登录的工作原理。我们将覆盖以下内容&#xff1a; 登录的基本概念创建一个简单的…

安装Jdk 报错 ,Java SE Development Kit 8 Update 202(64-bit)安装完毕之前,向导被中断

具体原因没有找到&#xff0c;估计是由于jdk 没有删干净导致的&#xff0c;我的处理方法是&#xff0c;将 Java的注册表全然后手动安装 Jdk和导入注册表&#xff08;在同事那里获取jdk文件 压缩包&#xff0c;并将 java的注册表导出&#xff0c;放在自己电脑上使用。&#xff0…

ChatGPT扩展系列之ChatExcel

文章目录 ChatGPT扩展系列之ChatExcel对某一列的文字进行处理对数据进行排序对数据进行计算微软官方又推出Excel AI插件ChatGPT扩展系列之ChatExcel 自从ChatGPT很空出世之后,很多基于ChatGPT的应用便如雨后春笋般应用而生,这些应用的底层本质就是利用了ChatGPT对自然语言的…

Linux curl命令最全详解

https://blog.csdn.net/angle_chen123/article/details/120675472

M1本地部署Stable Diffusion

下载安装 参考博客: 在Mac上部署Stable Diffusion&#xff08;超详细&#xff0c;AI 绘画入门保姆级教程&#xff09; 安装需要的依赖库 brew install cmake protobuf rust python3.10 git wget 可能中途会存在下载报错或者下载卡主的问题,需要切国内源 brew进行替换源: …

树莓派 qt 调用multimedia、multimediawidgets、serialport、Qchats

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、测试11.命令安装出现错误 二、测试21. 安装 Qt Charts&#xff1a;2. 安装 Qt Multimedia 和 Qt MultimediaWidgets&#xff1a;3. 安装 Qt SerialPort&…

C/S架构和B/S架构

1. C/S架构和B/S架构简介 C/S 架构&#xff08;Client/Server Architecture&#xff09;和 B/S 架构&#xff08;Browser/Server Architecture&#xff09;是两种不同的软件架构模式&#xff0c;它们描述了客户端和服务器之间的关系以及数据交互的方式。 C/S 架构&#xff08…

Springboot的Container Images,docker加springboot

Spring Boot应用程序可以使用Dockerfiles容器化&#xff0c;或者使用Cloud Native Buildpacks来创建优化的docker兼容的容器映像&#xff0c;您可以在任何地方运行。 1. Efficient Container Images 很容易将Spring Boot fat jar打包为docker映像。然而&#xff0c;像在docke…

VS 控制台程序出现不能引用c的问题

在visual stduio测试纯c代码时&#xff0c;出现main调用c接口时不能引用的问题&#xff1a; 错误 LNK2019 无法解析的外部符号 "void __cdecl xxx_alg_init(void)" (?xxx_alg_initYAXXZ)&#xff0c;函数 main 中引用了该符号 xxx_alg_init 原因是c程序调…

Leaky singletons的一种使用场景

Leaky singletons的一种使用场景 文章目录 Leaky singletons的一种使用场景场景问题本质如何解决Leaky singletons 场景 最近遇到了这个问题&#xff0c;正好想记录下。 比如你有一段代码&#xff0c;如下&#xff08;伪代码&#xff09;&#xff1a; static std::map<int…

python下载图片的脚本,requests模块的使用

python下载图片的脚本 import requests# 定义图片的url链接 image_url "https://example.com/image.jpg"# 发送网络请求&#xff0c;获取图片数据 response requests.get(image_url)# 检查响应状态码 if response.status_code 200:# 获取文件名file_name image_u…

【已解决】取消 el-aside 默认宽度|不再用 !important

文章目录 问题原因解决方法 问题原因 element-ui 的 el-aside 组件有 width props&#xff0c;默认为 300px 解决方法 给 el-aside 标签添加 width"" width 为空&#xff08;不正确的css样式/写法&#xff09;样式将会失效。 就可以在 style 中修改 el-aside 宽…

笔记检验(一):笔记检验概述

文章目录 一、 笔迹的概念及成分&#xff08;一&#xff09; 笔迹的概念&#xff08;二&#xff09; 笔迹的成分 二、 笔迹检验的概念、任务及作用&#xff08;一&#xff09; 笔迹检验的概念&#xff08;二&#xff09; 笔迹检验的任务&#xff08;三&#xff09; 笔记检验的作…

系统架构主题之八:非功能性需求对系统架构及设计的影响

从大的方面来讲&#xff0c;软件系统的需求分为功能性需求和非功能性需求。功能性需求一般由业务分解而来&#xff0c;是直接面向用户的需求&#xff0c;也是直接体现用户价值的需求。非功能性需求一般多是由功能性需求的内在要求衍生而来&#xff0c;其价值更多的体现在对功能…

Leetcode.275 H 指数 II

题目链接 Leetcode.275 H 指数 II mid 题目描述 给你一个整数数组 c i t a t i o n s citations citations &#xff0c;其中 c i t a t i o n s [ i ] citations[i] citations[i] 表示研究者的第 i i i 篇论文被引用的次数&#xff0c; c i t a t i o n s citations citat…

c# 操作word中的表格 批量复制和批量插入

用的是windows自带的dll包&#xff0c;没有引用第三方 1 WordHelper.cs using System; using Microsoft.Office.Interop.Word; using System.Runtime.InteropServices;namespace cadWord {public class WordHelper{private Microsoft.Office.Interop.Word.Document wDoc null…

C# “依赖注入” 中的 “三种生命周期”

&#x1f680;简介 依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&#xff09;是一种实现控制反转&#xff08;IoC&#xff09;的技术&#xff0c;用于减少代码之间的耦合度。通过依赖注入&#xff0c;一个类可以从外部获取其依赖的对象&#xff0c;而不是自己…