跳转到内容

Axolotl — YAML 驱动 LLM 微调

是什么

Axolotl 是一个把大模型微调全流程压进一份 YAML 文件的开源工具。日常类比:好比一份”做菜配方卡”——锅多大、火多猛、放什么料、炖多久,全写在一张卡上,照着抄就能复刻。

你想把 Llama 3 微调成你公司客服的语气,要做的不是写训练循环,而是写一份这样的 YAML:

base_model: meta-llama/Llama-3-8B
adapter: qlora
datasets:
- path: my-customer-data.jsonl
type: chat_template
sequence_len: 2048
micro_batch_size: 2
num_epochs: 3

然后 axolotl train config.yml,剩下的它都给你包了——加载模型、做 4-bit 量化、套 LoRA、跑训练、存权重。

GitHub 12k+ star,是 2023 年 LLaMA 开源以来社区微调脚手架的首选之一

为什么重要

不理解 axolotl,下面这些事都没法做:

  • 想用自己的数据微调一个开源模型,但不想从头写 PyTorch 训练循环
  • 想试 SFT / DPO / ORPO 哪种偏好优化方法效果好——换方法不想改代码
  • 单卡 24G 显存想跑 70B 模型——需要 QLoRA,但底层细节复杂
  • 团队里多人复现同一次训练——配方对得上才能不吵架

axolotl 的价值是把上百个超参和管线步骤压成一份可版本控制的 YAML,让微调从”写训练脚本”变成”写配方”。

核心要点

axolotl 解决三件事:

  1. 统一 YAML 接口:SFT / LoRA / QLoRA / DPO / ORPO / KTO / SimPO / GRPO 全部用同一个配置语法。换方法只改一两行(adapter: loraadapter: qlorarl: dpo 切到偏好优化)。

  2. 预处理与训练解耦axolotl preprocess 先把数据 tokenize、打包好存盘,axolotl train 直接读缓存。GPU 不会卡在数据处理上。

  3. 优化齐套:Flash Attention、序列并行、sample packing、多卡多机、DeepSpeed/FSDP——这些以前要自己拼的东西,YAML 里一行开关。

底下其实是站在 trl / accelerate / deepspeed 之上做封装,但用户层只看到 YAML。

实践案例

案例 1:最小 SFT 配置

base_model: mistralai/Mistral-7B-v0.1
adapter: lora
lora_r: 16
lora_alpha: 32
lora_target_modules: [q_proj, k_proj, v_proj, o_proj]
datasets:
- path: tatsu-lab/alpaca
type: alpaca
sequence_len: 2048
micro_batch_size: 4
gradient_accumulation_steps: 4
num_epochs: 3
learning_rate: 2e-4

读法:用 LoRA 在 Mistral-7B 上跑 Alpaca 风格的指令微调。LoRA 秩 16、注入到注意力的四个投影矩阵,3 个 epoch。

案例 2:从 SFT 切到 DPO

只需把 adapter 留住、加上 rl 字段、换成 chosen/rejected 数据:

base_model: ./out-sft
adapter: lora
rl: dpo
datasets:
- path: my-preference-data.jsonl
type: chatml.intel
beta: 0.1

关键差异:DPO 数据集每条要有 chosenrejected 两个回答;SFT 只要一个回答。axolotl 的好处是配方框架不变,只换数据集类型 + rl 开关。

案例 3:单卡跑 70B(QLoRA)

base_model: meta-llama/Llama-3-70B
adapter: qlora
load_in_4bit: true
lora_r: 32
sequence_len: 4096
micro_batch_size: 1
gradient_accumulation_steps: 16
flash_attention: true

load_in_4bit + qlora 就是经典 QLoRA 配方——4-bit 量化基模冻住,只训 LoRA 那一小撮参数。一张 A100 80G 能跑 70B。

踩过的坑

  1. YAML 字段上百个,初学直接被淹:先抄 examples/ 里现成配方再改一两个参数,不要从零写。

  2. preprocess 必须先跑axolotl train 第一次会自己 tokenize,但塞在训练里会让 GPU 等数据。生产里总是先 axolotl preprocess config.yml

  3. chat_templatedataset.type 必须匹配:你用 chatml 模板但数据集声明 alpaca,模型学到的格式会错乱。一律对齐到目标模板。

  4. QLoRA 训完别忘 mergeadapter: qlora 训出的是 LoRA 增量。推理时如果不 merge 进基模,会被 4-bit 量化拖慢。axolotl merge-lora 一键合并。

  5. DPO/ORPO 数据格式坑:必须是 {prompt, chosen, rejected},不是 SFT 的 {instruction, output}。换方法要先转数据。

适用 vs 不适用场景

适用

  • 个人 / 小团队微调开源模型(Llama / Mistral / Qwen / Gemma)
  • 想横向对比 SFT vs DPO vs ORPO 哪种偏好优化最适合自己的数据
  • 单卡 / 多卡 / 多机分布式训练都覆盖
  • 需要可复现配方分享给别人

不适用

  • 完全自定义训练循环(损失函数要魔改、要插自定义钩子)→ 直接用 trlpytorch
  • 极致单卡性能(追求 2-3 倍加速、显存极限压缩)→ 用 unsloth
  • 想用 PyTorch 官方”血统纯正”路径,方法不要太多 → 用 torchtune
  • 端到端 RLHF(包含 PPO 全链路 + 奖励模型部署)→ 用专门工具

学到什么

  1. YAML > 代码:训练这种”参数空间巨大、组合稀疏”的任务,把超参从代码挪进配置文件能极大降低试错成本
  2. 预处理与训练解耦:tokenize、打包、过滤这些 CPU 活该提前做完,让 GPU 专心训
  3. 统一抽象的力量:SFT 与 DPO 在论文里是两件事,但工程上只是”loss 不同 + 数据不同”,axolotl 抹掉这层差异
  4. 生态位:上层封装的价值在”组合现有能力”,不在”重新发明轮子”——axolotl 没自造算法,但把 trl / accelerate / deepspeed 串成了一条用户友好的路

延伸阅读

关联

  • trl —— Hugging Face 的训练循环原语,axolotl 在它上面包 YAML
  • accelerate —— 多卡 / 多机分布式抽象,axolotl 走它的 launcher
  • unsloth —— 单卡省显存方向的对手,速度更快但方法少
  • torchtune —— PyTorch 官方微调库,血统纯但生态没 axolotl 杂
  • deepspeed —— ZeRO 系列优化器,axolotl 里一行开关
  • pytorch —— 一切的底座

反向链接

  • pytorch —— PyTorch — 深度学习主流框架
  • torchtune —— torchtune — PyTorch 官方 LLM 微调库