Две видеокарты Tesla V100 SXM2 по 32 ГБ (всего 64 ГБ)

Можно ли запустить современную языковую модель на 27 миллиардов параметров и полноценного автономного агента, используя пару серверных ускорителей образца 2017 года, установленных в обычный ПК через переходники? Краткий ответ: да, но с рядом существенных оговорок.

В этой статье я рассмотрю практический кейс: развертывание Qwen3.6-27B в связке с автономным агентом Hermes от Nous Research на двух картах Tesla V100-SXM2-16GB. Ускорители подключены к потребительской материнской плате через адаптеры SXM2→PCIe. Такая конфигурация доступна для сборки дома, однако она накладывает жесткие ограничения на объем видеопамяти и пропускную способность шины.

Эксперимент показал, что данная связка является пределом практической применимости для локального запуска Hermes: система работает, но функционирует на грани возможностей оборудования. Ниже приведен детальный разбор технических препятствий, готовые конфигурации для запуска и честная оценка того, где проходит «стена», которую невозможно преодолеть программными методами.

Техническая база

Хост: Proxmox с пробросом (PCIe passthrough) двух GPU в виртуальную машину.

GPU: 2× Tesla V100-SXM2-16GB через переходники. Процессор — Intel Core i7-6700k.

Нюанс: NVLink между картами отсутствует (переходники передают только сигналы PCIe), а процессор 6700k обеспечивает лишь 16 линий PCIe 3.0, поэтому карты работают в режиме x8/x8.

Задача: запустить Qwen3.6-27B-AWQ и интегрировать агента Hermes, требующего минимум 65 000 токенов контекста.

Проверить топологию и ширину канала можно следующими командами внутри VM:

nvidia-smi topo -m          # если нет NVLink, вместо NV увидите PHB
nvidia-smi -q | grep -A2 "Link Width"   # проверка: 8x — это максимум для межкарточного обмена

Проблема №1: «Загрузка GPU на 50%»

Частая жалоба: обе карты нагружены только наполовину. Причина кроется в том, что движки вроде llama.cpp по умолчанию распределяют модель по слоям (pipeline split): пока вычисления идут на первом GPU, второй простаивает. Решение — использование параллелизма тензоров (Tensor Parallelism), при котором модель сегментируется «поперек», и оба GPU обрабатывают каждый токен одновременно. В vLLM для этого используется флаг --tensor-parallel-size 2, что позволяет достичь реальной 100% загрузки обеих карт.

Проблема №2: отсутствие поддержки Volta в новых vLLM

Модели Qwen3.6 требуют vllm >= 0.19.0, однако актуальные версии vLLM больше не поддерживают архитектуру Volta (sm_70). Кроме того, ядра AWQ (Marlin) рассчитаны на sm_80+. Выход — использование комьюнити-форка 1Cat-vLLM, в котором восстановлены ядра внимания для SM70, реализована поддержка AWQ на Volta и добавлена совместимость с архитектурой Qwen3.5/3.6.

Почему именно 1Cat-vLLM?

Это решение закрывает критический разрыв:

Оригинальный vLLM: новые версии не запускаются на V100, а старые не знают архитектуру Qwen3.6.

llama.cpp / GGUF: работают, но на момент эксперимента имели сложности с корректной сборкой под такой гибрид и менее эффективный параллелизм тензоров.

Другие движки (SGLang, TGI): официально требуют архитектуру sm_75 и выше.

1Cat-vLLM — единственный инструмент, объединяющий поддержку старого железа с современными архитектурами моделей. Установка производится через готовые пакеты:

# Скачивание пакетов из релиза
mkdir -p ~/wheels && cd ~/wheels
curl -s https://api.github.com/repos/1CatAI/1Cat-vLLM/releases/latest \
| grep browser_download_url | cut -d '"' -f4 | xargs -n1 wget
# Установка в conda-окружении

python -m pip install --prefer-binary --no-cache-dir \ --extra-index-url https://download.pytorch.org/whl/cu128 \ ./flash_attn_v100-.whl ./vllm-.whl

Почему AWQ, а не GPTQ?

На архитектуре Volta большинство современных 4-битных схем неработоспособны. GPTQ-Int4 через ядра Marlin требует sm_80+, а FP8 — архитектуру Hopper (sm_90). GPTQ-Int8 технически возможен, но размер модели удваивается, что делает невозможным её запуск в 32 ГБ видеопамяти. Остается AWQ 4-bit — единственный формат, который 1Cat-vLLM «оживляет» на V100 через специальные ядра WMMA, ужимая модель до ~21 ГБ.

Нюансы реализации

Память VM: vLLM резервирует swap. Выделяйте виртуальной машине не менее 24 ГБ ОЗУ.

KV-кэш: Volta поддерживает только FP8-формат e5m2. Используйте --kv-cache-dtype fp8_e5m2.

MTP (Speculative tokens): Если используете num_speculative_tokens=4, конфигурация графов должна быть кратна 5. Укажите --compilation-config '{"cudagraph_mode":"full_and_piecewise","cudagraph_capture_sizes":[5]}'.

Tool calling: Для работы Hermes сервер запускается с параметрами --enable-auto-tool-choice --tool-call-parser qwen3_coder --reasoning-parser qwen3.

Архитектурная особенность Qwen3.6

Модель является гибридной: из 64 слоев только 16 используют классическое внимание с растущим KV-кэшем. Остальные 48 — это Gated DeltaNet (линейное внимание), кэш которого фиксирован. Это позволяет «втиснуть» 65k контекста в 32 ГБ суммарной VRAM.

Рабочая конфигурация

После всех настроек мы получаем функционирующий сервер с контекстом 65k:

CUDA_VISIBLE_DEVICES=0,1 \
VLLM_DISABLE_PYNCCL=1 \
VLLM_1CAT_DISABLE_QWEN35_MTP_DEFAULTS=1 \

python -m vllm.entrypoints.openai.api_server \ --model ~/models/Qwen3.6-27B-AWQ \ --served-model-name qwen36 \ --tensor-parallel-size 2 \ --dtype float16 \ --kv-cache-dtype fp8_e5m2 \ --gpu-memory-utilization 0.92 \ --max-model-len 65536 \ --max-num-seqs 1 \ --max-num-batched-tokens 512 \ --trust-remote-code \ --attention-backend TRITON_ATTN \ --disable-custom-all-reduce \ --skip-mm-profiling \ --limit-mm-per-prompt '{"image":0,"video":0}' \ --enable-auto-tool-choice \ --tool-call-parser qwen3_coder \ --reasoning-parser qwen3 \ --compilation-config '{"cudagraph_mode":"full_and_piecewise","cudagraph_capture_sizes":[1]}' \ --host 0.0.0.0 --port 8000

Скорость генерации составляет около 45 токенов в секунду. Основной минус — отключенный кэш префиксов, из-за чего каждый запрос требует полного пересчета промпта.

Главное ограничение: 65k контекста + Prefix Caching

Попытка включить кэширование префиксов (чтобы не пересчитывать системный промпт) приводит к ошибке Triton Error [CUDA]: out of memory. Для работы кэша в режиме align требуется дополнительная память под буферы DeltaNet, которая не помещается в лимит 32 ГБ. На данной связке невозможно одновременно иметь полный контекст и кэш.

Итоги и варианты развития

1. Оставить как есть: 27B-модель с полным контекстом без кэша — работает надежно, но с медленным prefill.

2. Сменить модель: Использовать Qwen3.5-9B-AWQ. Она позволяет активировать кэширование префиксов, MTP и комфортно работать с контекстом 65k, жертвуя качеством ответов, присущим 27B-моделям.

3. Добавить GPU: Использование трех карт позволит применить Pipeline Parallelism, распределив 21 ГБ весов и освободив место под кэш и все функции ускорителя.


Спецификация стенда: Proxmox, Ubuntu 22.04, 2× Tesla V100-SXM2-16GB, драйвер 580 / CUDA 13, 1Cat-vLLM 1.1.0, Qwen3.6-27B-AWQ.

 

Источник

Читайте также