ptuning v2 的 chatglm垂直领域训练记录

news2025/1/23 4:50:57

thunlp chatglm 6B是一款基于海量高质量中英文语料训练的面向文本对话场景的语言模型。

THUDM/ChatGLM-6B: ChatGLM-6B:开源双语对话语言模型 | An Open Bilingual Dialogue Language Model (github.com)

国内的一位大佬把chatglm ptuning 的训练改成了多层多卡并行训练的实现

zero_nlp/Chatglm6b_ModelParallel_ptuning at main · yuanzhoulvpi2017/zero_nlp (github.com)

用到了神秘的perf库

希望大家能支持一下我的工作

用我的专用邀请链接,注册 OpenBayes,双方各获得 60 分钟 RTX 3090 使用时长,支持累积,永久有效:

注册 - OpenBayes

通过我的链接注册并充值openbayes平台。

找到了一些中国大百科的一对一对的数据集来ptuning chatglm 6B的对话模型。

添加图片注释,不超过 140 字(可选)

在双卡3080环境中进行了训练后。二十五个小时二十九分钟训练了3000次迭代。多卡分层ptuning的效果感觉并不理想。可能是因为训练的轮次太少了。loss竟然高达4.1447。那我们扩大100倍步数来等一下看看拟合效果。

把我们双3080训练的参数摆出来

 
 

PRE_SEQ_LEN=8 LR=1e-2 CUDA_VISIBLE_DEVICES=0,1 python3 main_parallel.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 /root/autodl-tmp/zero_nlp/Chatglm6b_ModelParallel_ptuning/output/adgen-chatglm-6b-pt-8-1e-2/checkpoint-3000 \ --output_dir output/adgen-chatglm-6b-pt-$PRE_SEQ_LEN-$LR \ --overwrite_output_dir \ --max_source_length 256 \ --max_target_length 512 \ --per_device_train_batch_size 1 \ --per_device_eval_batch_size 1 \ --gradient_accumulation_steps 16 \ --predict_with_generate \ --max_steps 30000 \ --logging_steps 10 \ --save_steps 2000 \ --learning_rate $LR \ --pre_seq_len $PRE_SEQ_LEN

添加图片注释,不超过 140 字(可选)

双卡3080训练31个小时损失及学习率相关情况截图。

60小时双卡3080训练一万六千步,形成了8个训练节点checkpoint。开始面向最新一轮的展开模型效果测试。

 
 

import os import platform import signal from transformers import AutoTokenizer, AutoModel import json os_name = platform.system() clear_command = 'cls' if os_name == 'Windows' else 'clear' stop_stream = False def build_prompt(history): prompt = "欢迎使用 ChatGLM-6B 模型,输入内容即可进行对话,clear 清空对话历史,stop 终止程序" for query, response in history: prompt += f"\n\n用户:{query}" prompt += f"\n\nChatGLM-6B:{response}" return prompt def signal_handler(signal, frame): global stop_stream stop_stream = True def main(): global stop_stream print("欢迎使用 ChatGLM-6B 模型,输入内容即可进行对话,clear 清空对话历史,stop 终止程序") tokenizer = AutoTokenizer.from_pretrained("/root/autodl-tmp/zero_nlp/Chatglm6b_ModelParallel_ptuning/output/adgen-chatglm-6b-pt-8-1e-2/checkpoint-16000", trust_remote_code=True) model = AutoModel.from_pretrained("/root/autodl-tmp/zero_nlp/Chatglm6b_ModelParallel_ptuning/output/adgen-chatglm-6b-pt-8-1e-2/checkpoint-16000", trust_remote_code=True).quantize(4).half().cuda() model = model.eval() AdvertiseGen = json.load(open("/root/autodl-tmp/zero_nlp/Chatglm6b_ModelParallel_ptuning/AdvertiseGen/dev.json")) for AdvertiseGen_one in AdvertiseGen: history = [] count = 0 response, history = model.chat(tokenizer, AdvertiseGen_one['content'], history=history) print(AdvertiseGen_one) print(response) if __name__ == "__main__": main()

添加图片注释,不超过 140 字(可选)

所以这里面我感觉是因为我的数据集长短分布差异较大导致的问题。于是痛定思痛。决定下一步从两个方向改进,第一输入输出长度设置为64、128。第二我要减小十倍的学习率,观察一下减小十倍的学习率能不能提升ptuning的效果。

在预测推理阶段发生了形状错误问题。 已经解决。本来是想着tokenizer部分要用原来的tockenizer,后来发现换成了训练好的tokenizer之后才不报错。

 
 

import os from transformers import AutoTokenizer, AutoModel tokenizer = AutoTokenizer.from_pretrained("/root/autodl-tmp/checkpoint-3000", trust_remote_code=True) model = AutoModel.from_pretrained("/root/autodl-tmp/checkpoint-3000", trust_remote_code=True).half().cuda() model = model.eval()

用这样的方式去加载已经ptuning训练好的模型就可以开始测试我们自己训练的数据集的效果了。

单卡官方原生ptuning训练

单卡A5000 Ptuning V2 chatglm 6B任务基于chatglm 6B官方开源ptuning V2版本代码运行。

在单卡A5000 混合精度训练推理。更改参数 --max_source_length 256 --max_target_length 512,个人感觉输入太短、输出太短,训练出来也没什么意义。所以把source和target的长度拉长到256、512。理论上只要长加起来不超过2048,就不会报错。我们把完整的训练参数show一下

 
 

PRE_SEQ_LEN=4 LR=1e-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 THUDM/chatglm-6b \ --output_dir output/adgen-chatglm-6b-pt-$PRE_SEQ_LEN-$LR-dev \ --overwrite_output_dir \ --max_source_length 256 \ --max_target_length 512 \ --per_device_train_batch_size 1 \ --per_device_eval_batch_size 1 \ --gradient_accumulation_steps 16 \ --predict_with_generate \ --max_steps 30000000 \ --logging_steps 1000 \ --save_steps 10000\ --learning_rate $LR \ --pre_seq_len $PRE_SEQ_LEN \ --quantization_bit 8

那么按照这个参数,模型将会占用A5000多少显存呢?

添加图片注释,不超过 140 字(可选)

显存占用10GB左右。

大家肯定很好奇10000步的时候ptuning V2 在chatglm 6B模型上的表现。

添加图片注释,不超过 140 字(可选)

而结果中的损失依旧让人看起来比较窒息。损失一直降不下去。

2023 04 07 实验

控制语料严格符合输入长度小于128输出长度小于512、学习率1e-3。

添加图片注释,不超过 140 字(可选)

前4000个epoch表现效果如上。依旧不理想。损失竟然变得更大了。

把官方代码通过修改bash为多卡运行。

 
 

PRE_SEQ_LEN=128 LR=2e-2 CUDA_VISIBLE_DEVICES=0,1 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 \ --quantization_bit 8

添加图片注释,不超过 140 字(可选)

不过目前看如果是简单的将训练代码中的显卡序号添加为多卡。

单卡训练需要两个小时

多卡需要30个小时

单卡两小时训练完,多卡30个小时训练完成。而多卡的显卡利用率竟然是百分之百。所以简单的将模型横向并行在某些设备上是不可取的。

20230408,zero_nlp的多卡分层并行训练目前出现了一些小问题。

痛定思痛,为什么官方的数据集表现得很好,但是我的数据集表现得并不是那么好呢。于是我准备给我的数据集截图看一看到底是哪里出现了问题。

添加图片注释,不超过 140 字(可选)

从中国大百科爬下来的数据,有一些标题的输入是比较短的。那么好,接下来我准备加入数据最短长度的限制。

喜欢大模型的小伙伴可以加我的 15246115202 一起交流训练大模型所需要的细节都有哪些。

目前官方给了三个交互解决方案。基于终端的交互,基于简单界面的交互,基于fastapi框架提供的接口进行交互。

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

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

相关文章

Spring 事务

目录 一、事务简介 二、在Spring中实现事务 编程式事务 声明式事务 三、事务的传播机制 一、事务简介 事务:就是将一组操作封装成为一个整体执行单元,要么全部执行,要么都不执行。 假如事务执行了一半发生了错误就会对已经执行的部分进…

Linux嵌入式学习之Ubuntu入门(三)用户、用户组及文件权限

系列文章目录 一、Linux嵌入式学习之Ubuntu入门(一)基本命令、软件安装及文件结构 二、Linux嵌入式学习之Ubuntu入门(二)磁盘文件介绍及分区、格式化等 文章目录系列文章目录用户与用户组创建用户和用户组图形化创建命令创建文件…

【人工智能】— 逻辑Agent、一般逻辑、Entailment 蕴涵、命题逻辑、前向链接、反向链接、Resolution归结

【人工智能】— 逻辑Agent、逻辑智能体Knowledge bases一个简单的基于知识的智能体一般逻辑Entailment 蕴涵Models模型蕴涵与推理命题逻辑逻辑连接词枚举推理有效性可满足性推导和证明霍恩子句Forward chaining 前向链接Proof of completeness(完备性)Ba…

QT学习开发笔记(项目实战之智能家居物联网项目1 )

智能家居物联网项目 本章介绍使用 Qt 开发智能家居中的一个物联应用。简单直白的说就是通过云服务器远程控 制设备(与设备通信等)。本章可以直接做毕设,是毕设物联网项目的一大福音!本章将实现远 程点亮开发板 LED 作为一个项目实…

springboot从2.1.3升级到2.3.5后控制台自动输出http请求日志RequestResponseBodyMethodProcessor

springboot从2.1.3升级到2.3.5后控制台自动输出http请求日志RequestResponseBodyMethodProcessor和RequestMappingHandlerMapping推荐使用第二个方案简单 明了 方便 快捷方案一第一步定义TurboFilter第二步配置logback方案二 直接配置logback的配置XML推荐使用第二个方案简单 明…

Insomnia 简单使用方法

文章目录1. 新建工程2. 新建若干文件夹3. 设置环境变量4. 授权以及进行请求的链式调用 (chaining requests)4. 1 解决办法 14. 2 解决办法 2Insomnia 同 Postman, 用于测试后端 endpoint,很容易使用。使用步骤如下:1. 新建工程 2. 新建若干文…

字节跳动软件测试面试过了,起薪20k

普通二本计算机专业毕业,从毕业后,第一份接触测试的工作是在一家通讯小公司,大部分接触的工作是以功能测试为主,一直都是几千块钱工资,还一度被派出差,以及兼职各种产品、运维、运营的活,感觉自…

四十五、docker之nginx手动部署前端项目

nginx的作用: 一、静态文件服务器和反向代理django服务 django框架中的静态文件服务只在开发调试时提供服务,当以生产模式运行时需要将静态文件部署到静态文件服务器上。 1. 收集django项目中的静态文件 在配置文件中配置STATIC_ROOT 我们在我的项目…

如何在低代码平台上构建ERP软件?

ERP软件是企业管理日常运营需求的关键组件。然而,对于许多企业,尤其是资源有限的企业来说,尝试构建和管理ERP平台可能要担负较高的成本的。幸运的是,低代码平台可以使这个过程变得容易得多。今天我们来解释如何在低代码平台上构建…

细粒度软件缺陷预测模型构建方法

在软件缺陷预测领域,粒度指的是缺陷库中每条样本的项目粒度.其中可以分为类粒度、文件粒度或者包粒度等。不同的开发语言有不同的层级的模块粒度,在软件缺陷预测领域,一般来说,在预测效果能够满足要求的情况下,粒度越小…

map容器(重要)

1、map容器简介 Map容器中所有的元素都会根据元素的键值自动实现排序。Map中所有的元素都是pair,pair的简介 同时拥有实值和键值,而前面的 set 只是拥有 键值,pair 中的 第一个元素是键值,而第二个值是 实值。Map 中是不允许有两…

Maven的进阶操作

系列文章目录 Maven进阶操作的学习 文章目录系列文章目录前言一、分模块开发与设计二、依赖管理1.依赖传递2.可选依赖3.排除依赖三、继承与聚合1.聚合2.继承四、属性1.属性2.版本管理五、多环境配置与应用1.多环境开发2.跳过测试六、私服1.私服简介2.私服仓库分类3.资源上传与…

IDEA的基本使用

IDEA的基本使用IDEA的基本使用1 IDEA概述2 IDEA的下载和安装2.1 下载2.2 安装3 IDEA中层级结构介绍3.1 结构分类3.2 结构介绍project(项目、工程)module(模块)package(包)class(类)3…

C#基础学习--委托

委托 什么是委托 可以认为委托是持有一个或多个方法的对象。 委托和类一样,是一种用户自定义的类型。但类表示的是数据和方法的集合,而委托则持有一个或多个方法,以及一系列预定操作。 可以通过一下擦欧总来使用委托: 可以把d…

度量,我们如何以终为始,以始为终?

你好,我是黄俊彬。 很多时候在研发过程中,我们都习惯性地用“拍脑袋”的方式来看待一个事情。例如这个代码写得不好、这个自动化测试覆盖不充分、版本的发布频率太差了等等。往往只知道哪里有问题,但是却不知如何去找出根因,真正…

14、MyBatis-Plus入门到进阶

1、Mybatis的问题 【简介】: 每个实体类对应一个实体类,对应一个mapper接口,对应一个mapper.xml文件,每个mapper接口都有重复的crud方法,每一个mapper.xml都有重复的crud的sql配置。 2、Mybatis-plus简介 1、官网 Mybatis-plusMybatis-plus 2、MyBatis是什么&a…

JS常用字符串方法

📝个人主页:爱吃炫迈 💌系列专栏:数据结构与算法 🧑‍💻座右铭:道阻且长,行则将至💗 文章目录移除字符串首尾空白符trim()trimStart()trimEnd()获取字符串指定位置的值ch…

记2023第十四届蓝桥杯感受

弱校ACM队员,曾获CB国二,CG国优第六。(我是fw) ------------------------------------------------------------------------分割线 2023.04.09 今年再次参加CG组,估计g了,盲猜一波省二前排,出…

基于BenchmarkSQL的Oracle数据库tpcc性能测试

基于BenchmarkSQL的Oracle数据库tpcc性能测试安装BenchmarkSQL及其依赖安装软件依赖编译BenchmarkSQLBenchmarkSQL props文件配置数据库用户配置BenchmarkSQL压测装载测试数据TPC-C压测(固定事务数量)TPC-C压测(固定时长)生成测试…

C++轻量级Web服务器TinyWebServer源码分析之http篇

文章目录http篇简介一、服务器接收http请求和http报文解析解析报文整体流程从状态机逻辑主状态机逻辑二、服务器响应请求报文http篇简介 http类这篇个人觉得是最难同时也是最繁琐的一篇,本篇在基础知识方面,包括epoll、HTTP报文格式、状态码和有限状态机…