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

使用 LlamaFactory 结合开源大语言模型实现文本分类:从数据集构建到 LoRA 微调与推理评估

文章目录

    • 背景介绍
      • 文本分类数据集
      • Lora 微调
      • 模型部署与推理
        • 期待模型的输出结果
    • 文本分类评估代码

背景介绍

本文将一步一步地,介绍如何使用llamafactory框架利用开源大语言模型完成文本分类的实验,以 LoRA微调 qwen/Qwen2.5-7B-Instruct 为例。

文本分类数据集

按照 alpaca 样式构建数据集,并在将其添加到 LLaMA-Factory/data/dataset_info.json 文件中。如此方便直接根据自定义数据集的名字,获取到数据集的数据。

[{"instruction": "","input": "请将以下文本分类到一个最符合的类别中。以下是类别及其定义:\n\n要求}}\nreason: \nlabel:","output": "reason: 该文本主要讨论的是xxx。因此,该文本最符合“社会管理”这一类别。\n\nlabel: 社会管理"},...
]

Lora 微调

llamafactory 框架支持网页端训练,但本文选择在终端使用命令行微调模型。

模型微调训练的参数较多,将模型训练的参数都存储在 yaml 文件中。

qwen_train_cls.yaml 的文件内容如下:

### model
model_name_or_path: qwen/Qwen2.5-7B-Instruct### method
stage: sft
do_train: true
finetuning_type: lora
lora_target: all### dataset
# dataset_dir: data
dataset_dir: LLaMA-Factory/data/ 填写相应路径
dataset: 数据集名 
template: qwen
cutoff_len: 2048
# max_samples: 1000 若数据集较大,可随机筛选一部分数据微调模型
overwrite_cache: true
preprocessing_num_workers: 16### output
output_dir: output/qwen2.5-7B/cls_epoch2 训练的LoRA权重输出路径
logging_steps: 10
save_steps: 500
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: 2.0
lr_scheduler_type: cosine
warmup_ratio: 0.1
bf16: true
ddp_timeout: 180000000### eval
# val_size: 0.1
# per_device_eval_batch_size: 1
# eval_strategy: steps
# eval_steps: 500

使用下述命令启动模型训练:

nohup llamafactory-cli train qwen_train_cls.yaml > qwen_train_cls.log 2>&1 &

命令分解介绍:
nohup, 全称为 “no hangup”(不要挂起)。它的作用是让命令在退出终端后仍然运行,防止因关闭终端或会话中断导致进程被终止。
默认情况下,nohup 会将输出重定向到 nohup.out 文件,但这里已经显式指定了输出位置。
llamafactory-cli train qwen_train_cls.yaml 运行 llamafactory-cli 工具,用于执行训练任务。
train 是子命令,表示进行训练。
qwen_train_cls.yaml 是一个配置文件,包含训练所需的超参数、数据路径、模型结构等。
qwen_train_cls.log
将标准输出 (stdout) 重定向到 qwen_train_cls.log 文件中。
即运行过程中的正常日志信息会被记录到这个文件。
2>&1: 将标准错误输出 (stderr) 重定向到标准输出 (stdout)。
这样,所有错误信息也会被写入到 qwen_train_cls.log 文件中。
&: 表示将整个命令放到后台运行。终端会立即返回,您可以继续进行其他操作,而不用等待命令完成。

模型部署与推理

模型训练完成后得到 Lora 权重。相关微调模型部署与推理,请浏览下述两篇文章,相比llamafactory原本的模型推理速度更快。

  • 基于 LLamafactory 的异步API高效调用实现与速度对比.https://blog.csdn.net/sjxgghg/article/details/144176645
  • 基于 LlamaFactory 的 LoRA 微调模型支持 vllm 批量推理的实现

目前llamafactory已经支持 vllm_infer 推理,这个PR是笔者提交的:

  • llamafactory vllm.https://github.com/hiyouga/LLaMA-Factory/blob/main/scripts/vllm_infer.py
期待模型的输出结果

下述是使用 llamafactory 推理出的数据格式,建议大家在做推理评估时,也做成这个样式,方便统一评估。

{"prompt": "请将以下文本分类到一个最符合的类别中。以下是类别及其定义:...", "predict": "\nreason: 该文本主要讨论了改革创新发展、行政区划调整、行政管理体制等方面的内容,涉及到体制机制的改革与完善,旨在推动高质量发展和提升生活品质。这些内容与社会管理和经济管理密切相关,但更侧重于行政管理和社会治理的改革,因此更符合“社会管理”这一类别。\n\nlabel: 社会管理", 		 "label": "reason: 该文本主要讨论的是改革创新、行政区划调整、体制机制障碍的破除以及行政管理体制等与政府治理和社会管理相关的内容,强调了与高质量发展和生活品质的关系。这些内容显示出对社会管理和行政管理的关注,尤其是在推动城乡一体化和适应高质量发展要求方面。因此,该文本最符合“社会管理”这一类别。\n\nlabel: 社会管理"
}

文本分类评估代码

import os
import re
import jsonfrom sklearn.metrics import classification_report, confusion_matrix# 文本类别
CLASS_NAME = ["产业相关",..."法律法规与行政事务","其他",
]def load_jsonl(file_path):"""加载指定路径的 JSON 文件并返回解析后的数据。:param file_path: JSON 文件的路径:return: 解析后的数据(通常是字典或列表):raises FileNotFoundError: 如果文件未找到:raises json.JSONDecodeError: 如果 JSON 格式不正确"""data = []try:with open(file_path, "r", encoding="utf-8") as file:for line in file:tmp = json.loads(line)data.append(tmp)except FileNotFoundError as e:print(f"文件未找到:{file_path}")raise eexcept json.JSONDecodeError as e:print(f"JSON 格式错误:{e}")raise ereturn datadef parser_label(text: str):pattern = r"label[::\s\.\d\*]*([^\s^\*]+)"matches = re.findall(pattern, text, re.DOTALL)if len(matches) == 1:return matches[0]return Nonedef trans2num(item):predict = parser_label(item["predict"])label = parser_label(item["label"])predict_idx = -1label_idx = -1for idx, cls_name in enumerate(CLASS_NAME):if predict == cls_name:predict_idx = idxif label == cls_name:label_idx = idxreturn predict_idx, label_idxdef cls_eval(input_file):data = load_jsonl(file_path=input_file)predicts = []labels = []for item in data:predict, label = trans2num(item)if label == -1:continuepredicts.append(predict)labels.append(label)return classification_report(predicts, labels, output_dict=False)

本文使用了大模型生成式预测文本类别,我没有使用结构化输出的方式,大家可以使用结构化的json格式输出,这样在提取大模型预测结果的时候会方便很多。

大家按照自己模型的输出结果,修改parser_label 函数,这个函数用于从大模型的输出结果提取label。

cls_eval("xxx/generated_predictions.jsonl")

就会得到下述的输出结果:

-1 代表模型预测的类别不在给定的类别中。
在这里插入图片描述

相关文章:

使用 LlamaFactory 结合开源大语言模型实现文本分类:从数据集构建到 LoRA 微调与推理评估

文章目录 背景介绍文本分类数据集Lora 微调模型部署与推理期待模型的输出结果 文本分类评估代码 背景介绍 本文将一步一步地,介绍如何使用llamafactory框架利用开源大语言模型完成文本分类的实验,以 LoRA微调 qwen/Qwen2.5-7B-Instruct 为例。 文本分类…...

Python基础学习总结篇

Python基础学习_01注释、变量、计算、打印 Python基础学习-02转义、输入、函数 Python基础学习-03逻辑分支语句、循环 Python基础学习-04列表List Python基础学习-05元组 tuple Python基础学习-06字典Dict Python基础学习-07不可重复的set集合 Python基础学习-08字符串 …...

8. Debian系统中显示屏免密码自动登录

本文介绍如何在Debian系统上,启动后,自动免密登录,不卡在登录界面。 1. 修改lightDM配置文件 嵌入式Debian系统采用lightDM显示管理器,所以,一般需要修改它的配置文件/etc/lightdm/lightdm.conf,找到[Seat…...

ubuntu安装nginx并设置开机自启动

1、下载nginx相关依赖包 sudo apt-get install gccsudo apt-get install libpcre3 libpcre3-devsudo apt-get install zlib1g zlib1g-devsudo sudo apt-get install opensslsudo apt-get install libssl-devsudo apt install make2、进入想下载安装包位置 cd /usr/local3、通…...

SQLServer中使用ISNULL替换为指定的替换值

ISNULL (Transact-SQL) 适用于: SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse Analytics 分析平台系统 (PDW)Microsoft Fabric 中的 SQL 分析端点Microsoft Fabric 中的仓库 NULL替换为指定的替换值。 1、语法 ISNULL ( check_expression , rep…...

深入浅出:PHP函数的定义与使用

文章目录 前言什么是函数定义函数语法示例 调用函数示例 参数传递按值传递示例按引用传递示例默认参数示例可变数量的参数示例 返回值示例 变量作用域全局作用域示例局部作用域示例静态作用域示例 匿名函数示例闭包示例 递归函数示例 内置函数常见内置函数示例 用户自定义函数示…...

C++知识整理day4内存管理——new和delete详解

文章目录 1.C/C内存分布2.C语言中动态内存管理:malloc/realloc/calloc3.C内存管理方式3.1 new/delete操作内置类型3.2 new和delete操作自定义类型 4.malloc/free和new/delete到底什么区别?4.1 对于自定义类型4.2 对于自定义类型4.3 总结:它们…...

部署项目报错

vue2项目部署后 Error: Cannot find module /views/*** 1.起因 登录页、首页等静态页面可以正常进入,后端访问也正常,可以获取到验证码。 但是登录之后会发现首页空白或者进入不到首页 F12查看有报错信息:Error: Cannot find module ‘/v…...

专业140+总分420+上海交通大学819考研经验上交电子信息与通信工程,真题,大纲,参考书。博睿泽信息通信考研论坛,信息通信考研Jenny

考研结束,专业819信号系统与信号处理140,总分420,终于梦圆交大,高考时敢都不敢想目标,现在已经成为现实,考研后劲很大,这一年的复习经历,还是历历在目,整理一下&#xff…...

电子信息工程自动化 单片机自动门控制系统设计

摘 要 伴随着社会经济的发展进步、科学技术的发展进步以及人民群众日常生活质量的逐渐提升,自动门开始全面进入人民群众的生活,逐渐发展成为了宾馆、大型超市、政府等当代建筑里必须配备的设备,是建筑自动智能化综合水平的主要标准之一。它具…...

T C P

文章目录 基于UDP应用场景 TCP协议TCP 协议段格式确认应答机制16位窗口大小 下定义32位序号和32位确认序号 基于UDP应用场景 UDP,tcp这样的协议根本不是直接谈UDP。tcp的应用场景,一定是上层写了应用层协议,所以才有UDP协议的应用场景。 比…...

PDF与PDF/A的区别及如何使用Python实现它们之间的相互转换

目录 概述 PDF/A 是什么?与 PDF 有何不同? 用于实现 PDF 与 PDF/A 相互转换的 Python 库 Python 实现 PDF 转 PDF/A 将 PDF 转换为 PDF/A-1a 将 PDF 转换为 PDF/A-1b 将 PDF 转换为 PDF/A-2a 将 PDF 转换为 PDF/A-2b 将 PDF 转换为 PDF/A-3a 将…...

【Linux课程学习】: 进程地址空间,小故事理解虚拟地址,野指针

🎁个人主页:我们的五年 🔍系列专栏:Linux课程学习 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 Linux学习笔记: https://blog.csdn.net/…...

解决el-select数据量过大的3种方法

在准备上线的后台管理系统中,我们发现有两个下拉框(select),其选项数据量超过 1 万条,而在测试环境中这些数据量只有几百条。这导致在页面加载时,浏览器性能出现瓶颈,页面卡顿甚至崩溃。 想了一…...

速盾:高防cdn预热指定url就只刷新这个吗?

高防CDN预热是指在网站上线或更新之前,将网站内容缓存到CDN节点服务器上,以提高用户访问网站的速度和稳定性。通常,预热可以通过指定URL来进行,而不是刷新整个网站。 预热指定URL的好处是可以选择性地进行缓存刷新,而…...

aarch64-linux-gnu-g++在windous不能用

aarch64-linux-gnu-g 是针对 ARM 64 位架构(aarch64)的交叉编译器,它通常用于在一个平台(例如 x86 的 Linux 系统)上为另一个平台(例如 ARM 设备)编译代码。aarch64-linux-gnu-g 是 Linux 环境下…...

01_Node.js入门 (黑马)

01_Node.js入门 知识点自测 从 index.js 出发&#xff0c;访问到 student/data.json 的相对路径如何写? A&#xff1a;../public/teacher/data.json B&#xff1a;./public/student/data.json C&#xff1a;../student/data.json <details><summary>答案</sum…...

记一次搞校园网的经历

接教室的校园网&#xff0c;到另一个屋子玩电脑&#xff0c;隔墙想放大一下AP的信号&#xff0c;发现死活不行 这是现状 由于校园网认证的存在&#xff0c;无法用桥接&#xff0c;桥接需要路由器有IP&#xff0c;而这个IP无法用未刷机的路由器来打开校园网页面认证 解决 将一…...

沃德云商协系统微信小程序PHP+Uniapp

“多组织”的云服务平台&#xff0c;打造总商会、总协会、总校友会、工商联等多组织无障碍沟通合作平台&#xff0c;让各大分会、各大分校友会、分组织实现轻松管理&#xff0c;线上宣传展示、商机挖掘、会员管理、会员服务、跨界交流等, 借助沃德云商协平台系统&#xff0c;让…...

Leecode刷题C语言之可以被进一步捕获的棋子数

执行结果:通过 执行用时和内存消耗如下&#xff1a; 代码如下&#xff1a; int numRookCaptures(char** board, int boardSize, int* boardColSize) {int cnt 0, st 0, ed 0;int dx[4] {0, 1, 0, -1};int dy[4] {1, 0, -1, 0};for (int i 0; i < 8; i) {for (int j…...

企业做智能问数,最容易被低估的不是模型,而是人工预置工作量

在当前企业数据智能平台选型中&#xff0c;“大模型能力”常被视为决定成败的关键。然而&#xff0c;越来越多的实践表明&#xff1a;真正制约智能问数从 POC&#xff08;概念验证&#xff09;走向规模化落地的瓶颈&#xff0c;并非模型本身&#xff0c;而是隐藏在技术方案背后…...

【DCTDECODE JPG】

import timeimport PyPDF2 import pdfplumber from PIL import Imagedef extract_image(page):try:# 提取第2页图片&#xff08;从0开始计数&#xff09;page_image pdf_image_reader.getPage(pageNumber1)extract_image(page_image)if /XObject in page[/Resources]:xObject …...

计算机毕业设计springboot在线阅读平台的设计与实现 基于SpringBoot的数字化图书阅读与积分兑换服务平台 SpringBoot框架下的网络文献资源管理与读者互动系统

计算机毕业设计springboot在线阅读平台的设计与实现 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。 随着互联网技术的飞速发展和移动智能终端的普及&#xff0c;人们的阅读习惯…...

图网络梯度计算与反向传播:自动微分技术的完整指南

图网络梯度计算与反向传播&#xff1a;自动微分技术的完整指南 【免费下载链接】graph_nets Build Graph Nets in Tensorflow 项目地址: https://gitcode.com/gh_mirrors/gr/graph_nets 在深度学习领域&#xff0c;图网络&#xff08;Graph Networks&#xff09;凭借其处…...

训练自定义游戏,构建Gymnasium训练环境

认识Gymnasium使用stable_baseline3只需要定义好Gymnasium环境&#xff0c;关注训练的奖励机制&#xff0c;将重点放在业务的开发上而不是复杂的算法。Gymnasium提供了几个核心的api&#xff1a;方法功能返回值reset()将环境重置为初始状态&#xff0c;开始新回合。obs, infost…...

Go语言中的字符串处理

Go语言中的字符串处理 1. 字符串的基本概念 在Go语言中&#xff0c;字符串是一种不可变的字节序列&#xff0c;使用UTF-8编码。字符串的类型为string&#xff0c;是Go语言的基本类型之一。 package mainimport "fmt"func main() {// 字符串字面量s1 : "Hello, W…...

2026长沙GEO优化公司权威实测:基于稳定性与转化效率的TOP5服务商深度推荐

2026长沙GEO优化公司权威实测&#xff1a;基于稳定性与转化效率的TOP5服务商深度推荐2026年&#xff0c;生成式AI搜索已深度重塑商业决策与品牌获客的路径。在全国GEO&#xff08;生成式引擎优化&#xff09;的版图中&#xff0c;长沙凭借活跃的数字经济生态与扎实的产业基础&a…...

大模型开发避坑:彻底理清 Skill(技能)与 MCP(模型 上下文协议)的本质区别与协同

在目前的 AI 应用开发圈子里&#xff0c;各种新名词层出不穷&#xff1a;Skill&#xff08;技能&#xff09;、Plugin&#xff08;插件&#xff09;、Function Calling&#xff08;函数调用&#xff09;、Tool&#xff08;工具&#xff09;、MCP&#xff08;模型上下文协议&…...

基于潜在扩散模型的高分辨率图像合成-CVPR2022

期刊&#xff1a;Conference on Computer Vision and Pattern Recognition (CVPR) 论文链接&#xff1a;[2112.10752] High-Resolution Image Synthesis with Latent Diffusion Models 年份&#xff1a;2022 关键词&#xff1a;扩散模型&#xff0c;图像生成 从像素空间走向…...

AA-PEG-VE,AA-PEG-Vitamin E,用于修饰蛋白质、多肽以及其他含有氨基的材料

一.名称英文名&#xff1a;AA-PEG-VE&#xff0c;AA-PEG-Vitamin E&#xff0c;Acetic Acid-PEG-VE&#xff0c;Acetic Acid-PEG-Vitamin E&#xff0c;Vitamin E-PEG-AA中文名&#xff1a;乙酸聚乙二醇维生素E&#xff0c;乙酸-PEG-维生素E&#xff0c;维生素E-PEG-乙酸分子量…...