1. LLaMA-Factory数据集配置文件解析
LLaMA-Factory作为当前热门的开源大语言模型训练框架,其数据集配置文件dataset_info.json是模型训练和微调过程中的核心枢纽。这个看似简单的JSON文件实际上承担着数据格式定义、预处理规则映射和训练任务适配等多重职责。在近期的多个开源大模型项目中,合理配置该文件已成为提升训练效率的关键因素。
重要提示:在LLaMA-Factory的最新版本(v2.3.0+)中,配置文件结构进行了重大调整,新增了对多模态数据的原生支持。使用旧版配置可能导致训练过程报错。
1.1 配置文件基础结构
典型的dataset_info.json采用层级嵌套结构,每个数据集定义包含以下必选字段:
json复制{
"dataset_name": {
"file_name": "data.json",
"formatting": "alpaca",
"ranking": false,
"columns": {
"prompt": "instruction",
"query": "input",
"response": "output"
}
}
}
- file_name:实际数据文件的路径(支持相对/绝对路径)
- formatting:数据格式类型(alpaca/sharegpt)
- ranking:是否为偏好排序数据集
- columns:字段映射关系
1.2 字段映射详解
columns对象是配置的核心,它建立了原始数据字段与训练框架预期字段的对应关系。以下是最常见的映射组合:
| 框架预期字段 | 数据源字段示例 | 作用说明 |
|---|---|---|
| prompt | instruction | 主要指令文本 |
| query | input | 补充输入内容 |
| response | output | 预期回答 |
| history | history | 对话历史 |
| images | images | 图片路径数组 |
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 不同训练任务的配置方案
2.1 指令监督微调(SFT)
这是最常见的微调场景,配置示例:
json复制"alpaca_zh": {
"file_name": "data/alpaca_zh.json",
"columns": {
"prompt": "instruction",
"query": "input",
"response": "output",
"system": "system_prompt",
"history": "chat_history"
}
}
关键注意事项:
prompt和response必须存在system字段非必需但建议添加- 多轮对话需确保
history格式为[[q1,a1],[q2,a2]]
2.2 预训练(PT)
预训练数据配置更为简单:
json复制"wiki_zh": {
"file_name": "pretrain/wiki.json",
"columns": {
"prompt": "text"
}
}
实测发现:当数据量超过1GB时,建议拆分为多个文件并采用
file_name: "part*.json"的通配符写法,可显著提升加载速度。
2.3 偏好训练(DPO/ORPO)
偏好训练需要区分优质和劣质回答:
json复制"dpo_data": {
"file_name": "preference/dpo.json",
"ranking": true,
"columns": {
"prompt": "question",
"chosen": "good_answer",
"rejected": "bad_answer"
}
}
3. 多模态数据配置技巧
3.1 图像数据集成
json复制"coco_caption": {
"file_name": "multimodal/coco.json",
"columns": {
"prompt": "caption",
"images": "image_path",
"response": "description"
}
}
路径处理建议:
- 使用绝对路径避免相对路径混乱
- 图片数量需与文本中
<image>标记严格一致 - 支持PNG/JPG/WebP格式
3.2 视频数据处理
json复制"video_qa": {
"file_name": "video/qa.json",
"columns": {
"prompt": "question",
"videos": "video_clip",
"response": "answer"
}
}
4. 高级配置与调试
4.1 混合数据集配置
通过"dataset_name": [file1, file2]语法实现:
json复制"mixed_data": [
{"file_name": "part1.json", "columns": {...}},
{"file_name": "part2.json", "columns": {...}}
]
4.2 常见报错排查
-
字段缺失错误:
- 现象:
KeyError: 'prompt' - 解决方案:检查
columns映射是否正确
- 现象:
-
格式不匹配:
- 现象:
ValueError: Invalid history format - 修正:确保history是严格的
[[q,a],[q,a]]结构
- 现象:
-
路径错误:
- 现象:
FileNotFoundError - 处理:使用
os.path.abspath()转换路径
- 现象:
5. 性能优化实践
-
内存优化:
- 对于超大规模数据集,添加
"streaming": true启用流式加载 - 设置
"cache_dir": "/tmp"指定缓存位置
- 对于超大规模数据集,添加
-
预处理加速:
json复制"preprocessing": { "max_length": 2048, "truncation": true, "num_proc": 8 } -
混合精度训练:
在配置中添加:json复制"training": { "fp16": true, "bf16": false }
在实际项目中,我曾遇到一个典型案例:当数据集包含50万条记录时,未启用流式加载会导致OOM错误。添加"streaming": true后内存占用从32GB降至3GB,同时配合num_proc参数将加载时间从2小时缩短到15分钟。
