Файнтюнинг больших языковых моделей — теперь с ноутбука

Открытый инструмент Soup от казахстанского разработчика Alpamys Makazhan резко снижает порог входа в обучение больших языковых моделей. Soup превращает боль файнтюнинга LLM в простой рабочий процесс: один конфиг, одна команда — и готово. Главная особенность — технология layer streaming, которая позволяет файнтюнить 8B-модель на ноутбучном GPU с 4 ГБ VRAM, держа замороженную базу вне VRAM и подавая её в GPU по одному декодерному слою за раз.

ℹ Что такое Soup?
Soup — это бесплатный CLI-инструмент (лицензия Apache-2.0) для файнтюнинга (fine-tuning) и пост-обучения (post-training) языковых моделей. Не требует облака, SSH или сложной инфраструктуры.

Как работает layer streaming

Обычно при обучении модель целиком живёт в видеопамяти GPU. Файнтюнинг современного LLM имеет жёсткий входной барьер: сама модель не влезает в память большинства устройств — 8B-модель в fp16 весит ~16 ГБ, плюс нужен запас для активаций, состояния оптимизатора и градиентов.

Soup решает это иначе. LoRA держит базовую модель замороженной — она только читается, никогда не записывается. Поэтому Soup хранит её в системной RAM и стримит в GPU по одному декодерному слою за раз. Пиковое использование VRAM сводится к размеру одного слоя вместо всей модели.

Это ключевая особенность серии v0.72 — layer streaming держит замороженную базовую модель полностью вне VRAM и подаёт её на GPU по одному декодерному слою через выделенный CUDA-поток, ограничивая пиковую VRAM размером одного слоя.


graph LR
    A[Базовая модель\nв системной RAM] -->|один декодерный слой| B[GPU VRAM\n≤ 4 ГБ]
    B --> C[LoRA-адаптер\nобучается]
    C --> D[Результат:\nфайнтюненная модель]
    style A fill:#4a90d9,color:#fff
    style B fill:#e74c3c,color:#fff
    style C fill:#27ae60,color:#fff
    style D fill:#8e44ad,color:#fff

Реальные измерения производительности

На RTX 3050 Laptop 4 ГБ: Llama-3.1-8B-Instruct + NF4 показала 119,6 tok/s при пике 3,32 ГБ — побитово идентична обычному запуску с полной загрузкой в VRAM, и воспроизведена независимо на H100 при 113,00 tok/s в тех же 3,32 ГБ.

Разработчики успешно провели квантизацию Llama 3.1 8B Instruct в формат NF4 и файнтюнинг с LoRA на GeForce RTX 3050 Laptop GPU с 4 ГБ VRAM. При длине последовательности 512 токенов и batch size 1 пиковое использование VRAM составило 3,32 ГБ, а скорость обработки — 119,6 токенов в секунду.

ПараметрRTX 3050 Laptop (4 ГБ)H100 (для сравнения)
МодельLlama-3.1-8B-Instruct + NF4Llama-3.1-8B-Instruct + NF4
Пик VRAM3,32 ГБ3,32 ГБ
Скорость119,6 tok/s113,00 tok/s
МетодLoRA, batch 1, seq 512LoRA, batch 1, seq 512
Точностьbit-exactbit-exact

Сотня FLOP-кратное превосходство H100 над RTX 3050 не отражается в скорости токенов — значит, узкое место не в вычислениях, а в пропускной способности памяти при стриминге слоёв.

⚠ Важно
Layer streaming находится в статусе BETA и включается опционально (stream_layers: true). Если модель уже влезает в VRAM — лучше оставить стриминг выключенным: он медленнее обычного режима.

Быстрый старт: три команды

Soup устанавливается через pip и работает полностью локально — без регистрации, кредитной карты и привязки к вендору.

# 1. Установка с поддержкой обучения
pip install "soup-cli[train]"

# 2. Создать конфиг (интерактивный мастер)
soup init --template chat

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

Пример минимального soup.yaml с включённым layer streaming:

# soup.yaml — затем просто `soup train --config soup.yaml`
training:
  stream_layers: true   # база стримится из VRAM; обучается только адаптер
  quantization: 4bit    # NF4 — ~4x меньше, 8B влезает в 4 ГБ карту
  batch_size: 4         # большие батчи амортизируют чтение весов
  stream_source: auto   # RAM если влезает, NVMe если нет
  seed: 1234

Доступны готовые шаблоны для chat, code, tool-calling, medical, reasoning, vision, RLHF и ещё десятка сценариев. Экспорт в GGUF, запуск в Ollama, публикация на HuggingFace — всё поддерживается.

Что нового в v0.73.2

Последний релиз сосредоточен на исправлении команды soup ship — встроенного «гейта выпуска» модели. В v0.73.2 гейт перестал ошибаться в обоих направлениях: soup ship отвечает на один вопрос — модель стала лучше или я её сломал? Два набора тестов ранжировали результаты по неправильному критерию, и целое направление отказов не имело детектора вообще.

Также добавлены:

  • soup ship --noise-floor N — повторяет базовую модель N раз и отказывается считать значимым любой дельта-результат меньше измеренного разброса
  • soup data split --stratify-semantic — семантическая стратификация при разбивке датасета
  • soup mcp serve --allow-execute — MCP-сервер с разрешением на выполнение

Поддержка DPO и preference-обучения

Для DPO референсная модель переиспользует тот же стримируемый базовый вес с отключёнными адаптерами, добавляя 0 дополнительной памяти под веса (измерено на уровне 0,914× пика SFT; принудительный второй экземпляр стоил бы +730 МБ). GRPO и PPO намеренно исключены, поскольку генерация перечитывает каждый слой на каждый токен — это нельзя амортизировать при стриминге.

💡 Совет
Если вы обучали модель с stream_layers: true на версии v0.72.0, адаптер неактивен: тензоры сохранены под ключами с лишним сегментом .inner.. Обновитесь до v0.72.1+ и переобучите или пересохраните модель.

Почему это важно для отрасли

Обучение LLM по-прежнему остаётся болезненным процессом: даже опытные команды тратят 30–50% времени на борьбу с инфраструктурой вместо улучшения моделей. Soup — бесплатный инструмент под лицензией Apache-2.0, разработанный MePlay, Inc., который сворачивает весь стек пост-обучения LLM в один YAML-конфиг и одну команду soup train. Он ориентирован на практиков, желающих файнтюнить большие языковые модели локально — без облачной инфраструктуры и экспертизы в конфигурации.

Проект разрабатывается и поддерживается на одном 4 ГБ ноутбуке — именно это, по словам автора, является причиной, по которой каждый показатель производительности измерен, а не просто заявлен. Исходный код и все измерения, включая неудачные эксперименты, опубликованы на GitHub.