Связка мини-ПК Bosgame M5 и внешней видеокарты RTX PRO 6000 Max-Q выдаёт 44–59.5 токенов в секунду на декодинге и до 1513 токенов в секунду на префилле при запуске DeepSeek-V4-Flash-0731. Уровень принятия черновиков в спекулятивном декодировании достигает 0.535. Гибридный запуск задействует одновременно CUDA и ROCm, распределяя слои модели между двумя вычислительными устройствами.
Эти цифры получены на трёх квантованных версиях - UD-Q2_K_XL, UD-Q4_K_XL, UD-Q8_K_XL. Тест подтверждает: экзотическая конфигурация с eGPU на AMD-платформе способна тянуть 284-миллиардную MoE-модель без серверных ускорителей. Ниже - полный разбор методики, команд запуска и архитектурных нюансов, влияющих на распределение экспертов.
Материал продолжает серию тестов AI-MANUAL по запуску больших моделей на нестандартном железе. Ранее мы разбирали рекордный инференс DeepSeek V4 Flash на Ryzen AI MAX+ 395 и оптимизацию на одном B300.
Результаты тестирования: скорость и качество на разных квантованных версиях
Тестовый стенд: Bosgame M5 с процессором AMD Ryzen, 64 ГБ оперативной памяти, внешняя NVIDIA RTX PRO 6000 Max-Q через интерфейс OCuLink. Модель - DeepSeek-V4-Flash-0731 в трёх вариантах квантизации UD-Q2_K_XL, UD-Q4_K_XL, UD-Q8_K_XL. Запуск через llama-server с распределением слоёв между CUDA0 (внешняя карта) и ROCm0 (интегрированная графика AMD).
Замеры проводились на синтетическом наборе промптов длиной от 512 до 4096 токенов. Для каждой квантизации выполнялось три прогона, результаты усреднялись. Холодный старт не учитывался - все цифры сняты после прогрева кэша.
Скорость декодирования: от 44 до 59.5 токенов/с
Декодинг - генерация токенов после обработки промпта, критичная метрика для диалоговых приложений. Измерялась как число выходных токенов, делённое на время фазы генерации, исключая префилл.
- UD-Q8_K_XL: 44.0 токенов/с. Самая тяжёлая и точная версия. Большая часть весов остаётся на eGPU, объём пересылок между устройствами минимален.
- UD-Q4_K_XL: 52.3 токенов/с. Компромиссный вариант. Снижение разрядности ускоряет вычисления на обоих устройствах, потери качества незначительны для большинства задач.
- UD-Q2_K_XL: 59.5 токенов/с. Максимальная скорость. Модель почти полностью помещается в VRAM внешней карты, ROCm0 обрабатывает лишь небольшую часть слоёв.
Разброс в 15.5 токенов/с между крайними квантизациями объясняется двумя факторами: объёмом вычислений на тензорных ядрах и пропускной способностью шины OCuLink. На Q2 версии PCIe-трафик снижается, узкое место смещается в вычислительную производительность GPU.
Скорость префилла: 564–1513 токенов/с
Префилл - этап обработки входного промпта перед началом генерации. Определяет, насколько быстро модель «вчитывается» в контекст. Замерялся на промптах длиной 2048 токенов с батч-размером 1.
- UD-Q8_K_XL: 564 токенов/с.
- UD-Q4_K_XL: 987 токенов/с.
- UD-Q2_K_XL: 1513 токенов/с.
Префилл масштабируется почти линейно относительно степени сжатия весов. Причина: фаза префилла вычислительно насыщена, и снижение битности параметров прямо пропорционально уменьшает количество операций. На коротких промптах разница менее выражена - узким местом становится запуск ядер и накладные расходы llama-server.
Спекулятивное декодирование: уровень принятия черновиков до 0.535
Спекулятивное декодирование работает так: лёгкая драфт-модель генерирует несколько гипотез-продолжений, основная модель проверяет их параллельно. Уровень принятия черновиков - доля токенов драфтера, которые основная модель сочла корректными. Значение 0.535 означает, что каждый второй черновой токен принимается, и модель пропускает этапы авторегрессионного декодинга.
Драфтер DSpark, портированный из закрытого PR, показал стабильные 0.51–0.535 на всех трёх квантизациях. Это хороший показатель для MoE-архитектур: fine-grained эксперты снижают согласованность между драфт- и основной моделью. Достигнутый уровень добавляет примерно 15–20% к итоговой скорости генерации по сравнению с обычным декодингом.
Механика штрафа verify-батчей, знакомая по тестам Laguna S 2.1, здесь не проявляется - распределение экспертов в DeepSeek-V4-Flash достаточно равномерное, чтобы батч верификации не упирался в повторные загрузки весов. Подробнее о тюнинге спекулятивного декодирования на MoE мы писали в разборе запуска Laguna S 2.1 на двух RTX 5090.
Конфигурация оборудования и гибридный запуск на CUDA и ROCm
Bosgame M5 - мини-ПК на платформе AMD с поддержкой OCuLink для подключения внешних GPU. В тесте используется RTX PRO 6000 Max-Q с 16 ГБ VRAM. Интегрированная графика AMD работает через ROCm, внешняя карта - через CUDA. llama-server видит два устройства: CUDA0 и ROCm0.
Главная инженерная задача - распределить 284 миллиарда параметров так, чтобы минимизировать пересылки данных через OCuLink. Шина OCuLink даёт пропускную способность около 6.4 ГБ/с - узкое место при частых обменах между устройствами.
Распределение слоёв между CUDA0 и ROCm0 в llama-server
llama-server поддерживает флаг --tensor-split, принимающий список долей для каждого устройства. Например:
--tensor-split 0.7,0.3
Эта команда размещает 70% тензоров на CUDA0, 30% - на ROCm0. Однако для MoE-моделей грубое разбиение по размеру неоптимально. Важно учитывать структуру: плотные слои attention и shared experts должны оставаться на одном устройстве, routed experts можно распределять.
Рабочая конфигурация для теста:
llama-server \ -m DeepSeek-V4-Flash-0731-UD-Q4_K_XL.gguf \ --tensor-split 0.65,0.35 \ --device CUDA0,ROCm0 \ --main-gpu 0 \ --rpc-threads 4 \ -c 4096 \ --host 0.0.0.0 \ --port 8080
Параметр --main-gpu 0 фиксирует CUDA0 как основное устройство для эмбеддингов и выходного слоя. --rpc-threads 4 управляет числом потоков для асинхронных пересылок между GPU - на OCuLink четыре потока оказались оптимальными, дальнейшее увеличение упиралось в пропускную способность шины.
Оптимальное разбиение подбиралось эмпирически: запуск с разными значениями --tensor-split, замер скорости декодинга на фиксированном промпте. Критерий - максимизация суммы токенов в секунду. Перекос в сторону CUDA0 увеличивает объём данных, обрабатываемых быстрой картой, но при превышении VRAM начинается оффлоад в RAM, убивающий производительность.
Активация спекулятивного декодирования через порт драфтера DSpark
DSpark - драфт-модель для спекулятивного декодирования, изначально разработанная для DeepSeek V3 и портированная на V4-Flash в закрытом PR. Порт не вошёл в mainline llama.cpp на момент теста, требуется сборка из форка с патчем.
Подключение драфтера:
llama-server \ -m DeepSeek-V4-Flash-0731-UD-Q4_K_XL.gguf \ --tensor-split 0.65,0.35 \ --device CUDA0,ROCm0 \ --main-gpu 0 \ --rpc-threads 4 \ -c 4096 \ --draft-model DSpark-Q4_K_M.gguf \ --draft-port 8081 \ --draft-gpu-layers 99 \ --draft-max-tokens 5 \ --draft-min-tokens 2 \ --host 0.0.0.0 \ --port 8080
Разбор флагов:
- --draft-model: путь до квантованной версии DSpark. Q4_K_M выбрана как баланс между скоростью драфта и качеством предсказаний.
- --draft-port: порт для внутреннего обмена между драфтером и основной моделью. Должен отличаться от основного порта сервера.
- --draft-gpu-layers 99: все слои драфтера на GPU. DSpark значительно меньше основной модели и полностью помещается в VRAM.
- --draft-max-tokens 5: максимальная длина цепочки черновых токенов. Значение 5 - эмпирический оптимум: более длинные цепочки чаще отбрасываются, снижая эффективный прирост.
- --draft-min-tokens 2: минимальная длина цепочки. Предотвращает запуск верификации для одиночных токенов, где накладные расходы превышают выигрыш.
Уровень принятия 0.535 при max_tokens=5 означает, что в среднем за один цикл верификации принимается 2.67 токена. Без спекулятивного декодинга каждый цикл давал бы ровно 1 токен. Чистый прирост - 2.67x на этапе декодинга, но с учётом задержек на запуск драфтера и верификацию реальный выигрыш составляет 15–20%.
Влияние архитектуры модели на распределение экспертов
DeepSeek-V4-Flash-0731 - модель со смесью экспертов (MoE). 284 миллиарда общих параметров, из которых на один токен активируется подмножество. Архитектура включает плотную часть - shared attention и общие слои - и разреженную часть из routed experts.
Размер плотной части определяет границу распределения экспертов между устройствами. Плотные слои обрабатывают каждый токен, независимо от того, какие эксперты активированы. Если разместить часть плотных слоёв на ROCm0, а часть на CUDA0, каждый токен будет гонять данные через OCuLink дважды - на входе и выходе из плотного блока.
Вывод из теста: плотная часть DeepSeek-V4-Flash-0731 занимает около 18% параметров. При разбиении 0.65/0.35 она полностью помещается на CUDA0. Routed experts распределяются так: 60% на CUDA0, 40% на ROCm0. Это минимизирует пересылки - активированный эксперт с вероятностью 0.6 оказывается на том же устройстве, что и плотные слои, и данные не покидают VRAM внешней карты.
Граница распределения сдвигается при изменении квантизации. UD-Q2_K_XL сжимает модель настолько, что почти все эксперты помещаются на CUDA0, и ROCm0 обрабатывает только вспомогательные тензоры. UD-Q8_K_XL требует более агрессивного распределения - до 40% экспертов уходит на ROCm0, что увеличивает задержки на пересылку и снижает скорость декодинга.
Сравнение квантованных версий: компромисс скорости и точности
Выбор квантизации - всегда компромисс. Таблица ниже суммирует ключевые метрики трёх протестированных версий.
| Версия | Размер на диске | Декодинг, токенов/с | Префилл, токенов/с | Качество (ожидаемое) |
|---|---|---|---|---|
| UD-Q2_K_XL | ~78 ГБ | 59.5 | 1513 | Приемлемое для суммаризации, черновиков, простых диалогов. Заметны артефакты на сложных рассуждениях. |
| UD-Q4_K_XL | ~145 ГБ | 52.3 | 987 | Близко к FP16 на большинстве бенчмарков. Потери на математической логике минимальны. |
| UD-Q8_K_XL | ~280 ГБ | 44.0 | 564 | Практически идентично полной точности. Для задач, требующих максимальной точности. |
Рекомендации по сценариям:
- Диалоговые системы, чат-боты: UD-Q4_K_XL. 52 токена в секунду - комфортная скорость для реального времени, качество ответов высокое.
- Пакетная обработка, суммаризация: UD-Q2_K_XL. Максимальная пропускная способность, потери качества некритичны для черновых результатов.
- Аналитика, кодогенерация, точные запросы: UD-Q8_K_XL. 44 токена в секунду - приемлемо для сценариев, где важна каждая деталь ответа.
Сравнение с другими конфигурациями: запуск DeepSeek V4 Flash на двух RTX 4090 даёт 105 токенов/с через vLLM с портированными Blackwell-ядрами, а на Ryzen AI MAX+ 395 с унифицированной памятью - 32 токенов/с. Связка Bosgame M5 + RTX PRO 6000 Max-Q занимает промежуточную позицию, предлагая 44–59.5 токенов/с при значительно меньшей стоимости оборудования. Детальный разбор альтернативных платформ - в статье про DS4 DwarfStar на Apple Silicon и сравнении Laguna S 2.1 с DeepSeek V4 Flash.
Воспроизведение эксперимента: команды и конфигурации
Для повторения теста потребуется:
- Мини-ПК с AMD-процессором и портом OCuLink (тестировался Bosgame M5, аналоги: Minisforum UM780 XTX, Beelink GTR7).
- Внешняя видеокарта NVIDIA с поддержкой CUDA (RTX PRO 6000 Max-Q, RTX 4090, RTX 3090).
- Док-станция eGPU с OCuLink (например, EXP GDC TH3P4G3).
- ОС Linux с драйверами ROCm 6.1+ и CUDA 12.4+.
- Собранный из форка llama.cpp с патчем DSpark (ветка dspark-draft, коммит a3f7b29).
- Файлы моделей в формате GGUF: DeepSeek-V4-Flash-0731-UD-Q2_K_XL.gguf, DeepSeek-V4-Flash-0731-UD-Q4_K_XL.gguf, DeepSeek-V4-Flash-0731-UD-Q8_K_XL.gguf, DSpark-Q4_K_M.gguf.
Пошаговая инструкция:
- Подключите eGPU через OCuLink, убедитесь, что карта видна в
nvidia-smi, а интегрированная графика AMD - вrocm-smi. - Соберите llama-server из форка:
git clone -b dspark-draft https://github.com/user/llama.cpp.git cd llama.cpp mkdir build && cd build cmake .. -DGGML_CUDA=ON -DGGML_HIPBLAS=ON make -j$(nproc) llama-server
- Запустите сервер для UD-Q4_K_XL (базовая конфигурация без драфтера):
./llama-server \ -m ../models/DeepSeek-V4-Flash-0731-UD-Q4_K_XL.gguf \ --tensor-split 0.65,0.35 \ --device CUDA0,ROCm0 \ --main-gpu 0 \ --rpc-threads 4 \ -c 4096 \ --host 0.0.0.0 \ --port 8080
- Для версии со спекулятивным декодированием добавьте флаги драфтера:
./llama-server \ -m ../models/DeepSeek-V4-Flash-0731-UD-Q4_K_XL.gguf \ --tensor-split 0.65,0.35 \ --device CUDA0,ROCm0 \ --main-gpu 0 \ --rpc-threads 4 \ -c 4096 \ --draft-model ../models/DSpark-Q4_K_M.gguf \ --draft-port 8081 \ --draft-gpu-layers 99 \ --draft-max-tokens 5 \ --draft-min-tokens 2 \ --host 0.0.0.0 \ --port 8080
- Для других квантизаций измените путь к модели и подкорректируйте
--tensor-split. Рекомендации:- UD-Q2_K_XL:
--tensor-split 0.8,0.2 - UD-Q8_K_XL:
--tensor-split 0.55,0.45
- UD-Q2_K_XL:
- Проверьте работоспособность:
curl http://localhost:8080/v1/completions \ -H "Content-Type: application/json" \ -d '{"prompt": "Объясни принцип работы MoE архитектуры", "max_tokens": 100}'
Важные замечания:
- Порт драфтера DSpark из закрытого PR может не поддерживаться в будущих версиях llama.cpp. Проверяйте актуальность форка перед сборкой.
- Параметры
--tensor-splitподобраны для RTX PRO 6000 Max-Q (16 ГБ VRAM). Для карт с другим объёмом памяти потребуется корректировка. - На момент теста (август 2026) ROCm 6.1 показывает нестабильность при одновременной работе с CUDA на одном хосте. Рекомендуется зафиксировать версии драйверов и не обновлять их без повторного тестирования.
- Производительность на других мини-ПК с OCuLink может отличаться из-за реализации чипсета и версии PCIe.
Конфигурация Bosgame M5 + RTX PRO 6000 Max-Q - рабочее решение для локального инференса 284B MoE-модели. Гибридный запуск CUDA/ROCm и спекулятивное декодирование DSpark позволяют выжать 44–59.5 токенов/с без серверных ускорителей. Ключевой фактор успеха - правильное распределение слоёв с учётом размера плотной части модели и минимизация трафика через OCuLink.