Chapter 06

数据集与内置格式

📌 commit 964f70ealpaca / OASST1 / OpenAI messages 全谱

XTuner 内置 20+ 数据 map_fn,覆盖常见 SFT / DPO / VL 数据集。本章讲清楚每种的输入输出。

6.1map_fn 全清单

map_fn预期数据列典型数据集
alpaca_map_fninstruction / input / outputtatsu-lab/alpaca
alpaca_zh_map_fn同上silk-road/alpaca-data-gpt4-chinese
oasst1_map_fnOASST1 树形OpenAssistant/oasst1
code_alpaca_map_fncode-alpacaHuggingFaceH4/CodeAlpaca_20K
openai_map_fnmessages = [{role, content}]★ 通用 chat
open_orca_map_fnsystem_prompt / question / responseOpen-Orca/OpenOrca
tiny_codes_map_fnnampdn-ai/tiny-codes
medical_map_fnshibing624/medical
arxiv_map_fntitle / abstractarxiv 数据
llava_map_fnVL 数据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_chatInternLM v1
internlm2_chatInternLM2
llama2_chatLlama-2
llama3_chatLlama-3
qwen_chatQwen v1
chatmlQwen v2+, ChatGPT 风
mistralMistral
baichuan2_chatBaichuan2
gemmaGemma
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这章你需要带走的