【深度学习】微调ChatGlm3-6b

1.前言

        指令微调ChatGlm3-6b。微调教程在github地址中给出,微调环境是Qwen提供的docker镜像为环境。

        镜像获取方式:docker pull qwenllm/qwen:cu117

        github地址:https://github.com/liucongg/ChatGLM-Finetuning

2.微调过程

        github地址中的教程给出了详细的微调过程。如果使用预先准备的docker,微调则更为方便。在实践时候,用了Qwen提供的docker。在使用容器微调时,不需要让容器中开启服务,所以需要以官方提供的镜像为基础,再做一个镜像。 本次实践中使用的镜像与微调Qwen-1.8B的镜像一致。做镜像的具体步骤与命令均在【微调Qwen1.8B】教程中给出。

2-1 环境准备

        开发机器中现有库的版本与requestment.txt中指定的版本不一致,所以使用docker镜像作为开发环境,docker的环境需要安装指定版本的deepspeed和tensorboard。

#运行镜像生成容器 挂载模型
docker run --gpus all -v /ssd/dongzhenheng/LLM/chatglm3-6b:/data/shared/Qwen/chatglm3-6b -it qwenllm/qwen:cu117 bash 
#下载
pip install deepspeed==0.11.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install tensorboard -i https://pypi.tuna.tsinghua.edu.cn/simple

 2-2 数据准备

        原github项目中给出了微调数据的格式,每条都包含instruction、input、output的json格式数据。

{"instruction": "你现在是一个信息抽取模型,请你帮我抽取出关系内容为\"性能故障\", \"部件故障\", \"组成\"和 \"检测工具\"的相关三元组,三元组内部用\"_\"连接,三元组之间用\\n分割。文本:", "input": "故障现象:发动机水温高,风扇始终是低速转动,高速档不工作,开空调尤其如此。", "output": "发动机_部件故障_水温高\n风扇_部件故障_低速转动"}
{"instruction": "你现在是一个信息抽取模型,请你帮我抽取出关系内容为\"性能故障\", \"部件故障\", \"组成\"和 \"检测工具\"的相关三元组,三元组内部用\"_\"连接,三元组之间用\\n分割。文本:", "input": "957号汽车故障报告故障现象一辆2007年长丰猎豹飞腾6400越野车,行驶里程27000km。维修室内灯不亮,更换室内灯泡后,发现四个转向灯常亮,后雨刮和后喷水常工作,开关不起作用。", "output": "开关_部件故障_不起作用\n维修室内灯_部件故障_不亮"}
#存放路径
sava_path = '/data/zhenhengdong/WORk/Fine-tuning/ChatGlm3-6B/Datasets'
def write_method(item):#建立data.jsonl文件,以追加的方式写入数据with jsonlines.open(sava_path + 'data.jsonl', mode = 'a') as json_writer:json_writer.write(item)
#读文件
data = pd.read_csv(data_path)
for index in range(len(data)):temp_data = data.iloc[index]temp_dict = {"instruction":prompt.replace('\n',''),"input": data.iloc[index]['输入query'],"output":data.iloc[index]['输出结果']}write_method(temp_dict)

2-3 代码准备

        将gitclone下来的ChatGLM-Finetuning-master项目、准备的数据复制到docker 容器中。

docker cp /data/zhenhengdong/WORk/Fine-tuning/ChatGlm3-6B/Codes/ChatGLM-Finetuning-master a27aaa4f78dc:/data/shared/Qwen/

        github教程中给出了多种训练方式,Freeze方法、PT方法、Lora方法、全参方法。在微调时,采用了 Lora方法。

        准备run_train.sh,在微调时直接运行即可。训练代码均采用DeepSpeed进行训练,可设置参数包含train_path、model_name_or_path、mode、train_type、lora_dim、lora_alpha、lora_dropout、lora_module_name、ds_file、num_train_epochs、per_device_train_batch_size、gradient_accumulation_steps、output_dir等, 可根据自己的任务配置。

        Datasetsdata.json是按照2-2中数据格式准备的微调数据。

        通过CUDA_VISIBLE_DEVICES控制具体哪几块卡进行训练,如果不加该参数,表示使用运行机器上所有卡进行训练。CUDA_VISIBLE_DEVICES=0表示使用0号GPU,也可设置为

CUDA_VISIBLE_DEVICES=0,1,2,3
CUDA_VISIBLE_DEVICES=0 deepspeed --master_port 5200 train.py \--train_path Datasetsdata.json \--model_name_or_path /data/shared/Qwen/chatglm3-6b \--per_device_train_batch_size 1 \--max_len 1560 \--max_src_len 1024 \--learning_rate 1e-4 \--weight_decay 0.1 \--num_train_epochs 2 \--gradient_accumulation_steps 4 \--warmup_ratio 0.1 \--mode glm3 \--lora_dim 16 \--lora_alpha 64 \--lora_dropout 0.1 \--lora_module_name "query_key_value,dense_h_to_4h,dense_4h_to_h,dense" \--seed 1234 \--ds_file ds_zero2_no_offload.json \--gradient_checkpointing \--show_loss_step 10 \--output_dir output-glm3

        训练过程如下: 

 2-4 微调输出

        微调之后会有一个output-glm3的文件夹。

        output-glm3文件夹中有每一轮训练保存的模型

2-5 merge

        在github教程中作者提供了merge.py文件,可以使用merge.py文件进行合并。在合并时,也可自己写merge代码。

        将微调的模型从docker容器中cp到ssd目录下,准备与原模型合并。

import torch
from peft import PeftModel
from transformers import AutoTokenizer, AutoModel
#加载原模型
base_model = '/ssd/dongzhenheng/LLM/chatglm3-6b'
base_model = AutoModel.from_pretrained(base_model, trust_remote_code=True).cuda()
#加载微调的模型
lora_model_path = '/ssd/dongzhenheng/Work/ChatGLM3-6B微调/epoch-2-step-84'
lora_model = PeftModel.from_pretrained(base_model,lora_model_path, torch_dtype=torch.float16)
lora_model.to("cpu")
#合并
merged_model = lora_model.merge_and_unload()
#合并的模型存储
new_model_directory = '/ssd/dongzhenheng/Work/ChatGLM3-6B微调'
merged_model.save_pretrained(new_model_directory, max_shard_size="2048MB", safe_serialization=True)

 2-6 验证

        使用合并的模型对测试数据验证。

#加载模型
new_model_directory = '/ssd/dongzhenheng/Work/ChatGLM3-6B微调'
tokenizer = AutoTokenizer.from_pretrained(new_model_directory, trust_remote_code=True)
model = AutoModel.from_pretrained(new_model_directory, trust_remote_code=True).cuda()
model.eval()
#输入
instruction = "你现在是一个信息抽取模型,请你帮我抽取出关系内容为\"性能故障\", \"部件故障\", \"组成\"和 \"检测工具\"的相关三元组,三元组内部用\"_\"连接,三元组之间用\\n分割。文本:"
input = "故障现象:发动机水温高,风扇始终是低速转动,高速档不工作,开空调尤其如此。 #验证
response, _ = model.chat(tokenizer, instruction+input_data, history=None)
print(response)

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

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

相关文章

Excel工作表控件实现滚动按钮效果

实例需求:工作表中有多个Button控件(工作表Form控件)和一个ScrollBar控件(工作表ActiveX控件,名称为ScrollBar2),需要实现如下图所示效果。点击ScrollBar控件实现按钮的滚动效果,实际…

2024.2.25 在centos8.0安装docker

2024.2.25 在centos8.0安装docker 安装过程比较简单,按顺序安装即可,简要步骤: 一、更新已安装的软件包: sudo yum update二、安装所需的软件包,允许 yum 通过 HTTPS 使用存储库: sudo yum install -y …

飞天使-k8s知识点22-kubernetes实操7-ingress

文章目录 ingress环境准备准备service和pod验证效果 https 代理效果 ingress 在 Kubernetes 中,Ingress 是一种 API 对象,它管理外部访问集群内部服务的规则。你可以将其视为一个入口,它可以将来自集群外部的 HTTP 和 HTTPS 路由到集群内部的…

代码随想录算法训练营第六十二天|739. 每日温度 , 496.下一个更大元素 I

通常是一维数组&#xff0c;要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置&#xff0c;此时我们就要想到可以用单调栈了。时间复杂度为O(n)。 739. 每日温度 代码随想录 class Solution {public int[] dailyTemperatures(int[] temperatures) {Deque<In…

静态时序分析:SDC约束命令set_load详解

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 set_load命令用于指定端口(port)或线网(net)的负载电容&#xff0c;该指令的BNF范式&#xff08;有关BNF范式&#xff0c;可以参考以往文章&#xff09;为&#…

LeetCode 刷题|20. 有效的括号,394. 字符串解码

20. 有效的括号 class Solution(object):def isValid(self, s):stack []for x in s:if x (:stack.append())elif x {:stack.append(})elif x [:stack.append(])else:if not stack:return Falseelif stack:a stack.pop()if x ! a:return False if stack:return F…

Java核心-核心类与API(4)

话接上回&#xff0c;继续核心类与API的学习&#xff0c;最后介绍一下Object类以及与数学、日期/时间有关的类&#xff0c;就结束该部分的学习了&#xff0c;其他的根据需要自行了解。 一、Object类 1、概述 Object 是 Java 类库中的一个特殊类&#xff0c;也是所有类的父类…

【数据库】MySQL有几种存储引擎(表类型)?各自有什么区别?

MySQL有几种存储引擎&#xff08;表类型&#xff09;&#xff1f;各自有什么区别&#xff1f; MySQL有几种存储引擎&#xff08;表类型&#xff09;&#xff1f;各自有什么区别&#xff1f;MyISAM&#xff08;1&#xff09;存储组成&#xff08;2&#xff09;MyISAM具有的特点&…

jitsi meet 视频会议录制方案

前言 我们都知道视频会议录制是个很常见的功能&#xff0c;但是由于jitsi meet使用jibri进行录制很耗资源&#xff0c;所以类似腾讯会议这种前端录制&#xff0c;不占用服务器资源&#xff0c;也是一种可选项。 前端录制 前端录制的特点; ●目前此录制仅支持最大 1GB&#…

linux-并发通信

一.linux-tcp通信框架 1.基础框架 1.1 tcp 服务器框架 1.套接字 #include <sys/socket.h> int socket(int domain, int type, int protocol);
 返回的文件描述符可以指向当前的socket&#xff0c;后续通过对文件描述符的访问就可以配置这个socket 成功时返回文件…

nccl2安装指南

https://developer.nvidia.com/nccl/nccl-download 旧版本安装: https://developer.nvidia.com/nccl/nccl-legacy-downloads 找到你对应的CUDA版本 我这里选择 deb 文件安装了 sudo dpkg -i nccl-local-repo-ubuntu2004-2.16.5-cuda11.8_1.0-1_amd64.debsudo cp /var/nccl-lo…

使用 React 和 MUI 创建多选 Checkbox 树组件

在本篇博客中&#xff0c;我们将使用 React 和 MUI&#xff08;Material-UI&#xff09;库来创建一个多选 Checkbox 树组件。该组件可以用于展示树形结构的数据&#xff0c;并允许用户选择多个节点。 前提 在开始之前&#xff0c;确保你已经安装了以下依赖&#xff1a; Reac…

政安晨:【机器学习基础】(二)—— 评估机器学习模型改进

根据前面我的文章看来&#xff0c;咱们只能控制可以观察到的东西。因为您的目标是开发出能够成功泛化到新数据的模型&#xff0c;所以能够可靠地衡量模型泛化能力是至关重要的&#xff0c;咱们这篇文章将正式介绍评估机器学习模型的各种方法。 政安晨的个人主页&#xff1a;政安…

Hikvision SPON IP网络对讲广播系统命令执行漏洞

声明 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 1.漏洞描述 Hikvision Intercom Broadcasting System是中国海康威视&a…

低功耗设计——门控时钟

1. 前言 芯片功耗组成中&#xff0c;有高达40%甚至更多是由时钟树消耗掉的。这个结果的原因也很直观&#xff0c;因为这些时钟树在系统中具有最高的切换频率&#xff0c;而且有很多时钟buffer&#xff0c;而且为了最小化时钟延时&#xff0c;它们通常具有很高的驱动强度。此外&…

Leetcode 第 124 场双周赛题解

Leetcode 第 124 场双周赛题解 Leetcode 第 124 场双周赛题解题目1&#xff1a;3038. 相同分数的最大操作数目 I思路代码复杂度分析 题目2&#xff1a;3039. 进行操作使字符串为空思路代码复杂度分析 题目3&#xff1a;3040. 相同分数的最大操作数目 II思路代码复杂度分析 题目…

leetcode hot100 买卖股票最佳时机3

本题中&#xff0c;依旧可以采用动态规划来进行解决&#xff0c;之前的两个题我们都是用二维数组dp[i][2]来表示的&#xff0c;其中i表示第i天&#xff0c;2表示长度为2&#xff0c;其中0表示不持有&#xff0c;1表示持有。 本题中&#xff0c;说至多完成两笔交易&#xff0c;也…

C++ 设计模式:工厂模式

工厂模式是一种创建型设计模式&#xff0c;通过封装对象的创建过程&#xff0c;提高代码的可维护性、可扩展性&#xff0c;并实现对象的创建与使用的解耦。 简单工厂模式&#xff1a; 提供一个工厂类&#xff0c;根据传入的参数来决定创建哪种产品类的实例。这种模式不符合开闭…

从零开始学HCIA之WLAN基础02

1、CAPWAP是无线接入点的控制与配置协议&#xff0c;用以支持大规模WLAN组网&#xff0c;同时实现多厂商AC和AP间互通。 2、CAPWAP协议主要功能包括&#xff1a; &#xff08;1&#xff09;实现 AP对 AC的自动发现及 AP和 AC的状态机运行与维护&#xff1b; &#xff08;2&a…

【JS运算符/表达式】`?.` `??` `...` `,` `=` `||=` `?:`等运算符讲解

运算符&#xff1a;除了以下demo代码的内容&#xff0c;其他不常用的就不写了 // 常用运算符&#xff1a; // 最常用的 - * / > < > < && || 就不说了// 取余 % console.log(10 % 3); // 1// 加法赋值运算符 // let a 1; // console.log((a 10)); //…