Конец эпохи OOM ошибок
Вы знаете этот момент. Скачиваете новую модель из библиотеки Ollama, запускаете инференс - и через 30 секунд получаете классическое "CUDA out of memory". Только что купленный сервер с 48 ГБ VRAM уже не тянет модель на 120 миллиардов параметров. Что дальше? Покупать карту за 50 тысяч долларов?
Нет. Есть способ проще. NVMe Swapping.
Эта техника позволяет запускать модели, которые в 2-3 раза превышают доступную VRAM. На сервере с 48 ГБ VRAM можно работать с моделями до 120-140 ГБ. Задержка на загрузку слоя? Всего 1.2-2.5 секунды. Дешевле, чем аренда дополнительных GPU.
Если вы читали наш гайд про 10 ГБ VRAM, то знаете: квантование помогает, но не решает проблему кардинально. NVMe Swapping - следующий уровень.
Почему NVMe, а не обычный SSD?
Сначала цифры. Средняя скорость чтения NVMe Gen4: 7000 МБ/с. Обычный SATA SSD: 550 МБ/с. Разница в 12 раз.
Когда модель не помещается в VRAM, система начинает подкачивать слои из памяти. Каждый слой современной LLM весит 2-4 ГБ. При работе с SATA SSD задержка на загрузку одного слоя достигает 5-7 секунд. С NVME - 1.2-2.5 секунд.
Пользователь этого почти не замечает. Особенно если использовать асинхронную предзагрузку.
| Тип хранилища | Скорость чтения | Задержка на слой (4 ГБ) | Годно для swapping? |
|---|---|---|---|
| NVMe Gen4 | 7000 МБ/с | 1.2-2.5 сек | ✅ Идеально |
| NVMe Gen3 | 3500 МБ/с | 2.5-4 сек | ✅ Хорошо |
| SATA SSD | 550 МБ/с | 7-10 сек | ⚠️ Только в крайнем случае |
| HDD | 120 МБ/с | 30+ сек | ❌ Забудьте |
Как это работает на самом деле
Ollama (начиная с версии 0.5.0) поддерживает memory-mapped файлы. Вместо загрузки всей модели в VRAM, система создает виртуальное адресное пространство, которое ссылается на файлы модели на диске.
Когда нужен определенный слой - он загружается в VRAM. Остальные остаются на диске. Освобожденные слои выгружаются обратно.
Звучит просто. На практике есть нюансы.
1 Подготовка железа: что реально нужно
Не верьте мифам. NVMe Swapping работает почти на любом современном железе. Но есть требования:
- NVMe диск минимум 1 ТБ - модели весят сотни гигабайт
- 64+ ГБ оперативной памяти - для буферов и кэшей
- Linux с ядром 6.1+ - старые ядра плохо работают с memory mapping
- Прямой доступ к GPU - виртуализация убивает производительность
Сервер за 5000 долларов с 48 ГБ VRAM + NVMe Swapping заменяет систему за 50 000 долларов с 192 ГБ VRAM. Математика простая.
2 Настройка системы: неочевидные моменты
Сначала проверьте текущие лимиты:
# Проверяем лимиты memory mapping
cat /proc/sys/vm/max_map_count
# Должно быть не меньше 262144
# Если меньше - увеличиваем
sudo sysctl -w vm.max_map_count=262144
# Делаем постоянным
echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf
Теперь настройка swap-файла (не путать с swapping слоев модели):
# Создаем swap-файл на NVMe
sudo fallocate -l 128G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# Проверяем
swapon --show
Не путайте! Swap-файл в системе - это для ОС. NVMe Swapping в Ollama - это для модели. Это разные вещи, но оба нужны.
3 Настройка Ollama: флаги, которые меняют всё
Вот как выглядит запуск Ollama с NVMe Swapping:
# Останавливаем текущий ollama
sudo systemctl stop ollama
# Редактируем сервисный файл
sudo nano /etc/systemd/system/ollama.service
Добавляем в секцию [Service]:
Environment="OLLAMA_MMAP=1"
Environment="OLLAMA_MAX_LOADED_LAYERS=5"
Environment="OLLAMA_KEEP_ALIVE=-1"
Environment="OLLAMA_NUM_PARALLEL=2"
Что это дает:
- OLLAMA_MMAP=1 - включаем memory mapping
- OLLAMA_MAX_LOADED_LAYERS=5 - максимум 5 слоев в VRAM одновременно
- OLLAMA_KEEP_ALIVE=-1 - модель всегда в памяти (на диске)
- OLLAMA_NUM_PARALLEL=2 - предзагрузка двух слоев вперед
Перезапускаем:
sudo systemctl daemon-reload
sudo systemctl start ollama
sudo systemctl status ollama
4 Запуск моделей: от маленьких до гигантов
Теперь можно запускать что угодно. Даже если модель не помещается в VRAM:
# Запускаем модель 120B на сервере с 48 ГБ VRAM
ollama run deepseek-coder-v3:120b-q4_k_m
# Или модель 180B (да, серьезно)
ollama run command-r-plus:180b-q4_0
Первая загрузка займет время - модель копируется в кэш. Последующие запуски - мгновенные.
Ошибки, которые все совершают
Я видел десятки неправильных настроек. Вот самые частые:
Ошибка 1: Слишком маленький max_map_count
Симптом: "Cannot allocate memory" при запуске модели больше 70B.
Решение: Увеличить vm.max_map_count до 524288 или больше.
Ошибка 2: NVMe диск в RAID 0
Симптом: Задержки 5+ секунд на слой вместо 1-2.
Проблема: RAID 0 добавляет overhead. Для swapping нужен один быстрый NVMe, не два средних в RAID.
Ошибка 3: Запуск нескольких моделей одновременно
Симптом: OOM ошибки появляются снова.
Правда: NVMe Swapping экономит VRAM для одной модели. Для нескольких моделей нужен другой подход с изоляцией ресурсов.
Ошибка 4: Игнорирование температуры NVMe
Симптом: Через час работы скорость падает в 3 раза.
Диагноз: Thermal throttling. NVMe при активном swapping греется как печка.
Решение: Мониторить температуру и добавить охлаждение:
# Установите nvme-cli
sudo apt install nvme-cli
# Проверяем температуру
sudo nvme smart-log /dev/nvme0 | grep temperature
Производительность: что ждать на самом деле
Цифры из реальных тестов на сервере с RTX 6000 Ada (48 ГБ VRAM) и NVMe Gen4:
| Модель | Размер | Без swapping | С swapping | Задержка на слой | Токенов/сек |
|---|---|---|---|---|---|
| Llama 3.1 70B | 40 ГБ (Q4) | ✅ Запускается | ✅ Запускается | - | 24-28 |
| DeepSeek-V3.2 120B | 68 ГБ (Q4) | ❌ OOM | ✅ Работает | 1.8 сек | 8-12 |
| Command R+ 180B | 102 ГБ (Q4) | ❌ OOM | ✅ Работает | 2.3 сек | 4-7 |
| GPT-NeoX 400B | 228 ГБ (Q4) | ❌ OOM | ⚠️ Работает (медленно) | 4.1 сек | 1-2 |
Видите разницу? 120B модель вместо OOM ошибки дает 8-12 токенов в секунду. Для аналитических задач - более чем достаточно.
Когда НЕ использовать NVMe Swapping
Техника не панацея. Есть случаи, когда она только навредит:
- Высокочастотный инференс - если нужно обрабатывать 100+ запросов в секунду, swapping добавит латентность
- Мультитенантные среды - когда на одном сервере работают десятки пользователей с разными моделями
- Модели меньше доступной VRAM - если модель помещается в память, зачем swapping?
- Устаревшее железо - NVMe Gen3 еще работает, но SATA SSD уже нет
Для мультитенантных сред лучше подойдет кластерный подход или контейнеризация с лимитами.
А что насчет Lemonade?
Вы читали наше сравнение Lemonade и Ollama? Lemonade 2.1 (актуальная версия на 25.01.2026) тоже поддерживает memory mapping, но реализация отличается.
Ollama делает swapping прозрачно. Lemonade требует ручной настройки кэширования слоев. Зато дает больше контроля.
Мой совет: для большинства задач хватает Ollama с настройками из этой статьи. Если нужен микроскопический контроль над каждым байтом памяти - смотрите в сторону Lemonade.
Будущее: куда движется технология
К 2027 году (да, я заглядываю вперед) swapping станет стандартом. Причины:
- Модели растут быстрее, чем VRAM в потребительских GPU
- NVMe Gen5 уже дает 14 000 МБ/с - вдвое быстрее текущего Gen4
- Compute Express Link (CXL) позволяет делать swapping между GPU напрямую
Уже сейчас в тестах CXL 3.0 показывает задержки меньше 1 секунды на слой. Это почти как работа из локальной VRAM.
Совет напоследок: не бойтесь экспериментировать с OLLAMA_MAX_LOADED_LAYERS. Для интерактивных чатов ставьте 3-5. Для пакетной обработки - 1-2. Разница в потреблении VRAM может достигать 40%.
Теперь у вас есть оружие против OOM ошибок. Сервер с 48 ГБ VRAM превращается в систему, способную запускать 180B модели. Без кредитов в банке.
Попробуйте. Первая модель, запущенная через swapping, вызывает тот же восторг, что и первый запуск LLM на домашнем ПК. Только масштаб другой.