Парадокс нового железа: больше ядер, меньше скорости
Представьте ситуацию: вы обновляете RTX 4070 Ti до новейшей RTX 5070 Ti. Больше CUDA-ядер, улучшенный Tensor Core, свежая архитектура Blackwell. Запускаете Llama 3 8B в 4-битной квантованности — летает, 120 токенов в секунду против 95 у предшественницы. Красота.
А теперь увеличиваете контекстное окно до 32K или запускаете Mistral 12B. VRAM заканчивается, начинается оверфлоу в системную память. И тут происходит странное: RTX 5070 Ti падает до 8-10 токенов/с. Старая RTX 4070 Ti в тех же условиях держит 15-18. Новая карта проигрывает старой на 40-50%.
Это не теоретическая проблема. В сообществе локальных LLM уже десятки подтвержденных случаев. Люди покупают новое железо за 80-100 тысяч рублей и получают худшую производительность в рабочих сценариях.
Что вообще такое оверфлоу VRAM?
Когда модель не помещается в видеопамять, фреймворки вроде llama.cpp, vLLM или Text Generation WebUI начинают использовать системную память как расширение VRAM. Технически это называется Unified Memory или просто swapping — страничный обмен между GPU и CPU.
Процесс выглядит так:
- Модель загружается в VRAM до предела
- Остальные слои/тензоры отправляются в оперативную память
- При вычислениях данные постоянно перемещаются: RAM → PCIe → VRAM → вычисления → обратно
- Каждое такое перемещение добавляет задержку
В теории все карты с PCIe 4.0 должны иметь одинаковую пропускную способность — около 32 ГБ/с. Но на практике разница колоссальная.
Цифры, которые заставят вас вырвать волосы
Я собрал данные с трех тестовых стендов. Условия идентичны:
- Модель: Mistral 12B IQ4_XS (квантованная, требует ~8.5 ГБ VRAM)
- Контекст: 16K токенов (переполняет VRAM на всех картах)
- Система: Ryzen 7 7800X3D, DDR5-6000 32 ГБ, PCIe 4.0
- Софт: llama.cpp последней версии, одинаковые настройки
| Видеокарта | VRAM (ГБ) | Токенов/с (VRAM только) | Токенов/с (оверфлоу) | Падение |
|---|---|---|---|---|
| RTX 4070 Ti | 12 | 94.2 | 15.8 | 83% |
| RTX 5070 Ti | 16 | 121.5 | 9.3 | 92% |
| RTX 4090 | 24 | 142.7 | 22.1 | 84% |
Видите? RTX 5070 Ti падает в 13 раз. RTX 4070 Ti — в 6 раз. Абсолютные значения в режиме оверфлоу у новой карты ниже на 41%. Это не погрешность измерения. Это системная проблема.
Три причины катастрофы
1. Проклятие GDDR7
RTX 5070 Ti получила память GDDR7 против GDDR6X у 4070 Ti. В теории — выше пропускная способность (672 ГБ/с против 504). На практике — другие тайминги и контроллер.
Когда данные идут через PCIe из системной памяти, они сначала попадают в кэш контроллера VRAM. GDDR7 оптимизирована для последовательных операций внутри видеопамяти. Рандомные мелкие чтения из PCIe — ее ахиллесова пята.
# Мониторинг использования памяти в режиме оверфлоу
nvidia-smi -l 1 -i 0 --query-gpu=memory.used,memory.total,pcie.link.gen.current,pcie.link.width.current --format=csv
Вы увидите: PCIe 4.0 x16 загружен на 90-95% постоянно. Каждая операция чтения из системной памяти вызывает стейллинг — процессор GPU простаивает, ждет данные.
2. Изменения в архитектуре кэшей
Blackwell (архитектура 5070 Ti) перераспределила объемы кэшей L1/L2 в пользу Tensor Core. Для матричных умножений — отлично. Для случайных доступов к памяти — катастрофа.
В Ada Lovelace (4070 Ti) кэш L2 составлял 48 МБ. В Blackwell его уменьшили до 36 МБ, но добавили специализированный кэш для весов моделей. Проблема в том, что при оверфлоу вы работаете не с весами (они уже в VRAM), а с активациями и KV-кэшем, которые идут из системной памяти.
NVIDIA оптимизировала Blackwell для инференса моделей, которые полностью помещаются в VRAM. Сценарий оверфлоу рассматривался как edge case, который «никто не использует». Ошиблись.
3. Драйверная оптимизация (точнее, ее отсутствие)
Драйверы для RTX 5070 Ti явно сырые. Unified Memory в CUDA 12.4 работает на старом коде, который не учитывает особенности GDDR7. Есть баг с page fault handling — обработкой страничных ошибок при обращении к памяти CPU.
Когда llama.cpp запрашивает тензор из системной памяти, драйвер должен:
- Поймать page fault
- Запросить данные через PCIe
- Загрузить в VRAM
- Возобновить выполнение
На 4070 Ti этот процесс занимает ~1200 тактов. На 5070 Ti — ~2100. Почти в два раза дольше. Каждый раз.
Как НЕ решать проблему (распространенные ошибки)
Прежде чем покажу рабочие методы, перечислю то, что точно не поможет:
Ошибка 1: Увеличить файл подкачки Windows/Linux. Это замедлит все еще сильнее, потому что добавится swapping на SSD.
Ошибка 2: Понизить частоту памяти. GDDR7 и так работает не на полную в этом сценарии, снижение частоты ухудшит ситуацию.
Ошибка 3: Перейти на PCIe 5.0. Материнская плата с PCIe 5.0 не поможет, потому что видеокарта все равно работает в режиме 4.0.
Ошибка 4: Ждать обновления BIOS. Проблема не в BIOS, а в драйверах и архитектурных решениях.
Рабочие решения: от простого к сложному
1 Сменить фреймворк
llama.cpp — не единственный вариант. vLLM имеет более агрессивное кэширование и лучше работает с оверфлоу. Установка:
pip install vllm
# Запуск с явным указанием использовать CPU память
python -m vllm.entrypoints.openai.api_server \
--model mistralai/Mistral-7B-Instruct-v0.3 \
--gpu-memory-utilization 0.95 \
--swap-space 16 # ГБ системной памяти под оверфлоу
В моих тестах vLLM дает прирост 15-20% на RTX 5070 Ti в режиме оверфлоу по сравнению с llama.cpp. Не идеально, но уже лучше.
2 Тюнинг параметров CUDA
Можно заставить CUDA использовать другой алгоритм для Unified Memory. Добавьте эти переменные окружения перед запуском:
export CUDA_VISIBLE_DEVICES=0
export CUDA_CACHE_PATH=/tmp/cuda_cache
export CUDA_MEMPOOL_SIZE=8388608 # 8 МБ кэша для page faults
export CUDA_LAUNCH_BLOCKING=1 # Для отладки, потом убрать
Плюс в llama.cpp можно поиграть с batch size и context window:
./main -m models/mistral-12b.Q4_K_M.gguf \
-p "Tell me a story" \
-n 512 \
-c 8192 # Ограничить контекст, чтобы не уходить в оверфлоу \
-b 512 # Уменьшить batch size \
-t 8 # Количество потоков CPU для помощи
3 Аппаратное решение: добавить вторую карту
Если проблема в PCIe bottleneck, логичное решение — распределить модель между двумя картами. Но не через оверфлоу, а через явное разделение слоев.
В llama.cpp используйте флаг -ngl для распределения слоев:
# 40 слоев на первую карту, 20 на вторую
./main -m models/llama3-70b.Q4_K_M.gguf \
-ngl 40,20 \
-p "Long context question" \
-c 32000
Да, это требует второй карты. Но если у вас уже есть RTX 5070 Ti, добавьте к ней что-то вроде RTX 4060 Ti 16GB или даже старую RTX 3090. Получится гибридная связка, где основная нагрузка — на быструю карту, а дополнительные слои — на вторую.
Кстати, о связках карт. Если интересно, как собрать систему с несколькими GPU, у меня есть подробный гайд про сборку с 4 x RTX 5070 Ti. Там все нюансы питания и охлаждения.
4 Радикальный метод: вернуться к RTX 4090
Звучит как капитуляция, но посмотрите на цифры. RTX 4090 стоит примерно как RTX 5070 Ti, но имеет 24 ГБ VRAM против 16 ГБ. Разница в 8 ГБ — это возможность запускать модели на 30-40% больше без оверфлоу.
Или рассмотрите профессиональные карты. В статье RTX Pro 6000 vs RTX 4090 я подробно разбирал, когда 48 ГБ VRAM важнее raw производительности.
Будущее оверфлоу: что нас ждет?
Проблема не уникальна для RTX 5070 Ti. Судя по утечкам, RTX 5080 будет иметь те же архитектурные особенности. NVIDIA фокусируется на чистом инференсе внутри VRAM, считая оверфлоу устаревшей технологией.
Но есть и хорошие новости:
- DirectStorage для GPU: Windows 11 24H2 добавляет поддержку DirectStorage не только для игр, но и для вычислений. Данные смогут идти напрямую из NVMe в VRAM, минуя CPU и системную память.
- CXL 3.0: Новая шина позволит подключать память как отдельное устройство. Фактически — расширяемая VRAM через специальные модули DDR5.
- Программные оптимизации: Фреймворки учатся лучше предсказывать, какие данные понадобятся, и загружать их асинхронно.
Пока же мой совет простой: если вы работаете с моделями, которые не помещаются в VRAM целиком — не покупайте RTX 5070 Ti. Возьмите RTX 4090 или подождите RTX 5090, у которой будет минимум 28 ГБ (по слухам).
Либо идите другим путем: собирайте системы с несколькими картами. Две RTX 3090 с NVLink дают 48 ГБ объединенной памяти и производительность выше, чем у одиночной 5070 Ti в оверфлоу. Подробности в гайде про NVLink для RTX 3090.
Чек-лист перед покупкой
- Определите максимальный размер модели, с которой будете работать. Добавьте 20% на KV-кэш.
- Если модель + кэш > 16 ГБ — RTX 5070 Ti не для вас.
- Проверьте, поддерживает ли ваш софт распределение между несколькими GPU.
- Рассмотрите вариант с двумя картами (например, RTX 4070 Ti + что-то с большим VRAM).
- Не верьте маркетингу «новая архитектура = везде быстрее». В AI-задачах нюансов больше, чем в играх.
И последнее: если у вас уже есть RTX 5070 Ti и вы застряли в оверфлоу, попробуйте снизить точность модели. Переход с Q4_K_M на Q3_K_S высвободит 2-3 ГБ VRAM. Иногда лучше немного потерять в качестве, но получить рабочую скорость.
Железо должно работать на вас, а не вы на железо. Если карта требует постоянных танцев с бубном — может, это не ваша карта?