【LLaMA-Factory 实战系列】一、数据准备篇 - 从文本到多模态的完整流程

  • 1. 引言
  • 2. LLaMA-Factory 数据格式概述
    • 2.1 Alpaca 格式
    • 2.2 ShareGPT 格式
  • 3. 文本数据准备
    • 3.1 Alpaca 格式示例
    • 3.2 ShareGPT 格式示例
    • 3.3 预训练数据格式
  • 4. 多模态数据准备
    • 4.1 图像数据准备
    • 4.2 视频数据准备
    • 4.3 音频数据准备
  • 5. 多模态实战案例:Pokemon 数据集处理
    • 5.1 完整代码(包含下载与转换)
    • 5.2 结果示例
  • 6. 数据集配置与注册
    • 6.1 什么是 dataset_info.json
    • 6.2 配置参数详解
    • 6.3 配置示例详解
  • 7. 最佳实践与注意事项
    • 7.1 数据质量检查
    • 7.2 多模态数据准备要点
    • 7.3 性能优化
    • 7.4 常见问题与解决方案
  • 8. 总结

1. 引言

在大模型训练中,数据准备是最关键的步骤之一。俗话说 “Garbage in, garbage out”,数据的质量直接决定了模型的性能上限。本文将详细介绍如何为 LLaMA-Factory 准备训练数据,包括文本数据和多模态数据的处理方法。


2. LLaMA-Factory 数据格式概述

LLaMA-Factory 支持两种主要的数据格式:

2.1 Alpaca 格式

  • 结构简单,适合单轮对话
  • 支持 instructioninputoutput 字段
  • 适用于指令微调任务

2.2 ShareGPT 格式

  • 支持多轮对话
  • 角色更丰富(human、gpt、system、function、observation)
  • 适合复杂对话场景和多模态任务

3. 文本数据准备

3.1 Alpaca 格式示例

[{"instruction": "请解释什么是机器学习","input": "","output": "机器学习是人工智能的一个分支,它使计算机能够从数据中学习并改进性能,而无需明确编程。","system": "你是一个专业的AI助手","history": [["你好", "你好!有什么可以帮助你的吗?"]]}
]

3.2 ShareGPT 格式示例

[{"conversations": [{"from": "human","value": "什么是深度学习?"},{"from": "gpt","value": "深度学习是机器学习的一个子领域,使用多层神经网络来学习数据的复杂模式。"}],"system": "你是一个专业的AI助手"}
]

3.3 预训练数据格式

[{"text": "这是一段用于预训练的文本内容"},{"text": "另一段文本内容"}
]

4. 多模态数据准备

4.1 图像数据准备

数据格式示例

[{"conversations": [{"from": "human","value": "描述这张图片<image>"},{"from": "gpt","value": "这是一只可爱的小猫,正在阳光下睡觉。"}],"images": ["path/to/cat_image.jpg"]}
]

关键要点

  • <image> 标记的数量必须与 images 列表中的图片数量一致
  • 图片路径可以是相对路径或绝对路径
  • 支持常见格式:jpg、png、webp 等

4.2 视频数据准备

[{"conversations": [{"from": "human","value": "<video>这个视频中发生了什么?"},{"from": "gpt","value": "视频展示了一个人在公园里慢跑的场景。"}],"videos": ["path/to/running_video.mp4"]}
]

4.3 音频数据准备

[{"conversations": [{"from": "human","value": "<audio>请转录这段音频"},{"from": "gpt","value": "音频内容是:今天天气真好,适合出去散步。"}],"audios": ["path/to/audio_file.wav"]}
]

5. 多模态实战案例:Pokemon 数据集处理

5.1 完整代码(包含下载与转换)

import os
import json
from datasets import load_dataset
from PIL import Image
from tqdm import tqdm# 设置镜像加速
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"def convert_pokemon_dataset(output_dir="pokemon_sharegpt"):os.makedirs(output_dir, exist_ok=True)images_dir = os.path.join(output_dir, "images")os.makedirs(images_dir, exist_ok=True)ds = load_dataset("BUAADreamer/pokemon-gpt4-1k", split="train")sharegpt_data = []for idx, item in enumerate(tqdm(ds, desc="处理数据")):entry = {"conversations": [],"system": "You are a helpful assistant.","images": [f"images/pokemon_{idx:04d}.png"]}# 保存图片if "images" in item and item["images"]:image = item["images"][0]if isinstance(image, Image.Image):image.save(os.path.join(images_dir, f"pokemon_{idx:04d}.png"))# 转换对话if "messages" in item:for i, msg in enumerate(item["messages"]):role = msg.get("role", "")content = msg.get("content", "")if role == "user":from_role = "human"if i == 0:content += "<image>"elif role == "assistant":from_role = "gpt"else:continueentry["conversations"].append({"from": from_role,"value": content})sharegpt_data.append(entry)output_path = os.path.join(output_dir, "pokemon_sharegpt.json")with open(output_path, "w", encoding="utf-8") as f:json.dump(sharegpt_data, f, ensure_ascii=False, indent=2)print(f"✅ 数据转换完成,已保存至: {output_path}")if __name__ == "__main__":convert_pokemon_dataset()

5.2 结果示例

代码运行成功后,会在pokemon_sharegpt文件夹下生成一个images文件夹,以及一个pokemon_sharegpt.json的文件,json内容如下

{"conversations": [{"from": "human","value": "Provide caption for the image in one sentence. Be detailed but precise.<image>"},{"from": "gpt","value": "A cheerful Bulbasaur ready for its next Pokémon adventure."}],"system": "You are a helpful assistant.","images": ["images/pokemon_0000.png"]
}

对应图片如下:
在这里插入图片描述


6. 数据集配置与注册

6.1 什么是 dataset_info.json

dataset_info.json 是 LLaMA-Factory 用于管理和加载数据集的核心配置文件。所有自定义数据集都必须在这个文件中注册后才能使用。该文件应放置在 dataset_dir 目录下(后续可以放置在 pokemon_sharegpt文件夹下)。

配置文件的基本结构

{"数据集名称1": {// 数据集配置},"数据集名称2": {// 数据集配置}
}

6.2 配置参数详解

基础参数

参数名类型必填说明示例
file_namestring是*本地数据集文件路径"data/train.json"
hf_hub_urlstringHugging Face Hub 仓库名称"tatsu-lab/alpaca"
ms_hub_urlstringModelScope Hub 仓库名称"modelscope/alpaca"
formattingstring数据格式,默认为 alpaca"alpaca""sharegpt"
rankingboolean是否为偏好数据集truefalse
subsetstring数据集子集名称"train"
splitstring数据集分割,默认为 train"train", "test", "validation"
num_samplesinteger限制使用的样本数量10000

注:如果指定了 hf_hub_urlms_hub_url,则可以不填 file_name

columns参数(字段映射)

columns 用于将数据集中的字段名映射到 LLaMA-Factory 标准字段名:

标准字段说明Alpaca 默认值ShareGPT 默认值
prompt用户指令"instruction"-
query用户输入(补充)"input"-
response模型回复"output"-
messages对话消息列表-"conversations"
system系统提示词"system""system"
history历史对话"history"-
images图片路径列表"images""images"
videos视频路径列表"videos""videos"
audios音频路径列表"audios""audios"
tools工具描述"tools""tools"
chosen偏好数据集中的优选回复"chosen""chosen"
rejected偏好数据集中的劣选回复"rejected""rejected"
kto_tagKTO 训练的标签"kto_tag""kto_tag"

tags参数(ShareGPT 格式专用)

tags 用于定义 ShareGPT 格式中的标签名称:

参数说明默认值
role_tag角色标识字段名"from"
content_tag内容字段名"value"
user_tag用户角色标识"human"
assistant_tag助手角色标识"gpt"
observation_tag工具返回结果标识"observation"
function_tag函数调用标识"function_call"
system_tag系统消息标识"system"

6.3 配置示例详解

示例 1:基础文本数据集

{"my_text_dataset": {"file_name": "data/my_dataset.json","formatting": "sharegpt","columns": {"messages": "conversations","system": "system_prompt"}}
}

示例 2:多模态图像数据集

{"pokemon_multimodal": {"file_name": "pokemon_sharegpt/pokemon_sharegpt.json","formatting": "sharegpt","columns": {"messages": "conversations","system": "system","images": "image_paths"}}
}

示例 3:完整的高级配置

{"advanced_dataset": {"hf_hub_url": "BUAADreamer/pokemon-gpt4-1k","ms_hub_url": "modelscope/pokemon-gpt4","file_name": "data/pokemon.json","formatting": "sharegpt","ranking": false,"subset": "default","split": "train","num_samples": 5000,"columns": {"messages": "chats","system": "sys_prompt","images": "img_list","tools": "functions"},"tags": {"role_tag": "role","content_tag": "content","user_tag": "user","assistant_tag": "assistant"}}
}

示例 4:偏好数据集(用于 DPO/RLHF)

{"preference_dataset": {"file_name": "data/preferences.json","formatting": "alpaca","ranking": true,"columns": {"prompt": "question","query": "context","chosen": "better_answer","rejected": "worse_answer"}}
}

7. 最佳实践与注意事项

7.1 数据质量检查

def validate_dataset(json_path):"""验证数据集格式是否正确"""with open(json_path, 'r', encoding='utf-8') as f:data = json.load(f)issues = []for idx, item in enumerate(data):if 'conversations' not in item:issues.append(f"第 {idx} 条缺少 conversations 字段")if len(item['conversations']) % 2 != 0:issues.append(f"第 {idx} 条对话轮次为奇数")if 'images' in item:for img_path in item['images']:if not os.path.exists(img_path):issues.append(f"第 {idx} 条的图片不存在: {img_path}")return issues

7.2 多模态数据准备要点

  • 数据结构:多模态需包含图片/音频/视频路径字段
  • 标记符号:使用 <image><video><audio> 插入媒体位置
  • 统一格式:将图片转换为 PNG,使用统一命名
  • 路径管理:使用相对路径,确保可移植性
  • 数据增强:适当增强图像质量

7.3 性能优化

def process_large_dataset(dataset, batch_size=100):total = len(dataset)for i in range(0, total, batch_size):batch = dataset[i:i+batch_size]process_batch(batch)if i % 1000 == 0:save_checkpoint(i)

7.4 常见问题与解决方案

问题解决方案
图片加载失败检查路径正确性,确保图片格式支持
内存溢出使用流式处理,避免一次性加载所有数据
格式不匹配使用验证脚本检查结构
编码错误统一使用 UTF-8 编码

8. 总结

准备高质量的训练数据是大模型成功的关键。本文介绍了:

  • LLaMA-Factory 支持的数据格式:Alpaca 和 ShareGPT
  • 文本与多模态数据的准备方式
  • Pokemon 多模态数据集的完整处理流程
  • 如何配置和注册自定义数据集

尽可能保证:

  • 数据格式正确
  • 内容质量高
  • 标注准确
  • 适合你的训练目标

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/86196.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/86196.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/86196.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JuiceFS 集群部署详细指南:使用 SeaweedFS 作为数据存储,ETCD 作为元数据存储

1. 概述 本指南将详细介绍如何部署一个 JuiceFS 集群,其中数据存储层采用高性能的分布式对象存储 SeaweedFS,元数据存储层采用强一致性的分布式键值存储 ETCD。这种组合方案旨在为用户提供一个高性能、高可用、易于扩展且数据强一致的分布式文件系统解决方案,特别适用于云原…

【数字后端】- 什么是NDR规则?

NDR是指与工艺库的默认规则&#xff08;DR&#xff09;不同的特殊物理规则&#xff1a; 常见的有&#xff1a; 间距规则&#xff08;spacing&#xff09;&#xff1a;增加信号线与邻近线之间的距离&#xff0c;降低Crosstalk串扰。线宽规则&#xff08;width&#xff09;&…

B2B 商城定制的优势:解锁企业数字化转型新动力

精准适配业务流程&#xff0c;贴合企业运营特色​ 每一家企业都有独特的业务流程、运营模式与管理需求。标准化的 B2B 商城往往难以完全满足企业个性化的业务需求&#xff0c;而定制化商城则能够深入剖析企业业务细节&#xff0c;从采购、销售、库存管理到财务管理等全流程&am…

osg实例绘制

#include <osg/Geometry> #include <osg/Geode> #include <osg/Program> #include <osg/VertexAttribDivisor> #include <osgViewer/Viewer> #include <osgViewer/ViewerEventHandlers> #include <random> // 创建单个立方体几何体&…

Qt面试题汇总

目录 1. 简单说一下Qt 2. 用过QT中的哪些模块&#xff1f; 3. 说一些你常用的Qt控件&#xff1f; 4. Qt中如何创建一个窗口&#xff1f; 5. 说一下QT中创建控件的方式? 6. 说一下Qt中信号和槽机制是什么&#xff1f; 7. 说一下QT信号与槽机制原理&#xff1f; 8. 如何自…

【stm32】标准库学习——USART串口

目录 一、USART串口 1.串口参数及时序 2.USART简介 3.配置USART基本结构 4.初始化模板 (1) 接收一个数据 (2) 发送一个数据 一、USART串口 1.串口参数及时序 波特率:串口通信的速率起始位:标志一个数据帧的开始&#xff0c;固定为低电平数据位:数据帧的有效载荷&#…

黑马Day01-03集开始

03集 JSX jsx里面可以写 表达式,表达式里面会返回一个值js语法的扩展,需要babel解析才能够在浏览器运行 语法 使用花括号 {} ,在里面进行编写jsx代码04集 高频场景 使用引号传递字符串 使用js变量 函数调用和方法调用 使用js对象.js自带的一些对象或new出来的对象{&quo…

vue 路由学习

params 不能传递对象类型如 [ ]和{ } query传参 总结&#xff1a; query传参既可以通过name 和path 找到路由规则里的组件&#xff0c;所以为了统一避免非必要麻烦 无论是使用query传参还是 params传参 映射路由建议统一使用 name 进阶 props的使用 备注&#xff1a;资料来自…

JDK安装全攻略:开启Java编程大门

目录 一、安装前准备1.1 确认系统类型1.2 检查系统要求1.3 下载 JDK 安装包 二、Windows 系统下 JDK 安装步骤2.1 双击安装包2.2 选择安装目录2.3 完成安装 三、Windows 系统环境变量配置3.1 打开环境变量设置3.2 配置 JAVA_HOME 变量3.3 配置 Path 变量3.4 验证配置 四、Linux…

《P1253 扶苏的问题》

题目描述 给定一个长度为 n 的序列 a&#xff0c;要求支持如下三个操作&#xff1a; 给定区间 [l,r]&#xff0c;将区间内每个数都修改为 x。给定区间 [l,r]&#xff0c;将区间内每个数都加上 x。给定区间 [l,r]&#xff0c;求区间内的最大值。 输入格式 第一行是两个整数&…

09.【C语言学习笔记】指针(一)

目录 1. 内存和地址 1.1 内存 1.2 究竟该如何理解编址 2. 指针变量和地址 2.1 取地址操作符&#xff08;&&#xff09; 2.2 指针变量和解引用操作符&#xff08;*&#xff09; 2.2.1 指针变量 2.2.2 如何拆解指针类型 2.2.3 解引用操作符 * 2.3 指针变量的大小…

Java中static关键字的作用与使用详解

static是Java中一个非常重要的关键字&#xff0c;它可以用来修饰变量、方法、代码块和嵌套类。下面将从多个方面详细解释static的作用和使用方法。 一、static变量&#xff08;类变量&#xff09; 作用 static变量属于类&#xff0c;而不是类的某个实例。所有实例共享同一个s…

HMLDM-UD100A 型工业激光测距仪通过modbusRTU 转 profinet 网关轻松接入到西门子1200plc

HMLDM-UD100A 型工业激光测距仪通过modbusRTU 转 profinet 网关轻松接入到西门子1200plc 在现代工业生产与自动化控制领域&#xff0c;精准的测量设备与高效的通信技术至关重要。HMLDM-UD100A 型工业激光测距仪凭借其高精度、稳定性强等优势&#xff0c;广泛应用于各类工业场景…

数据结构与算法:图论——深度优先搜索dfs

深度优先搜索dfs 提到深度优先搜索&#xff08;dfs&#xff09;&#xff0c;就不得不说和广度优先搜索&#xff08;bfs&#xff09;有什么区别 根据搜索方式的不同&#xff0c;可以将图的遍历分为「深度优先搜索」和「广度优先搜索」。 深度优先搜索&#xff1a;从某一顶点出…

数组题解——​合并区间【LeetCode】

56. 合并区间 排序&#xff1a; 将所有区间按起始位置 start 从小到大排序。这样&#xff0c;重叠的区间会相邻排列&#xff0c;方便后续合并。 合并&#xff1a; 初始化一个空列表 merged&#xff0c;用于存储合并后的区间。遍历排序后的区间列表&#xff1a; 如果 merged 为…

关于高精度和链表的详细讲解(从属于GESP五级)

本章内容 高精度 链表 位数再多&#xff0c;只管稳稳进位&#xff0c;终会把答案写满。 一、高精度 1. 什么是高精度 • 定义 “高精度整数”指不受 C 原生整型 (int / long long) 位宽限制&#xff0c;而用数组模拟任意位数的大整数。 • 必要性 64 位 long long 仅能…

Python自动化框架选型指南:Selenium/Airflow/Celery该选谁?

在Python自动化领域,Selenium、Airflow和Celery是三个高频出现的工具,但它们的定位和适用场景截然不同。许多开发者在技术选型时容易混淆它们的边界,导致项目架构臃肿或功能不匹配。本文将通过对比分析,帮你明确不同场景下的最佳选择。 一、框架定位与核心功能对比 框架核…

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | DrinkWater(喝水记录组件)

&#x1f4c5; 我们继续 50 个小项目挑战&#xff01;—— DrinkWater组件 仓库地址&#xff1a;https://github.com/SunACong/50-vue-projects 项目预览地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 Composition API 和 <script setup> 语法结…

UAVAI-YOLO:无人机航拍图像的小目标检测模型

摘要 针对无人机航拍图像目标检测效果差的问题&#xff0c;提出改进的UAVAI-YOLO模型。首先&#xff0c;为使模型获得更加丰富的语义信息&#xff0c;使用改进可变形卷积网络&#xff08;deformable convolutional networks&#xff0c;DCN&#xff09;替换原骨干&#xff08…

Solidity 入门教程(一):Hello Web3,从一个字符串开始!

学习 Solidity 最好的方式&#xff0c;就是写出你的第一个合约&#xff01;在本篇文章中&#xff0c;我们将用极简的代码&#xff0c;通过 Remix 平台快速实现并运行一个 “Hello Web3!” 合约&#xff0c;正式迈入智能合约开发的大门。 一、什么是 Solidity&#xff1f; Sol…