【LLaMA-Factory 实战系列】一、数据准备篇 - 从文本到多模态的完整流程_llamfactory 数据
【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 格式
- 结构简单,适合单轮对话
- 支持
instruction
、input
、output
字段 - 适用于指令微调任务
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\": \"描述这张图片\" }, { \"from\": \"gpt\", \"value\": \"这是一只可爱的小猫,正在阳光下睡觉。\" } ], \"images\": [ \"path/to/cat_image.jpg\" ] }]
关键要点
标记的数量必须与
images
列表中的图片数量一致- 图片路径可以是相对路径或绝对路径
- 支持常见格式:jpg、png、webp 等
4.2 视频数据准备
[ { \"conversations\": [ { \"from\": \"human\", \"value\": \" }, { \"from\": \"gpt\", \"value\": \"视频展示了一个人在公园里慢跑的场景。\" } ], \"videos\": [ \"path/to/running_video.mp4\" ] }]
4.3 音频数据准备
[ { \"conversations\": [ { \"from\": \"human\", \"value\": \" }, { \"from\": \"gpt\", \"value\": \"音频内容是:今天天气真好,适合出去散步。\" } ], \"audios\": [ \"path/to/audio_file.wav\" ] }]
5. 多模态实战案例:Pokemon 数据集处理
5.1 完整代码(包含下载与转换)
import osimport jsonfrom datasets import load_datasetfrom PIL import Imagefrom 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 += \"\" elif role == \"assistant\": from_role = \"gpt\" else: continue entry[\"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.\" }, { \"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 配置参数详解
基础参数
\"data/train.json\"
\"tatsu-lab/alpaca\"
\"modelscope/alpaca\"
\"alpaca\"
或 \"sharegpt\"
true
或 false
\"train\"
\"train\"
, \"test\"
, \"validation\"
10000
注:如果指定了
hf_hub_url
或ms_hub_url
,则可以不填file_name
columns参数(字段映射)
columns
用于将数据集中的字段名映射到 LLaMA-Factory 标准字段名:
\"instruction\"
\"input\"
\"output\"
\"conversations\"
\"system\"
\"system\"
\"history\"
\"images\"
\"images\"
\"videos\"
\"videos\"
\"audios\"
\"audios\"
\"tools\"
\"tools\"
\"chosen\"
\"chosen\"
\"rejected\"
\"rejected\"
\"kto_tag\"
\"kto_tag\"
tags参数(ShareGPT 格式专用)
tags
用于定义 ShareGPT 格式中的标签名称:
\"from\"
\"value\"
\"human\"
\"gpt\"
\"observation\"
\"function_call\"
\"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 多模态数据准备要点
- 数据结构:多模态需包含图片/音频/视频路径字段
- 标记符号:使用
、
、
插入媒体位置
- 统一格式:将图片转换为 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 常见问题与解决方案
8. 总结
准备高质量的训练数据是大模型成功的关键。本文介绍了:
- LLaMA-Factory 支持的数据格式:Alpaca 和 ShareGPT
- 文本与多模态数据的准备方式
- Pokemon 多模态数据集的完整处理流程
- 如何配置和注册自定义数据集
尽可能保证:
- 数据格式正确
- 内容质量高
- 标注准确
- 适合你的训练目标