Axolotl 微调教程 2026
训练脚本越写越长,最后变成五百行样板代码,还不可复现。Axolotl 的思路是把所有训练决策收进一个 YAML:数据、量化、LoRA 秩、打包、并行策略,全是配置项。这篇给一份能跑的最小配置和运行命令。
📜 目录
Axolotl 微调教程 2026:配置文件驱动的 LLM 训练实战
训练脚本写着写着就变成五百行样板代码:数据加载、模板拼接、量化、梯度累积、checkpoint、日志,每换一个模型重抄一遍,还不敢保证上次跑的和这次一样。
Axolotl 的解法是把所有训练决策收进一个 YAML。想要 LoRA?配置里写。想要 4-bit?两行。序列打包、梯度检查点、对话模板、DeepSpeed 策略,全是配置项。好处不只是短:整套训练可以进 Git,能 diff、能回滚、能在代码评审里被同事看懂。
一、这套东西适合谁
- 团队协作:训练配置要评审、要复现
- 复杂场景:多卡、FSDP、DeepSpeed ZeRO、flash attention
- 需要扫参:改 YAML 里的
lora_r和学习率跑一组实验
如果你只是单卡训一次 LoRA、要最快出结果,Unsloth 更省事。Axolotl 赢在可控和可复现。
二、一份真能跑的 QLoRA 配置
存成 config.yml:
base_model: Qwen/Qwen2.5-7B-Instruct
load_in_4bit: true
adapter: lora
lora_r: 16
lora_alpha: 32
lora_dropout: 0.05
lora_target_linear: true
datasets:
- path: data/train.jsonl
type: alpaca
val_set_size: 0.05
dataset_prepared_path: last_run_prepared
sequence_len: 2048
sample_packing: true
pad_to_sequence_len: true
micro_batch_size: 2
gradient_accumulation_steps: 4
num_epochs: 1
optimizer: adamw_torch
lr_scheduler: cosine
learning_rate: 2e-4
warmup_ratio: 0.05
gradient_checkpointing: true
flash_attention: true
output_dir: ./out
逐项说清关键几个:
| 配置项 | 作用 | 常用值 |
|---|---|---|
load_in_4bit |
基座模型 4-bit 加载(QLoRA) | true;显存充足可关掉做 16bit LoRA |
lora_r / lora_alpha |
适配器容量与缩放 | 16/32;难题升到 32/64 |
lora_target_linear |
给所有线性层挂适配器 | true,比只挂 q/v 效果好得多 |
sequence_len |
训练序列长度 | 2048 起,显存吃紧降到 1024 |
sample_packing |
把多条短样本压进一条序列 | true,吞吐提升明显 |
micro_batch_size × gradient_accumulation_steps |
等效 batch | 乘起来 8-16 |
learning_rate |
学习率 | LoRA 用 2e-4,全参用 2e-5 |
gradient_checkpointing |
用时间换显存 | true,长序列必开 |
flash_attention |
注意力加速与省显存 | 硬件支持就开 |
sample_packing 是最容易被忽略的性能项。指令数据大多只有一两百 token,不打包的话一条序列 2048 的位置大半是 padding,GPU 在算空。打包把多条样本拼进一条,吞吐能明显上去。副作用是每个 step 的样本数不再固定,loss 曲线的解读方式要跟着变。
三、安装和运行
git clone https://github.com/axolotl-ai-cloud/axolotl
cd axolotl
pip install -e .
pip install -U flash-attn --no-build-isolation
# 先预处理数据,把 tokenize 结果缓存下来
axolotl preprocess config.yml
# 开始训练
accelerate launch -m axolotl.cli.train config.yml
单卡直接 accelerate launch 就行;多卡在同一命令前加 accelerate config 走一遍配置,或在 YAML 里指定 deepspeed: deepspeed_configs/zero3.json。
训练完合并适配器:
axolotl merge-lora config.yml
# 旧版本命令:python -m axolotl.cli.merge_lora config.yml
合并出来的是完整权重,之后转 GGUF 给 Ollama,或转 AWQ 给 vLLM。
四、数据格式:type 决定解析方式
datasets 里的 type 不是随便填的,它决定字段怎么被读:
| type | 需要的字段 | 用在哪 |
|---|---|---|
alpaca |
instruction / input / output |
最常见的指令数据 |
sharegpt |
conversations(含 from/value) |
多轮对话 |
chat_template |
messages(role/content) |
直接用模型自带模板,推荐 |
completion |
text |
纯文本继续预训练 |
多轮对话优先用 chat_template,框架会调模型自己的模板拼序列,省掉手写特殊标记的错。配 train_on_inputs: false 只对回答部分算 loss,避免模型学着复述问题。
数据质量的门槛比格式更硬:500-5000 条自洽的样本,胜过几万条风格不一致的。先标 100 条、跑一个 epoch、看输出,再决定要不要标全集——这个顺序能省掉大量返工。
五、判断训练是否有效
不要只看 loss。按这个顺序验:
- 训练前留出 50-100 条不参与训练的样本,同一批提示词在基座和微调后模型上各跑一遍,人工比对。
- 看 loss 是否在合理区间下降。跌到 0.1 以下通常意味着背答案。
- 抽 20 条训练集内的样本重跑,看是否变成逐字复读。
- 混几条完全无关的问题,看通用能力有没有明显退化。
这四步做下来,能区分"真的学会了"和"记住了训练集"。
六、什么时候选 Axolotl,什么时候不选
| 场景 | 建议 |
|---|---|
| 团队协作、配置要进 Git | Axolotl |
| 多卡/多机、FSDP、DeepSpeed | Axolotl |
| 单卡快速试一次 LoRA | Unsloth 更快 |
| 要写自定义训练循环 | 直接用 TRL/PyTorch |
常见问题
Q:配置项总报未知字段怎么办?
A:Axolotl 的配置结构在小版本间改过(比如 adapter 相关字段的命名)。报错时对照仓库里 examples/ 下同任务的最新 YAML,比翻旧博客快。
Q:显存不够怎么调?
A:顺序是:降 sequence_len → 降 micro_batch_size 并提高 gradient_accumulation_steps → 确认 load_in_4bit: true → 关 flash_attention(反而可能更省)。不要一上来降 lora_r,那是牺牲效果。
Q:训练中断了能续吗?
A:可以,accelerate launch -m axolotl.cli.train config.yml --resume_from_checkpoint ./out/checkpoint-500。中断续训依赖 checkpoint 目录完整,别手动删里面的文件。
Q:怎么知道用了多少 token、多少步? A:启动日志会打印样本数、打包后的步数和有效 batch,先看这三项对不对,再看 loss。
Q:能微调多模态模型吗? A:支持部分视觉语言模型,配置项和纯文本不同,以官方 examples 里的多模态配置为准。
注:Axolotl 配置字段随版本演进,本文示例对应 2026 年的常见结构,实际运行请以仓库 examples 与官方文档为准;显存与吞吐数字随硬件、序列长度变化。
相关文章
本站文章由编辑人工撰写,收录的工具均经过实测或公开资料核验。文中链接指向工具官网或 GitHub 仓库,仅作信息参考,不构成付费推广。