Когда 24 ГБ VRAM уже мало
Помните статью про тройной GTX 1070 и 24 ГБ VRAM? Там мы радовались MoE-моделям. Но это было полгода назад. Сейчас появились Qwen3-VL 235B, Claude 3.5 Sonnet (со слухами о 400B параметрах), и прочие монстры. 24 ГБ - это детский сад.
Три RTX 3090 дают 72 ГБ VRAM. Кажется, этого должно хватить на всё. Но не тут-то было. Сырая 235B-параметровая модель в формате FP16 требует 470 ГБ памяти. Даже в формате Q4_K_M - около 120 ГБ. Как впихнуть невпихуемое?
1 Зачем вообще это нужно?
Слышу вопрос: "Зачем запускать 235B на трех 3090, если можно взять одну A100 80GB?". Отвечаю: потому что три 3090 стоят дешевле, чем одна A100. Потому что у многих энтузиастов уже есть одна 3090, и докупить еще две б/у - реально. Потому что это вызов. И потому что качество 235B-модели на TQ1 квантовании всё равно бьет 70B-модель в Q4.
Главная проблема не в том, чтобы загрузить модель. Главная проблема - заставить ее работать с приемлемой скоростью. 1 токен в секунду - это не работа, это издевательство.
Железо: что работает, а что нет
Моя конфигурация:
- 3x RTX 3090 (не Founders Edition, с нормальным охлаждением)
- Материнка: ASUS ProArt X670E-CREATOR WIFI
- Процессор: AMD Ryzen 9 7950X
- Память: 128 ГБ DDR5 6000MHz
- БП: 1600W (да, это перебор, но лучше перебор)
Самая большая ошибка, которую делают все: пытаются запихнуть три двухслотовые карты в обычный корпус. Не выйдет. Нужен либо открытый стенд, либо корпус с 8+ слотами расширения. Либо водяное охлаждение.
2 Настройка PCIe и драйверов
Здесь есть нюанс. В теории PCIe 4.0 x8 дает 16 ГБ/с. Этого достаточно. На практике - если у вас карты работают в x8/x8/x8 режиме, всё ок. Но если какая-то карта попадает в x4 слот - готовьтесь к 30% просадке скорости.
Проверяем:
nvidia-smi topo -m
Должны увидеть что-то вроде:
GPU0 GPU1 GPU2
GPU0 X PIX PIX
GPU1 PIX X PIX
GPU2 PIX PIX X
Если видите "NODE" вместо "PIX" - у вас проблемы с пропускной способностью между картами.
Квантование: жестокий выбор между скоростью и качеством
Вот таблица, которая всё объясняет:
| Формат | Размер 235B | Качество | Скорость (tok/s) | Влезает в 72GB? |
|---|---|---|---|---|
| FP16 | 470 GB | 100% | 0.5-1 | Нет |
| Q4_K_M | 120 GB | ~95% | 2-3 | Нет |
| Q3_K_S | 90 GB | ~85% | 4-5 | С натяжкой |
| TQ1* | 30 GB | ~70% | 8-12 | Да |
*TQ1 - экспериментальный формат 1-битного квантования в llama.cpp. Не путать с Q2_K или другими "официальными" форматами.
Видите проблему? Чтобы впихнуть 235B в 72 ГБ, нужно использовать TQ1. Но качество падает до 70% от оригинала. Стоит ли оно того?
Мой ответ: для некоторых задач - да. 70% от 235B всё равно лучше, чем 95% от 70B-модели в Q4. Особенно для задач, где важны знания, а не креативность.
3 Конвертация в TQ1
Вот команда, которая работает (после сборки llama.cpp с поддержкой CUDA):
./quantize \
models/Qwen3-VL-235B/Qwen3-VL-235B-f16.gguf \
models/Qwen3-VL-235B/Qwen3-VL-235B-tq1.gguf \
tq1
Внимание: конвертация 235B модели в TQ1 занимает 6-8 часов и требует 500+ ГБ свободного места на диске. Не начинайте этот процесс, если у вас нет SSD и терпения.
Запуск: магия llama.cpp
Основная команда для запуска:
./main \
-m models/Qwen3-VL-235B/Qwen3-VL-235B-tq1.gguf \
-ngl 99 \
-t 16 \
-c 4096 \
-b 512 \
--temp 0.7 \
--repeat-penalty 1.1 \
-mg 0,1,2 \
-ins
Разберем ключевые флаги:
-ngl 99- загрузить ВСЕ слои в VRAM. Для TQ1 это возможно.-mg 0,1,2- использовать GPU 0, 1 и 2. Важно: порядок имеет значение для скорости.-t 16- 16 потоков CPU. Не ставьте больше, чем физических ядер.-c 4096- контекст 4k. Для 235B больше и не нужно - память закончится.
А вот как НЕ надо делать (видел в статье про Qwen3-VL на CPU):
# ПЛОХО: так вы получите 0.5 tok/s
./main -m model.gguf -ngl 33 -t 32 -c 8192 -mg 0,2,1
Почему плохо? -ngl 33 загрузит только 33% слоев в VRAM, остальное будет в RAM. Для 235B это смерть. -t 32 на 16-ядерном процессоре создаст contention. -mg 0,2,1 нарушает физический порядок карт.
Бенчмарк: холодные цифры
Я протестировал несколько моделей на одинаковом промпте ("Напиши эссе о будущем ИИ на 500 слов"). Результаты:
| Модель | Параметры | Формат | Скорость (tok/s) | Качество* | VRAM usage |
|---|---|---|---|---|---|
| Qwen3-VL | 235B | TQ1 | 8-12 | 7/10 | 65 GB |
| Claude 3.5 Sonnet** | ~200B | Q3_K_S | 3-4 | 8/10 | 72 GB (full) |
| GPT-4-class MoE | ~180B | Q4_K_M | 1-2 | 9/10 | Не влезла |
| Mixtral 8x22B | 141B | Q4_K_M | 15-20 | 8/10 | 45 GB |
*Качество оценивал субъективно по связности, глубине и оригинальности ответа.
**Неофициальная реализация, точность параметров неизвестна.
Что видим? Mixtral 8x22B в Q4_K_M даёт 15-20 tok/s и занимает всего 45 ГБ. Это лучший компромисс. Но если нужна именно 235B - придется мириться с 8-12 tok/s и TQ1.
Проблемы, с которыми столкнетесь
1. Out of memory при запуске
Даже если модель должна влезть, llama.cpp иногда резервирует память под кэш, контекст и прочее. Решение: уменьшить -c (контекст) или -b (batch size).
2. Разная загрузка GPU
Часто вижу, что GPU0 загружен на 90%, GPU1 на 60%, GPU2 на 30%. Это нормально для llama.cpp. Но если разница больше - проверяйте -mg порядок и PCIe топологию.
3. Перегрев
Три 3090 под нагрузкой - это 1000+ ватт тепла. Без хорошего охлаждения карты будут троттлить уже через 10 минут. Решение: лимит мощности через nvidia-smi -pl 300 для каждой карты. Потеряете 10% производительности, но избежите перегрева.
Стоит ли игра свеч?
После недели тестов я пришел к выводу: запускать 235B модели на трех 3090 - это экстремальный спорт. Для реальной работы лучше использовать Mistral Vibe или другие 70B-модели. Они дают сравнимое качество при 3-4 раза большей скорости.
Но если хочется именно 235B - теперь вы знаете, как это сделать. TQ1 квантование, правильные флаги llama.cpp, и много терпения.
И последний совет: не пытайтесь запустить таким же образом 355B модель. Для этого нужно либо 4x3090, либо совсем другие оптимизации.
А что насчет будущего? Жду появления Q4_T - нового формата квантования, который обещает 4-битное качество при 2-битном размере. Тогда 235B влезет в 72 ГБ без потери качества. Но пока это лишь слухи в репозитории llama.cpp.