当前位置: 首页 > news >正文

使用LLM-Tuning实现百川和清华ChatGLM的Lora微调

LLM-Tuning项目源码:

GitHub - beyondguo/LLM-Tuning: Tuning LLMs with no tears💦, sharing LLM-tools with love❤️.Tuning LLMs with no tears💦, sharing LLM-tools with love❤️. - GitHub - beyondguo/LLM-Tuning: Tuning LLMs with no tears💦, sharing LLM-tools with love❤️.icon-default.png?t=N7T8https://github.com/beyondguo/LLM-Tuning

1、环境准备

训练主机配置:

  • NVIDIA A100-PCIE-40GB
  • Python 3.8.10
  • CUDA: 11.2

安装依赖库:

pip install xformers==0.0.20
pip install torch==2.0.1
pip install transformers==4.29.1
pip install datasets==2.12.0
pip install accelerate==0.19.0
pip install sentencepiece==0.1.99
pip install tensorboard==2.13.0
pip install peft==0.3.0

2、数据准备

原始文件的准备

指令微调数据一般有输入和输出两部分,输出则是希望模型的回答,统一使用json的格式在整理数据,可以自定义输出输出的字段名。

{"q": "请计算:39 * 0 = 什么?", "a": "这是简单的乘法运算,39乘以0得到的是0"}
{"q": "题目:51/186的答案是什么?", "a": "这是简单的除法运算,51除以186大概为0.274"}
{"q": "鹿妈妈买了24个苹果,她想平均分给她的3只小鹿吃,每只小鹿可以分到几个苹果?", "a": "鹿妈妈买了24个苹果,平均分给3只小鹿吃,那么每只小鹿可以分到的苹果数就是总苹果数除以小鹿的只数。\n24÷3=8\n每只小鹿可以分到8个苹果。所以,答案是每只小鹿可以分到8个苹果。"}
...

整理好数据后,保存为.json或者.jsonl文件,然后放入目录中的data/文件夹中。

对数据集进行分词

为了避免每次训练的时候都要重新对数据集分词,先分好词形成特征后保存成可直接用于训练的数据集。

例如:

  • 原始指令微调文件为:data/ 文件夹下的 simple_math_4op.json 文件
  • 输入字段为q,输出字段为a
  • 希望经过 tokenize 之后保存到 data/tokenized_data/ 下名为 simple_math_4op 的文件夹中设定
  • 文本最大程度为 2000

则我们可以直接使用下面这段命令(即tokenize.sh文件)进行处理:

CUDA_VISIBLE_DEVICES=0,1 python tokenize_dataset_rows.py \--model_checkpoint THUDM/chatglm-6b \--input_file simple_math_4op.json \--prompt_key q \--target_key a \--save_name simple_math_4op \--max_seq_length 2000 \--skip_overlength False

处理完毕之后,在 data/tokenized_data/ 下生成名为 simple_math_4op 的文件夹,这就是下一步中可以直接用于训练的数据。

对比不同的 LLM,需在 tokenize.sh 文件里切换 model_checkpoint 参数。

3、使用 LoRA 微调

得到 tokenize 之后的数据集,就可以直接运行 chatglm_lora_tuning.py 来训练 LoRA 模型了。

对于不同的 LLM,需切换不同的 python 文件来执行:

  • ChatGLM-6B 应使用 chatglm_lora_tuning.py
  • ChatGLM2-6B 应使用 chatglm2_lora_tuning.py
  • baichuan-7B 应使用 baichuan_lora_tuning.py
  • baichuan2-7B 应使用 baichuan2_lora_tuning.py
  • internlm-chat/base-7b 应使用 intermlm_lora_tuning.py
  • chinese-llama2/alpaca2-7b 应使用 chinese_llama2_alpaca2_lora_tuning.py

具体可设置的主要参数包括:

  • tokenized_dataset, 分词后的数据集,即在 data/tokenized_data/ 地址下的文件夹名称
  • lora_rank, 设置 LoRA 的秩,推荐为4或8,显存够的话使用8
  • per_device_train_batch_size, 每块 GPU 上的 batch size
  • gradient_accumulation_steps, 梯度累加,可以在不提升显存占用的情况下增大 batch size
  • max_steps, 训练步数
  • save_steps, 多少步保存一次
  • save_total_limit, 保存多少个checkpoint
  • logging_steps, 多少步打印一次训练情况(loss, lr, etc.)
  • output_dir, 模型文件保存地址

例如我们的数据集为 simple_math_4op,希望保存到 weights/simple_math_4op ,则执行下面命令(即train.sh文件):

CUDA_VISIBLE_DEVICES=0,1 python chatglm_lora_tuning.py \--tokenized_dataset simple_math_4op \--lora_rank 8 \--per_device_train_batch_size 10 \--gradient_accumulation_steps 1 \--max_steps 100000 \--save_steps 200 \--save_total_limit 2 \--learning_rate 1e-4 \--fp16 \--remove_unused_columns false \--logging_steps 50 \--output_dir weights/simple_math_4op

训练完之后,可以在 output_dir 中找到 LoRA 的相关模型权重,主要是adapter_model.bin和adapter_config.json两个文件。

如何查看 tensorboard:

  • 在 output_dir 中找到 runs 文件夹,复制其中日期最大的文件夹的地址,假设为 your_log_path
  • 执行 tensorboard --logdir your_log_path 命令,就会在 http://localhost:6006/ 上开启tensorboard
  • 如果是在服务器上开启,则还需要做端口映射到本地。
  • 如果要自己手动进行端口映射,具体方式是在使用 ssh 登录时,后面加上 -L 6006:127.0.0.1:6006 参数,将服务器端的6006端口映射到本地的6006端口。

4、在本地大模型上加载LoRA并推理

把上面的 output_dir 打包带走,假设文件夹为 weights/simple_math_4op, 其中(至少)包含 adapter_model.bin 和 adapter_config.json 两个文件,用下面的方式直接加载,并推理

from peft import PeftModel
from transformers import AutoTokenizer, AutoModelForCausalLM
from transformers.generation.utils import GenerationConfig
import torchdevice = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")# 加载原始 LLM
model_path = "baichuan-inc/Baichuan2-7B-Chat"
model = AutoModelForCausalLM.from_pretrained(model_path, trust_remote_code=True).half().to(device)
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)model.generation_config = GenerationConfig.from_pretrained(model_path)
messages = [{"role": "user", "content": "什么是视觉生成艺术"}]
output = model.chat(tokenizer, messages)
print(output)# 给原始 LLM 安装上你的 LoRA tool
model = PeftModel.from_pretrained(model, "weights/chat_messagge_4op").half().to(device)
output = model.chat(tokenizer, messages)
print(output)

理论上可以通过多次执行 model = PeftModel.from_pretrained(model, "weights/simple_math_4op").half()  的方式,加载多个 LoRA 模型,从而混合不同Tool的能力,但实际测试的时候,由于暂时还不支持设置不同 LoRA weights的权重,往往效果不太好,存在覆盖或者遗忘的情况。

相关文章:

使用LLM-Tuning实现百川和清华ChatGLM的Lora微调

LLM-Tuning项目源码: GitHub - beyondguo/LLM-Tuning: Tuning LLMs with no tears💦, sharing LLM-tools with love❤️.Tuning LLMs with no tears💦, sharing LLM-tools with love❤️. - GitHub - beyondguo/LLM-Tuning: Tuning LLMs wit…...

浏览器标签页之间的通信

前言 在开发管理后台页面的时候,会遇到这样一种需求:有一个列表页面,一个新增按钮,一个新增页面,点击新增按钮,在一个新的标签页中打开新增页面。并且,新增后要自动实时的更新列表页面的数据。…...

Semantic Kernel 学习笔记1

1. 挂代理跑通openai API 2. 无需魔法跑通Azure API 下载Semantic Kernel的github代码包到本地,主要用于方便学习python->notebooks文件夹中的内容。 1. Openai API:根据上述文件夹中的.env.example示例创建.env文件,需要填写下方两个内…...

图像二值化阈值调整——Triangle算法,Maxentropy方法

一. Triangle方法 算法描述:三角法求分割阈值最早见于Zack的论文《Automatic measurement of sister chromatid exchange frequency》主要是用于染色体的研究,该方法是使用直方图数据,基于纯几何方法来寻找最佳阈值,它的成立条件…...

监控视频片段合并完整视频|FFmpeg将多个视频片段拼接完整视频|PHP自动批量拼接合并视频

关于环境配置ffmpeg安装使用的看之前文章 哔哩哔哩缓存转码|FFmpeg将m4s文件转为mp4|PHP自动批量转码B站视频 <?php date_default_timezone_set("PRC"); header("Content-type: text/html; charsetutf-8"); set_time_limit(0);// 遍历获取文件 functi…...

client-go controller-runtime kubebuilder

背景 这半年一直做k8s相关的工作&#xff0c;一直接触client-go controller-runtime kubebuilder&#xff0c;但是很少有文章将这三个的区别说明白&#xff0c;直接用框架是简单&#xff0c;但是出了问题就是黑盒&#xff0c;这不符合我的理念&#xff0c;所以这篇文章从头说起…...

【vue 如何解决响应式丢失】

响应式丢失原因 在 Vue 中&#xff0c;响应式丢失通常是由于以下原因导致的&#xff1a; 1. 使用非响应式对象或属性&#xff1a;在 Vue 中&#xff0c;只有使用 Vue 实例的 data 对象中的属性或使用 Vue.set() 方法添加的属性才是响应式的。如果使用普通对象或属性&#xff…...

Selenium alert 弹窗处理!

页面弹窗有 3 种类型&#xff1a; alert&#xff08;警告信息&#xff09;confirm&#xff08;确认信息&#xff09;prompt&#xff08;提示输入&#xff09; 对于页面出现的 alert 弹窗&#xff0c;Selenium 提供如下方法&#xff1a; 序号方法/属性描述1accept()接受2dismis…...

有关自动化的脚本思考 python 按键 javascript

start 说来其实挺巧的&#xff0c;去年年中的时候&#xff0c;有一个同组的同事&#xff0c;由于工作流程需要&#xff0c;经常会打开某一网页&#xff0c;填写某些信息&#xff0c;然后上传特定的代码。 他有一次和我闲聊&#xff0c;他吐槽说&#xff0c;他每天的时间会被这…...

CKA认证模块②-K8S企业运维和落地实战-2

CKA认证模块②-K8S企业运维和落地实战-2 K8S常见的存储方案及具体应用场景分析 k8s存储-empty emptyDir类型的Volume是在Pod分配到Node上时被创建&#xff0c;Kubernetes会在Node上自动分配一个目录&#xff0c;因此无需指定宿主机Node上对应的目录文件。 这个目录的初始内容…...

SpectralDiff论文阅读笔记

高光谱图像分类是遥感领域的一个重要问题&#xff0c;在地球科学中有着广泛的应用。近年来&#xff0c;人们提出了大量基于深度学习的HSI分类方法。然而&#xff0c;现有方法处理高维、高冗余和复杂数据的能力有限&#xff0c;这使得捕获数据的光谱空间分布和样本之间的关系具有…...

selenium基本使用、无头浏览器(chrome、FireFox)、搜索标签

selenium基本使用 这个模块&#xff1a;既能发请求&#xff0c;又能解析&#xff0c;还能执行js selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行 JavaScript代码的问题 selenium 会做web方向的自动化测试appnium 会做 app方向的自动化…...

Html 引入element UI + vue3 报错Failed to resolve component: el-button

问题&#xff1a;Html 引入element UI vue3 &#xff0c;el-button效果不出来 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><!-- import Vue before Element --> <!-- <script src"https://unpkg.com/vue2/dist…...

sen2cor安装

Sen2Cor工具安装教程-百度经验 (baidu.com)...

通付盾Web3专题 | SharkTeam:Web3安全实践与创新

在Web3领域&#xff0c;安全漏洞、黑客攻击已愈发成为用户和投资者重点关注的领域。如何保障加密资产的安全&#xff0c;Web3黑暗森林中又有哪些新的攻击模式产生&#xff0c;SharkTeam将从一线进行分享和讨论。 我们先来看一下2023年1月到8月的安全事件数量和损失的数据统计。…...

ARM Linux 基础学习 / Ubuntu 下的包管理 / apt工具

编辑整理 by Staok。 注&#xff1a;在 Github 上的原版文章日后可能会更新&#xff0c;在其它位置发的不会跟进。文章的 Gitee 仓库地址&#xff0c;Gitee 访问更流畅。 Ubuntu 下的包管理 / apt工具 包管理系统的功能和优点大致相同&#xff0c;但打包格式和工具会因平台&a…...

springcloudalibaba入门详细使用教程

目录标题 一、简介二、SpringCloud Alibaba核心组件2-1、Nacos (配置中心与服务注册与发现)2-2、Sentinel (分布式流控)2-3、RocketMQ (消息队列)/RabbitMq/kafka2-4、Seata (分布式事务)2-5、Dubbo (RPC) 三、为什么大家看好 Spring Cloud Alibaba3-1、阿里巴巴强大的技术输出…...

C# DirectoryInfo类的用法

在C#中&#xff0c;DirectoryInfo类是System.IO命名空间中的一个类&#xff0c;用于操作文件夹&#xff08;目录&#xff09;。通过DirectoryInfo类&#xff0c;我们可以方便地创建、删除、移动和枚举文件夹。本文将详细介绍DirectoryInfo类的常用方法和属性&#xff0c;并提供…...

IDEA常用快捷键大全(详解)

如何在IDEA中进行内容全局查找 在idea中进行全局查找&#xff0c;可以使用快捷键“Ctrl Shift F”或者在菜单栏中选择Edit > Find > Find in Path。在弹出的界面中&#xff0c;输入要查找的内容。如果“Ctrl Shift F”这个快捷键无法实现全局查找&#xff0c;可以尝…...

设计模式之解释器模式

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概5000多字&#xff0c;预计阅读时间长需要5分钟。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&#x…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明&#xff0c;此教程是针对Simulink编译模型并导入Veristand中编写的&#xff0c;同时需要注意的是老用户编译可能用的是Veristand Model Framework&#xff0c;那个是历史版本&#xff0c;且NI不会再维护&#xff0c;新版本编译支持为VeriStand Model Generation Suppo…...

React父子组件通信:Props怎么用?如何从父组件向子组件传递数据?

系列回顾&#xff1a; 在上一篇《React核心概念&#xff1a;State是什么&#xff1f;》中&#xff0c;我们学习了如何使用useState让一个组件拥有自己的内部数据&#xff08;State&#xff09;&#xff0c;并通过一个计数器案例&#xff0c;实现了组件的自我更新。这很棒&#…...

Tauri2学习笔记

教程地址&#xff1a;https://www.bilibili.com/video/BV1Ca411N7mF?spm_id_from333.788.player.switch&vd_source707ec8983cc32e6e065d5496a7f79ee6 官方指引&#xff1a;https://tauri.app/zh-cn/start/ 目前Tauri2的教程视频不多&#xff0c;我按照Tauri1的教程来学习&…...

【1】跨越技术栈鸿沟:字节跳动开源TRAE AI编程IDE的实战体验

2024年初&#xff0c;人工智能编程工具领域发生了一次静默的变革。当字节跳动宣布退出其TRAE项目&#xff08;一款融合大型语言模型能力的云端AI编程IDE&#xff09;时&#xff0c;技术社区曾短暂叹息。然而这一退场并非终点——通过开源社区的接力&#xff0c;TRAE在WayToAGI等…...