Сколько VRAM нужно для обучения нейросетей?
Почему обучение требует в 9 раз больше памяти, чем инференс, куда уходят байты на каждый параметр и как уложить дообучение LLM в одну карту с помощью QLoRA и checkpointing.
TL;DR — Кратко:
- Обучение требует примерно в 9 раз больше памяти, чем инференс: 18 байт на параметр против 2.
- Полное дообучение 7B модели упирается в 126 ГБ статики — это больше, чем одна A100 80GB.
- QLoRA снимает потолок: авторы метода дообучили 65B модель на одной карте с 48 ГБ.
Типичная ситуация: вы скачали веса LLaMA-7B, запустили скрипт дообучения на RTX 3060 и получили RuntimeError: CUDA out of memory через несколько секунд.
С видеопамятью нет промежуточного состояния. На CPU можно уйти в swap и потерять скорость, но не процесс. На GPU не влезло — процесс упал.
Ниже разберём, из чего складывается потребление памяти при обучении, почему оно на порядок больше, чем при инференсе, и какие техники позволяют уложиться в имеющуюся карту. Если вы ещё не определились с задачей и подбираете карту в целом, начните с разбора того, как выбрать GPU под задачу.
Куда уходит память: 18 байт на параметр
Линейный расчёт «модель весит 14 ГБ, карта на 16 ГБ, значит влезет» не работает. Веса — меньшая часть расхода.
При обучении память занимают четыре группы данных. Первые три пропорциональны числу параметров, четвёртая зависит от батча и длины последовательности:
- Веса модели. В mixed precision хранятся две копии: fp16 для прямого и обратного прохода и fp32 как эталон для обновления.
- Состояния оптимизатора. Adam держит на каждый параметр момент и дисперсию, обе в fp32.
- Градиенты. Считаются на обратном проходе для каждого параметра.
- Активации. Промежуточные результаты слоёв, сохранённые для вычисления градиентов.
Раскладка по байтам, по документации HuggingFace «Model training anatomy»:
| Компонент | Что внутри | Байт на параметр |
|---|---|---|
| Веса | fp16-копия (2 Б) + fp32-эталон (4 Б) | 6 |
| Оптимизатор (Adam) | fp32 momentum (4 Б) + fp32 variance (4 Б) | 8 |
| Градиенты | fp32 | 4 |
| Итого статика | mixed precision + Adam | 18 |
| Активации | зависят от батча и длины контекста | считается отдельно |
Сравните с инференсом: там нужны только веса в fp16, то есть 2 байта на параметр. Отсюда и разрыв — 18 против 2, то есть в 9 раз, ещё до учёта активаций.
Формула для быстрой прикидки
Чтобы понять, потянет ли карта полное дообучение, считайте так:
VRAM ≈ параметры × 18 байт + активации
Расчёт для модели на 7 миллиардов параметров:
- Статика: 7 × 10⁹ × 18 байт = 126 ГБ
- Активации: ещё десятки гигабайт в зависимости от длины контекста и размера батча
Вывод неприятный: полное дообучение 7B не помещается даже в A100 80GB. Нужны две карты минимум, а с длинным контекстом — больше.
Именно поэтому полное дообучение почти никто не делает. Практический путь — LoRA и QLoRA, о которых ниже.
Реальные требования по сценариям
Сводная таблица для контекста около 4096 токенов. Колонка INT4 опирается на фактические размеры GGUF-сборок, колонка Full FT — на формулу выше:
| Модель | Инференс FP16 | Инференс INT4 | Обучение QLoRA | Полное дообучение (статика) |
|---|---|---|---|---|
| 7B (Mistral/Llama) | 14 ГБ | ~5 ГБ | 8–12 ГБ | 126 ГБ |
| 13B (Llama 2) | 26 ГБ | ~9 ГБ | 16–24 ГБ | 234 ГБ |
| 34B (Yi/CodeLlama) | 68 ГБ | ~20 ГБ | 32–40 ГБ | 612 ГБ |
| 70B (Llama 3) | 140 ГБ | ~40 ГБ | 48–80 ГБ | 1260 ГБ |
Колонка FP16 — это параметры × 2 байта. Колонка Full FT — параметры × 18 байт без активаций, то есть нижняя граница. Значения INT4 сверены с манифестами реестра Ollama на 18 августа 2026 года:
llama3:8bзанимает 4.66 ГБ,llama3:70b— 39.97 ГБ, оба в формате GGUF Q4_0.
Практический потолок для RTX 3090 или 4090 с их 24 ГБ — дообучение 7B и 13B через QLoRA. Инференс 70B в INT4 в 24 ГБ уже не помещается: нужно 40 ГБ, то есть карта уровня A6000. Подробный разбор запуска квантованных моделей есть в гайде по DeepSeek-R1 и в инструкции по Llama 3 через Ollama.
Как уложиться в имеющуюся память
Mixed precision
База, с которой начинают. Обучение в чистом fp32 удваивает расход памяти на веса и градиенты без выигрыша в качестве для большинства задач.
В связке с HuggingFace Accelerate настраивается интерактивно:
accelerate config
# На вопрос про FP16 или BF16 отвечайте bf16 для карт Ampere и новее, иначе fp16 Gradient checkpointing
Активации не хранятся целиком, а пересчитываются на обратном проходе. Метод описан в статье «Training Deep Nets with Sublinear Memory Cost». Память под промежуточные данные снижается до O(√n) для сети из n слоёв. Плата — один дополнительный прямой проход на каждый мини-батч.
Включается одной строкой:
model.gradient_checkpointing_enable() Это самый выгодный по соотношению «экономия против сложности» приём, когда упор идёт именно в активации, то есть при длинном контексте или большом батче.
LoRA и QLoRA
Приём, который сделал дообучение LLM доступным на одной карте.
LoRA замораживает веса базовой модели: они не требуют ни градиентов, ни состояний оптимизатора. Обучаются только небольшие матрицы-адаптеры, и вся статика из таблицы выше схлопывается до долей процента от исходной.
QLoRA дополнительно сжимает замороженную модель до 4 бит. В статье авторов метода заявлено дообучение модели на 65 миллиардов параметров на одной карте с 48 ГБ при сохранении качества полного 16-битного дообучения. Практическое продолжение этой темы — разбор файн-тюнинга Llama 3 на 16 ГБ VRAM.
Batch size и накопление градиентов
Если батч 32 не помещается, ставьте 1 и накапливайте градиенты. Тридцать два шага с батчем 1, суммирование градиентов, затем один шаг оптимизатора — математически близко к батчу 32, но пик памяти определяется единицей.
training_args = TrainingArguments(
per_device_train_batch_size=1,
gradient_accumulation_steps=32, # эффективный батч = 32
bf16=True,
) 8-битный оптимизатор
Состояния Adam — это 8 из 18 байт, самая крупная статья после весов. Квантованная версия из bitsandbytes сжимает их до 2 байт на параметр, то есть вчетверо по этому компоненту (по той же документации HuggingFace).
import bitsandbytes as bnb
optimizer = bnb.optim.AdamW8bit(model.parameters(), lr=1e-5) Когда техник уже не хватает
Все приёмы выше работают в пределах одной карты. Когда упор остаётся, следующий шаг — распределить состояния между несколькими GPU. Этим занимаются FSDP в PyTorch и DeepSpeed ZeRO. Подход описан в статье «ZeRO: Memory Optimizations Toward Training Trillion Parameter Models». Он разносит по картам как раз градиенты и состояния оптимизатора, а не только веса.
Потребительские карты против серверных
Почему две RTX 4090 не дают двукратного прироста
Ограничений два, и объём памяти — только первое из них.
24 ГБ — жёсткий потолок. Обучить 70B даже через QLoRA на такой карте не выйдет: по таблице нужно от 48 ГБ. Выгрузка в оперативную память формально спасает, но замедляет процесс настолько, что смысл теряется.
NVLink на 4090 отсутствует. Это не «работает медленно», а именно отсутствует: в официальных спецификациях RTX 4090 в строке NVIDIA NVLink (SLI-Ready) стоит No. Разъём убран в поколении Ada, и обмен между картами идёт по PCIe. Для обучения, где градиенты синхронизируются на каждом шаге, это узкое место: искать мостик для 4090 бесполезно, его не существует.
Что дают серверные карты
A6000 и A6000 Ada, 48 ГБ. Порог, за которым появляется QLoRA для 70B и обучение 13B с длинным контекстом. Практический разбор выбора между потребительскими и серверными картами есть в сравнении A100 и RTX 4090.
A100, 80 ГБ. Помимо объёма, здесь память HBM2e с заметно большей пропускной способностью, чем GDDR6X. При больших батчах обучение упирается именно в неё, а не в объём.
Чек-лист при ошибке OOM
Порядок действий, от самого дешёвого к самому затратному:
- Снизить
per_device_train_batch_sizeдо 1 и компенсировать черезgradient_accumulation_steps. - Включить gradient checkpointing. Помогает сильнее всего при длинном контексте, качество модели не страдает.
- Перейти на 8-битный оптимизатор через
bitsandbytes, если статика упирается в состояния Adam. - Перейти с полного дообучения на QLoRA, если этого ещё не сделано. Разница на порядок, а не на проценты.
- Очистить кеш — помогает редко, но проверить стоит:
import gc
import torch
torch.cuda.empty_cache()
gc.collect() - Распределить обучение через FSDP или DeepSpeed ZeRO, если карт несколько.
Что в итоге
Разница между инференсом и обучением — это 2 байта на параметр против 18. Отсюда следует всё остальное: модель, которая свободно отвечает на запросы в 14 ГБ, для полного дообучения требует 126 ГБ.
Для экспериментов с 7B хватит 12–16 ГБ при использовании QLoRA. Для работы с 70B или длинными контекстами ориентируйтесь на 48–80 ГБ. Промежуточный вариант — арендовать карту нужного объёма на время прогона, чтобы не упираться в потолок домашнего железа и не покупать его под разовую задачу.
Надоело видеть CUDA out of memory?
Арендуйте сервер с NVIDIA A6000 на 48 ГБ или A100 на 80 ГБ. Готовое ML-окружение — запускайте код сразу.
Забрать сервер с 80GB VRAM