Как рассчитать размер модели в памяти?¶
Языковая модель состоит из параметров (весов), каждый из которых занимает определённое количество байт в зависимости от формата хранения (precision).
Формула оценки объема в памяти (без учёта оптимизаций и буферов):
Объем модели в памяти (байт) = Кол-во параметров × Размер одного параметра
Размер одного параметра:¶
| Формат | Тип данных | Размер 1 параметра |
|---|---|---|
| FP32 | float32 | 4 байта |
| FP16 | float16 (half) | 2 байта |
| BF16 | bfloat16 | 2 байта |
| INT8 | int8 | 1 байт |
| INT4 | int4 | 0.5 байта |
| INT3 | int3 | 0.375 байта |
| INT2 | int2 | 0.25 байта |
| GPTQ (4bit) | INT4 + мета | ~0.6 байта |
| GPTQ (3bit) | INT3 + мета | ~0.45 байта |
| GGUF | зависит | 0.3 – 0.6 байта |
Таблица памяти по размеру модели:¶
| Размер модели | FP32 | FP16/BF16 | INT8 | INT4 | GPTQ 4bit | GGUF (int4) |
|---|---|---|---|---|---|---|
| 125M | 0.5GB | 0.25GB | 125MB | ~65MB | ~75MB | ~50MB |
| 350M | 1.4GB | 0.7GB | 350MB | 175MB | ~210MB | ~150MB |
| 1.3B | 5.2GB | 2.6GB | 1.3GB | 650MB | ~780MB | ~600MB |
| 6.7B | 26.8GB | 13.4GB | 6.7GB | 3.3GB | ~4.0GB | ~3.0GB |
| 13B | 52GB | 26GB | 13GB | 6.5GB | ~7.8GB | ~6.0GB |
| 30B | 120GB | 60GB | 30GB | 15GB | ~18GB | ~14GB |
| 65B | 260GB | 130GB | 65GB | 32GB | ~36–40GB | ~28–32GB |
Важно: Это только веса модели, без учета активаций, буферов, оптимизаторов и прочего. Для inference нужен запас 10–30%, для обучения — гораздо больше.
Что ещё влияет на потребление GPU-памяти:¶
| Фактор | Как влияет |
|---|---|
| Batch Size | Увеличивает буферы активаций и внимание |
| Sequence Length | Больше токенов = больше self-attention операций |
| Number of Layers | Больше слоёв = больше активаций и промежуточных тензоров |
| Model Parallelism | Делит модель на несколько GPU, снижает требования на 1 GPU |
| Precision (FP16 vs INT8) | Меньшая точность = меньше памяти |
| Use of KV Cache (e.g., Transformers) | Хранение контекста требует памяти ∝ sequence_length × hidden_size |
| Framework (Transformers, vLLM, Exllama, llama.cpp) | Некоторые фреймворки эффективнее по памяти |
| LoRA / PEFT / adapters | Добавляет веса, но незначительно (+1–5%) |
| Gradient Checkpointing (в обучении) | Снижает потребление памяти за счёт recomputation |
| Tokenizer / Embeddings | Не сильно влияет, но в больших моделях может быть ощутимо |
Расширенный пример — LLaMA 33B:¶
- Параметров: ~33 миллиардов
-
В FP16: 33e9 × 2 байта = ~66 GB только на веса
-
Inference с batch size 1, seq len 128, no KV cache:
- В FP16: GPU с 80–90GB VRAM может справиться
- В 4bit: GPU с 16–24GB VRAM достаточно
Практические рекомендации:¶
| Сценарий | Рекомендованное решение |
|---|---|
| Инференс 7B модели | RTX 3060+ (12GB), особенно с квантизацией |
| Инференс 13B модели | A100 40GB или 4bit модель на RTX 3090 |
| Инференс 30B–33B модели | A100 40/80GB или 4bit модель + оптимизации |
| Инференс 65B модели | 2×A100 80GB или GGUF 4bit модель |
| Обучение 7B модели с FP16 | 4×A100 40GB с DeepSpeed или FSDP |
Вывод:¶
- Расчет зависит от параметров модели и precision.
- A100 40GB — очень мощная карта, но full precision 32B+ модели уже “на грани”.
- С квантизацией (4bit) модели до 65B можно запускать даже на 24–40GB.