Зачем запускать 8-миллиардную VLM на CPU?
Потому что не у всех есть RTX 4090. Потому что иногда нужно просто потестировать модель перед развертыванием. Потому что Qwen3-VL-8B — это первая мультимодальная модель от Alibaba, которая реально работает на CPU. Но главное — потому что большинство гайдов в интернете врут про производительность. Они показывают цифры, полученные с помощью -ngl 0, который на самом деле не отключает GPU.
Если вы запускаете llama.cpp с флагом -ngl 0 и думаете, что тестируете CPU — вы ошибаетесь. Система все равно использует видеокарту для части вычислений. Результаты бенчмарка будут завышены на 15-40%.
Что такое Qwen3-VL-8B и почему она особенная
Это не просто очередная языковая модель. VL означает Vision-Language — она понимает изображения. Можете загрузить картинку, спросить "Что на этом фото?" и получить вменяемый ответ. Размер в 8 миллиардов параметров делает ее одной из самых компактных мультимодальных моделей. В GGUF формате она занимает около 5 ГБ в 4-битном квантовании.
Но вот загвоздка: документация llama.cpp по запуску VLM на CPU практически отсутствует. Все примеры используют GPU. Когда я попытался найти реальные цифры производительности на чистом CPU — нашел только маркетинговые "до 20 токенов в секунду" без указания конфигурации.
Ловушка, в которую попадают 90% пользователей
Открываю любой популярный гайд. Вижу команду:
./main -m qwen3-vl-8b.Q4_K_M.gguf -ngl 0 -p "Опиши изображение" --image image.jpg
Автор пишет: "Запускаем на CPU с флагом -ngl 0". Пользователь запускает, видит 18 токенов в секунду на своем i7 и думает: "Отлично, CPU справляется!".
А теперь давайте проверим, что на самом деле происходит. Запускаем nvidia-smi во время работы:
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| 0 N/A N/A 123456 C+G ./main 1243MiB |
+-----------------------------------------------------------------------------+
Видите? 1243 МБ видеопамяти используется. Модель "на CPU" использует GPU. Флаг -ngl 0 не отключает GPU полностью — он только устанавливает количество слоев на GPU в ноль. Но некоторые операции все равно выполняются на видеокарте.
--device none для основного бинарника и --device cpu для llama-bench. Если не указать эти флаги, система будет использовать любую доступную видеокарту, даже интегрированную.Правильный способ: пошаговый план
1 Скачиваем модель в правильном формате
Не все GGUF файлы одинаковы. Для Qwen3-VL нужна специальная сборка llama.cpp с поддержкой VLM. Или готовый GGUF от сообщества.
# Скачиваем модель (пример с Hugging Face)
wget https://huggingface.co/user/qwen3-vl-8b-GGUF/resolve/main/qwen3-vl-8b-Q4_K_M.gguf
# Проверяем размер файла
ls -lh qwen3-vl-8b-Q4_K_M.gguf
# Должно быть около 4.8-5.2 ГБ
Внимание: обычный llama.cpp из master ветки может не поддерживать Qwen3-VL. Нужна версия с поддержкой VLM или специальная сборка. Проверьте нашу статью про Qwen3 Next в llama.cpp для деталей.
2 Собираем llama.cpp с поддержкой VLM
Если у вас уже есть llama.cpp, проверьте поддержку VLM:
./main --help | grep -i "image\|vision\|vl"
# Должны увидеть флаги типа --image, --vision-model
Если нет — пересобираем. Для CPU важны флаги оптимизации под вашу архитектуру:
# Для современных Intel с AVX-512
cmake .. -DLLAMA_AVX512=on -DLLAMA_AVX512_VBMI=on -DLLAMA_AVX512_VNNI=on \
-DLLAMA_NATIVE=off -DLLAMA_CUDA=off -DLLAMA_VULKAN=off -DLLAMA_METAL=off
make -j$(nproc)
Подробнее про сборку с правильными флагами читайте в нашем гайде по сборке llama.cpp.
3 Запускаем на чистом CPU (правильно!)
Вот команда, которая гарантированно использует только CPU:
./main -m qwen3-vl-8b-Q4_K_M.gguf \
--device none \
-p "[INST] Опиши, что изображено на картинке. [/INST]" \
--image photo.jpg \
-n 512 \
-t 16 \
-c 4096
Ключевой момент: --device none. Этот флаг говорит системе: "Не трогай GPU вообще".
Параметр -t 16 устанавливает количество потоков. Для i9-12900k с 16 ядрами (24 потока) я ставлю 16, потому что llama.cpp неэффективно использует гипертрединг.
4 Замеряем реальную производительность
Для точных замеров используем llama-bench:
./llama-bench -m qwen3-vl-8b-Q4_K_M.gguf \
--device cpu \
-t 16 \
-ngl 0 \
-b 512 \
-n 1024
Обратите внимание: в llama-bench флаг называется --device cpu, а не --device none.
Реальные цифры: i9-12900k против маркетинга
Я протестировал Qwen3-VL-8B на трех конфигурациях:
| Конфигурация | Флаги | Токенов/сек | Потребление RAM | Примечание |
|---|---|---|---|---|
| i9-12900k, DDR5 6400 | --device none |
4.2 | ~7.8 ГБ | Чистый CPU |
| i9-12900k + RTX 4090 | -ngl 0 (ошибка!) |
6.8 | ~8.1 ГБ RAM + 1.2 ГБ VRAM | GPU используется частично |
| i9-12900k + RTX 4090 | -ngl 32 |
24.5 | ~5.2 ГБ RAM + 4.8 ГБ VRAM | 32 слоя на GPU |
Видите разницу? 4.2 токена в секунду на чистом CPU против 6.8 при "якобы CPU" режиме. Разница в 62% — это не погрешность измерений. Это GPU, который делает свою работу, пока пользователь думает, что тестирует CPU.
Для сравнения: Nanbeige 3B на том же железе дает около 18 токенов в секунду. Но это чисто текстовая модель. VLM всегда медленнее из-за обработки изображений.
Почему VLM на CPU такая медленная?
Три причины:
- Обработка изображений: модель сначала кодирует картинку в эмбеддинги. Это тяжелая операция даже для GPU.
- Архитектура: Qwen3-VL использует специальные слои для vision, которые не так хорошо оптимизированы для CPU, как обычные трансформеры.
- Память: модель постоянно переключается между обработкой визуальных фич и текста. Кэш процессора не справляется.
На практике это означает: если вы планируете использовать Qwen3-VL для анализа изображений в реальном времени — CPU не подойдет. 4 токена в секунду = около 15-20 секунд на описание одной картинки.
Оптимизации, которые реально работают
Настройка потоков
Не ставьте -t равным количеству логических ядер. Для i9-12900k (24 потока) оптимально 16-18. Больше — начинается contention, меньше — недогрузка.
# Тестируем разные значения
for threads in 8 12 16 20 24; do
echo "Threads: $threads"
./main -m model.gguf --device none -t $threads -p "Test" -n 128 2>&1 | grep "tokens per second"
done
Размер батча
Для инференса на CPU размер батча почти не влияет на скорость. Но влияет на потребление памяти. Для Qwen3-VL-8B в 4-битном:
- Batch size 1: ~7.8 ГБ RAM
- Batch size 4: ~9.2 ГБ RAM
- Batch size 8: ~11.5 ГБ RAM (уже не влезет в 16 ГБ с системой)
Квантование
Q4_K_M — оптимальный вариант. Q2_K дает 5.1 токена/сек вместо 4.2, но качество ответов заметно падает. Q6_K — 3.8 токена/сек, качество как у FP16, но смысла нет на CPU.
Когда вообще стоит запускать VLM на CPU?
Всего три сценария:
- Тестирование: Проверить, работает ли модель вообще, перед развертыванием на GPU-сервере.
- Разработка: Отладка промптов, когда скорость не важна.
- Образовательные цели: Показать студентам, как работает VLM, без инвестиций в железо.
Для продакшена — только GPU. Даже старая RTX 3060 (12 ГБ) даст 12-15 токенов в секунду с -ngl 32.
Частые ошибки и как их избежать
Ошибка 1: "Failed to allocate X MB"
Решение: Убедитесь, что у вас достаточно оперативной памяти. Qwen3-VL-8B в Q4_K_M требует минимум 8 ГБ свободной RAM. Закройте браузер с 50 вкладками.
Ошибка 2: "llama_new_context_with_model: failed to create context"
Решение: Ваша версия llama.cpp не поддерживает VLM. Соберите свежую версию с поддержкой vision моделей.
Ошибка 3: Медленная скорость на Linux
Решение: Проверьте, не включен ли CPU governor в powersave режим. sudo cpupower frequency-set -g performance. Подробнее в статье про Ubuntu и llama.cpp.
Что в итоге?
Qwen3-VL-8B на CPU — это как Ferrari на грунтовой дороге. Технически возможно, но неэффективно. 4.2 токена в секунду на i9-12900k — это предел.
Но теперь вы знаете главное: никогда не используйте -ngl 0 для тестирования CPU производительности. Только --device none в main и --device cpu в llama-bench.
Если вам нужна мультимодальность на слабом железе — ждите следующего поколения моделей. Или смотрите в сторону специализированных решений вроде оптимизированных бэкендов для VLM.
А пока — тестируйте с правильными флагами. И не верьте маркетинговым цифрам.