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

欺诈文本分类检测(十一):LLamaFactory多卡微调

1. 引言

前文训练时都做了一定的编码工作,其实有一些框架可以支持我们零代码微调,LLama-Factory就是其中一个。这是一个专门针对大语言模型的微调和训练平台,有如下特性:

  • 支持常见的模型种类:LLaMA、Mixtral-MoE、Qwen、Baichuan、ChatGLM等等。
  • 支持单GPU和多GPU训练。
  • 支持全参微调、Lora微调、QLora微调。
    ……

还有很多优秀的特性,详细参考:https://llamafactory.readthedocs.io/zh-cn/latest/

本文会尝试用LLamaFactory进行一次多GPU训练。

2. 安装

git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e ".[torch,metrics,deepspeed,bitsandbytes,vllm]"

安装完后执行llamafactory-cli version验证安装是否成功,结果报了AttributeError: module 'torch.library' has no attribute 'register_fake'
在这里插入图片描述
原因:PyTorch 和 TorchVision 版本不兼容,经常发生在torchvision较新而pytorch版本较旧的场景。

解法:使用pip install --upgrade torch torchvision 更新两者版本使之一致,再次运行llamafactory-cli version后正常输出了版本号0.8.4。

----------------------------------------------------------
| Welcome to LLaMA Factory, version 0.8.4.dev0           |
|                                                        |
| Project page: https://github.com/hiyouga/LLaMA-Factory |
----------------------------------------------------------

3. 数据处理

针对sft, llamafactory支持多种数据格式,我们这里选用alpaca,此格式简单清晰,每条数据只需包含三个字段:

  • instruction 列对应的内容为人类指令;
  • input 列对应的内容为人类输入;
  • output 列对应的内容为模型回答。
{"instruction": "计算这些物品的总费用。 ","input": "输入:汽车 - $3000,衣服 - $100,书 - $20。","output": "汽车、衣服和书的总费用为 $3000 + $100 + $20 = $3120。"
},

为了格式匹配,封装一个函数to_alpaca用于转换数据。

import json  def to_alpaca(input_path, output_path):with open(input_path, 'r', encoding='utf-8') as infile, open(output_path, 'w', encoding='utf-8') as outfile:  dataset = []for line in infile:  data = json.loads(line)  item = {'input': data['input'],'output': json.dumps({'is_fraud':data['label']}, ensure_ascii=False),'instruction':data['instruction'],}  dataset.append(item)# 将结果写入输出文件  outfile.write(json.dumps(dataset, indent=4, ensure_ascii=False))  print(f"convert over,{input_path} to {output_path}")

批量将前文欺诈文本分类微调(四):构造训练/测试数据集已经构建好的数据集作格式转换。

input_files = ['../dataset/fraud/train_test/train0819.jsonl','../dataset/fraud/train_test/test0819.jsonl','../dataset/fraud/train_test/eval0819.jsonl',
]for input_path in input_files:output_path = f'../dataset/fraud/train_test/{filename(input_path)}_alpaca.json'to_alpaca(input_path, output_path)
convert over,../dataset/fraud/train_test/train0819.jsonl to ../dataset/fraud/train_test/train0819_alpaca.json
convert over,../dataset/fraud/train_test/test0819.jsonl to ../dataset/fraud/train_test/test0819_alpaca.json
convert over,../dataset/fraud/train_test/eval0819.jsonl to ../dataset/fraud/train_test/eval0819_alpaca.json

文件内容如下所示:

[{"input": "发言人3: 现在我所在这个哪里能够工艺能够去把屈光做得很好的,去到这个省级医院是自治区医院跟广西医科大学这个附属医院他们还可以,他们一直保持比较好的一个一个手术量。\n发言人1: 就是","output": "{\"is_fraud\": false}","instruction": "\n下面是一段对话文本, 请分析对话内容是否有诈骗风险,以json格式输出你的判断结果(is_fraud: true/false)。\n"},……{"input": "发言人12: 好的,感谢大家参加本次电话会议会议到此结束,祝大家生活愉快,再见。\n发言人1: 本次会议已结束。\n发言人2: the meeting has ended。","output": "{\"is_fraud\": false}","instruction": "\n下面是一段对话文本, 请分析对话内容是否有诈骗风险,以json格式输出你的判断结果(is_fraud: true/false)。\n"}
]

转换好数据集后,需要将其配置到LLamaFactory安装目录下的data/dataset_info.json文件中,只需要在文件最后添加我们新构造的数据集。

{"identity": {"file_name": "identity.json"},……"anti_fraud": {"file_name": "train0819_alpaca.jsonl","columns": {"prompt": "instruction","query": "input","response": "output"}}
}

4. 训练参数配置

LLamaFactory的训练参数采用yaml文件保存,在安装目录下的examples子目录下有各种微调方法的示例配置,可以直接拷贝一份进行修改。

在这里插入图片描述

yaml文件中采用分块配置,下面分别示例。

模型路径
### model
model_name_or_path: /data2/anti_fraud/models/modelscope/hub/Qwen/Qwen2-1___5B-Instruct
微调方法

说明:同前面训练的参数配置保持一致。

stage: sft          
do_train: true
finetuning_type: lora  # 具体微调方法采用Lora
lora_target: q_proj,k_proj,v_proj,o_proj,gate_proj,up_proj,down_proj
lora_rank: 16
lora_alpha: 32
lora_dropout: 0.2
  • stage: sft :LLamaFactory中将训练划分成了很多阶段,例如:rm(reward modeling), pt(pretrain), sft(Supervised Fine-Tuning), PPO, DPO, KTO, ORPO,监督微调选择sft。
  • finetuning_type: lora 微调方法选择Lora。
数据集配置

这部分参数定义上有些不同,下面会详细说明。

dataset: anti_fraud
template: qwen
cutoff_len: 2048
max_samples: 200000
overwrite_cache: true
preprocessing_num_workers: 16

dataset: anti_fraud 是用于上面在dataset_info.json中添加的数据集名称。

template: llama3 此参数控制着最终给模型训练的数据模板。

  • 如果是llama3:
<|start_header_id|>user<|end_header_id|>下面是一段对话文本, 请分析对话内容是否有诈骗风险,以json格式输出你的判断结果(is_fraud: true/false)。发言人3: 现在我所在这个哪里能够工艺能够去把屈光做得很好的,去到这个省级医院是自治区医院跟广西医科大学这个附属医院他们还可以,他们一直保持比较好的一个一个手术量。
发言人1: 就是<|eot_id|><|start_header_id|>assistant<|end_header_id|>{"is_fraud": false}<|eot_id|>
  • 如果是qwen:
<|im_start|>system
You are a helpful assistant.<|im_end|>
<|im_start|>user下面是一段对话文本, 请分析对话内容是否有诈骗风险,以json格式输出你的判断结果(is_fraud: true/false)。发言人3: 现在我所在这个哪里能够工艺能够去把屈光做得很好的,去到这个省级医院是自治区医院跟广西医科大学这个附属医院他们还可以,他们一直保持比较好的一个一个手术量。
发言人1: 就是<|im_end|>
<|im_start|>assistant
{"is_fraud": false}<|im_end|>

cutoff_len: 相当于max_length,限制一条数据的最大长度,超出截断。

max_samples: 用于限制在训练或评估过程中使用的样本数量。此参数主要适用于数据集非常大并且不需要所有样本都进行训练的场景。

输出配置

说明:同前面训练的参数配置保持一致。

### output
output_dir: /data2/anti_fraud/models/Qwen2-1___5B-Instruct_ft_0826
logging_steps: 10
save_steps: 100
plot_loss: true
overwrite_output_dir: true
训练配置

说明:同前面训练的参数配置保持一致。

per_device_train_batch_size: 16
gradient_accumulation_steps: 1
gradient_checkpointing: true
learning_rate: 1.0e-4
num_train_epochs: 3.0
lr_scheduler_type: cosine
warmup_ratio: 0.05
bf16: true
ddp_timeout: 180000000
验证配置

说明:同前面训练的参数配置保持一致。

val_size: 0.1
per_device_eval_batch_size: 8
eval_strategy: steps
eval_steps: 100

配置完成后,将上面的配置保存到qwen2_lora_sft.yaml 文件中。

5. 训练

5.1 开始训练

设置环境变量CUDA_VISIBLE_DEVICES声明训练过程中允许使用4张显卡,显卡编号分别为1、2、3、4。

使用 llamafactory-cli命令启动训练。

export CUDA_VISIBLE_DEVICES=1,2,3,4
llamafactory-cli train /data2/downloads/LLaMA-Factory/qwen2_lora_sft.yaml 

训练关键信息:

08/26/2024 18:08:49 - INFO - llamafactory.model.loader - trainable params: 18,464,768 || all params: 1,562,179,072 || trainable%: 1.1820
[INFO|trainer.py:2134] 2024-08-26 18:08:50,496 >> ***** Running training *****
[INFO|trainer.py:2135] 2024-08-26 18:08:50,496 >>   Num examples = 19,021
[INFO|trainer.py:2136] 2024-08-26 18:08:50,496 >>   Num Epochs = 3
[INFO|trainer.py:2137] 2024-08-26 18:08:50,496 >>   Instantaneous batch size per device = 16
[INFO|trainer.py:2140] 2024-08-26 18:08:50,496 >>   Total train batch size (w. parallel, distributed & accumulation) = 64
[INFO|trainer.py:2141] 2024-08-26 18:08:50,496 >>   Gradient Accumulation steps = 1
[INFO|trainer.py:2142] 2024-08-26 18:08:50,496 >>   Total optimization steps = 894
[INFO|trainer.py:2143] 2024-08-26 18:08:50,502 >>   Number of trainable parameters = 18,464,768

从上面这个信息可以看出一个显著变化,实际的批量大小batch_size从单卡下的16变成了多GPU下的64。在数据量不变的情况下,总的训练步数从之前的3522缩小到了894,相当于训练步数变少,而每一步迈的更大。

第一个100步的信息:

在这里插入图片描述

训练完的eval_loss为0.0152,比单卡时的验证损失0.016190要低。

***** eval metrics *****epoch                   =        3.0eval_loss               =     0.0152eval_runtime            = 0:00:17.00eval_samples_per_second =    124.291eval_steps_per_second   =      3.939
5.2 可视化训练结果

使用tensorboard可视化训练过程中的数据指标。

tensorboard --host=0.0.0.0 --port 6006 --logdir=/data2/anti_fraud/models/Qwen2-1___5B-Instruct_ft_0826/runs/Aug26_18-07-16_ubuntu/

训练损失下降曲线:
在这里插入图片描述
验证损失下降曲线:
在这里插入图片描述
学习率变化曲线:
在这里插入图片描述

学习率先降后升是学习率调度器配置lr_scheduler_type: cosine所起的作用,它将我们预设的1e-4作为最大值,刚开始训练时从2e-5左右缓慢上升至1e-4来适应数据,随着训练到了后期,逐渐降低学习率来尝试找到损失最低点。

5.3 评估测试

使用魔法命令%run导入评估脚本,定义原始模型/微调checkpoint的路径以及评估数据集。

%run evaluate.py
device = 'cuda'
evaldata_path = '/data2/anti_fraud/dataset/eval0819.jsonl'
model_path = '/data2/anti_fraud/models/modelscope/hub/Qwen/Qwen2-1___5B-Instruct'
checkpoint_path_900 = '/data2/anti_fraud/models/Qwen2-1___5B-Instruct_ft_0826/checkpoint-900'

运行评测:

evaluate(model_path, checkpoint_path_900, evaldata_path, device, batch=True, debug=True)
progress: 100%|██████████| 2348/2348 [03:22<00:00, 11.59it/s]
tn:1160, fp:5, fn:103, tp:1080
precision: 0.9953917050691244, recall: 0.9129332206255283

精确率precision从0.978上升到了0.995,召回率从0.866上升到了0.912,说明多张卡一起训练带来的批量大小增加,有助于模型更好的学习数据分布,从而更快的收敛到更优的解。

小结:本文尝试用LLamaFactory工具对前面的欺诈文本分类任务进行了SFT微调训练,并启用了多张GPU,多GPU的直接影响是批量大小batch_size的4倍增加,使得模型每次训练时能看到更多的数据,进行更稳定梯度估计和更准确的参数更新,最终在评测指标上有一个显著的提升。

参考文章

  • 欺诈文本分类微调(七):lora单卡二次调优
  • LLamaFactory使用教程
  • llama-factory参数体系
  • llama-factory微调参数详解

相关文章:

欺诈文本分类检测(十一):LLamaFactory多卡微调

1. 引言 前文训练时都做了一定的编码工作&#xff0c;其实有一些框架可以支持我们零代码微调&#xff0c;LLama-Factory就是其中一个。这是一个专门针对大语言模型的微调和训练平台&#xff0c;有如下特性&#xff1a; 支持常见的模型种类&#xff1a;LLaMA、Mixtral-MoE、Qw…...

SprinBoot+Vue健康管管理微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平…...

C++基础类容详解

目录 知识点1 C的概述 1 C的特征 2 C程序的编辑、编译和执行 3 第一个C源程序 4 面向对象程序设计思想 4.1 面向对象程序设计思想初始 4.2 面向对象程序设计思想的核心 知识点2 C对C的扩展 1 作用域访问运算符(::) 2 名称空间域 2.1 创建名称空间域 2.2 已有名称空间…...

python基础(16面试题附答案一)

python系列文章目录 python基础&#xff08;01变量&数据类型&运算符&#xff09; python基础&#xff08;02序列共性&#xff09; python基础(03列表和元组) python基础&#xff08;04字符串&字典&#xff09; python基础&#xff08;05集合set&#xff09; pytho…...

Leetcode3256. 放三个车的价值之和最大 I

Every day a Leetcode 题目来源&#xff1a;3256. 放三个车的价值之和最大 I 解法1&#xff1a;贪心 从大到下排序矩阵所有值, 记为数组v。 转化此题&#xff1a;从r*c个数中选取3个数分别给到车1&#xff0c;车2&#xff0c;和车3&#xff0c;使得符合条件的三数之和最大。…...

Redis中String类型的基本命令

文章目录 一、String字符串简介二、常见命令setgetmgetmsetsetnxincrincrbydecrdecrbyincrbyfloatappendgetrangesetrangestrlen 三、命令小结四、字符串内部编码五、String典型使用场景1. 缓存(Cache)功能2. 计数功能3. 共享会话&#xff08;Session&#xff09;4. 手机验证码…...

2024 年高教社杯全国大学生数学建模竞赛题目【A/B/C/D/E题】完整思路

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ A题是数模类赛事很常见的物理类赛题&#xff0c;需要学习不少相关知识。此题涉及对一个动态系统的建模&#xff0c;模拟…...

HR招聘新员工,如何考察企业文化适配度

要解决文化适配性问题&#xff0c;那在招聘过程中一定要明确企业核心价值观。比如通过制定明确文化价值观手册的方式&#xff0c;向求职者展示企业的使命愿景和价值观。 目前最为理想的考察方式就是线上的人才测评&#xff0c;比如&#xff1a;采用职业价值观测评法&#xff0…...

AI算力「搅局」座舱SoC

对于芯片巨头来说&#xff0c;汽车是难以割舍的赛道。 这不仅仅是因为「车规级」向来是准入门槛最高的细分市场之一&#xff0c;更重要的原因来自于从PC、智能手机到智能汽车时代&#xff0c;芯片公司都在寻求成为新周期的标杆。 比如&#xff0c;从PC时代的「英特尔」到智能手…...

lvs DR模式调试

DS配置&#xff1a; # cat /etc/keepalived_docker/keepalived.conf ! Configuration File for keepalived global_defs {router_id LVS_70 # 设置lvs的id&#xff0c;在一个网络内应该是唯一的 }vrrp_instance VI_70 {state MASTER # 两个 DS&#xff0…...

Java线程池的优化策略与最佳实践

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云/阿里云/华为云/51CTO&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互…...

android面试:解释一下 AsyncTask是什么?

AsyncTask 是 Android 中用于处理异步操作的一个类&#xff0c;它允许在后台线程中执行任务&#xff0c;并在完成后将结果传递回主线程。AsyncTask 主要用于执行短时间的后台操作&#xff0c;例如网络请求、文件读写等&#xff0c;而不阻塞用户界面。 AsyncTask 的主要特点&am…...

Django+Vue3前后端分离学习(四)(登录功能实现)

1、序列化数据&#xff1a; 创建serializers.py的python文件 从rest_framework里导入serializers类&#xff1a; from rest_framework import serializers class LoginSerializer(serializers.Serializer):email serializers.EmailField(requiredTrue, error_messages{&qu…...

机器学习面试:SVM为什么使用对偶函数求解?

支持向量机&#xff08;SVM&#xff09;在求解过程中使用对偶函数的原因主要与优化问题的性质、计算效率以及模型的泛化能力有关。以下是对偶函数在 SVM 中使用的详细解释&#xff1a; 1. 原始问题与对偶问题 在 SVM 中&#xff0c;我们的目标是找到一个超平面来最大化分类间…...

RabbitMQ 入门教程

介绍 RabbitMQ 是一个消息中间件&#xff0c;它实现了 AMQP (Advanced Message Queuing Protocol) 协议。本教程将引导你通过几个简单的步骤来学习如何使用 RabbitMQ 发送和接收消息。 环境准备 1. 安装 RabbitMQ - 在你的系统上安装 RabbitMQ: https://www.rabbitmq.com/d…...

docker进阶 compose等

Docker Compose 简介&#xff1a; 比如有100个微服务&#xff0c;不需要手动启动每一个&#xff0c;可以使用docker compose定义运行多个容器&#xff0c;高效管理化。 定义、运行多个容器 YAML file配置文件 single command 命令 写docker-compose.yaml docker-compose …...

[详细建模已更新]2024数学建模国赛高教社杯A题:“板凳龙” 闹元宵 思路代码文章助攻手把手保姆级

A 题 “板凳龙” 闹元宵 “板凳龙”&#xff0c;又称“盘龙”&#xff0c;是浙闽地区的传统地方民俗文化活动。人们将少则几十条&#xff0c;多则上百条的板凳首尾相连&#xff0c;形成蜿蜒曲折的板凳龙。盘龙时&#xff0c;龙头在前领头&#xff0c;龙身和龙尾相随盘旋&#x…...

网络编程(TCP+网络模型)

【1】TCP 初版服务器 #include <stdio.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h> #include <unistd.h> #include <arpa/inet.h> #include <string.h…...

Docker Image 命令

文章目录 目录 文章目录 1 . Docker镜像是什么? 2 . 镜像命令详解 docker images docker tag docker pull docker rmi docker save 总结 1 . Docker镜像是什么? Docker image 本质上是一个 read-only 只读文件&#xff0c; 这个文件包含了文件系统、 源码、库文件…...

如何在IntelliJ IDEA中将Tab设置为4个空格

前言 IntelliJ IDEA是一个强大的开发工具&#xff0c;支持多种编程语言。为了保持代码整洁一致&#xff0c;开发者经常需要调整编辑器中的Tab和缩进设置。 步骤1: 打开设置 首先&#xff0c;启动IntelliJ IDEA。在主界面上方的菜单栏中找到 File&#xff08;文件&#xff09…...

氧化镓高体积热容的特性,集成高介电常数界面的结侧冷却架构

速览&#xff1a;技术背景与挑战背景&#xff1a; 虽然宽禁带&#xff08;WBG&#xff09;半导体&#xff08;如SiC、GaN&#xff09;已取得进展&#xff0c;但超宽禁带&#xff08;UWBG&#xff09;材料如氧化镓&#xff08;Ga₂O₃&#xff09;具有更高的理论极限。痛点&…...

深度解析:软考高级科目中哪个最适合零基础考生?

1. 零基础考生如何选择软考高级科目 对于没有任何计算机背景的考生来说&#xff0c;选择软考高级科目确实是个令人头疼的问题。我见过太多零基础考生一开始就选错了方向&#xff0c;结果白白浪费了时间和精力。根据我这些年接触过的上百位考生的经验&#xff0c;**信息系统项目…...

GitHub 学生认证通过后,这些隐藏注意事项你一定要知道!

这篇文章&#xff0c;就结合实际情况&#xff0c;为大家详细梳理 GitHub 认证通过后的有效期机制、风控规则、权益激活技巧。一、关于认证有效期✅ 认证通过后&#xff0c;账号默认有效期为 2 年。但这只是一个常规周期&#xff0c;并不代表你一定能稳稳用满两年。GitHub 官方及…...

景区气象站是什么

景区气象站监测项目包含负氧离子、pm2.5、pm10、温度、湿度、气压、含氧量、噪音、风速、风向等&#xff0c;是一款用于林业、景区、公园、环保、气象、农业等领域的实时环境气象监测与发布的监测系统&#xff0c;主要针对景区、湿度公园空气质量环境进行集中监控和管理&#x…...

告别虚拟机!在WSL2的Ubuntu 20.04上搞定OpenCV 4.5+完整开发环境(含GUI显示配置)

在WSL2的Ubuntu 20.04上构建OpenCV 4.5全功能开发环境 当计算机视觉开发者第一次尝试在Windows系统上搭建OpenCV环境时&#xff0c;往往会面临两个选择&#xff1a;要么忍受虚拟机沉重的性能开销&#xff0c;要么在原生Windows环境中与各种兼容性问题搏斗。而今天&#xff0c;我…...

大模型之Linux服务器部署大模型斜

一、各自优势和对比 这是检索出来的数据&#xff0c;据说是根据第三方评测与企业数据&#xff0c;三款产品在代码生成质量上各有侧重&#xff1a; 产品 语言优势 场景亮点 核心差异 百度 Comate C核心代码质量第一&#xff1b;Python首生成率达92.3% SQL生成准确率提升35%&…...

Aseprite新手必看:5分钟搞定像素角色基础动画(附完整工程文件)

Aseprite像素动画速成指南&#xff1a;从静态角色到生动动作的5分钟魔法 第一次打开Aseprite时&#xff0c;我被它简洁的界面和强大的功能震撼了——作为一个独立游戏开发者&#xff0c;我需要快速制作角色动画&#xff0c;但又不想陷入复杂的美术流程。经过多次实践&#xff…...

用MobileNetV2和ONNX.js,5分钟在浏览器里跑通一个照片美学评分模型

浏览器端AI美学评分实战&#xff1a;MobileNetV2与ONNX.js的高效融合方案 当摄影作品成为数字社交的通用语言&#xff0c;如何快速评估一张照片的视觉价值成为刚需。传统人工评分效率低下且主观性强&#xff0c;而基于MobileNetV2与ONNX.js的浏览器端解决方案&#xff0c;让美…...

UNet人脸融合作品集:这些换脸效果太惊艳了!

UNet人脸融合作品集&#xff1a;这些换脸效果太惊艳了&#xff01; 1. 前言&#xff1a;当AI遇见人脸融合 想象一下&#xff0c;你有一张喜欢的风景照&#xff0c;但照片里的人物表情不够完美&#xff1b;或者你想看看自己如果长着明星的五官会是什么样子。这些在过去需要专业…...

RFSOC XCZU47DR在5G射频基带开发中的实战应用(含代码示例)

RFSOC XCZU47DR在5G射频基带开发中的实战应用&#xff08;含代码示例&#xff09; 在5G通信系统的开发中&#xff0c;射频基带处理一直是工程师面临的核心挑战之一。Xilinx的RFSOC XCZU47DR凭借其独特的架构设计&#xff0c;将高性能RF数据转换器与可编程逻辑完美融合&#xff…...