Chapter 06
数据集与内置格式
XTuner 内置 20+ 数据 map_fn,覆盖常见 SFT / DPO / VL 数据集。本章讲清楚每种的输入输出。
6.1map_fn 全清单
| map_fn | 预期数据列 | 典型数据集 |
|---|---|---|
| alpaca_map_fn | instruction / input / output | tatsu-lab/alpaca |
| alpaca_zh_map_fn | 同上 | silk-road/alpaca-data-gpt4-chinese |
| oasst1_map_fn | OASST1 树形 | OpenAssistant/oasst1 |
| code_alpaca_map_fn | code-alpaca | HuggingFaceH4/CodeAlpaca_20K |
| openai_map_fn | messages = [{role, content}] | ★ 通用 chat |
| open_orca_map_fn | system_prompt / question / response | Open-Orca/OpenOrca |
| tiny_codes_map_fn | — | nampdn-ai/tiny-codes |
| medical_map_fn | — | shibing624/medical |
| arxiv_map_fn | title / abstract | arxiv 数据 |
| llava_map_fn | VL 数据 | llava 风格 |
| ... | — | 看 xtuner/dataset/map_fns/ |
6.2openai_map_fn:万能选择
当数据已经是标准 messages 格式,直接用 openai_map_fn:
{"messages": [
{"role": "system", "content": "..."},
{"role": "user", "content": "..."},
{"role": "assistant", "content": "..."}
]}
config 里:
train_dataset = dict(
type=process_hf_dataset,
dataset=dict(type=load_dataset, path="./mydata.jsonl"),
tokenizer=tokenizer,
max_length=max_length,
dataset_map_fn=openai_map_fn,
template_map_fn=dict(
type=template_map_fn_factory,
template=PROMPT_TEMPLATE.internlm2_chat,
),
remove_unused_columns=True,
shuffle_before_pack=True,
pack_to_max_length=True,
)
6.3chat template(PROMPT_TEMPLATE)
XTuner 内置 30+ chat template,对应每种模型族。看 xtuner/utils/templates.py:
| 模板名 | 对应模型 |
|---|---|
| internlm_chat | InternLM v1 |
| internlm2_chat | InternLM2 |
| llama2_chat | Llama-2 |
| llama3_chat | Llama-3 |
| qwen_chat | Qwen v1 |
| chatml | Qwen v2+, ChatGPT 风 |
| mistral | Mistral |
| baichuan2_chat | Baichuan2 |
| gemma | Gemma |
| deepseek_* | DeepSeek 各版本 |
| vicuna / wizardlm / alpaca | 各种 |
6.4packing(pack_to_max_length)
把多条短样本拼成 max_length 序列,省 padding。XTuner 配 use_varlen_attn=True 时用 flash-attn 的 cu_seqlens 实现"打包但 attention 不串"。
# model 里
use_varlen_attn = True
# dataset 里
pack_to_max_length = True
6.5多数据集混合
from xtuner.dataset.collate_fns import default_collate_fn
train_dataloader = dict(
batch_size=batch_size,
num_workers=4,
dataset=dict(
type=ConcatDataset, # ★ 拼接
datasets=[alpaca_en, oasst1, code_alpaca],
),
sampler=dict(type=DefaultSampler, shuffle=True),
collate_fn=dict(type=default_collate_fn),
)
6.6自定义 map_fn
写一个函数处理你的 schema:
# my_map_fn.py
def my_map_fn(example):
return {
"conversation": [
{"input": example["q"], "output": example["a"]},
]
}
# config 里
dataset_map_fn = my_map_fn
关键:返回的 dict 必须有 conversation 列,每个元素 {input, output} 或 {system, input, output}。XTuner 后面再用 template 拼。
6.7DPO 数据
DPO config 用不同的 process 函数:
train_dataset = dict(
type=build_preference_dataset,
dataset=dict(type=load_dataset, path="HuggingFaceH4/ultrafeedback_binarized"),
tokenizer=tokenizer,
max_length=max_length,
dataset_map_fn=preference_map_fn,
is_dpo=True,
is_reward=False,
)
6.8这章你需要带走的
- 20+ 内置 map_fn 覆盖主流 SFT 数据;通用场景选 openai_map_fn;
- chat template 在
xtuner/utils/templates.py,30+ 个; - packing 必须配
use_varlen_attn=True否则 attention 会串; - 自定义 map_fn 返回 dict 含
conversation列即可。