Дообучить открытую модель на 8B на своих данных через QLoRA можно на одном арендованном GPU с 24 ГБ, и типичный запуск стоит меньше доллара. Сложные вопросы идут раньше: нужно ли дообучение вообще (для фактов обычно выигрывает поиск по документам) и как сохранить данные в тайне на машине, которая принадлежит кому-то другому.
В руководстве разобрано и то и другое, а затем — сколько VRAM нужно в зависимости от размера модели, актуальные инструменты, рабочий скрипт обучения, пример расчёта стоимости и запуск результата. Всё проверено в сентябре 2026 года; источники — в конце.
Дообучение, RAG или промпты получше
Дообучение меняет поведение модели. Учить её фактам так — плохая идея. Ovadia et al. сравнили оба подхода для добавления знаний и выяснили, что RAG «стабильно превосходит» дообучение без учителя «как для знаний, встречавшихся при обучении, так и для совершенно новых». Их вывод: LLM с трудом усваивают новые факты через дообучение.
Поэтому, прежде чем что-то арендовать, пройдите по этому дереву:
Хорошие причины для дообучения:
- Строгий формат ответа. Извлекать поля в вашу схему при каждом вызове без страницы инструкций в каждом промпте.
- Стиль и тон. Ответы поддержки, которые звучат как ваша команда, или отчёты фиксированной структуры.
- Узкая задача для небольшой модели. Дообученная модель на 8B может заменить большую универсальную модель на одной задаче, а это важно, если запускать её на дешёвом железе.
- Короткие промпты. Поведение, выученное в весах, не нужно повторять в каждом запросе.
LoRA и QLoRA
Полное дообучение обновляет все веса, поэтому GPU должен держать градиенты и состояние оптимизатора для каждого из них в дополнение к самой модели. LoRA замораживает базовую модель и обучает небольшие матрицы низкого ранга рядом с её слоями; в исходной статье число обучаемых параметров сократилось в 10 000 раз, а расход видеопамяти — в 3 раза по сравнению с полным дообучением GPT-3 175B с Adam.
QLoRA идёт дальше: замороженная базовая модель загружается в 4-битной точности NF4, а в 16 битах обучаются только адаптеры. Dettmers et al. дообучили так модель на 65B на одном GPU с 48 ГБ, «сохранив качество полного 16-битного дообучения». Статья добавила три компонента, которые инструменты используют до сих пор: тип данных NF4, двойное квантование констант квантования и страничные оптимизаторы, которые сглаживают пики расхода памяти.
Результат в обоих случаях — адаптер, папка с несколькими тензорами, который накладывается поверх неизменённой базовой модели. Его можно держать отдельно или влить в веса. Для моделей изображений метод тот же: LoRA для Stable Diffusion обучается на одной арендованной карте с 24 ГБ и обходится заметно дешевле $10.
Сколько нужно VRAM
Unsloth публикует таблицу минимального объёма VRAM для дообучения в зависимости от размера модели. Ниже её цифры, с учётом оптимизаций памяти Unsloth; обычному обучению на Hugging Face нужно больше, а длинные последовательности и большие батчи поднимают каждую строку.
| Размер модели | QLoRA (4 бит) | LoRA (16 бит) | Арендная карта, где QLoRA помещается с запасом |
|---|---|---|---|
| 3B | 3,5 ГБ | 8 ГБ | Любая карта от 12 ГБ |
| 8B | 6 ГБ | 22 ГБ | RTX 3090 / 4090 (24 ГБ) |
| 14B | 8,5 ГБ | 33 ГБ | RTX 3090 / 4090 (24 ГБ) |
| 32B | 26 ГБ | 76 ГБ | Карта на 48 ГБ (RTX A6000, A40, L40S) |
| 70B | 41 ГБ | 164 ГБ | Карта на 80 ГБ (A100, H100) |
Мой выбор по умолчанию — модель на 8B или 14B на RTX 4090. Это самая дешёвая арендная карта, на которой остаётся место под последовательности в 2048 токенов и разумный батч, а модели такого размера потом легко запускать. Как выбрать базовую модель под VRAM, на котором вы будете её запускать, — в статье какие модели ИИ помещаются в VRAM вашего GPU.
Выбираем инструмент: TRL, Unsloth или Axolotl
Все три — с открытым кодом, и все умеют LoRA и QLoRA.
| Инструмент | Как с ним работать | Сильная сторона | На что обратить внимание |
|---|---|---|---|
| Hugging Face TRL + PEFT | Python (SFTTrainer) | Эталонная реализация; DPO, GRPO и другое через тот же API | На том же запуске расходует больше памяти, чем Unsloth |
| Unsloth | Python или веб-интерфейс Unsloth Studio | Заявляет вдвое большую скорость и на 70% меньше VRAM; экспорт сразу в GGUF | Интерфейс Studio под AGPL-3.0 (ядро под Apache 2.0) |
| Axolotl | Один YAML-файл, axolotl train config.yml | Несколько GPU (FSDP, DeepSpeed), много готовых рецептов | Нужны Python 3.11+ и PyTorch 2.11+ |
На сентябрь 2026 года TRL — версии 1.14, PEFT — 0.21. Unsloth нужен Python от 3.11 до 3.13 и GPU NVIDIA с CUDA capability 7.0 или новее (V100, T4, серия RTX 20 и старше). Axolotl рекомендует Python 3.12 и PyTorch 2.12.1.
TRL — если хотите понимать каждую строку, Unsloth — если не хватает VRAM или нужен экспорт в GGUF одним вызовом, Axolotl — если будете повторять запуски с разными настройками или переходить на несколько GPU. Скрипт ниже написан на TRL: это самый короткий путь, на котором видны все движущиеся части.
Готовим данные
SFTTrainer из TRL читает диалоги в том же формате, что и запрос к чат-API. По одному JSON-объекту на строку в train.jsonl:
{"messages": [{"role": "system", "content": "Extract the invoice fields as JSON."}, {"role": "user", "content": "Invoice 4471 from Norden AB, due 12 March, total 1,250 EUR"}, {"role": "assistant", "content": "{\"invoice_id\": \"4471\", \"supplier\": \"Norden AB\", \"due\": \"2026-03-12\", \"total\": 1250, \"currency\": \"EUR\"}"}]}
Практические правила:
- Качество важнее количества. Несколько сотен или тысяч согласованных и правильных примеров лучше десятков тысяч зашумлённых. Каждая ошибка в данных — это поведение, за обучение которому вы платите.
- Как в продакшене. Используйте тот системный промпт и формат входа, которые ваше приложение будет отправлять на самом деле.
- Отложите 5–10%. Оставьте примеры, на которых модель не обучается, чтобы сравнить базовую и дообученную модель бок о бок.
- Уберите лишнее. Имена, email, номера счетов и идентификаторы редко помогают модели выучить формат. Замените их правдоподобными заглушками до того, как данные покинут ваш компьютер.
Последнее правило касается не только арендованной машины. Carlini et al. извлекли из GPT-2 сотни дословных обучающих фрагментов, включая имена, телефоны и адреса email, причём некоторые встречались лишь в одном обучающем документе. Дообученная модель может повторить то, на чём её обучали, любому, кто будет ею пользоваться.
Как сохранить данные в тайне на арендованной машине
На маркетплейсе GPU компьютер принадлежит кому-то другому. Vast.ai говорит об этом прямо: «Клиенты изолированы в непривилегированных Docker-контейнерах и имеют доступ только к своим данным», и «уровень безопасности у провайдеров сильно различается». Изоляция защищает вас от других арендаторов. От человека с физическим доступом и root-правами на хосте она не защищает.
Для закрытых данных:
- Выбирайте проверенный хост в дата-центре. Провайдеры Secure Cloud на Vast.ai — это «проверенные дата-центры с сертификацией ISO 27001 и стандартами Tier 3/4», и Vast рекомендует их для чувствительных задач. Secure Cloud у RunPod работает в дата-центрах T3/T4; Community Cloud связывает вас с отдельными провайдерами. Уровни в дата-центрах стоят дороже в час, и здесь они того стоят.
- Загружайте только очищенный датасет, по SSH (
rsync -avPилиscp). Не выкладывайте его по пути в публичный бакет или по общей ссылке. - Логи — только локально. В TRL 1.14
report_toпо умолчанию равен"none", так что в трекер экспериментов ничего не уходит, пока вы сами это не включите. Не вызывайтеpush_to_hubдля адаптера, обученного на закрытых данных. - Заберите результаты, потом удалите инстанс. Скачайте адаптер и результаты оценки, выйдите из Hugging Face (
hf auth logout), если использовали токен, и удалите инстанс и все тома. На Vast.ai хранилище оплачивается и сохраняется, пока инстанс не удалён, а не просто остановлен.
Удаление файлов внутри контейнера не гарантирует, что диск хоста будет очищен, поэтому настоящая защита — шаги 1 и 2: выбрать, у кого будет железо, и отправить ему как можно меньше. Подробнее — в статье как защитить датасет на публичном GPU-узле. Если ваша политика запрещает любое чужое железо, тот же скрипт работает на вашей собственной карте с 24 ГБ.
Обучение: скрипт QLoRA на TRL
На арендованной Linux-машине с RTX 3090 или 4090:
python -m venv venv && source venv/bin/activate
pip install torch trl peft bitsandbytes datasets
Затем train.py по схеме QLoRA из документации TRL по PEFT. Qwen3-8B распространяется под Apache 2.0 и в свободном доступе, так что токен Hugging Face не нужен:
import torch
from datasets import load_dataset
from peft import LoraConfig
from transformers import BitsAndBytesConfig
from trl import SFTConfig, SFTTrainer
dataset = load_dataset("json", data_files="train.jsonl", split="train")
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16,
bnb_4bit_use_double_quant=True,
)
peft_config = LoraConfig(
r=16,
lora_alpha=32,
lora_dropout=0.05,
target_modules="all-linear",
task_type="CAUSAL_LM",
)
args = SFTConfig(
output_dir="out",
num_train_epochs=3,
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
learning_rate=2e-4,
lr_scheduler_type="cosine",
warmup_steps=20,
max_length=2048,
bf16=True,
logging_steps=10,
save_strategy="epoch",
model_init_kwargs={"dtype": torch.bfloat16},
)
trainer = SFTTrainer(
model="Qwen/Qwen3-8B",
args=args,
train_dataset=dataset,
quantization_config=bnb_config,
peft_config=peft_config,
)
trainer.train()
trainer.save_model("out/adapter")
Что здесь важно:
learning_rate=2e-4. Документация TRL рекомендует для QLoRA скорость примерно в 10 раз выше обычной для дообучения. Если loss на оценке растёт, а на обучении падает, модель переобучается: уменьшите число эпох.r=16,target_modules="all-linear". Адаптеры на каждом линейном слое — такую конфигурацию используют бенчмарки Unsloth. Ранга 16 хватает для формата и стиля; для задач посложнее поднимите его.max_length=2048. Более длинные примеры обрезаются. Проверьте длину своих данных в токенах; более высокий предел требует больше VRAM.- Эффективный батч 16 (4 × 4 шага накопления). Если не хватает памяти, уменьшите
per_device_train_batch_sizeи увеличьте накопление, чтобы произведение не изменилось.
Прежде чем выключать машину, прогоните отложенные примеры через базовую и дообученную модель и сравните. Только эта проверка скажет, дали ли потраченные деньги хоть что-то.
Сколько это стоит
Время обучения — это общее число токенов, делённое на пропускную способность. Хостинговая компания GigaGPU опубликовала замер: около 3500 обучающих токенов в секунду для Llama 3.1 8B с QLoRA на RTX 4090. Если считать, что для Qwen3-8B скорость примерно такая же:
Небольшой запуск: 2000 примеров × 600 токенов × 3 эпохи = 3,6 млн токенов. 3 600 000 ÷ 3500 = 1029 с, около 17 минут.
| Этап | Время |
|---|---|
| Настройка окружения | 10 мин |
| Скачивание Qwen3-8B (16,4 ГБ весов) и загрузка данных | 10 мин |
| Обучение | 17 мин |
| Сравнение базовой и дообученной модели на отложенных данных | 15 мин |
| Слияние, экспорт, скачивание, удаление инстанса | 15 мин |
| Итого | 67 мин (1,12 ч) |
- RTX 4090 на Vast.ai по $0,31/ч: 1,12 × $0,31 = $0,35
- RTX 4090 на RunPod по $0,74/ч (цена со страницы цен): 1,12 × $0,74 = $0,83
Запуск побольше: 20 000 примеров × 1000 токенов × 2 эпохи = 40 млн токенов ÷ 3500 = 11 429 с, около 3,2 часа. С теми же 50 минутами накладных расходов — 4,0 часа: $1,24 на Vast.ai или $2,97 на RunPod.
Для модели на 32B карты с 48 ГБ на RunPod в сентябре 2026 года стоят $0,49/ч (A40), $0,53/ч (RTX A6000) и $1,09/ч (L40S). Опубликованной пропускной способности для QLoRA на 32B на этих картах у меня нет, поэтому прогоните 50 шагов, возьмите время шага из лога и сделайте то же умножение, прежде чем запускать долгое обучение.
Цены — на сентябрь 2026 года, со страницы цен RunPod и из трекера getdeploying.com для Vast.ai. Уровни Secure и в дата-центрах стоят дороже самых дешёвых предложений сообщества. Общая картина — в статье сравнение цен на аренду GPU.
Запуск результата
Вариантов два: держать адаптер отдельно или влить его в модель.
Отдельно, через vLLM. vLLM загружает адаптеры LoRA рядом с базовой моделью и отдаёт каждый как отдельное имя модели на своём OpenAI-совместимом сервере:
vllm serve Qwen/Qwen3-8B --enable-lora --lora-modules invoices=./out/adapter
Клиенты затем отправляют "model": "invoices". Несколько адаптеров могут делить одну базовую модель на одном GPU.
Влить и запустить в Ollama. Влейте адаптер в веса полной точности, конвертируйте в GGUF через llama.cpp, квантуйте и импортируйте:
import torch
from peft import AutoPeftModelForCausalLM
from transformers import AutoTokenizer
model = AutoPeftModelForCausalLM.from_pretrained("out/adapter", dtype=torch.bfloat16)
model.merge_and_unload().save_pretrained("merged")
AutoTokenizer.from_pretrained("Qwen/Qwen3-8B").save_pretrained("merged")
python llama.cpp/convert_hf_to_gguf.py merged --outfile invoices-bf16.gguf --outtype bf16
./llama.cpp/build/bin/llama-quantize invoices-bf16.gguf invoices-Q4_K_M.gguf Q4_K_M
echo "FROM ./invoices-Q4_K_M.gguf" > Modelfile
ollama create invoices -f Modelfile
Unsloth делает слияние и экспорт в GGUF одним вызовом (model.save_pretrained_gguf("dir", tokenizer, quantization_method="q4_k_m")). Его документация предупреждает, что самая частая причина плохих ответов после экспорта — не тот шаблон чата: запускайте модель с тем шаблоном, с которым обучали. Плюсы и минусы Ollama, vLLM и TGI — в нашем бенчмарке инференса на RTX 4090.
При чём здесь GPUFlow
Обучать на GPUFlow нельзя: он сдаёт OpenAI-совместимый API на GPU провайдера, без командной оболочки, SSH и доступа к файлам. Запустить там свою дообученную модель тоже нельзя. Арендаторы не могут загружать модели; доступны те, что каждый провайдер установил сам (обычно через Ollama), например qwen2.5:7b или llama3.1:8b.
Помочь он может на шаге, который идёт до всего этого: за несколько центов проверить, не справляется ли с задачей уже стандартная открытая модель с хорошим промптом — это самый дешёвый исход в дереве решений. Используйте для этого тестовые данные, а не закрытые, о которых идёт речь в этом руководстве: пока идёт аренда, промпты и ответы проходят через машину провайдера в открытом виде. Как это устроено — в быстром старте с API, а как подключить ключ к существующим инструментам — в статье как использовать ключ в приложениях.
Источники
Всё проверено в сентябре 2026 года.
- Статьи: Hu et al., LoRA; Dettmers et al., QLoRA; Ovadia et al., Fine-Tuning or Retrieval?; Carlini et al., Extracting Training Data from Large Language Models
- Hugging Face TRL: SFT Trainer, интеграция с PEFT и QLoRA
- Unsloth: требования и таблица VRAM, бенчмарки, сохранение в GGUF, GitHub
- Axolotl на GitHub
- Модель: карточка модели Qwen3-8B
- Скорость обучения: GigaGPU, дообучение на RTX 4090
- Хосты и безопасность: FAQ по безопасности Vast.ai, цены Vast.ai, обзор подов RunPod
- Цены: цены RunPod, getdeploying.com для Vast.ai и RTX 4090
- Запуск моделей: адаптеры LoRA в vLLM, квантование в llama.cpp, импорт в Ollama
- GPUFlow: быстрый старт с API