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

2024-09-05 09:36

本文主要是介绍欺诈文本分类检测(十一):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单卡二次调优
  • llama-factory参数体系
  • llama-factory微调参数详解

这篇关于欺诈文本分类检测(十一):LLamaFactory多卡微调的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1138589

相关文章

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

AI Toolkit + H100 GPU,一小时内微调最新热门文生图模型 FLUX

上个月,FLUX 席卷了互联网,这并非没有原因。他们声称优于 DALLE 3、Ideogram 和 Stable Diffusion 3 等模型,而这一点已被证明是有依据的。随着越来越多的流行图像生成工具(如 Stable Diffusion Web UI Forge 和 ComyUI)开始支持这些模型,FLUX 在 Stable Diffusion 领域的扩展将会持续下去。 自 FLU

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

[数据集][目标检测]血细胞检测数据集VOC+YOLO格式2757张4类别

数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2757 标注数量(xml文件个数):2757 标注数量(txt文件个数):2757 标注类别数:4 标注类别名称:["Platelets","RBC","WBC","sickle cell"] 每个类别标注的框数:

Level3 — PART 3 — 自然语言处理与文本分析

目录 自然语言处理概要 分词与词性标注 N-Gram 分词 分词及词性标注的难点 法则式分词法 全切分 FMM和BMM Bi-direction MM 优缺点 统计式分词法 N-Gram概率模型 HMM概率模型 词性标注(Part-of-Speech Tagging) HMM 文本挖掘概要 信息检索(Information Retrieval) 全文扫描 关键词