Migrate from Axolotl to Soup CLI
Axolotl is a popular fine-tuning framework. Soup CLI can import Axolotl configs directly with soup migrate.
One-line migration
soup migrate --from axolotl path/to/axolotl_config.ymlField mapping
| Axolotl | Soup CLI |
|---|---|
base_model | base (a root-level string, not base.model) |
datasets[0].path | data.train |
datasets[0].type | data.format |
sequence_len | data.max_length (sequence length lives under data, not training) |
micro_batch_size | training.batch_size |
gradient_accumulation_steps | training.gradient_accumulation_steps |
num_epochs | training.epochs |
adapter: lora / qlora | training.lora.r (+ training.quantization: 4bit for qlora) |
no adapter | training.lora.r: 0 and training.quantization: none, a full fine-tune, with a warning. Only sft and embedding runs can do this: any other task exits 1 |
lora_r / lora_alpha | training.lora.r / training.lora.alpha |
load_in_4bit: true | training.quantization: 4bit (the key is quantization, not quant) |
load_in_8bit: true | training.quantization: 8bit |
neither load_in_4bit nor load_in_8bit, and adapter: lora | training.quantization: none, written explicitly |
rl: | task: dpo, ipo, kto, orpo and simpo give the task of the same name, grpo and gdpo give grpo. Any other value exits 1 |
flash_attention: true | training.use_flash_attn: true for sft and tts only. For any other task the importer drops it with a warning, because Soup refuses use_flash_attn there |
Example conversion
Axolotl:
base_model: mistralai/Mistral-7B-v0.3
load_in_4bit: true
adapter: qlora
datasets:
- path: tatsu-lab/alpaca
type: alpaca
sequence_len: 2048
micro_batch_size: 2
gradient_accumulation_steps: 8
num_epochs: 3
learning_rate: 0.0002
lora_r: 16
lora_alpha: 32
flash_attention: trueSoup CLI (equivalent config; soup migrate leaves backend at its default and writes use_flash_attn: true, so add backend: unsloth yourself):
base: mistralai/Mistral-7B-v0.3
task: sft
backend: unsloth # root-level, NOT under training
data:
train: tatsu-lab/alpaca
format: alpaca
max_length: 2048 # sequence length lives under data
training:
quantization: 4bit # the key is quantization, not quant
epochs: 3
lr: 2.0e-4 # the key is lr, not learning_rate
batch_size: 2
gradient_accumulation_steps: 8
use_flash_attn: true
lora:
r: 16 # LoRA turns on when r > 0; there is no enabled flag
alpha: 32If the source sets sample_packing, the importer warns and does not map it; set training.packing (or training.multipack) by hand. An adapter other than lora or qlora has no Soup equivalent: the importer warns and writes LoRA.
If you migrated before v0.76.0
Check the soup.yaml you generated, because the importer changed what it writes. Upstream's changelog lists what was wrong or has changed:
- An unquantized source wrote no
quantizationline, so Soup loaded it as 4-bit QLoRA, and a source with no adapter got LoRAr=64instead of a full fine-tune (#1215, #1302). An Axolotl config that setsload_in_4bitoradapter: qlorawas not affected. rl: orpo,ipoandsimpobecametask: sftwith no warning. They now map to their own tasks, and anrl:value with no Soup task exits 1 naming it (#1254).flash_attention: truewas mapped touse_flash_attnfor every task. Onlysftandttsread it, and since v0.76.0 the loader refuses it on any other task, so a non-SFTsoup.yamlfrom an older importer that carries it no longer loads; the importer now drops it with a warning there (#806, #983).
If your source was bf16 or a full fine-tune, or used one of those rl: values, the run you got may not have been the run you meant. Regenerate and diff. Details for all three importers are on Migration.
What you gain
- One CLI for train / chat / eval / serve / export instead of separate tools
- Native Unsloth backend (automatic 2–5× speedup on supported models)
- GGUF / Ollama / vLLM / SGLang export and serving built-in
- Loss watchdog, curriculum learning, sample packing, freeze training
Dry-run
soup migrate --from axolotl axolotl.yml --dry-runThe importer checks its result with Soup's own config loader before it writes anything, so the file it hands back loads. Run soup doctor --config soup.yaml on it before you train: it shows the loader's errors and warnings, and a clean report is not a guarantee that every key takes effect.
Related
Soup is free and Apache-2.0. If it saved you a training run, starring the repo costs nothing and helps most. You can also fund the GPU time behind the work a 4 GB laptop cannot reach.