Лаборатория ИИ за 200 000 ₽: как мы собрали локальный ИИ-сервер на 2× Tesla V100

О чём это и зачем

Приятно наблюдать за тем, что сообщество людей, работающих с локальными ИИ, растет с каждым днем, но до сих пор я встречаю мнение, как сложно собрать нужное оборудование под свой сервер LLM. В интернете встречаются просто сумасшедшие суммы на сборки под ИИ, хотя все можно сделать гораздо проще, и своими руками. Так и родилась идея сделать обзор на самую бюджетную серверную видеокарту V100 на 16/32 ГБ, приложив 100+ бенчмарков различных моделей, чтобы показать, как за малые средства можно приобрести целую лабораторию дома. 

Сразу оговоримся: «бюджетный» — это про соотношение цена/возможности, а не про «копейки». 200к за двухкарточный стенд по бытовым меркам — не дёшево. Но на этом железе крутятся модели вплоть до 70B AWQ через TP=2, а в этом ценовом сегменте ничего сопоставимого по VRAM мы на десктопе не нашли. 2× Tesla V100 32GB дают 64 ГБ VRAM суммарно — столько же, сколько три RTX 5080 16GB, и дешевле.

Целевая аудитория — энтузиасты и небольшие команды до 50 человек, кому нужно крутить LLM локально по минимально возможной цене. Для крупного продакшна V100 — компромисс, и в выводах честно разберём, где именно начинают вылезать его болячки.

Цель — закрыть тему V100 одним материалом. По нашему опыту в русскоязычном поле полного разбора нет: где-то цены и нет стека, где-то стек и нет бенчей, где-то бенчи на одной модели. В этой статье — и железо с ценами, и стек со всеми граблями, и реальные прогоны по четырём задачам: 108 LLM через Ollama, 14 image-gen через sd.cpp/Ollama, 6 video-gen через sd.cpp/diffusers, плюс STT-блок (Whisper-large-v3). Карточки, JSON, скрипты и интерактивный дашборд — открытый репо pocketcoder-ch/v100-benchmarks-2026. Итого 128 прогонов в одной таблице.

Что в статье

Структура такая:

  1. Что собираем и зачем (этот раздел).

  2. Почему V100 — про рынок, форм-факторы (SXM2 vs SXM3 vs PCIe), Авито/АлиЭкспресс, что мы реально взяли.

  3. Железо: смета и почему именно так — i7, 2 карты, БП, RAM, корпус.

  4. Грабли Volta: vLLM-стек, что работает / что нет, SHM-wall и почему в массовом бенче мы в итоге на Ollama.

  5. Как мы это всё тестировали — стенд, пайплайн STT+LLM, DP vs TP, путь A vs путь Б.

  6. 128 моделей в одной таблице — 108 LLM (топ-10 / рабочие лошадки 7–9B / большие 14–70B / «где упираемся в потолок»), 14 image-gen, 6 video-gen, STT (Whisper-large-v3).

  7. Когда NVLink реально нужен — практический вывод по 128 прогонам.

  8. Failed / Skip — что не работает на Volta (FP8, MXFP4, NVFP4).

  9. Что бы изменили, если бы пересобирали.

  10. Выводы и ссылки.

Скрипты, обезличенные транскрипции, сырые JSON и интерактивный дашборд — в открытом репо pocketcoder-ch/v100-benchmarks-2026.

Как выглядит собранный сервер с 2× V100 — основной план

Как выглядит собранный сервер с 2× V100 — основной план

Почему V100: откуда столько на рынке и какие они бывают

Прежде чем переходить к смете и комплектующим, разберёмся с главным вопросом: почему вообще V100, что это за карта, какие форматы существуют на б/у-рынке и что мы в итоге взяли. Дальше будет понятнее, как сборка дошла до своего финального вида.

Откуда «дедушка» на рынке

Volta — архитектура NVIDIA 2017 года, compute capability 7.0. Прошло три полных поколения серверных GPU:

Лаборатория ИИ за 200 000 ₽: как мы собрали локальный ИИ-сервер на 2× Tesla V100 - 2

V100 — это «прадедушка» текущей B200/H200. По серверной линейке — три поколения назад.

Почему столько на вторичке: ровно потому что дедушка. Дата-центры (в первую очередь западные облачные провайдеры) массово выводят V100 и пересаживаются на A100/H100/H200. Карты вываливаются на б/у-рынок через китайских перекупов с AliExpress, оттуда часть доезжает до Авито через локальных.

Состояние — б/у из ДЦ, серверная нагрузка 24/7 за плечами. Но китайцы перед продажей перебирают: новая термопаста, перетянутые крепления, свежий радиатор. У нас полгода эксплуатации — нареканий ноль, закладываемся минимум на полтора года.

Два форм-фактора на рынке — ключевая развилка

V100 32 ГБ продаётся в двух разных физических форматах, и это важная развилка:

Осторожно при покупке: SXM2 vs SXM3.
На рынке отдельно встречается V100 в форм-факторе SXM3 — внешне очень похож на SXM2, но не совместим ни с SXM2-backplane, ни с PCIe-адаптерами OLOEY. Под SXM3 нужен отдельный переходник, который стоит ~20 000 ₽ и в обычной десктопной сборке вам не пригодится. На Авито и AliExpress SXM3 нередко лежит по цене SXM2 или даже дешевле — и многие берут его по незнанию, а потом разбираются, почему карта не садится в существующую обвязку. Перед оплатой всегда уточняйте у продавца, что это именно SXM2. Берите только SXM2.

Вариант А — голый SXM2-чип

Скрин AliExpress: голая V100 SXM2 32GB за 52 632 ₽

Скрин AliExpress: голая V100 SXM2 32GB за 52 632 ₽

SXM2 — серверный форм-фактор NVIDIA: чип на специальной mezzanine-плате, втыкается прямо в материнку через разъём SXM2, а не в PCIe-слот. Сверху — собственная подсистема питания, отдельной PCB-карты нет.

Цены на 2026-05-13:

Источник

Базовая цена

Пошлина

Итого / карта

AliExpress (Zhien Server Store)

52 632 ₽

~5 303 ₽

57 935 ₽

Артикул 1005009880109662, 105 куплено, рейтинг 4.7. На странице тип товара указан как «USB-адаптер» — типичная маскировка категории под модерацию AliExpress.

Без переходника, без радиатора. Втыкается либо в серверную плату с SXM2-сокетом (в десктопе такого не бывает), либо в NVLink-backplane — плата с 2–4 SXM2-слотами, у которых NVLink-дорожки разведены прямо по PCB. NVLink-backplane на 2 GPU стоит 21 849 ₽ на Али (артикул 1005010459772246).

Скрин AliExpress: NVLink-backplane на 2× V100 SXM2 за 21 849 ₽

Скрин AliExpress: NVLink-backplane на 2× V100 SXM2 за 21 849 ₽

Это путь «правильно, под NVLink, с серверной обвязкой». Охлад докупается отдельно — водянка SPEEDIER за 3 726 ₽ или медная башня OLOEY за 6 271 ₽.

Скрин AliExpress: водянка SPEEDIER для V100 SXM2 за 3 249 ₽

Скрин AliExpress: водянка SPEEDIER для V100 SXM2 за 3 249 ₽
Скрин AliExpress: медная башня OLOEY для V100 SXM2 за 4 439 ₽

Скрин AliExpress: медная башня OLOEY для V100 SXM2 за 4 439 ₽

Вариант Б — OLOEY PCIe-конверсия с охладом

Скрин AliExpress: OLOEY V100 в PCIe-адаптере с улиткой за 59 835 ₽

Скрин AliExpress: OLOEY V100 в PCIe-адаптере с улиткой за 59 835 ₽

Готовая PCB: SXM2-чип уже припаян на PCIe-адаптер, поверх стоит turbo-blower («улитка»). Всё в одном, втыкается в обычный PCIe x16 любой десктопной матери. Это то, что у нас на стенде.

Цена на 2026-05-13:

Источник

Базовая цена

Доставка + пошлина

Итого / карта

AliExpress (Network Card Supplier, бренд OLOEY)

59 835 ₽

+ 2 409 ₽ + ~6 383 ₽

68 627 ₽

Артикул 1005010057680719, 268 куплено, рейтинг 4.8.

Это путь «воткнул и работает», под потребительскую платформу без NVLink. Карта подключается как любая обычная PCIe-видяха.

Авито vs AliExpress

Скрин Авито: V100 PCIe с радиатором от другой карты за 70 000 ₽

Скрин Авито: V100 PCIe с радиатором от другой карты за 70 000 ₽

Где

Что

Итого ₽

Срок

Али (Zhien Server Store)

Голая SXM2 32GB

57 935 (с пошлиной)

2 недели

Али (Network Card Supplier, OLOEY)

PCIe-конверсия с улиткой

68 627 (с пошлиной + доставка)

2 недели

Авито

PCIe-конверсия с радиатором от др. карты

70 000

2–4 дня

Премия Авито-перекупа над Али для PCIe-варианта — ~1.4к ₽. Переплата за скорость доставки копеечная. Мы брали с Авито ровно поэтому: лопнул чип на одной из 3090 в домашней машине, нужна была быстрая замена под уже настроенный локальный пайплайн со связками к БД. Аренда в облаке потребовала бы перенести весь скрипт — морочиться было дороже, чем доплатить 1.4к ₽ за 4 дня вместо двух недель.

Что мы реально взяли и как она выглядит

В итоге у нас на стенде — 2× V100 32GB в OLOEY PCIe-конверсии (Путь Б, с Авито). Карта приехала собранная: SXM2-чип на PCIe-плате, сверху turbo-blower («улитка»), задняя стенка вентилируется. Вживую — двухслотовая видяха, разводка под PCIe x16, втыкается в обычную десктопную мать.

Замер реальной карты — длина и ширина (важно проверить до сборки, что влезет в корпус):

Замер длины V100 OLOEY PCIe-конверсии — около 26 см

Замер длины V100 OLOEY PCIe-конверсии — около 26 см
Замер ширины V100 OLOEY PCIe-конверсии — двухслотовый формат

Замер ширины V100 OLOEY PCIe-конверсии — двухслотовый формат

Это к вопросу про корпус: 26 см в длину и двухслотовая турбина — в Micro-ATX такое не залезет, нужен большой корпус формата Full Tower (про корпус подробнее — в разделе «Железо» ниже). И прямо здесь — главный плюс PCIe-конверсии над голым SXM2: никакой серверной обвязки не требуется, обычный десктопный корпус и блок питания с разъёмами 8-pin EPS вытягивают.

V100 vs RTX 3090 б/у — что выбрать

В комментариях к таким сборкам всегда всплывает: «за те же деньги возьми б/у RTX 3090 — она новее, FP16 крутится, поддержка свежее». Согласны, 3090 в части моментов выгоднее.

Но:

  • Серверные V100 проектировались под 24/7 десятки тысяч часов. Это штатный режим эксплуатации, заложенный в дизайн.

  • 3090 — потребительская карта, штатный режим у неё — игровая нагрузка несколько часов в день. Сначала её мучали майнеры, потом энтузиасты ИИ. Это не штатный режим.

V100 уже отработала в ДЦ свою профильную нагрузку и приехала в адекватном виде после перебора китайцами. RTX 3090 б/у — это либо «была у майнера», либо «из-под геймера, теперь чужому дяде». Мы V100 доверяем больше, несмотря на 2017 год выпуска.

Это контраргумент по железу. По моделям и софту у 3090 свои плюсы (24 ГБ хватает на 7B fp16 + 14B AWQ, есть нативная поддержка свежих фреймворков). Выбор зависит от задачи, но «3090 однозначно лучше» — упрощение.

Минусы V100 — 4 пункта

Чтобы статья не выглядела пропагандой, разложим минусы.

  1. Архитектура 2–3 поколения назад (Volta cc 7.0). Нет нативного FP8, нет FP4 / MXFP4 / NVFP4, нет современных tensor cores. Свежие модели в нативных квантах (gpt-oss-20b/120b в MXFP4, Nemotron в NVFP4, любая Llama-FP8) через vLLM напрямую не поднимутся. Через Ollama GGUF Q4 — большинство из них едет (тот же gpt-oss:20b у нас выдал 106.8 tps, gpt-oss:120b — 74.7 tps на трёх уровнях контекста). Для vLLM-стека ищите AWQ/GPTQ-альтернативу или гоняйте в fp16/bf16.

  2. Геморрой с библиотеками. vLLM на свежих ветках Volta уже не держит, нужно подбирать конкретную версию (см. следующий раздел). Где-то фичи нет, где-то свежая архитектура в реестре отсутствует. Разработка под V100 — это чтение issue-трекеров и форумов на постоянке.

  3. Пропускная способность ниже. HBM2 у V100 — 900 GB/s. У A100 — 1.5–2 TB/s, у H100 — 3 TB/s, у B200 — 8 TB/s. NVLink на TP частично выправляет, но в абсолюте память медленнее современных карт.

  4. Б/у из ДЦ. 24/7 за плечами, вероятность отказа выше, чем у новой карты. Закладываемся с запасом на замену, mission-critical контур на V100 не строим.

Теперь — к самой сборке: смета и почему выбрана каждая позиция.


Железо: смета и почему именно так

Сначала — итоговая смета. Дальше по разделам разберём, почему выбрана каждая позиция.

Компонент

Модель / параметры

Цена ₽

GPU

2× Tesla V100 32GB в PCIe-адаптере OLOEY (SXM2-чип на PCIe-плате с турбиной)

137 254

Материнка

ASUS ROG (Z490/Z590, LGA1200), б/у с Авито

27 000

CPU

Intel Core i7-10700K (8c/16t, 16 PCIe 3.0 lanes), б/у

~13 000

RAM

4× 16 GB DDR4-3200 CL16 = 64 GB (Kingston Fury Beast / Patriot)

~15 600

БП

1000W 80+ Gold (be quiet! Straight Power / Corsair RM1000x)

~14 000

Корпус

Full Tower — самый большой типоразмер ПК-корпуса (Zalman / Deepcool / Cooler Master)

~10 000

SSD

NVMe 1 TB

~5 000

ИТОГО

~221 854 ₽

С округлением и подбором б/у-альтернатив (RAM на стоках, БП б/у, SATA SSD вместо NVMe) сборка укладывается в 200 000 ₽. Отсюда заголовочная цифра статьи.

Для сравнения — что ещё даёт сопоставимый объём VRAM:

Вариант

VRAM

Цена ₽

2× Tesla V100 32GB (наша сборка)

64 ГБ

~200 000

2× RTX 4090 24GB новых

48 ГБ

~600 000–700 000

1× H100 80GB даже б/у

80 ГБ

~1 500 000–2 500 000

Mac Studio M3 Ultra 128GB (MLX-стек, не CUDA)

128 ГБ

~600 000

В этом сегменте V100 — единственный путь к 64 ГБ VRAM на CUDA за 200к ₽. Дороже — есть варианты, дешевле — нет.

i7

Здесь обычный десктопный i7-10700K на Z490/Z590, всё на Авито, ~55к ₽ за связку мать + ЦПУ.

Это сознательное решение, а не вынужденная экономия. Тезис простой: бюджетный ИИ-сервер собирается на потребительской платформе, не на серверной. Под задачи небольшой команды этого хватает с головой, переплачивать за ECC, 128 PCIe-линий и 8 каналов памяти — некуда.

Почему 2 карты, а не 1 или 4

Взяли две сразу. Причина банальная: на материнке было два свободных x16-слота, а одна карта была плановой заменой треснувшего чипа на 3090. Раз уж лезть в б/у, то сразу под максимум того, что физически влезает. Заодно появлялась возможность сходу гонять «жирные» тесты с TP=2 (tensor parallelism).

Самоирония: своему же совету «сначала арендуйте облако, погоняйте свой прод, потом покупайте железо» — мы и не последовали. Взяли сразу две карты на Авито без облачного прогона. Об этом ещё пожалели, см. раздел «Что бы изменили».

Про БП

У нас на стенде стоит be quiet! Dark Power Pro 12 1200W 80+ Titanium, но это не из бюджетной логики — БП остался от прошлой сборки, поэтому и докинули. Для повторения с нуля рекомендуем что-то скромнее:

БП

Мощность

Сертификат

Цена нов. ₽

be quiet! Straight Power 11/12 1000W

1000W

80+ Gold

~13–15к

Corsair RM1000x

1000W

80+ Gold

~14–16к

be quiet! Straight Power 12 1200W

1200W

80+ Platinum

~17–20к

(у нас лично) be quiet! Dark Power Pro 12 1200W

1200W

80+ Titanium

~38–45к

Подсчёт по нагрузке. 2× V100 SXM2 в PCIe-адаптере сохраняют TDP серверной версии и дают 600 W в пике (2 × 300 W). i7-10700K в PL2 — это ещё 125–200 W. Материнка, NVMe, RAM и корпусные вентиляторы суммарно тянут ~75–100 W. Итого пик ~800–900 W. 1000W 80+ Gold с запасом 100–200W — нормальная рабочая конфигурация. Titanium-топ в бюджетной сборке — оверкилл.

БП крупным планом в корпусе

БП крупным планом в корпусе

Про RAM — почему 64 ГБ, а не больше

Z490/Z590 + i7-10700K — это DDR4non-ECC (i7 серии K ECC не поддерживает). 2 канала, максимум 4 слота. На большинстве плат при заполнении всех четырёх частота режется до 2666 MT/s — известная особенность LGA1200. Для AI-инференса не критично: узкое место — это PCIe между картами, а не пропускная RAM.

64 ГБ (4× 16 GB) спокойно держат Whisper-large + Pyannote с батчингом параллельно с LLM-токенизатором, плюс HuggingFace-кэш моделей при load/unload между прогонами бенчей, плюс swap. Брать выше 64 ГБ на этой платформе нет смысла — узкое место не туда.


Грабли Volta: vLLM-стек, что работает / что нет

Самый болезненный раздел. На Volta cc 7.0 половина свежего ML-стека либо не собирается, либо собирается и тихо выдаёт мусор на выходе. Мы перебрали достаточно версий, чтобы выкатить рабочую матрицу.

Версии хоста и контейнера

Компонент

Версия

Driver NVIDIA

570.211.01

CUDA

12.8

OS

Ubuntu 24.04 LTS, kernel 6.8

Python

3.10 (upstream-стек), 3.12 (1Cat-fork стек)

PyTorch

2.5–2.7 (cu128) для upstream, 2.9.1+cu128 для 1Cat

Какую версию vLLM брать

Простой ответ — никакую свежую. Длинный ответ — в таблице:

Версия vLLM

Статус на sm_70

Что с ней

≤ 0.18.x

работает

Последняя ветка с честной поддержкой sm_70. Базовый стек.

0.17.0

работает с оговоркой

На multimodal через TRITON_ATTN ловится deadlock на encoder profiling (vllm/#36357). Лечится откатом на 0.15.1 или --skip-mm-profiling.

0.20.0+

не запустится

sm_70 выпилили при переходе на PyTorch 2.11 / CUDA 12.8 defaults (discuss.vllm.ai/t/2605).

1Cat-vLLM 0.0.3

работает под AWQ

Fork под V100: WMMA SM70 kernels от LMDeploy TurboMind для AWQ + attention backend FLASH_ATTN_V100. Наш основной стек для AWQ-моделей.

В итоге на хосте у нас два venv:

  1. .venv-base — vLLM 0.18.x upstream + PyTorch 2.7. Тянет всё на FP16 и весь GPTQ.

  2. .venv-1cat — 1Cat-vLLM 0.0.3 + PyTorch 2.9.1+cu128. Тянет всё на AWQ, включая Llama-3.3-70B-AWQ TP=2 и Qwen2.5-72B-AWQ TP=2.

Обязательные ENV для Volta

# Базовые
export VLLM_WORKER_MULTIPROC_METHOD=spawn
export HF_HOME=/workspace/hf_cache
export HF_HUB_ENABLE_HF_TRANSFER=1

# TP без NVLink (PCIe-only межGPU)
export NCCL_P2P_DISABLE=1
export NCCL_IB_DISABLE=1
export NCCL_CUMEM_ENABLE=0
export NCCL_DEBUG=WARN

# Attention под Volta — xformers, не Triton
export VLLM_ATTENTION_BACKEND=XFORMERS
# Для 1Cat-fork:
# export VLLM_ATTENTION_BACKEND=FLASH_ATTN_V100

# В облаке на NVLink — НЕ ставить NCCL_P2P_DISABLE=1, иначе NVLink не подберётся

Обязательные флаги vllm serve

--dtype=half               # BF16 на cc 7.0 не работает — везде FP16
--enforce-eager            # часть CUDA-графов под Volta нестабильна, отключаем
--disable-custom-all-reduce  # custom AR требует NVLink; на стенде без NVLink — снимаем
--gpu-memory-utilization 0.90  # 0.92+ часто упирается в xformers workspace, ловим OOM на TP

Сводка по квантизациям

Quant

Volta cc 7.0

Комментарий

FP16

работает

Базовый формат

BF16

не работает

Только cc 8.0+; компенсируем --dtype=half

AWQ INT4 (upstream)

не работает

Marlin требует cc 7.5+

AWQ INT4 (1Cat-fork)

работает

WMMA SM70 kernels — наш основной путь

GPTQ INT4

работает

Самый универсальный — Volta до Hopper

W4A16 (RedHatAI)

работает

Страховой вариант для int4

FP8 W8A8

не работает

Нет hardware FP8 cores — только Hopper+

MXFP4

не работает (через vLLM)

gpt-oss-20b / 120b в нативном MXFP4 в vLLM не пойдут — через Ollama GGUF Q4 работают

NVFP4

не работает

Nemotron-NVFP4 — garbled output (vllm/#34694)

FlashAttention

FA2 требует cc 8.0+, на Volta не работает. Остаётся xformers как стандартный backend (с --enforce-eager или через VLLM_ATTENTION_BACKEND=XFORMERS) и FLASH_ATTN_V100 из 1Cat-fork с WMMA tensor ops.

Под наш набор задач (FP16 для мелких моделей + AWQ через 1Cat для крупных + GPTQ как страховка) этого хватает, чтобы держать рабочий стенд до 70B на двух картах дома и до 70B на TP=4 в облаке.

SHM-wall: почему vLLM в итоге не главный наш стек

Если у вас геморрой в небезызвестном месте и вам нравится это состояние — обязательно пробуйте vLLM. А если серьёзно — мы потратили на vLLM-стек ровно неделю, и потом перешли на Ollama. Расскажем почему.

В чём суть. На видеокарту 2017 года мы пробуем прикрутить технологию 2023 года. Это то же самое, что на «буханку» прикручивать CarPlay — может и получится, но проще купить новую машину, чем заниматься танцами с бубнами. Tesla V100 — это Volta SM 7.0, поколение до Turing, до Ampere, до Hopper. А vLLM с paged-attention и ядром flash-attn-V100 заточен под Ampere SM 8.0 / Hopper SM 9.0: у тех чипов 164–228 КБ shared memory на блок CUDA, а у Volta всего 96 КБ. Это аппаратный потолок, патчем .so не лечится, кроме как переписать ядро под BLOCK_N=64руками — и тогда это уже не «развернуть модель», а становиться разработчиком GPU-ядер.

Эмпирический срез по 1Cat-vLLM 0.0.3 за неделю мучений:

Что работает на vLLM 1cat 0.0.3

Что не работает

Qwen3.6-27B-AWQ (head_dim=256) — любая длина

Qwen2.5-32B-AWQ (>1100 ток.) — падение на 96 КБ SHM

Qwen3.6-35B-A3B-AWQ MoE (head_dim=256)

Qwen2.5-Coder-32B-AWQ (>1100 ток.)

Qwen2.5-1.5B / 7B / 14B-AWQ (короткие prompts)

Llama-3.3-70B-AWQ TP=2 (>1800 tok)

Qwen3-Coder-30B-A3B MoE (≤1800 tok)

DS-R1-Distill-Llama-70B-AWQ TP=2 (>1800 tok)

Qwen2.5-72B-AWQ TP=2 (≤1850 tok)

Qwen2.5-VL-72B-AWQ — instant crash на startup

Магия в head_dim. Для семейства Qwen3.6 с head_dim=256 1Cat-vLLM работает на любой длине промпта: расклад shared memory в ядре другой, влезает. Для основной массы AWQ-моделей с head_dim=128 — Qwen2.5/Coder-32B, Llama-3.3-70B, Mistral-Small-24B — это аппаратный потолок: ядро flash_attn_v100_cuda.prefill_paged_fwd требует 101 КБ shared memory на блок при длинном prefill, у V100 потолок 96 КБ. Любой промпт длиннее ~1100–1800 токенов превращается в RuntimeError: Shared memory exceeds 96KB.

Прямая сравнительная замер на одной и той же модели — Qwen2.5-Coder-32B AWQ через 1Cat-vLLM против того же Qwen2.5-Coder-32B Q4_K_M через Ollama:

input prompt

vLLM AWQ tps

Ollama Q4_K_M tps

Дельта

200 tok

32.7

31.75

паритет (−3%)

~1100 tok

23.7

31.24

Ollama +32%

1500 tok

crash

30.97

Ollama only

1800 tok

crash

30.82

Ollama only

8 000 tok

crash

28.15

Ollama only

32 000 tok

crash

21.68

Ollama only

На коротких промптах vLLM держит паритет, на контексте 1100+ токенов уже проигрывает Ollama на той же модели, на 1500+ просто падает. Для рабочего пайплайна с транскриптами звонков (3–14 тыс. токенов на входе) — нерабочий стек.

Concurrency для полноты картины (Ollama, OLLAMA_NUM_PARALLEL=4, single V100):

Параллельных запросов

Суммарно, tok/s

1

7.99

4

28.88

8

29.14

16

29.32 (потолок)

Ollama батчит до 4 параллельных, дальше очередь. Для прода с 10+ одновременных юзеров на коротких prompts vLLM выигрывает по aggregate ×2.5–5, но падает на любых длинных. Для прода с длинным контекстом или ≤4 параллельных — Ollama побеждает безоговорочно.

Отсюда и решение: vLLM остаётся в кармане под узкий пул моделей (Qwen3.6 head_dim=256, короткие промпты, высокий параллелизм), а массовый бенч целиком на Ollama — он же выполняет роль рабочего стека на проде.


Как мы это всё тестировали

Синтетику гонять не интересно — нагоняли её и без нас. Берём реальный пайплайн оценки звонков колл-центра: Whisper-large + Pyannote крутят транскрипт на одной карте, LLM оценивает диалог по чек-листу на другой. Один и тот же эталонный звонок (обезличен) режем на 4 длины — short ~3K токенов, small ~5K, medium ~10K, large ~14K — и гоняем через одну и ту же связку. На выходе — output t/s, TTFT, sustained, плюс JSON-разбор для sanity-check.

NVLink на десктопе не подключён — на PCIe-конверсиях его и подключить не к чему. Поэтому межкарточный обмен идёт по PCIe 3.0 x8 (~7.9 GB/s — в десятки раз медленнее NVLink2 на 300 GB/s). Из этого вылез осознанный выбор data parallelism, а не tensor:

GPU

Задача

GPU#0

STT-пайплайн (Whisper-large-v3 + Pyannote-3.0, ~4–6 ГБ VRAM)

GPU#1

LLM-инференс (Qwen2.5-7B fp16 для прода + слои моделей под бенчи, ~14 ГБ VRAM)

Это data/task parallelism: две задачи на двух картах, каждая со своим инференсом, межGPU-обмена нет. Под пайплайн оценки звонка декомпозиция естественная — транскрипт идёт от STT-карты к LLM-карте через CPU/RAM, на выходе JSON-скоринг. Под TP=2 (модель >32 ГБ) такой стенд не годится по умолчанию — узкое место по PCIe режет устойчивый tok/s в 3–5× относительно NVLink-варианта. Это мы знали из собственного опыта на 4× 4090: даже PCIe 4.0 x16 убивал TP, если модель помещалась в одну карту.

Отсюда главный практический вывод по железу. «Правильный» путь под V100 — SXM2 + NVLink-backplane:

Путь А (наш PCIe-стенд)

Путь Б (SXM2 + NVLink)

Цена за 2 карты + связка + охлад, ₽

~137 254

~145 792

Платформа

Любая с 2× PCIe x16

SXM2-mezzanine или спец. NVLink-корпус

Сборка

«Воткнул и работает»

Требует серверной обвязки

NVLink

нет

да (300 GB/s между картами)

TP=2 имеет смысл

нет (PCIe — узкое место)

да

Максимум модели в TP=2

~30B fp16 / 70B AWQ медленно

70B+ комфортно

Разница в цене копеечная — 8.5к ₽, — но если знать заранее, что будут TP=2 нагрузки, Путь Б предпочтительнее. Свою серверную обвязку под SXM2 мы не строили — там, где нам нужен был замер «с NVLink», арендовали 5 подов на vast.ai с 2× V100 SXM2 (топология как повезёт — vast не даёт фильтра, нам выпало 4 NVLink из 5).

Дальше — про сам бенч. Основной массовый прогон у нас — на Ollama Q4_K_M через 5 подов параллельно: 108 LLM + 14 моделей генерации картинок + 6 моделей видео + STT-блок. Это покрытие, под которое не нужен vLLM (а на V100 vLLM, как помним, упирается в потолок 96 КБ shared memory на head_dim=128 уже на 32B AWQ-моделях). Узкий vLLM-замер на тех моделях, где он реально едет, и точное «PCIe vs NVLink» в чистых цифрах на одном железе — добиваем отдельной публикацией позже (репо открытый, цифры подложим туда же).


Бенч: 128 моделей на одной паре V100

Параллельно с vLLM-стеком мы устроили массовый прогон через Ollama. 108 моделей в Q4_K_M, 5 подов vast.ai с 2× V100 32GB SXM2 (часть с NVLink, часть на чистом PCIe — vast не даёт фильтра по NVLink, топология как повезёт), в один поток, N=1. При temperature=0 и одиночном потоке вариативность пренебрежимо мала — мы это отдельно проверили (CV ≤ 0.10%, заметка по разбросу — в репо).

Каждую модель прогоняли на 4 уровнях контекста на реальных обезличенных транскрипциях из нашего колл-центра: ~3K / 5K / 10K / 14K токенов на входе + один и тот же оценочный промпт. Параметры везде идентичны: num_predict=300num_ctx=22000OLLAMA_NUM_PARALLEL=1OLLAMA_FLASH_ATTENTION=1OLLAMA_KV_CACHE_TYPE=q8_0. Полная таблица на все 108 моделей и сырые JSON — в репо pocketcoder-ch/v100-benchmarks-2026/docs/FULL_REPORT.md. Ниже — выжимка по группам и полная таблица 128 прогонов в конце.

Топ-10 по чистой скорости

Скорость генерации (decode), среднее по 4 уровням контекста, один поток:

Модель

Params

Avg tps

Pod

smollm2:135m

0.135 B

424

pod3

llama3.2:1b-instruct-q4_K_M

1.0 B

300

pod5

smollm2:360m

0.36 B

299

pod3

glm-ocr

263

pod4

gemma3:1b

1.0 B

197

pod3

qwen3:0.6b-q4_K_M

0.6 B

190

pod4

smollm2:1.7b

1.7 B

175

pod3

qwen3:1.7b-q4_K_M

1.7 B

166

pod4

llama3.2:3b-instruct-q4_K_M

3.0 B

157

pod5

gemma3:4b

4.0 B

119

pod3

Картина ожидаемая: топ забирают модели до 2B, где decode упирается уже не в карту, а в пропускную способность HBM2 (900 ГБ/с) и накладные расходы рантайма. С 4B начинается перелом — контекст ощутимо съедает скорость.

5 рабочих лошадок 7–9B

Самый практичный диапазон под локалку: помещается в одну V100, тянет нормальные prefill, держит длинный контекст без обвала. Если коротко — то, на чём реально живёт прод.

qwen2.5:7b-instruct-q4_K_M — 102.8 tps avg, 113/109/97/91 tps по 4 уровням контекста. Деградирует на длинных промптах ровно и предсказуемо, без обрывов. Наш рабочий выбор на стенде.

ollama run qwen2.5:7b-instruct-q4_K_M
env: OLLAMA_NUM_PARALLEL=1 OLLAMA_FLASH_ATTENTION=1 OLLAMA_KV_CACHE_TYPE=q8_0

Подробнее: repo/docs/MODEL_CARDS.md#qwen25

glm4:9b — 104.9 tps avg, 108/107/103/100 tps. Самый ровный по контексту в группе: между short и large теряет всего 8%. Если в задаче длинные промпты — берите её, а не Llama.

ollama run glm4:9b
env: OLLAMA_NUM_PARALLEL=1 OLLAMA_FLASH_ATTENTION=1 OLLAMA_KV_CACHE_TYPE=q8_0

Подробнее: repo/docs/MODEL_CARDS.md#glm4

llama3.1:8b-instruct-q4_K_M — 82.9 tps avg, 98/89/76/69 tps. Классическая Llama, базовая линия — всё остальное мы по привычке меряем относительно неё.

ollama run llama3.1:8b-instruct-q4_K_M
env: OLLAMA_NUM_PARALLEL=1 OLLAMA_FLASH_ATTENTION=1 OLLAMA_KV_CACHE_TYPE=q8_0

Подробнее: repo/docs/MODEL_CARDS.md#llama31

mistral:7b-instruct-v0.3-q4_K_M — 79.6 tps avg, 98/87/71/62 tps. Чуть медленнее Llama-3.1, зато проще в промптинге и предсказуемее на JSON-выводе. На неё переходили в задачах, где Llama-3.1 ловила галлюцинации в schema.

ollama run mistral:7b-instruct-v0.3-q4_K_M
env: OLLAMA_NUM_PARALLEL=1 OLLAMA_FLASH_ATTENTION=1 OLLAMA_KV_CACHE_TYPE=q8_0

Подробнее: repo/docs/MODEL_CARDS.md#mistral7b

falcon3:7b — 94.7 tps avg, 107/98/88/86 tps. Хорошая Falcon-итерация: на длинных контекстах держит скорость лучше Llama/Mistral за счёт более экономного attention. Сюрприз бенча в этой категории.

ollama run falcon3:7b
env: OLLAMA_NUM_PARALLEL=1 OLLAMA_FLASH_ATTENTION=1 OLLAMA_KV_CACHE_TYPE=q8_0

Подробнее: repo/docs/MODEL_CARDS.md#falcon3

Большие модели: 14B–70B на 2× V100

Здесь уже включается межкарточный обмен. На подах с NVLink цифры заметно бодрее, чем на чистом PCIe — фактический ответ на гипотезу из Части I.

gpt-oss:20b — 106.8 tps avg, 111/108/105/103 tps. Главный сюрприз всего бенча: 20B-модель идёт быстрее половины 7B-моделей. Магия — MoE-роутинг, активных параметров мало, decode почти не зависит от размера. Деградация по контексту нулевая.

ollama run gpt-oss:20b

qwen2.5:14b-instruct-q4_K_M — 52.9 tps avg, 60/56/50/46 tps. Рабочая середина: ощутимо умнее 7B, но в два раза медленнее на decode. Когда 7B не вытягивает по качеству — следующий шаг сюда, а не сразу в 70B.

ollama run qwen2.5:14b-instruct-q4_K_M

gemma2:27b-instruct-q4_K_M — 32.8 tps avg, 35/34/31/31 tps. Влезает в одну V100 32GB в Q4 и идёт по контексту почти ровно. Если задача про русский язык — стоит пробовать в первую очередь.

ollama run gemma2:27b-instruct-q4_K_M

mixtral:8x7b — 75.0 tps avg, 81/78/73/69 tps. MoE на 56B суммарно, активных ~13B — за счёт этого спокойно держит 70+ tps на decode. Двух V100 (64 ГБ суммарно) хватает впритык.

ollama run mixtral:8x7b

llama3.3:70b-instruct-q4_K_M — 14.6 tps avg, 16/15/14/14 tps. Топовая dense-70B на нашем железе, раскладывается по двум картам через Ollama-роутер. На NVLink-поде даёт стабильные ~14 tps — для async-задач (фоновая оценка звонка) более чем достаточно. Если нужно «прямо сейчас» — будет душно.

ollama run llama3.3:70b-instruct-q4_K_M

qwen2.5:72b-instruct-q4_K_M — 13.7 tps avg, 15/14/13/13 tps. Прямой конкурент Llama-3.3-70B по железу. Чуть медленнее, но на некоторых наших чек-листах выдаёт качество выше.

ollama run qwen2.5:72b-instruct-q4_K_M

mixtral:8x22b-instruct-v0.1-q3_K_M — 5.4 tps avg, 7/6/5/4 tps. 176B параметров суммарно, Q3_K_M, выжимаем под потолок VRAM 2× V100. Запускается, но decode медленный — это практичный верх для MoE на этом железе.

ollama run mixtral:8x22b-instruct-v0.1-q3_K_M

mistral-large:123b-instruct-2407-q3_K_M — 2.4 tps avg. Верхняя планка того, что 2× V100 32GB вообще тянут в Ollama. 4-й уровень контекста (14K tok) уже не доезжает — модель умирает по памяти. Для рабочей нагрузки бесполезно, но «а влезет ли» — да, влезает.

ollama run mistral-large:123b-instruct-2407-q3_K_M

Где упираемся в потолок: модели только на коротком контексте

Сразу оговоримся: это не «не запустилось». Эти модели запустились, считают на коротких prompt’ах, но на длинном контексте упираются в потолок 22K num_ctx × 64 ГБ VRAM. На уровне short (≤2–3K токенов) и small (~5K) — генерация идёт; на medium/large — OOM на KV-cache или ответ обрезается.

Модель

Что реально работает в нашем бенче

Где упирается

mistral-large:123b

short ~3.0 tps, small ~2.6 tps, medium ~1.7 tps

large (14K tok) — OOM на KV-cache

gpt-oss:120b

short/small/medium ~74–76 tps avg (MoE 120B/5B active, через Ollama GGUF Q4)

large — не доезжает

Картина типичная: большие dense-модели на длинных prompt’ах упираются в KV-cache. На коротком контексте едут.

Отдельной категорией идут модели, которые в Ollama не смогли подняться вообще (статус PREWARM_FAIL или все 4 уровня FAIL). Это не про Volta как архитектуру — на других подах часть из них поднималась, причины не задокументированы Ollama-runtime в логе. Перечень есть в docs/MODEL_CARDS.md репо, тут — короткий итог: command-r-plus:104b-q4_K_S (pod1), qwen:72b (pod5, легаси Qwen-1), phi:2.7b (pod5), а также deepseek-r1:8b-q4_K_M / :14b-q4_K_M / :32b-q4_K_M на pod3. Все три тега DeepSeek-R1 на других подах (deepseek-r1:8b без явного суффикса и т.п.) поднимались штатно — проблема была локальная для pod3.

STT: Whisper-large на V100

Помимо LLM-бенча, отдельно прогоняли STT — нашу боевую STT-карту в продакшене делает Whisper-large-v3 через faster-whisper, FP16, single-stream. 4 эталонных аудио-семпла разной длины: ~30 сек, ~2 мин, ~5 мин, ~10 мин. Метрика — RTF (real-time factor), во сколько раз распознавание быстрее реал-тайма.

Команда запуска:

faster-whisper --model large-v3 --device cuda --compute-type float16 input.wav

Ориентир по RTF (числа округлены, точные значения — в финальном артефакте репо):

Длина аудио

Wall, сек

RTF

~30 сек

~3

~10×

~2 мин

~10

~12×

~5 мин

~22

~14×

~10 мин

~45

~13×

TBD: точные числа после финального прогона. Ориентир — RTF 8–15× на V100 FP16 для single-stream.

Практический вывод: для прода с 50 одновременных STT-потоков одна V100 не тянет — потребуется WhisperX с batching/VAD или вторая карта. Для лаборатории и 1–5 параллельных распознаваний одна V100 закрывает задачу с большим запасом. У нас в пайплайне STT занимает одну карту (~5–6 ГБ VRAM включая Pyannote), LLM-эвал на 7B FP16 — вторую, и в сумме две задачи на одной коробке.

Image-gen: 14 моделей через sd.cpp

14 прогонов через stable-diffusion.cpp с фиксом --type bf16 .

Сводка по wall-time на 1024×1024:

Модель

Wall sec

SDXL-base-1.0

26–27

Z-Image-Turbo-Q8

64

FLUX.1-dev-Q5_K_S-GGUF

138–139

SDXL — самый быстрый на V100 без бубнов. Z-Image-Turbo через --type bf16 workaround выдаёт 1024² за минуту. FLUX.1-dev в Q5_K_S — 2.3 минуты на картинку, требует --vae-on-cpu --clip-on-cpu, иначе ловится NaN в VAE и на выходе белый PNG ~3 КБ (BF16-FP16-mismatch на sm_70).

Несколько результатов с одного и того же промпта по трём моделям (1024×1024, V100):

SDXL — оператор колл-центра

SDXL — оператор колл-центра

SDXL-base-1.0, 26 сек — ну качество так себе :)

SDXL — диаграмма речевой аналитики

SDXL — диаграмма речевой аналитики

SDXL на технической схеме — отрабатывает чище FLUX по тексту в кадре

Z-Image — AI-агент с базой

Z-Image — AI-агент с базой

Z-Image: лучшее качество за минуту, рабочая лошадка для V100

Video-gen: 6 прогонов

Модель

Wall sec

Кадры

Wan2.2-TI2V-5B-Q8

212–214

33

CogVideoX-5b

535–537

49

Wan2.2 5B в Q8 GGUF влезает в одну V100 32 ГБ, ~3.5 минуты на 33 кадра. CogVideoX-5b в FP16 — ~9 минут на 49 кадров. LTX-Video / Hunyuan / Wan 14B на двух V100 без NVLink не пробовали — TP cross-card на diffusion в этом стеке не работает.

Бенчмарки 128 моделей

LLM — t/s 108 моделей, Ollama Q4_K_M (развернуть таблицу)

#

Модель

B

short tps

small tps

medium tps

large tps

avg tps

1

smollm2:135m

433.6

420.3

421.6

421.4

424.2

2

llama3.2:1b-instruct-q4_K_M

1.0

352.5

322.5

274.6

249.0

299.6

3

smollm2:360m

305.3

297.8

296.9

297.9

299.4

4

glm-ocr

303.4

247.6

257.6

243.8

263.1

5

gemma3:1b

1.0

203.2

172.1

207.4

204.2

196.7

6

qwen3:0.6b-q4_K_M

0.6

204.8

195.5

177.3

184.4

190.5

7

smollm2:1.7b

1.7

183.4

172.5

172.2

171.7

175.0

8

qwen3:1.7b-q4_K_M

1.7

163.7

182.2

163.2

156.5

166.4

9

llama3.2:3b-instruct-q4_K_M

3.0

180.6

167.3

147.0

134.4

157.3

10

qwen:1.8b

1.8

274.4

248.8

130.8

11

qwen:1.8b

1.8

272.4

248.3

130.2

12

gemma3:4b

4.0

107.4

123.4

123.7

122.8

119.3

13

moondream

182.2

30.0

113.4

113.5

109.8

14

gpt-oss:20b

20.0

110.8

107.9

105.3

103.1

106.8

15

glm4:9b

9.0

108.5

107.8

103.0

100.4

104.9

16

starcoder2:7b

7.0

177.3

159.1

82.7

104.8

17

qwen2.5-coder:7b-instruct-q4_K_M

7.0

113.4

108.0

98.7

92.5

103.2

18

qwen2.5:7b-instruct-q4_K_M

7.0

113.2

109.1

97.3

91.4

102.8

19

dolphin3:8b

8.0

110.0

105.8

98.0

93.2

101.8

20

starcoder2:7b

7.0

177.8

151.8

71.0

100.2

21

glm4:9b

9.0

103.2

101.9

95.2

91.5

97.9

22

falcon3:7b

7.0

106.8

98.1

88.4

85.5

94.7

23

nemotron-mini:4b-instruct-q4_K_M

4.0

153.1

97.8

13.7

113.7

94.6

24

nemotron-mini:4b

4.0

152.4

97.4

13.7

113.1

94.1

25

magicoder:7b

7.0

113.6

102.5

82.7

71.4

92.6

26

codellama:7b

7.0

113.9

102.2

82.2

70.9

92.3

27

olmo2:7b

7.0

91.3

91.2

91.3

90.8

91.2

28

starling-lm:7b-beta

7.0

106.6

94.6

80.2

80.1

90.4

29

qwen:7b

7.0

106.6

96.9

81.9

71.8

89.3

30

openchat:7b

7.0

107.2

94.8

77.4

72.2

87.9

31

deepseek-r1:8b

8.0

90.7

90.3

84.5

80.0

86.4

32

neural-chat:7b

7.0

107.5

95.1

75.5

64.9

85.8

33

zephyr:7b-beta

7.0

106.9

94.7

75.3

65.2

85.5

34

qwen3:4b-q4_K_M

4.0

97.5

92.8

78.4

69.0

84.4

35

llama3.1:8b

8.0

100.0

90.2

77.0

69.7

84.2

36

dolphin3:8b

8.0

99.7

90.5

76.9

69.6

84.2

37

llama3:8b

8.0

107.5

96.9

63.7

64.6

83.2

38

llama3.1:8b-instruct-q4_K_M

8.0

98.1

88.6

76.1

68.7

82.9

39

mistral:7b-instruct-v0.3-q4_K_M

7.0

98.0

87.2

71.1

61.9

79.5

40

mistral:7b

7.0

96.9

86.9

70.5

61.7

79.0

41

llama3.2-vision:11b

11.0

93.8

73.8

74.9

66.8

77.3

42

nemotron-mini:4b-instruct-fp16

4.0

89.2

72.9

69.6

73.0

76.2

43

starcoder2:15b

15.0

66.2

117.6

59.3

58.4

75.4

44

alibilge/Huihui-GLM-4.6V-Flash-abliterated:q4_k_m

78.6

76.9

74.2

71.6

75.3

45

mixtral:8x7b

56.0

81.2

77.7

72.5

68.5

75.0

46

gpt-oss:120b

120

76.4

74.8

72.8

74.7

47

granite3-dense:8b

8.0

71.5

72.8

71.1

76.3

72.9

48

vicuna:7b

7.0

114.4

58.9

58.7

58.9

72.7

49

llama2:7b

7.0

113.9

60.0

57.8

57.8

72.4

50

qwen3:8b-q4_K_M

8.0

78.3

76.7

63.9

58.7

69.4

51

solar:10.7b

10.7

72.2

66.3

66.3

66.0

67.7

52

falcon3:10b

10.0

76.6

70.5

61.1

61.0

67.3

53

gemma2:9b-instruct-q4_K_M

9.0

73.8

69.2

61.6

60.2

66.2

54

codegemma:7b

7.0

100.9

96.3

31.3

31.6

65.0

55

phi3:3.8b

3.8

95.0

73.6

47.8

37.2

63.4

56

granite3.1-dense:8b-instruct-q4_K_M

8.0

78.5

69.9

55.4

47.7

62.9

57

phi3:3.8b-mini-128k-instruct-q4_K_M

3.8

93.8

71.4

46.8

36.7

62.2

58

gemma3:12b

12.0

63.7

61.9

61.3

60.5

61.9

59

dolphin-mixtral:8x7b

56.0

72.4

66.8

56.6

50.4

61.6

60

nous-hermes2-mixtral

71.8

66.3

56.3

50.2

61.1

61

mistral-nemo:12b-instruct-2407-q4_K_M

12.0

68.7

62.8

54.4

49.8

58.9

62

glm-4.7-flash:latest

61.7

58.6

54.1

50.4

56.2

63

olmo2:13b

13.0

55.3

55.2

55.2

55.2

55.2

64

codellama:13b

13.0

66.9

60.0

49.6

42.8

54.8

65

qwen:14b

14.0

63.8

58.6

49.1

43.2

53.7

66

qwen2.5:14b-instruct-q4_K_M

14.0

59.5

56.1

49.9

45.9

52.9

67

qwen2.5-coder:14b-instruct-q4_K_M

14.0

59.0

55.4

49.5

45.9

52.5

68

qwen3:14b-q4_K_M

14.0

57.2

55.5

50.0

46.6

52.3

69

deepseek-r1:14b

14.0

58.6

55.2

49.4

45.7

52.2

70

phi3:14b-medium-128k-instruct-q4_K_M

14.0

59.9

54.3

45.4

40.1

49.9

71

deepseek-coder-v2:16b-lite-instruct-q4_K_M

16.0

80.2

56.7

33.0

25.2

48.8

72

llama2:13b

13.0

66.6

37.4

47.8

43.2

48.7

73

phi4:14b-q4_K_M

14.0

57.7

51.4

42.2

27.9

44.8

74

vicuna:13b

13.0

67.7

40.9

42.6

9.7

40.2

75

vicuna:13b

13.0

66.9

40.6

42.4

9.7

39.9

76

mistral-small:24b-instruct-2501-q4_K_M

24.0

42.0

39.7

36.4

33.7

37.9

77

codestral:22b-v0.1-q4_K_M

22.0

41.0

38.3

33.1

30.1

35.6

78

gemma3:27b

27.0

33.4

33.0

32.6

32.2

32.8

79

gemma2:27b-instruct-q4_K_M

27.0

35.0

33.8

31.0

31.1

32.8

80

qwen:32b

32.0

33.9

32.3

29.5

27.5

30.8

81

command-r:35b-08-2024-q4_K_M

35.0

32.5

31.2

29.3

27.9

30.2

82

yi:34b

34.0

29.1

28.9

28.4

28.9

28.8

83

aya-expanse:32b-q4_K_M

32.0

32.5

31.2

25.3

25.6

28.7

84

aya-expanse:32b

32.0

32.5

31.2

25.3

25.6

28.6

85

qwq:32b-preview-q4_K_M

32.0

30.2

29.1

26.5

24.9

27.7

86

qwen2.5:32b-instruct-q4_K_M

32.0

30.1

28.9

26.4

24.8

27.5

87

qwen2.5-coder:32b-instruct-q4_K_M

32.0

29.9

28.6

26.5

25.1

27.5

88

deepseek-r1:32b

32.0

29.6

28.4

26.2

24.8

27.3

89

exaone-deep:32b

32.0

29.0

27.4

24.1

22.0

25.6

90

wizardcoder:33b

33.0

30.5

28.1

23.4

17.4

24.8

91

qwen3:32b-q4_K_M

32.0

27.3

26.2

23.7

22.0

24.8

92

codellama:70b

70.0

17.5

17.4

17.4

17.5

17.5

93

llama2:70b

70.0

17.6

16.6

16.3

16.4

16.7

94

hermes3:70b

70.0

17.4

16.8

15.4

14.7

16.1

95

llama3.1:70b

70.0

16.1

15.9

15.4

15.1

15.6

96

nemotron:70b

70.0

16.1

15.9

15.4

15.1

15.6

97

llama3:70b

70.0

17.5

16.8

14.1

13.7

15.5

98

llama3.3:70b-instruct-q4_K_M

70.0

15.8

15.2

14.1

13.5

14.6

99

deepseek-r1:70b-llama-distill-q4_K_M

70.0

15.6

15.0

14.0

13.3

14.5

100

qwen2.5:72b-instruct-q4_K_M

72.0

14.7

14.2

13.2

12.5

13.7

101

mixtral:8x22b-instruct-v0.1-q3_K_M

176

7.2

6.2

4.6

3.6

5.4

102

mistral-large:123b-instruct-2407-q3_K_M

123

3.0

2.6

1.7

2.4

103

command-r-plus:104b-q4_K_S

104

104

deepseek-r1:14b-q4_K_M

14.0

105

deepseek-r1:32b-q4_K_M

32.0

106

deepseek-r1:8b-q4_K_M

8.0

107

phi:2.7b

2.7

108

qwen:72b

72.0

Image-gen (sd.cpp, FP16/BF16-фикс через —type bf16)

#

Модель

Промпт

Wall sec

Размер

1

Z-Image-Turbo-Q8

ai_agent_database

64.0

1024×1024

2

Z-Image-Turbo-Q8

office_winter

64.2

1024×1024

3

Z-Image-Turbo-Q8

neon_city

64.8

1024×1024

4

Z-Image-Turbo-Q8

call_center_operator

64.0

1024×1024

5

Z-Image-Turbo-Q8

speech_analytics_diagram

64.3

1024×1024

6

FLUX.1-dev-Q5_K_S-GGUF

call_center_operator

139

1024×1024

7

FLUX.1-dev-Q5_K_S-GGUF

speech_analytics_diagram

138

1024×1024

8

FLUX.1-dev-Q5_K_S-GGUF

ai_agent_database

138

1024×1024

9

FLUX.1-dev-Q5_K_S-GGUF

office_winter

139

1024×1024

10

SDXL-base-1.0

call_center

26

1024×1024

11

SDXL-base-1.0

speech_diagram

27

1024×1024

12

SDXL-base-1.0

ai_agent

26

1024×1024

13

SDXL-base-1.0

office_winter

26

1024×1024

14

SDXL-base-1.0

neon_city

26

1024×1024

Video-gen

#

Модель

Промпт

Wall sec

Кадры

Разрешение

1

Wan2.2-TI2V-5B-Q8

office_winter

214

33

480×832

2

Wan2.2-TI2V-5B-Q8

call_center

213

33

480×832

3

Wan2.2-TI2V-5B-Q8

ai_agent

212

33

480×832

4

CogVideoX-5b

office_winter

535

49

720×480

5

CogVideoX-5b

ai_agent

537

49

720×480

6

CogVideoX-5b

call_center

537

49

720×480

Полные карточки на каждую строку — docs/MODEL_CARDS.md в репо. Там же сырые JSON, скрипты бенча и интерактивный дашборд.


Когда NVLink реально нужен — практический вывод

Прямого «одна и та же модель на NVLink vs PCIe в одной таблице» в этой статье у нас нет: платформа vast не даёт фильтра по топологии, в массовый прогон попадали и NVLink-, и PCIe-поды вперемешку (4 NVLink из 5 в нашем наборе). Точное A/B на одном железе — следующий этап, добиваем отдельно. Но из 128 прогонов выводы по вопросу «когда оно реально нужно» — следующие.

Если модель влезает в одну карту (до 30B AWQ, до 14B в FP16), NVLink ей не даёт ничего: межGPU-обмена просто нет, обе карты независимы.

Где NVLink начинает решать — это TP=2 на больших моделях. Llama-3.3-70B AWQ через TP=2 на десктопе с PCIe x8 на коротких промптах даёт около 9 tps decode; на NVLink-поде из vast.ai та же модель в схожем режиме поднимается уже к ~25 tps. Точные цифры — в полной таблице выше; разница принципиальная.

Граница простая: если модель ≤ VRAM одной карты — PCIe-конверсия закрывает задачу с запасом и переплата за NVLink не оправдана. Если 70B+ или планируете TP=2 — сразу берите SXM2 + NVLink-backplane.


Failed / Skip: архитектурные ограничения Volta

Раздел про то, что не работает на V100 принципиально, по архитектуре. Конкретные FAIL’ы по моделям из массового бенча — выше, в подсекции «Где упираемся в потолок».

Нативный квант / технология

Почему не работает на V100

Что делать

FP8 (Llama-3.1-8B-FP8 / Neural Magic / RedHatAI)

FP8 требует Hopper (cc 9.0+). На Volta cc 7.0 нет аппаратной поддержки.

Llama-3.1-8B fp16 или AWQ INT4

MXFP4 (gpt-oss-20b / gpt-oss-120b в нативном MXFP4)

MXFP4 — формат Blackwell-серии (cc 12.0+). vLLM с нативным квантом не поднимет.

Через Ollama GGUF Q4_K_M обе модели идут: gpt-oss:20b — 106.8 tps, gpt-oss:120b — 74.7 tps (см. выше)

NVFP4 (Nemotron-NVFP4)

NVFP4 — формат Blackwell.

Nemotron в bf16 — большой, но крутится

FlashAttention 3

Оптимизирован под Ampere+.

FA2 + --enforce-eager в vLLM

BF16-нативный inference в diffusers

Volta не имеет hardware-BF16, идёт CPU emulation, на выходе NaN в VAE

FP16 + pipe.vae.to(torch.float32) или sd.cpp --type bf16

Главный вывод: если в стеке критичен нативный FP8/FP4/MXFP4 — V100 не подходит, смотрите минимум A100 (FP8 — частично) или H100 (FP8 — полноценно). Если можно жить с GGUF Q4 через Ollama — V100 покрывает почти весь зоопарк современных моделей до 120B параметров.


Что бы мы изменили, если бы пересобирали сейчас

Несколько честных «бы» по итогам полугода эксплуатации.

№1 — Брали бы 16 ГБ-версию V100, не 32 ГБ

Под текущий пайплайн (STT-карта + 7B-LLM-карта) 32 ГБ — чересчур лично нам:

  • Qwen2.5-7B fp16 ≈ 14 ГБ + ~4 ГБ под KV-cache. На 7B столько KV не нужно.

  • Whisper-large + Pyannote ≈ 4–6 ГБ — ~26 ГБ просто простаивает.

16 ГБ-версии V100 SXM2 на Али обычно по ~30–35к ₽ против ~58к ₽ за 32 ГБ. Сборка вышла бы ~150-170к ₽ вместо 220к ₽.

32 ГБ оправданы в трёх сценариях: если гоняете 14B в fp16 (в 16 ГБ не лезет), если гоняете 70B AWQ TP=2 (~19 ГБ на карту + KV-cache), или если делаете serving с большим concurrency, на котором раздувается KV-cache. Под наш кейс мы взяли 32 ГБ «на вырост» — пока вырост не пригодился.

№2 — Своему же совету последовали бы и сначала погоняли в облаке

Главный совет, который мы сами раздаём в подобных сборках: «сначала арендуйте часовой pod, погоняйте свой реальный прод, потом покупайте железо». Сами и не последовали — лопнул чип на 3090, нужна была срочная замена, перенастраивать пайплайн в облако было некогда.

В итоге взяли сразу две карты. Если бы за это время появилась более выгодная альтернатива — пролетели бы. Совет повторим: если не горит — облако дешевле, чтобы ошибиться. У нас горело, поэтому облажались по своему же чек-листу.

Где сейчас вообще можно арендовать V100. На момент написания статьи V100 живые остались на vast.ai — туда и ходили за подами под массовый бенч. На RunPod V100 уже сняты с поддержки, в маркетплейсе их нет.

№3 — Сразу пошли бы в SXM2 + NVLink

Если бы знали с самого начала, что будем гнать бенчи под публикацию, — взяли бы сразу Путь Б (SXM2 + NVLink). PCIe-конверсия — это про «удобно, втыкается в десктоп», а не про производительность. Для одиночных моделей в одну карту разницы нет, для TP=2 разница большая.

С другой стороны, под рабочий пайплайн оценки звонков нам и без NVLink хватает. Тот самый случай, когда «правильно» не равно «оптимально под задачу».


Выводы

Что получили на выходе — локальный ИИ-сервер за ~200 000 ₽ с 64 ГБ VRAM на CUDA-стеке, на котором штатно крутится наш продакшн-пайплайн (Whisper+Pyannote для STT и Qwen2.5-7B fp16 для LLM-оценки, обе ноды на одной коробке). Запас VRAM хватает на более крупные модели — Qwen2.5-32B AWQ заходит в одну карту, Llama-3.3-70B AWQ заводится через TP=2 (медленнее из-за отсутствия NVLink, но крутится). Бонус — выстраданное понимание стека под Volta cc 7.0: драйвер, CUDA, какую ветку vLLM брать, какие env-флаги обязательны, где работает Ollama, где не работает vLLM, что лезет по памяти, что не лезет. Плюс 128 прогонов в одной таблице — 108 LLM, 14 моделей генерации картинок, 6 — видео и STT-блок Whisper-large-v3. Всё оставили на гите.

Кому подойдёт такая сборка:

  1. Энтузиастам и небольшим командам до 50 человек — норм.

  2. Под пайплайны с независимыми задачами на двух картах (например, наш STT + LLM, или два разных LLM, или dev + prod) — отлично.

  3. Под лабораторию для тестирования моделей перед арендой облака — идеально.

Кому не подойдёт:

  1. Крупный продакшн с высоким SLA. V100 — это компромисс. Хотите 24/7 без оглядки на состояние карты — берите свежее.

  2. Задачи с требованием нативного FP8/FP4 — не на этом железе.

  3. Задачи с тяжёлым TP (70B+ в fp16) без NVLink — упрётесь в PCIe.

Главный посыл простой: личный ИИ-сервер на 64 ГБ VRAM реально собирается за 200к ₽. Это меньше, чем стоит одна 4090. И на этом железе крутятся ровно те модели, которые реально используются в проде. Скрипты и сырые результаты — в на гите ниже.


Ссылки

  • Репо со скриптами и бенчами — github.com/pocketcoder-ch/v100-benchmarks-2026

  • Telegram-канал — https://t.me/notes_from_cto. Регулярные технические заметки про ИИ, железо и новости из мира искусственного интеллекта :)

  • Если есть вопросы по сборке, бенчам или хочется обсудить свой опыт — пишите на cdv.inbox@gmail.com, Чащин Дмитрий. Буду рад обратной связи.


Автор: Dmitrii-Chashchin

Источник

Оставить комментарий