LLaMA-Factory GLM4-9B-CHAT LoRA 指令微调实战
🤩LLaMA-Factory GLM LoRA 微调
安装llama-factory包
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
进入下载好的llama-factory,安装依赖包
cd LLaMA-Factory
pip install -e ".[torch,metrics]"
#上面这步操作会完成torch、transformers、datasets等相关依赖包的安装

大模型下载
modelscope代码方式下载
import torch
from modelscope import snapshot_download, AutoModel, AutoTokenizer
import os
model_dir = snapshot_download('ZhipuAI/glm-4-9b-chat', cache_dir='/root/autodl-tmp', revision='master')
git clone方式下载
git lfs install # 大文件传输
sudo apt-get install git-lfsgit clone https://www.modelscope.cn/ZhipuAI/glm-4-9b-chat.git
指令数据集构建-Alpaca 格式
Alpaca 格式是一种用于训练自然语言处理(NLP)模型的数据集格式,特别是在对话系统和问答系统中。这种格式通常包含指令(instruction)、输入(input)和输出(output)三个部分,它们分别对应模型的提示、模型的输入和模型的预期输出。三者的数据都是字符串形式
Alpaca 格式训练数据集
[{"instruction": "Answer the following question about the movie 'Inception'.","input": "What is the main theme of the movie?","output": "The main theme of the movie 'Inception' is the exploration of dreams and reality."},{"instruction": "Provide a summary of the book '1984' by George Orwell.","input": "What is the book '1984' about?","output": "The book '1984' is a dystopian novel that tells the story of a totalitarian regime and the protagonist's struggle against it."}
]
我的数据集构建如下
crop_train.json
[{"instruction": "你是农作物领域专门进行关系抽取的专家。请从给定的文本中抽取出关系三元组,不存在的关系返回空列表。请按照JSON字符串的格式回答。","input": "煤是一种常见的化石燃料,家庭用煤经过了从\"煤球\"到\"蜂窝煤\"的演变。","output": "[{\"head\": \"煤\", \"relation\": \"use\", \"tail\": \"燃料\"}]"},{"instruction": "你是农作物领域专门进行关系抽取的专家。请从给定的文本中抽取出关系三元组,不存在的关系返回空列表。请按照JSON字符串的格式回答。","input": "内分泌疾病是指内分泌腺或内分泌组织本身的分泌功能和(或)结构异常时发生的症候群。","output": "[{\"head\": \"腺\", \"relation\": \"use\", \"tail\": \"分泌\"}]"},
]
我的数据格式转换代码:
import json
import re# 选择要格式转换的数据集
file_name = "merged_trainProcess.json"# 读取原始数据
with open(f'./{file_name}', 'r', encoding='utf-8') as file:data = json.load(file)# 转换数据格式
converted_data = [{"instruction": item["instruction"],"input": item["text"],"output": json.dumps(item["triplets"], ensure_ascii=False),} for item in data]# 将转换后的数据写入新文件
output_file_name = f'processed_{file_name}'
with open(output_file_name, 'w', encoding='utf-8') as file:json.dump(converted_data, file, ensure_ascii=False, indent=4)print(f'{output_file_name} Done')
构建好后保存到llama-factory目录中某文件下
修改 LLaMa-Factory 目录中的 data/dataset_info.json 文件,在其中添加:
"crop_merged": {"file_name": "/home/featurize/data/crop_train.json" #自己的训练数据集.json文件的绝对路径}
微调模型代码
在 LLaMA-Factory 目录中**新建配置文件 crop_glm4_lora_sft.yaml :**
### model:glm-4-9b-chat模型地址的绝对路径
model_name_or_path: /home/featurize/glm-4-9b-chat### method
stage: sft # supervised fine-tuning(监督式微调)
do_train: true # 是否执行训练过程
finetuning_type: lora # 微调技术的类型
lora_target: all # all 表示对模型的所有参数进行 LoRA 微调### dataset
# dataset 要和 data/dataset_info.json 中添加的信息保持一致
dataset: crop_merged # 数据集的名称
template: glm4 # 数据集的模板类型
cutoff_len: 2048 # 输入序列的最大长度
max_samples: 100000 # 最大样本数量, 代表在训练过程中最多只会用到训练集的1000条数据;-1代表训练所有训练数据集
overwrite_cache: true
preprocessing_num_workers: 16 # 数据预处理时使用的进程数 ### output
# output_dir是模型训练过程中的checkpoint,训练日志等的保存目录
output_dir: saves/crop-glm4-epoch10/lora/sft
logging_steps: 10 # 日志记录的频率
#save_steps: 500
plot_loss: true # 绘制损失曲线
overwrite_output_dir: true # 是否覆盖输出目录中的现有内容
save_strategy: epoch # 保存策略,epoch 表示每个 epoch 结束时保存。### train
per_device_train_batch_size: 1 # 每个设备上的批次大小,每增加几乎显存翻倍
gradient_accumulation_steps: 8 # 梯度累积的步数,这里设置为 8,意味着每 8 步执行一次梯度更新。
learning_rate: 1.0e-4 # 学习率
num_train_epochs: 3 # 训练的 epoch 数
lr_scheduler_type: cosine #学习率调度器的类型
warmup_ratio: 0.1
fp16: true # 更适合模型推理,混合精度训练,在训练中同时使用FP16和FP32
#bf16: true # 更适合训练阶段
gradient_checkpointing: true # 启用梯度检查点(gradient checkpointing),减少中间激活值的显存占用### eval
do_eval: false # 是否进行评估
val_size: 0.1 # 验证集的大小比例,这里设置为 0.1,即 10%
per_device_eval_batch_size: 1 # 每个设备上的评估批次大小
eval_strategy: steps # 评估策略,steps 表示根据步数进行评估
eval_steps: 1000 # 评估的步数间隔
### model
model_name_or_path: /home/featurize/glm-4-9b-chat### method
stage: sft
do_train: true
finetuning_type: lora
lora_target: all### dataset
dataset: crop_merged
template: glm4
cutoff_len: 512
overwrite_cache: true
preprocessing_num_workers: 16### output
output_dir: saves/crop-glm4-epoch10/lora/sft
logging_steps: 100
save_steps: 1000
plot_loss: true
overwrite_output_dir: true### train
per_device_train_batch_size: 1
gradient_accumulation_steps: 8
learning_rate: 1.0e-4
num_train_epochs: 1
lr_scheduler_type: cosine
warmup_ratio: 0.1
bf16: true
gradient_checkpointing: true### eval
val_size: 0.1
per_device_eval_batch_size: 1
eval_strategy: epoch
执行以下命令开始微调:
cd LLaMA-Factory
llamafactory-cli train crop_glm4_lora_sft.yaml
合并模型代码
训练完成后,在 LLaMA-Factory 目录中**新建配置文件 crop_glm4_lora_sft_export.yaml:**
导出的模型将被保存在models/CropLLM-glm-4-9b-chat目录下。
### model
model_name_or_path: /home/featurize/glm-4-9b-chat
# 刚才crop_glm4_lora_sft.yaml文件中的 output_dir
adapter_name_or_path: saves/crop-glm4-epoch10/lora/sft
template: glm4
finetuning_type: lora### export
export_dir: models/CropLLM-glm-4-9b-chat
export_size: 2
export_device: cpu
export_legacy_format: false
半精度(FP16、BF16)
执行以下命令开始合并模型:
cd LLaMA-Factory
llamafactory-cli export crop_glm4_lora_sft_export.yaml
在 models/CropLLM-glm-4-9b-chat 目录中就可以获得经过Lora微调后的完整模型。

推理预测
import torch
from transformers import AutoModelForCausalLM, AutoTokenizermodel_path = "/home/featurize/LLaMA-Factory/models/CropLLM-glm-4-9b-chat"device = "cuda"
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)system_prompt = "你是农作物领域专门进行关系抽取的专家。请从给定的文本中抽取出关系三元组,不存在的关系返回空列表。请按照JSON字符串的格式回答。"
input = "玉米黑粉病又名“乌霉”和“瘤黑粉病”,病原菌是真菌,:担孢子菌,是由于玉米黑粉菌所引起的一种局部浸染性病害。病瘤内的黑粉是病菌的"inputs = tokenizer.apply_chat_template([{"role": "system", "content": system_prompt},{"role": "user", "content": input}],add_generation_prompt=True,tokenize=True,return_tensors="pt",return_dict=True)inputs = inputs.to(device)
model = AutoModelForCausalLM.from_pretrained(model_path,torch_dtype=torch.bfloat16,low_cpu_mem_usage=True,trust_remote_code=True
).to(device).eval()gen_kwargs = {"max_length": 2500, "do_sample": True, "top_k": 1}
with torch.no_grad():outputs = model.generate(**inputs, **gen_kwargs)outputs = outputs[:, inputs['input_ids'].shape[1]:]print(f"model: {model_path}")print(f"task: {system_prompt}")print(f"input: {input}")output = tokenizer.decode(outputs[0], skip_special_tokens=True)print(f"output: {output}")
相关文章:
LLaMA-Factory GLM4-9B-CHAT LoRA 指令微调实战
🤩LLaMA-Factory GLM LoRA 微调 安装llama-factory包 git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git进入下载好的llama-factory,安装依赖包 cd LLaMA-Factory pip install -e ".[torch,metrics]" #上面这步操作会完成…...
GTM023 W.H.Greub线性代数经典教材:Linear Algebra
这本教材是我高中时期入门线性代数的主要教材,我的很多基础知识都来源于这本书,如今看回这本书可以说满满的回忆。这本书可以说,是我读过的内容最为全面且完备的线性代数教材了。而且它的语言风格非常的代数化,没有什么直观可言&a…...
交换机与路由器的区别
交换机和路由器是网络中的两种关键设备,它们各自承担不同的功能,主要区别体现在以下几个方面: 一、工作层次与功能 交换机: 工作层次:交换机主要工作在OSI模型的第二层,即数据链路层。 功能:交…...
springboot502基于WEB的牙科诊所管理系统(论文+源码)_kaic
牙科诊所管理系统的设计与实现 摘要 近年来,信息化管理行业的不断兴起,使得人们的日常生活越来越离不开计算机和互联网技术。首先,根据收集到的用户需求分析,对设计系统有一个初步的认识与了解,确定牙科诊所管理系统的…...
soular使用教程
用 soular 配置你的组织,工作更高效!以下是快速上手的简单步骤:  1. 账号管理 可以对账号信息进行多方面管理,包括分配不同的部门、用户组等,从而确保账号权限和职责的清晰分配。  1.1 用…...
纯div+css+js弹出窗
目的:实现弹出窗、仅关闭弹窗之后才能操作。自适应宽度与高度、当文本内容太多时、添加滚动条效果。 效果图 源码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport"…...
一篇文章学会HTML
目录 页面结构 网页基本标签 图像标签 超链接标签 文本链接 图像链接 锚链接 功能链接 列表 有序列表 无序列表 自定义列表 表格 跨列/跨行 表头 媒体元素 视频 音频 网站的嵌套 表单 表单元素 文本框 单选框 多选框 按钮 下拉框 文本域和文件域 表…...
QGIS二次开发(插件开发)
实习二 QGIS插件开发 2.1 任务要求 a)用C语言编写qgis插件,实现带有x/y坐标的文本文件的地图显示。 用文件流fstream操作文本文件,读取其中的坐标数据。基于QgsPlugin相关类派生出一个插件,并加到插件工厂中。基于QgsVectorLaye…...
Web防火墙和下一代防火墙的区别
介绍 客户经常询问“当我已经拥有下一代防火墙(NGFW)时,为什么需要Web应用程序防火墙(WAF)?”。本博文的目的是解释两种解决方案之间的区别,重点关注Web应用程序防火墙可以提供的附加值。 什么…...
Linux:alias别名永久有效
一、背景 日常使用bash时候,有些常用的命令参数的组合命令太长,很难记,此时可以利用Linux提供的alias命令生成命令的别名(命令的隐射),但是我们会发现,当退出了终端后重新登录就失效了ÿ…...
【递归与回溯深度解析:经典题解精讲(中篇)】—— LeetCode
文章目录 组合目标和组合总和字母大小写全排序优美的排列N皇后 组合 思路:回溯算法 问题要求从 1 到 n 中选出 k 个数的所有组合。 使用回溯算法递归构造解。 每次递归时,记录当前的组合路径,当组合长度达到 k 时,将其加入结果集…...
01.HTTPS的实现原理-HTTPS的概念
01.HTTPS的实现原理-HTTPS的概念 简介1. HTTPS的概念和安全性2. HTTPS的实现原理3. HTTPS和HTTP的区别4. OSI七层协议模型5. SSL和TLS的区别 简介 该系列文章主要讲述了HTTPS协议与HTTP协议的区别,以及HTTPS如何实现安全传输。内容分为三部分:HTTPS的实…...
一文详解MacOS+CLion——构建libtorch机器学习开发环境
对于希望在本地环境中进行深度学习开发的开发者来说,配置合适的工具链是至关重要的一步。本文旨在帮助您在 macOS 操作系统上,利用 CLion IDE 和 PyTorch 的 C依赖库——libtorch,快速搭建起一个高效的开发环境。这里我们将一步步地讲解如何下…...
【LeetCode 面试经典150题】详细题解之哈希表篇
【LeetCode 面试经典150题】详细题解之哈希表篇 1 哈希表的基础1.1 基础概念及实现1.2.1 哈希表的工作原理1.2.2 705.设计哈希集合1.2.3 706.设计哈希映射 1.2 HashMap相关1.2.1 基本操作1.2.2 遍历 1.3 Hashtable1.4 LinkedHashMap1.5 HashSet**1.5.1基本特性**1.5.2 基本方法…...
linux socket编程之udp_dict_serve服务端--引入配置文件
注意:本篇博客只是对上一篇博客功能的增加 1.创建配置文件(翻译) Dict.txt apple: 苹果 banana: 香蕉 cat: 猫 dog: 狗 book: 书 pen: 笔 happy: 快乐的 sad: 悲伤的 run: 跑 jump: 跳 teacher: 老师 student: 学生 car: 汽车 bus: 公交车 love: 爱 hate: 恨 hell…...
selenium学习笔记(二)
文章目录 前言设计模式POMPOM概念POM优势POM设计原则POM的实现 selenium的常用操作处理动态元素截图操作勾选复选框多层框架/窗口定位操作下拉框上传文件操作处理弹窗切换窗口拖拽操作 如何处理浏览器驱动更新导致的问题selenium与网站监控监听网页内容变化监控网络请求 seleni…...
宏集eX710物联网工控屏在石油开采机械中的应用与优势
案例概况 客户:天津某石油机械公司 应用产品:宏集eX710物联网工控屏 应用场景:钻井平台设备控制系统 一、应用背景 石油开采和生产过程复杂,涵盖钻井平台、采油设备、压缩机、分离器、管道输送系统等多种机械设备。这些设备通…...
linux——vi命令常用操作
一、vi模式 vi一般分为三种模式,分别是命令行模式、插入模式、末行模式 1.命令模式:控制屏幕光标的移动,按 :进入末行模式,按 i(其他插入命令也可) 进入插入模式; 2.插入模式&…...
vscode添加全局宏定义
利用vscode编辑代码时,设置了禁用非活动区域着色后,在一些编译脚本中配置的宏又识别不了 遇到#ifdef包住的代码就会变暗色,想查看代码不是很方便。如下图: 一 解决: 在vscode中添加全局宏定义。 二 步骤:…...
重装荣耀X14笔记本电脑踩坑记
这几天趁着有国补搞了台荣耀 X14笔记本电脑。到手后第一件事情对我来说当然是要重装成Windows 11 LTSC版。所以按以往的经验做了个USB启动安装盘,但发现上电后按F12能进入启动设备选择,可是USB分类下没有任何设备。重启按F2进入设置界面,关闭…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
