# Универсальное дообучение Axolotl

Axolotl объединяет HuggingFace Transformers, PEFT, TRL и DeepSpeed в единый интерфейс, управляемый YAML. Вы определяете вашу модель, набор данных, метод обучения и гиперпараметры в одном конфигурационном файле — затем запускаете одной командой. Для стандартных рабочих процессов не требуется написание скриптов на Python.

{% hint style="success" %}
Все примеры запускаются на GPU-серверах, арендованных через [CLORE.AI Marketplace](https://clore.ai/marketplace).
{% endhint %}

## Ключевые особенности

* **Конфигурация только в YAML** — определите всё в одном файле, Python не нужен
* **Все методы обучения** — LoRA, QLoRA, полная дообучение, DPO, ORPO, KTO, RLHF
* **Поддержка нескольких GPU из коробки** — DeepSpeed ZeRO 1/2/3 и FSDP с одним флагом
* **Упаковка примеров** — конкатенация коротких примеров для заполнения длины последовательности, прирост пропускной способности в 3–5×
* **Flash Attention 2** — автоматическая экономия видеопамяти на поддерживаемом оборудовании
* **Широкая поддержка моделей** — Llama 3.x, Mistral, Qwen 2.5, Gemma 2, Phi-4, DeepSeek, Falcon
* **Встроенные форматы наборов данных** — alpaca, sharegpt, chat\_template, completion и пользовательские

## Требования

| Компонент | Минимум        | Рекомендуется        |
| --------- | -------------- | -------------------- |
| GPU       | RTX 3060 12 ГБ | RTX 4090 24 ГБ (×2+) |
| VRAM      | 12 ГБ          | 24+ ГБ               |
| ОЗУ       | 16 ГБ          | 64 ГБ                |
| Диск      | 50 ГБ          | 100 ГБ               |
| CUDA      | 11.8           | 12.1+                |
| Python    | 3.10           | 3.11                 |

**Цены Clore.ai:** RTX 4090 ≈ $0.5–2/день · RTX 3090 ≈ $0.3–1/день · RTX 3060 ≈ $0.15–0.3/день

## Быстрый старт

### 1. Установите Axolotl

```bash
# Клонировать и установить
git clone https://github.com/OpenAccess-AI-Collective/axolotl.git
cd axolotl

pip install packaging ninja
pip install -e '.[flash-attn,deepspeed]'
```

Или используйте Docker-образ (рекомендуется для воспроизводимости):

```bash
docker run --gpus all -it --rm \
  -v /workspace:/workspace \
  winglian/axolotl:main-latest
```

### 2. Создайте конфигурационный файл

Сохраните это как `config.yml`:

```yaml
base_model: meta-llama/Meta-Llama-3.1-8B-Instruct
model_type: LlamaForCausalLM
tokenizer_type: AutoTokenizer

load_in_4bit: true
adapter: qlora
lora_r: 32
lora_alpha: 16
lora_dropout: 0.05
lora_target_linear: true

datasets:
  - path: yahma/alpaca-cleaned
    type: alpaca

sequence_len: 2048
sample_packing: true
pad_to_sequence_len: true

wandb_project: axolotl-clore
wandb_name: llama3-qlora

output_dir: /workspace/axolotl-output

gradient_accumulation_steps: 4
micro_batch_size: 2
num_epochs: 1
learning_rate: 2e-4
optimizer: adamw_bnb_8bit
lr_scheduler: cosine
warmup_steps: 10

bf16: auto
flash_attention: true
gradient_checkpointing: true

logging_steps: 10
save_strategy: steps
save_steps: 500
eval_steps: 500

evals_per_epoch:
val_set_size: 0.02
```

### 3. Запустите обучение

```bash
# Одна GPU
accelerate launch -m axolotl.cli.train config.yml

# Multi-GPU (все доступные GPU)
accelerate launch --multi_gpu -m axolotl.cli.train config.yml
```

Логи прогресса обучения выводятся в stdout и при желании в Weights & Biases.

## Глубокое погружение в конфигурацию

### Форматы наборов данных

Axolotl нативно поддерживает несколько входных форматов:

```yaml
# В стиле Alpaca (инструкция / ввод / вывод)
datasets:
  - path: yahma/alpaca-cleaned
    type: alpaca

# ShareGPT многотуровый чат
datasets:
  - path: anon8231489123/ShareGPT_Vicuna_unfiltered
    type: sharegpt
    conversation: chatml

# Шаблон чата (автоопределение по токенизатору)
datasets:
  - path: HuggingFaceH4/ultrachat_200k
    type: chat_template
    field_messages: messages
    message_field_role: role
    message_field_content: content

# Локальный файл JSONL
datasets:
  - path: /workspace/data/my_dataset.jsonl
    type: alpaca
    ds_type: json
```

### Multi-GPU с DeepSpeed

Создайте `deepspeed_zero2.json`:

```json
{
  "bf16": { "enabled": true },
  "zero_optimization": {
    "stage": 2,
    "offload_optimizer": { "device": "cpu" },
    "allgather_partitions": true,
    "allgather_bucket_size": 5e8,
    "reduce_scatter": true,
    "reduce_bucket_size": 5e8,
    "overlap_comm": true,
    "contiguous_gradients": true
  },
  "train_micro_batch_size_per_gpu": "auto",
  "gradient_accumulation_steps": "auto",
  "gradient_clipping": 1.0
}
```

Добавьте в вашу конфигурацию:

```yaml
deepspeed: deepspeed_zero2.json
```

Затем запустите:

```bash
accelerate launch --num_processes 4 -m axolotl.cli.train config.yml
```

### Выравнивание DPO / ORPO

```yaml
base_model: meta-llama/Meta-Llama-3.1-8B-Instruct
rl: dpo
# или: rl: orpo

datasets:
  - path: argilla/ultrafeedback-binarized-preferences
    type: chat_template.default
    field_messages: chosen
    field_chosen: chosen
    field_rejected: rejected

dpo_beta: 0.1
```

### Полная донастройка (без LoRA)

```yaml
base_model: meta-llama/Meta-Llama-3.1-8B-Instruct

# Нет адаптера, нет квантования
adapter:
load_in_4bit: false
load_in_8bit: false

learning_rate: 5e-6
micro_batch_size: 1
gradient_accumulation_steps: 8
gradient_checkpointing: true
flash_attention: true
bf16: auto

deepspeed: deepspeed_zero3.json  # требуется для полной донастройки моделей 8B+
```

## Примеры использования

### Инференс после обучения

```bash
# Запуск интерактивного инференса
accelerate launch -m axolotl.cli.inference config.yml \
  --lora_model_dir /workspace/axolotl-output
```

### Слияние LoRA с базовой моделью

```bash
accelerate launch -m axolotl.cli.merge_lora config.yml \
  --lora_model_dir /workspace/axolotl-output \
  --output_dir /workspace/merged-model
```

### Предобработка набора данных (проверить перед обучением)

```bash
python -m axolotl.cli.preprocess config.yml
```

Это токенизирует и проверит набор данных. Полезно для выявления ошибок формата до долгого запуска обучения.

## Справочник по использованию видеопамяти

| Модель        | Метод      | GPU | Видеопамять/GPU | Конфигурация              |
| ------------- | ---------- | --- | --------------- | ------------------------- |
| Llama 3.1 8B  | QLoRA 4bit | 1   | ≈12 ГБ          | r=32, seq\_len=2048       |
| Llama 3.1 8B  | LoRA 16bit | 1   | ≈20 ГБ          | r=16, seq\_len=2048       |
| Llama 3.1 8B  | Полное     | 2   | ≈22 ГБ          | DeepSpeed ZeRO-3          |
| Qwen 2.5 14B  | QLoRA 4bit | 1   | \~16 ГБ         | r=16, seq\_len=2048       |
| Llama 3.3 70B | QLoRA 4bit | 2   | ≈22 ГБ          | r=16, seq\_len=2048       |
| Llama 3.3 70B | Полное     | 4   | ≈40 ГБ          | DeepSpeed ZeRO-3+выгрузка |

## Советы

* **Всегда включать `sample_packing: true`** — наибольшее единичное улучшение пропускной способности (3–5× на коротких наборах данных)
* **Используйте `flash_attention: true`** на GPU Ampere+ для экономии видеопамяти на 20–40%
* **Начните с QLoRA** для экспериментов переходите на полную донастройку только когда качество LoRA выходит на плато
* **Установите `val_set_size: 0.02`** чтобы отслеживать переобучение во время обучения
* **Сначала предобработайте** — выполните `axolotl.cli.preprocess` чтобы проверить формат данных перед запуском долгого обучения
* **Используйте Docker-образ** для воспроизводимых окружений — избегает конфликтов зависимостей
* **`lora_target_linear: true`** применяет LoRA ко всем линейным слоям, обычно лучше, чем нацеливание только на attention

## Устранение неполадок

| Проблема                                   | Решение                                                                 |
| ------------------------------------------ | ----------------------------------------------------------------------- |
| `OutOfMemoryError`                         | Понизьте `micro_batch_size` до 1, включите `gradient_checkpointing`     |
| Ошибки формата набора данных               | Запустите `python -m axolotl.cli.preprocess config.yml` для отладки     |
| `sample_packing` медленный на первой эпохе | Нормально — начальное вычисление упаковки выполняется единожды          |
| Многопроцессное обучение зависает          | Проверьте NCCL: `export NCCL_DEBUG=INFO`, убедитесь, что все GPU видимы |
| `flash_attention` ошибка импорта           | Установите: `pip install flash-attn --no-build-isolation`               |
| Потеря не уменьшается                      | Понизьте LR до 1e-4, увеличьте warmup, проверьте качество набора данных |
| Ошибка соединения WandB                    | Запустите `wandb login` или задайте `wandb_project:` в пустую строку    |

## Ресурсы

* [Axolotl на GitHub](https://github.com/OpenAccess-AI-Collective/axolotl)
* [Примеры конфигураций](https://github.com/OpenAccess-AI-Collective/axolotl/tree/main/examples)
* [CLORE.AI Marketplace](https://clore.ai/marketplace)
