Для первого дообучения LLM проще всего взять TRL с PEFT: это стандартный стек Hugging Face, и весь запуск LoRA или QLoRA умещается в один скрипт. Unsloth удобен, когда нужно быстро стартовать на одной видеокарте или в ноутбуке, а Axolotl, когда вы хотите описывать обучение YAML-файлом и масштабировать на несколько GPU. Это не конкуренты в чистом виде: Unsloth строится поверх Transformers, PEFT и TRL, а PEFT и TRL лежат в основе большинства остальных. Ниже сравнение, версии на 25 октября 2026 года и минимальные рабочие примеры.
Кто за что отвечает
- PEFT: библиотека адаптеров (LoRA и другие методы). Замораживает базовую модель и добавляет небольшие обучаемые матрицы. Сама не обучает: ей нужен тренер.
- TRL: тренеры для SFT, DPO, GRPO и других постобучающих методов поверх Transformers. SFTTrainer принимает
peft_configиquantization_config, то есть собирает LoRA и QLoRA в одном месте. - bitsandbytes: 4-битная и 8-битная загрузка модели, на которой стоит QLoRA.
- Unsloth: фреймворк для дообучения и RL с собственными ядрами, плюс десктопное приложение и веб-интерфейс Studio.
- Axolotl: конфигурируемая обвязка, где датасет, адаптер, оптимизатор и распределённая схема задаются в YAML, а запуск идёт командой
axolotl train.
Чтобы понять, зачем всё это, вспомните идею LoRA: веса базовой модели замораживаются, а в слои добавляются обучаемые матрицы малого ранга, что по статье Hu и соавторов сокращает число обучаемых параметров и память по сравнению с полным дообучением. QLoRA идёт дальше: базовая модель хранится в 4-битном формате NF4, а градиенты проходят через неё в адаптеры, что позволило авторам дообучать модель на 65B на одной карте 48 ГБ.
Сравнение
| TRL + PEFT | Unsloth | Axolotl | |
|---|---|---|---|
| Версия на PyPI | trl 1.16.0 (15.10.2026), peft 0.21.2 (01.10.2026) | unsloth 2026.10.8 (23.10.2026) | axolotl 0.21.0 (16.10.2026) |
| Лицензия | Apache-2.0 | Apache-2.0 для ядра; интерфейс Studio под AGPL-3.0 | Apache-2.0 |
| Интерфейс | Python-код | Python-код, ноутбуки, Studio и десктоп-приложение | YAML и CLI |
| Python | 3.11 и новее | от 3.9 до 3.14 | 3.12 и новее |
| Оборудование | То, что поддерживает PyTorch и Transformers; для QLoRA нужен bitsandbytes | Windows, Linux, WSL, macOS; NVIDIA, AMD, Intel, CPU по заявлению проекта | NVIDIA Ampere и новее или AMD; на Windows рекомендуют WSL2 или Docker |
| Мульти-GPU | Через Accelerate, DeepSpeed, FSDP | Заявлена поддержка нескольких GPU | DeepSpeed, FSDP, мульти-нод в документации |
| Сложность запуска | Низкая для одной карты, больше ручной работы для больших схем | Низкая: готовые ноутбуки и приложение | Средняя: нужно строгое окружение (Python, PyTorch, CUDA), зато проще воспроизвести через конфиг |
| Сильная сторона | Прозрачность, методы DPO и GRPO, совместимость с экосистемой HF | Низкий порог входа: готовые ноутбуки, приложение и Studio | Конфиг как артефакт эксперимента, упаковка, экспорт в GGUF |
Данные из таблицы взяты со страниц trl, репозитория Unsloth и установки Axolotl. Документация TRL приводит заявление Unsloth об ускорении до 2 раз и экономии до 70 процентов VRAM; это цифры проекта для его собственных сценариев, поэтому на своей модели и данных их нужно мерить, а не ждать автоматически.
Какие модели можно обучать
Все три инструмента работают с архитектурами из Transformers, но поддержка новых семейств появляется с разной скоростью. На главной странице Unsloth в качестве поддерживаемых названы Qwen3.8, GLM-5.3-Flash, Kimi K3, Gemma 4, DeepSeek-V4; в новостях Axolotl за сентябрь 2026 отмечена поддержка Qwen3.6 и Qwen3.8-Flash-Next. Перед выбором откройте список поддержки инструмента и проверьте именно вашу модель и версию.
Помните про размер. Модель вроде Qwen3.8 27B влезает в QLoRA на одной карте с большим объёмом памяти, а MoE с сотнями миллиардов параметров требует несколько GPU и узкоспециализированных конфигов. Для первого эксперимента берите модель на 0,5-8B: цикл обучения в десятки минут, ошибки в датасете видны сразу. Как считать память, показано в статье про выбор размера LLM.
Минимальный путь: TRL + PEFT, QLoRA
Установка (Linux или WSL, Python 3.11+, видеокарта NVIDIA):
python -m venv .venv && source .venv/bin/activate
pip install torch
pip install -U trl peft bitsandbytes datasets
Скрипт train_qlora.py. Модель и датасет взяты из примеров документации TRL; замените их на свои.
import torch
from datasets import load_dataset
from peft import LoraConfig
from transformers import BitsAndBytesConfig
from trl import SFTConfig, SFTTrainer
MODEL = "Qwen/Qwen3-0.6B" # для проверки пайплайна; затем замените на свою базу
bnb = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_use_double_quant=True,
bnb_4bit_compute_dtype=torch.bfloat16,
)
lora = LoraConfig(
r=16,
lora_alpha=32,
lora_dropout=0.05,
target_modules="all-linear", # как в QLoRA: адаптеры на все линейные слои
task_type="CAUSAL_LM",
)
dataset = load_dataset("trl-lib/Capybara", split="train[:2000]")
args = SFTConfig(
output_dir="./out/qlora-demo",
per_device_train_batch_size=2,
gradient_accumulation_steps=8,
learning_rate=1e-4, # для адаптеров обычно выше, чем для полного обучения
num_train_epochs=1,
bf16=True,
gradient_checkpointing=True,
logging_steps=10,
save_strategy="epoch",
)
trainer = SFTTrainer(
model=MODEL,
args=args,
train_dataset=dataset,
peft_config=lora,
quantization_config=bnb,
)
trainer.train()
trainer.save_model("./out/qlora-demo/adapter")
Что здесь важно. Для LoRA без квантования уберите quantization_config и обучайте в bf16. Если данные в формате «промпт и ответ», по умолчанию потери считаются только на ответе (документация SFTTrainer), а для диалогов с ролями есть assistant_only_loss=True. Значение target_modules="all-linear" в документации PEFT соответствует подходу QLoRA, где адаптеры стоят на всех линейных слоях, а не только на query и value. Параметр max_length и другие поля SFTConfig могут отличаться между версиями, поэтому при ошибке сверяйтесь с документацией установленной версии.
Чтобы использовать адаптер, подгрузите его поверх базы или слейте с ней:
from peft import AutoPeftModelForCausalLM
model = AutoPeftModelForCausalLM.from_pretrained("./out/qlora-demo/adapter")
merged = model.merge_and_unload()
merged.save_pretrained("./out/merged")
Слитую модель можно конвертировать в GGUF и запустить в llama.cpp или Ollama; про форматы квантования читайте в материале про GGUF.
Тот же путь в Axolotl
Установка по документации проекта (нужны Python 3.12, PyTorch 2.13 и видеокарта NVIDIA Ampere или новее, либо AMD; версию CUDA подберите под свою карту):
curl -LsSf https://astral.sh/uv/install.sh | sh
export UV_TORCH_BACKEND=cu130 # или cu128, по вашей карте
uv venv --python 3.12 && source .venv/bin/activate
uv pip install torch==2.14.0 torchvision
uv pip install --no-build-isolation "axolotl[deepspeed]"
axolotl fetch examples
Конфиг qlora.yml, взятый из примера examples/llama-3/qlora-1b.yml репозитория Axolotl:
base_model: NousResearch/Llama-3.2-1B
load_in_8bit: false
load_in_4bit: true
adapter: qlora
datasets:
- path: teknium/GPT4-LLM-Cleaned
type: alpaca
dataset_prepared_path: last_run_prepared
val_set_size: 0.1
output_dir: ./outputs/qlora-out
sequence_len: 2048
sample_packing: true
eval_sample_packing: true
lora_r: 32
lora_alpha: 16
lora_dropout: 0.05
lora_target_modules:
- gate_proj
- down_proj
- up_proj
- q_proj
- v_proj
- k_proj
- o_proj
gradient_accumulation_steps: 4
micro_batch_size: 2
num_epochs: 1
optimizer: adamw_bnb_8bit
lr_scheduler: cosine
learning_rate: 0.0002
bf16: auto
gradient_checkpointing: true
attn_implementation: flash_attention_2
warmup_ratio: 0.1
evals_per_epoch: 4
saves_per_epoch: 1
special_tokens:
pad_token: " "
Запуск и дальнейшие шаги (быстрый старт):
axolotl train qlora.yml
axolotl inference qlora.yml --lora-model-dir="./outputs/qlora-out"
axolotl merge-lora qlora.yml --lora-model-dir="./outputs/qlora-out"
Слитая модель окажется в outputs/qlora-out/merged. Axolotl также умеет экспортировать в GGUF командой axolotl export (по новостям проекта за сентябрь 2026). Для замены датасета меняйте блок datasets и его type под формат ваших данных, а для полного обучения уберите строки adapter и load_in_4bit. Если Flash Attention не установлен или карта старше Ampere, замените attn_implementation на sdpa.
Где Unsloth
Unsloth ставится через pip install unsloth или uv pip install unsloth --torch-backend=auto, а на Windows сначала нужно поставить torchao. Он же предлагает готовые ноутбуки для Colab и Kaggle и приложение с веб-интерфейсом. Там задаются те же параметры: max_seq_length, load_in_4bit для QLoRA, load_in_16bit для LoRA в 16 битах, full_finetuning для полного обучения; в руководстве проекта для старта рекомендуют QLoRA на Instruct-моделях и предупреждают, что прыгать сразу в полное дообучение не стоит. Если ваш процесс уже построен на TRL, Unsloth подключается как ускоряющая прослойка без смены тренера. Помните про лицензию: ядро под Apache-2.0, а часть для интерфейса Studio под AGPL-3.0, что важно, если вы встраиваете её в закрытый продукт.
Как выбрать
- Один эксперимент на одной карте или в Colab: Unsloth или чистый TRL.
- Воспроизводимость и командная работа: Axolotl, где весь эксперимент описан одним файлом, который можно положить в репозиторий.
- Нестандартные методы (DPO, GRPO, своя функция потерь) и полный контроль над циклом: TRL.
- Windows без WSL: Unsloth заявляет поддержку, для Axolotl проект рекомендует WSL2 или Docker.
Перед любым запуском решите, нужно ли обучение вообще: промпт, RAG или fine-tuning. А после обучения сравните адаптер с базовой моделью на своих запросах, как в статье про сравнение LLM.
Итого
- Для старта: TRL SFTTrainer + PEFT LoRA + bitsandbytes 4-bit, около 50 строк кода.
- Версии на 25.10.2026: trl 1.16.0, peft 0.21.2, unsloth 2026.10.8, axolotl 0.21.0, bitsandbytes 0.50.2. Закрепляйте их в
requirements.txt, API тренеров меняется между релизами. - Начинайте с маленькой модели и 1-2 тысяч примеров, проверьте пайплайн и оценку, только потом берите крупную базу.
- Слияние адаптера и экспорт в GGUF позволяют запускать результат локально.