Сколько VRAM нужно для обучения нейросетей?

Почему обучение требует в 9 раз больше памяти, чем инференс, куда уходят байты на каждый параметр и как уложить дообучение LLM в одну карту с помощью QLoRA и checkpointing.

YouGPU Team Обновлено: 7 мин

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 ГБ, значит влезет» не работает. Веса — меньшая часть расхода.

При обучении память занимают четыре группы данных. Первые три пропорциональны числу параметров, четвёртая зависит от батча и длины последовательности:

  1. Веса модели. В mixed precision хранятся две копии: fp16 для прямого и обратного прохода и fp32 как эталон для обновления.
  2. Состояния оптимизатора. Adam держит на каждый параметр момент и дисперсию, обе в fp32.
  3. Градиенты. Считаются на обратном проходе для каждого параметра.
  4. Активации. Промежуточные результаты слоёв, сохранённые для вычисления градиентов.

Раскладка по байтам, по документации HuggingFace «Model training anatomy»:

КомпонентЧто внутриБайт на параметр
Весаfp16-копия (2 Б) + fp32-эталон (4 Б)6
Оптимизатор (Adam)fp32 momentum (4 Б) + fp32 variance (4 Б)8
Градиентыfp324
Итого статикаmixed precision + Adam18
Активациизависят от батча и длины контекстасчитается отдельно

Сравните с инференсом: там нужны только веса в 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

Порядок действий, от самого дешёвого к самому затратному:

  1. Снизить per_device_train_batch_size до 1 и компенсировать через gradient_accumulation_steps.
  2. Включить gradient checkpointing. Помогает сильнее всего при длинном контексте, качество модели не страдает.
  3. Перейти на 8-битный оптимизатор через bitsandbytes, если статика упирается в состояния Adam.
  4. Перейти с полного дообучения на QLoRA, если этого ещё не сделано. Разница на порядок, а не на проценты.
  5. Очистить кеш — помогает редко, но проверить стоит:
import gc
import torch

torch.cuda.empty_cache()
gc.collect()
  1. Распределить обучение через 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