Зачем связывать две 7900 XTX для одной модели?
Потому что 48 ГБ VRAM на столе дешевле, чем один H100. Потому что сообщество мастерит адские конфигурации, пока NVIDIA продает сказки про NVLink. Потому что в 2026 году запускать 35-миллиардную модель на потребительских видеокартах — это не хобби, а необходимость. Qwen3.5-35B — отличный кандидат: умная, многоязычная, но требует около 20-24 ГБ VRAM для комфортной работы в FP16. Одна 7900 XTX (24 ГБ) справляется, но впритык. Две — дают запас и скорость.
Проблема в том, что у AMD нет аналога NVLink для RDNA3. Данные между картами передаются через PCIe, и все слои модели надо делить вручную. Vulkan-бэкенд в llama.cpp (начиная с версии 3.1) научился это делать, но требует танцев с бубном. Без правильного сплита вы получите либо ошибку памяти, либо скорость как у улитки.
Железо и софт: что нужно перед стартом
Две Radeon RX 7900 XTX. Материнская плата с двумя PCIe x16 слотами (желательно 4.0 или 5.0). Блок питания от 1000W. Linux. Да, Windows с WSL2 теоретически работает, но Vulkan-драйвера там — это боль, о которой я молчу. Мы используем Ubuntu 24.04 LTS или свежий Arch.
- Драйвер: AMDGPU из репозитория kernel 6.11+ (актуально на март 2026). RADV (Vulkan) идет в комплекте.
- llama.cpp: версия 3.2.0 или новее. Именно здесь появились критические фиксы для multi-GPU на Vulkan.
- Модель: Qwen3.5-35B-Instruct-FP16 (или Qwen3.5-35B-Base). Качаем с Hugging Face.
- Память: 32+ ГБ ОЗУ, потому что часть слоев может уйти в системную память при нехватке VRAM.
1Ставим всё с нуля: драйверы и llama.cpp
Открываем терминал. Не паникуем.
# Обновляем систему и ставим Vulkan-тулзы
sudo apt update && sudo apt upgrade -y
sudo apt install vulkan-tools mesa-vulkan-drivers git build-essential -y
# Клонируем llama.cpp (берем самую свежую версию)
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
git checkout master # или конкретный тег, например v3.2.0
# Собираем с поддержкой Vulkan. Обратите внимание на флаг -DLLAMA_VULKAN=1
mkdir build && cd build
cmake .. -DLLAMA_VULKAN=1 -DCMAKE_BUILD_TYPE=Release
make -j$(nproc)
# После сборки бинарник ./bin/main будет лежать в build/bin/
# Проверяем, что Vulkan видит обе карты
vulkaninfo | grep "GPU id"Если видите две GPU — отлично. Если одну — проверьте подключение карт и драйверы. Иногда помогает явно указать AMD_VULKAN_ICD=RADV в окружении.
2Конвертируем модель и готовим сплит
Qwen3.5 в формате Hugging Face нельзя просто скормить llama.cpp. Нужно конвертировать в GGUF. К счастью, в llama.cpp есть скрипт.
# Возвращаемся в корень llama.cpp
cd ../..
# Клонируем репозиторий с моделью (или качаем вручную)
git lfs clone https://huggingface.co/Qwen/Qwen3.5-35B-Instruct
# Конвертируем в GGUF FP16 (можно использовать и IQ4_XS для экономии памяти)
python3 llama.cpp/convert.py \
--outfile qwen35-35b-instruct-fp16.gguf \
--outtype f16 \
Qwen3.5-35B-Instruct/
# Модель весит около 20 ГБ. Убедитесь, что на диске есть место.А вот теперь самое важное: распределение слоёв. Модель Qwen3.5-35B имеет 64 слоя. Мы должны решить, сколько слоев отдать первой карте, сколько второй. Неверный сплит — и одна карта будет простаивать, а другая захлебнется. Золотое правило: делим примерно пополам, но с учетом памяти. На каждую карту по 12 ГБ под модель, плюс запас для кеша контекста.
Рассчитываем сплит: -ngl 63 --split-mode layer --tensor-split 20,44. Что это значит? -ngl 63 загружает 63 слоя в VRAM (почти все, 64-й иногда оставляем на CPU). --tensor-split 20,44 говорит: первые 20 слоев на GPU 0, остальные 44 на GPU 1. Почему не поровну? Потому что первый слой часто занимает больше памяти из-за эмбеддингов. Это эмпирика, проверенная на версии llama.cpp 3.2.
3Первый запуск и бенчмарк
Запускаем инференс с нашим сплитом. Сначала простой тест на генерацию.
./build/bin/main -m qwen35-35b-instruct-fp16.gguf \
-p "Ты — ИИ-ассистент. Напиши короткое стихотворение про Rust и Vulkan." \
-n 256 \
-ngl 63 \
--split-mode layer \
--tensor-split 20,44 \
-c 4096 \
-b 512 \
-t 12Флаги: -c 4096 — контекст, -b 512 — размер батча, -t 12 — потоки CPU. Если все хорошо, вы увидите генерацию. Но нам нужны цифры. Запускаем llama-bench.
./build/bin/llama-bench -m qwen35-35b-instruct-fp16.gguf \
-ngl 63 \
--split-mode layer \
--tensor-split 20,44 \
--verbosity 1На моей системе с двумя 7900 XTX (драйвер amdgpu 6.11, RADV 1.3.275) получается примерно 42 токена/с при размере промпта 512 и генерации 128 токенов. Для сравнения: одна карта дает около 28 токенов/с. Прирост почти 50%, что очень неплохо для PCIe 4.0 x8/x8.
| Конфигурация | Скорость (токенов/с) | Загрузка GPU 1 | Загрузка GPU 2 |
|---|---|---|---|
| Одна 7900 XTX (24 слоя на GPU) | ~28 | 100% | 0% |
| Две 7900 XTX (сплит 20,44) | ~42 | ~85% | ~90% |
| Две 7900 XTX (сплит 32,32) — НЕПРАВИЛЬНО | ~35 (с просадками) | 100%, потом паузы | нестабильная |
Где собака зарылась: нюансы и грабли
Теперь о том, что сломает вам день, если не знать.
1. OOM (Out of Memory) при, казалось бы, правильном сплите
Вы рассчитали, что на каждую карту по 12 ГБ, но llama.cpp падает с ошибкой памяти. Почему? Потому что Vulkan-бэкенд резервирует память под контекст и кеш K/V. При контексте 4096 токенов и 64 слоях это добавляет несколько гигабайт. Решение: уменьшить -c (контекст) или использовать --no-mmap. Или просто отдать чуть меньше слоев на первую карту. Сплит 18,46 часто работает стабильнее.
2. Одна карта грузится на 100%, вторая на 20%
Классическая проблема неравномерного распределения. Слои обрабатываются последовательно, и если они поделены криво, одна карта ждет другую. Используйте nvtop или rocm-smi для мониторинга. Подбирайте сплит экспериментально. Иногда помогает флаг --main-gpu 1, чтобы поменять порядок.
3. Segmentation fault в середине генерации
Знакомо? Возможно, проблема в драйверах или памяти VRAM. Обновите ядро и amdgpu. Если не помогает, попробуйте собрать llama.cpp с -DLLAMA_VULKAN_DEBUG=1 и посмотреть логи. Еще одна причина — битая модель. Переконвертируйте. У нас есть целая статья про Segmentation Fault на AMD MI50, многие принципы применимы и к RDNA3.
4. Низкая скорость compared to NVIDIA
Да, две 7900 XTX не догонят RTX 4090 в некоторых задачах из-за отсутствия tensor cores и оптимизированных ядер для ML. Но за эти деньги вы получаете 48 ГБ VRAM, что для NVIDIA стоит как маленькая ипотека. И Vulkan-бэкенд активно развивается. После обновления прошивки AMD (которое мы описывали здесь) скорость выросла на 15-20%.
А что с альтернативами? vLLM и другие движки
llama.cpp — не единственный вариант. vLLM с версии 0.5.0 экспериментально поддерживает AMD GPU через Vulkan. Но настройка сложнее, требует своих переменных окружения. Мы писали про это в гайде Как настроить vLLM для моделей Qwen3.5 на двух AMD Radeon 7900 XTX. vLLM может дать более высокую пропускную способность (throughput) при батчинге, но latency часто выше. Для интерактивного чата llama.cpp пока удобнее.
FAQ: вопросы, которые вы зададите через час
Можно ли использовать 3 или 4 видеокарты?
Теоретически да. llama.cpp поддерживает --tensor-split 10,20,34 для трех GPU. Но PCIe lanes станут узким местом. И материнская плата должна поддерживать. Для 72B моделей это может быть оправдано. Смотрите наш опыт с тремя 3090.
Почему не используется ROCm?
ROCm официально не поддерживает RDNA3 (7900 XTX) для ML инференса. Точнее, поддерживает, но с огромным количеством костылей. Vulkan-бэкенд в llama.cpp — это обходной путь, который, как ни странно, работает стабильнее и быстрее на потребительских картах.
Какой сплит лучше для контекста 8192 токенов?
Увеличьте запас памяти под кеш. Попробуйте сплит 16,48 или даже 14,50. Обязательно мониторьте использование VRAM через rocm-smi --showmeminfo. И не забудьте увеличить -c в команде запуска.
Что делать, если модель загружается, но генерация медленная?
Проверьте частоту GPU. Иногда карты не выходят из idle-режима. Запустите стресс-тест Vulkan или установите производительный режим в /sys/class/drm/card*/device/power_dpm_force_performance_level. Также убедитесь, что PCIe работает на x8 или x16 для каждой карты (проверка: lspci -v).
Последний совет: забудьте про равномерный сплит
Самый большой миф — что слои нужно делить строго пополам. На практике первые и последние слои модели ведут себя по-разному с точки зрения памяти и вычислений. Экспериментируйте. Запустите llama-bench с разными --tensor-split значениями и запишите результаты. Иногда разница между 20,44 и 22,42 может быть 5 токенов/с. Это как разница между чашкой кофе и его отсутствием в четыре утра, когда модель наконец-то заработала.
И помните: две 7900 XTX — это не магическая пуля, а инструмент. Дорогой, мощный, немного упрямый. Но когда он работает, вы получаете свою собственную 35-миллиардную нейросеть на столе, которая не просит API-ключей и не смотрит на вас через камеру. В 2026 году это дорогого стоит.