Chapter 13

源码导读:XTuner + MMEngine

📌 commit 964f70e从 CLI 到 model wrapper

XTuner 核心 ~6 万行(不算 configs),主要在 model wrapper + dataset processor + hooks。本章给阅读路线。

13.1仓库结构

xtuner/                            https://github.com/InternLM/xtuner
├── xtuner/
│   ├── tools/                     ★ CLI 入口
│   │   ├── train.py
│   │   ├── chat.py
│   │   ├── test.py
│   │   ├── model_converters/
│   │   │   ├── pth_to_hf.py
│   │   │   ├── merge.py
│   │   │   └── ...
│   │   └── ...
│   ├── configs/                   ★ 100+ 内置 config
│   ├── model/                     ★ wrapper(SFT / DPO / VL)
│   │   ├── sft.py                  SupervisedFinetune
│   │   ├── dpo.py
│   │   ├── orpo.py
│   │   ├── reward.py
│   │   ├── llava.py                LLaVA
│   │   ├── internvl.py             InternVL
│   │   └── utils.py
│   ├── dataset/                   数据集
│   │   ├── huggingface.py          process_hf_dataset
│   │   ├── preference_dataset.py
│   │   ├── intern_repo.py
│   │   ├── llava.py / internvl/
│   │   ├── map_fns/                 20+ map_fn
│   │   └── samplers/
│   ├── engine/
│   │   ├── hooks/                   EvaluateChatHook 等
│   │   └── runner.py
│   ├── parallel/
│   │   └── sequence/                 Ulysses SP
│   ├── utils/
│   │   ├── templates.py             ★ 30+ chat template
│   │   └── stop_criteria.py
│   ├── apis/                       Python API(少用)
│   └── version.py
├── docs/
└── tests/

13.2建议阅读顺序

#文件读什么
1xtuner/tools/train.py训练 CLI 入口
2xtuner/configs/internlm/internlm2_chat_7b/internlm2_chat_7b_qlora_alpaca_e3.py典型 SFT config
3xtuner/model/sft.pySupervisedFinetune wrapper
4xtuner/dataset/huggingface.pyprocess_hf_dataset 入口
5xtuner/dataset/map_fns/dataset_map_fns/alpaca_map_fn.py典型 map_fn
6xtuner/utils/templates.pychat template
7xtuner/engine/hooks/evaluate_chat_hook.py实时评估 hook
8xtuner/model/dpo.pyDPO wrapper
9xtuner/model/internvl.pyVL model wrapper
10xtuner/tools/model_converters/pth_to_hf.py转换工具

13.3调度链

xtuner train cfg.py
   │
   ├── tools/train.py: parse args + load config
   ├── 用 MMEngine Runner 构造
   │       ├── 解析 model dict → SupervisedFinetune(llm=..., lora=...)
   │       ├── 解析 dataset dict → process_hf_dataset(...)
   │       │       └── 调 map_fn 转 conversation
   │       │       └── 调 template 拼 prompt
   │       │       └── tokenize + pack
   │       ├── 解析 optim / scheduler
   │       └── 注册 hooks
   └── Runner.train()
           └── 每 iter: forward / backward / step / hooks

13.4关键 commit 时间线

时间变更
2023-08v0.1:首版 SFT
2023-12多模型 + QLoRA
2024-03DPO / KTO / ORPO
2024-06Sequence Parallel(Ulysses 风格)
2024-08InternVL 全面支持
2024-11LLaVA-NeXT / MiniGPT-4 集成
2025-Q1Float8 训练支持

13.5对照其他

XTunerLLaMA-Factoryms-swift
配置Python (MMEngine)YAML / WebUICLI
独家InternLM / InternVL 最优WebUI 易用魔搭生态
多模态★★★★(VLM)★★★★★★★★
RLHF★★★(SFT/DPO/ORPO)★★★★★★★(含 GRPO)
部署集成★★★★(LMDeploy)★★★★★★(vLLM/PAI)

13.6社区入口

13.7这章你需要带走的

13.8 真实源码树(v0.2.0 + V1)

xtuner/
├── entry_point.py:12-253      ★ CLI 13 子命令 dispatcher
├── registry.py                 BUILDER / MAP_FUNC 注册表
├── version.py                  __version__ = "0.2.0"
│
├── configs/                   ★ 594 个 config,27 个模型家族
│   ├── llama/ internlm/ qwen/ deepseek/ gemma/ baichuan/ chatglm/ mixtral/ qwen_moe/
│   ├── llava/ internvl/        VLM
│   ├── dpo/ orpo/ reward_model/
│   └── deepspeed/              ZeRO-2/3 preset
│
├── model/                     ★ wrapper
│   ├── sft.py:36-105           SupervisedFinetune
│   ├── dpo.py:44-60            DPO(持 reference model)
│   ├── orpo.py / reward.py
│   ├── llava.py / internvl.py
│   ├── modules/                projectors / dispatch / 自定义层
│   ├── transformers_models/    Mixtral / DeepSeek 等定制版
│   └── utils.py
│
├── dataset/                   ★ 17 个 loader
│   ├── huggingface.py:23-40    process_hf_dataset
│   ├── json_dataset.py / preference_dataset.py / concat_dataset.py
│   ├── llava.py / internvl_dataset.py
│   ├── map_fns/                alpaca_map_fn / template_map_fn_factory
│   ├── collate_fns/             默认 + preference collate
│   └── utils.py                 Packer / encode_fn
│
├── engine/
│   ├── runner/loops.py:8-42     TrainLoop(IterBasedTrainLoop wrapper)
│   ├── hooks/                    DatasetInfoHook / EvaluateChatHook / VarlenAttnArgsToMessageHubHook
│   └── _strategy/deepspeed.py    DeepSpeed strategy
│
├── parallel/sequence/         ★ Ulysses SP(6 文件)
│   ├── setup_distributed.py / comm.py / attention.py
│   ├── sampler.py / reduce_loss.py
│   └── __init__.py:37-63
│
├── tools/ (32 个)
│   ├── train.py:162-309         主训练入口
│   ├── chat.py / test.py / list_cfg.py / copy_cfg.py / log_dataset.py
│   ├── model_converters/        pth_to_hf / merge / split
│   ├── data_preprocess/         arxiv / refcoco
│   └── mmbench.py / eval_refcoco.py
│
├── evaluation/                  benchmark
└── v1/                         ★ V1 引擎(2025-09 新)
    ├── engine/                   FSDP + DeepSpeed
    ├── model/                    V1 模型类
    ├── datasets/                 21 个 V1 loader
    ├── train/                    V1 训练 loop
    ├── loss/                     GRPO / DPO / SFT loss
    ├── rl/                       RL 子系统(参考 verl)
    ├── float8/                   ★ FP8 训练
    ├── ops/                      自定义 CUDA
    └── utils/

13.9 XTuner V1(2025-09):为 200B+ MoE 而生

特性说明
Dropless MoE 专家无 padding 训练,200B+ MoE 友好
长序列 原生 64k+ 不必开 SP
FP8 xtuner/v1/float8/
FSDP + DeepSpeed 两套都支持,可叠加 EP
RL suite GRPO / DPO + reward 模型
覆盖模型 InternS1、InternVL、Qwen3、DeepSeek V3、KIMI K2

13.10 与 LLaMA-Factory / ms-swift 比较

XTunerLLaMA-Factoryms-swift
核心引擎 MMEngine + V1 自家 transformers Trainer 自家 Trainer + Megatron
config 风格 Python dict + RegistryCLI / YAML CLI / argparse
config 数量 594 200+ 1000+
大 MoE 优势 ★ V1 Dropless 普通 ★ Megatron 后端
多模态 LLaVA / InternVL(首选)LLaVA ★ 全栈最强
生态 InternLM 全家桶 通用 魔搭 + 阿里云