
У меня уже была установлена RTX 4080 с 16 ГБ VRAM. Её вполне достаточно для гейминга, но не для моделей, которые я хотел запускать локально. Так что следующим шагом было либо приобретение дорогущей карточки с большим объёмом памяти, либо поиск другого способа.
И я этот способ нашёл.
Я купил видеокарту для дата-центра, у которой даже нет нормального коннектора PCIe, и подключил её к ПК через адаптер. Теперь у меня в системе 32 ГБ VRAM от двух GPU, на которых работает модель с 27 миллиардами параметров, выдавая по 32 токена в секунду. И обошлось мне это всего в £200.
GPU

Я взял Tesla V100 SXM2 16GB. Эта модель разрабатывалась для серверов NVIDIA DGX и OCP-стоек гиперскейлеров. Она имеет форм-фактор SXM2, то есть коннектора PCIe у неё нет. Стандартный разъём питания тоже отсутствует. Эти карточки устанавливаются в проприетарные серверные стойки и обмениваются данными через интерфейс NVLink.

Просто так вставить её в материнскую плату не выйдет. Потребуются костыли.
Но вот в чём суть: это видеочип Volta с 16 ГБ памяти HBM2 и 5120 CUDA-ядрами, который я купил на eBay примерно за £150. На сегодня это по-прежнему весьма производительная карта с солидным объёмом VRAM. Самое же удивительное кроется в пропускной способности её памяти.
HBM2 относится к отдельной весовой категории. В V100 используется 4096-битная шина со скоростью передачи 900 ГБ/с. Для наглядности скажу, что в моей RTX 4080 с её модной GDDR6X скорость составляет 736 ГБ/с. То есть память V100 родом из 2017 на 22% быстрее, чем у GPU, выпущенного в 2022.
И в проигрыше тут не только потребительские карты NVIDIA — с продукцией Apple ситуация не лучше. К примеру, у чипа M3 Max скорость памяти 400 ГБ/с, у M4 Max — 546 ГБ/с, а у новейшего M5 Max — ноутбук с которым обойдётся вам дороже £3 000 — 614 ГБ/с. То есть видеокарта из 2017 года обходит все современные решения для Mac.
Самым близким конкурентом моей 4080 является RX 7900 XTX, которая оснащена 24 ГБ GDDR6 со скоростью 960 ГБ/с. Технически она превосходит V100, но стоит при этом £700+, да и инференс LLM на ROCm пока ещё реализован хуже, чем на CUDA. В свою очередь, V100 даёт вам 94% от этой пропускной способности, стоит почти вчетверо дешевле и прекрасно работает с llama.cpp.
Единственным потребительским GPU, который значительно опережает это решение, является RTX 5090 с её 1 792 ГБ/с. Но эта карточка стоит больше £2,000. Для инференса LLM, где узким местом выступает пропускная способность, определяющая число выдаваемых токенов в секунду, это самый важный аспект.
Единственная проблема здесь — это подключение.
Адаптер
Как выяснилось, умельцы уже придумали переходник SXM2-PCIe. Нет, это не NVIDIA, и официально он никем не поддерживается. Это голая печатная плата с разъёмом SXM2 на одной стороне и торцевым разъёмом PCIe на другой. Он обошёлся мне где-то в £50. Половина этой стоимости вполне может объясняться медным радиатором.

Так что всего за £200 я получил видеокарту с 16 ГБ памяти, которую смог установить в материнскую плату рядом со своей RTX 4080. Итого у меня получалось 32 ГБ VRAM при том, что RTX 5090 с аналогичным объёмом стоит больше £2 000. Я не говорю, что моё решение обеспечит равноценный опыт работы, но объём памяти у него такой же.
Адский вентилятор
Но прежде, чем я мог начать нормально работать с V100, мне нужно было разобраться с шумом её вентилятора.
Эта версия карты проектировалась под использование в серверном корпусе формата 2U с промышленным охлаждением, поэтому она далеко не тихая. Такую вещь в своей комнате, особенно в спальне, вы держать явно не захотите.
Вот замер её уровня шума с Apple Watch:

Целых 82 децибела — это где-то между измельчителем отходов и газонокосилкой. Тут уж неволей можно задуматься о ношении берушей в собственном доме.
Самое же печальное, что этот вентилятор не регулируется. Я пробовал nvidia-smi, пробовал найти его сканированием в Linux, даже пытался повлиять на него через Afterburner в Windows — всё безрезультатно. Предполагается, что этот вентилятор будет непрерывно работать на полную катушку внутри сервера, где никого это не побеспокоит.
Тут я пытаюсь разобраться с распиновкой вентилятора. Предположив, что она может оказаться такой же, как у типичных корпусных кулеров, я соединил выводы VCC и минуса с контактами батарейки 9 В с помощью монтажных проводов. Вентилятор заработал, причём намного тише, чем при его стандартных 12 В:
Так я убедился в расположении контактов и решил, что этого зверя всё же можно усмирить.
Обуздание вентилятора
Тест с помощью батарейки показал, что распиновка здесь такая же, как у типичных корпусных вентиляторов, просто использован странный коннектор. Теперь мне нужно было понять, будет ли кулер реагировать на ШИМ-управление, если я подключу его контакты тахометра и ШИМ напрямую к материнской плате.
Чтобы это выяснить, я аналогичным образом соединил пины коннектора с выводами гребёнки на материнской плате (прибавьте громкость):
Сработало. Плата считывает обороты вентилятора, и он управляется через ШИМ. В итоге я установил для него минимальную скорость на 10%. При этом карта даже при полной нагрузке не греется выше 50 С, и работает кулер бесшумно.
Теперь нужно было заменить эти монтажные проводки, которые держались на честном слове, уже надёжным кабелем.

В качестве коннектора на вентиляторе использован небольшой 4х-контактный штекер JST PH2.0 с шагом контактов 2,0 мм. Если сравнивать его с гребёнками вентиляторов на материнской плате, у которых шаг 0,1 дюйма (2,54 мм), то он заметно меньше.
Решением стал кабель-переходник с разъёма PH2.0 на стандартный штекер с шагом 2,54 мм. Конец PH2.0 типа «папа» я подключил к штекеру вентилятора, а чёрный штекер «мама» надел на свободную гребёнку материнки:

Так мне удалось снизить уровень шума с оглушительных 82 дБ до вполне терпимого.
Дешёвое решение для удвоения видеопамяти
Разобравшись с вентилятором, мне удалось прекрасно разместить V100 рядом с RXT 4080:
RTX 4080: 16ГБ, архитектура Ada.
Tesla V100: 16ГБ, архитектура Volta.
Итого: 32ГБ с двух GPU.
llama.cpp умеет разделять модель между GPU, используя распределение тензоров. Она размещает часть слоёв на одной карте, а часть на другой и передаёт между ними промежуточные результаты по шине PCIe. Работает такое решение не так быстро, как на одной карте с 32 ГБ, но работает, а главное, обошлось оно в 10% от той стоимости, которую бы пришлось выложить за единые 32 ГБ. При этом максимальное потребление V100 составляет 150 Вт. Это немало, но и не так уж много для GPU, выполняющего локальный инференс LLM.
Но есть вариант и пожирнее
У V100 также есть модификация с 32 ГБ. Она вдвое дороже, но даже так это всего лишь несколько сотен фунтов за 32 ГБ памяти HBM2 на одной плате. Если взять две таких, вы получите 64 ГБ примерно за 20% от нынешней стоимости RTX 5090.
К тому же, их можно объединить в кластер. Формат SXM2 нативно поддерживает NVLink, а значит, если вы собираете грамотную конфигурацию на нескольких GPU, то эти карточки смогут обмениваться данными на очень высокой скорости. И даже через переходник на PCIe производительность при распределении тензоров остаётся весьма достойной.
Программная часть
Благодаря NixOS, эта часть квеста прошла на удивление гладко. Как я уже говорил, в V100 используется видеочип Volta. NVIDIA прекратила поддержку этой серии, начиная с ветки драйверов 560. Последний драйвер, который поддерживает и RTX 4080 (Ada), и V100 (Volta) относится к ветке 550.x, которая в NixOS соответствует пакету nvidiaPackages.legacy_535.
Этот драйвер поддерживает только CUDA до версии 12.2, а в текущем репозитории nixpkgs доступна минимум 12.6. Так что мне пришлось вытянуть CUDA 12.2 из ветки версии 24.05.
Кроме того, этот драйвер также требует версии ядра 6.6. Более новые не поддерживаются.
И здесь есть одна странность: несмотря на то, что я собрал сервер чисто для инференса без вывода изображения, всё равно требуется установить services.xserver.enable = true. Без этого модули ядра NVIDIA просто не загрузятся.
Благодаря NixOS, большая часть всего этого процесса прошла без заминок. Вот основные параметры для настройки драйверов и ядра:
boot.kernelPackages = pkgs.linuxPackages_6_6; hardware.nvidia.package = config.boot.kernelPackages.nvidiaPackages.legacy_535; services.xserver.enable = true; services.xserver.videoDrivers = [ "nvidia" ];
А вот инструкции для загрузки CUDA 12.2 из более старого nixpkgs, так как текущий предлагает только версии 12.6+:
nixpkgs.overlays = [ (final: prev: { cudaPackages_12_2 = nixpkgs-cuda.legacyPackages.${prev.system}.cudaPackages_12_2; }) ];
Самое главное — всё работает. Обе видеокарты отображаются, CUDA функционирует, и NixOS элегантно обработала все тонкости. Если вы решите повторить эксперимент, то вся конфигурация системы хранится в моём репозитории dotfiles, включая определение сервиса llama.cpp и кастомную сборку, привязанную к правильной версии.
Запуск модели
Я использую Qwen3.6-27B-MTP с квантованием Q5_K_M, на что требуется примерно 19 ГБ. При наличии двух видеокарт вся модель легко умещается в память, и ещё остаётся место для контекста:

Настройка | Значение |
Модель | Qwen3.6-27B-MTP Q5_K_M (19 ГБ) |
Окно контекста | 128k токенов |
Слоёв GPU | 99 (все выгружены) |
Распределение тензоров | -ts 1.0,1.0 (даже между обеих видеокарт) |
И показатели производительности:
Метрика | Значение |
Скорость инференса | ~32 токенов/с |
Обработка промта | ~133-160 токенов/с |
Для интерактивной работы 32 токена в секунду вполне достаточно. Это быстрее, чем при использовании многих облачных API, когда накладывается сетевая задержка. И это с учётом тензорного распределения обработки между разными архитектурами видеокарт, подключенных через PCIe.
Эта модель хороша
Хочу прояснить один момент. Эта модель не просто «хороша в качестве локальной» и не просто «приемлема, если поумерить свои ожидания». Qwen3.6-27B конкурирует с Claude Sonnet 4.6 в рейтинге Agentic Index от Artificial Analysis. Она обходит Sonnet 4.6 в бенчмарках MMMU-Pro и Terminal-Bench 2.0. Эта модель с 27 миллиардами параметров, работающая на железе со вторичного рынка, реально может тягаться с последними облачными моделями от Anthropic.
Да, Sonnet 4.6 выигрывает в тестах GPQA и SWE-Bench Verified. Но оно и понятно, ведь это массивная проприетарная модель. И да, если вам нужен абсолютный топ, то к вашим услугам Opus 4.8. Правда, 20 минут её серьёзного использования уже обойдутся вам больше, чем весь мой сетап из видеокарты и адаптера. При этом разрыв между ними не столь велик. Мы уже достигли точки, когда модель, которую вы можете запустить у себя в спальне, находится в той же весовой категории, что и платные решения.
Предсказание нескольких токенов за раз
MTP в названии модели означает Multi-Token Prediction. При стандартном инференсе модель предсказывает по одному токену: предсказывает, утверждает, предсказывает следующий и так далее. MTP меняет этот процесс. Теперь модель предсказывает несколько будущих токенов сразу, после чего проверяет, какие из них были корректны. В этом случае подтверждённые токены, по сути, даются нам «бесплатно». Если же дополнительный токен был предсказан ошибочно, модель его отбрасывает и вычисляет очередной стандартным путём.
В результате генерация ускоряется примерно в 1,5-2 раза без потери точности. На моей конфигурации это означает, что модель выводит уже не 32 токена/с, а потенциально 50-60, особенно в предсказуемых контекстах вроде кода.
Подвох в том, что поддержка MTP в llama.cpp появилась недавно. Версия в nixpkgs не поддерживает архитектуру Qwen3.6 MTP, поэтому мне пришлось собрать llama.cpp из исходников на базе конкретного коммита, где эта поддержка уже была добавлена. В NixOS это делается без лишних проблем. У меня есть собственный рецепт сборки, привязанный к нужному коммиту, и весь этот процесс полностью воспроизводим. Когда я хочу обновить модель или изменить версию llama.cpp, то просто меняю строку в своём конфиге, выполняю nixos-rebuild switch, и дело сделано. Никакого ада зависимостей, никаких ручных переустановок и никаких сомнений в том, под правильную ли версию CUDA я выполнил сборку.
Зрение: как модель видит изображения
Qwen3.6-27B поддерживает обработку изображений через отдельный файл мультимодального проектора (mmproj). Он требует дополнительно всего 928 МБ и даёт просто потрясающие возможности.
Принцип его работы следующий. Визуальный энкодер (аналогичный тем, что используются в ChatGPT и Claude) получает пиксели изображения и переводит их в пространство эмбеддингов LLM. Модель не «видит» изображение так, как его видит человеческий глаз. Вместо этого визуальный энкодер сжимает картинку в последовательность векторов, находящихся в том же математическом пространстве, что и токены текста. Затем LLM обрабатывает эти векторы так, будто они просто являются очередной последовательностью токенов.
На практике это означает следующее: вы вместе с текстовым промтом отправляете модели адрес изображения, и она может описывать, анализировать и рассуждать на тему того, что на нём видит. Наличие такой способности увеличивает размер модели на 1 ГБ. Всего 1 ГБ — и ваша локальная модель уже умеет читать изображения.
В llama.cpp реализовать эту возможность несложно:
--mmproj /mnt/nas/llamacpp/mmproj-F16.gguf --mmproj-offload
Флаг --mmproj-offload обеспечивает выгрузку визуального энкодера в память GPU вместе с моделью, так что и обработка изображений тоже будет выполняться быстро.
Использование в связке с OpenCode
Я использую этот сетап в тандеме с OpenCode — ИИ-ассистентом для программирования, умеющим работать с локальными моделями. Сам сервер LLM выполняется на моём настольном ПК, но я за ним не сижу, а подключаюсь с любой другой машины в домашней сети или извне через Tailscale (но это уже тема для отдельной статьи). Чтобы указать OpenCode на сервер llama.cpp, достаточно настроить API URL. Модель выполняется локально, отвечает быстро, и никакая информация не покидает мою локальную сеть.
NAS и USB-накопитель
Все модели находятся на моём сервере TrueNAS, смонтированном через NFS:
fileSystems."/mnt/nas" = { device = "truenas-nfs.tymscar.com:/mnt/oasis/services"; fsType = "nfs"; options = [ "nfsvers=4" "_netdev" "auto" "nofail" ]; };
Сервис llama.cpp зависит от mnt-nas.mount, поэтому не запустится, пока NAS не окажется доступен. Это означает, что я могу хранить терабайты моделей, не беспокоясь о свободном месте на локальных дисках.
Вся ОС работает на Corsair MP600 MINI, размещённом в DockCase USB-C NVMe. Никакого вмешательства во внутренние диски не требуется. Если я хочу поиграть, то просто отсоединяю SSD и перезагружаюсь под Windows, где спокойно использую для этого RTX 4080. Если же мне нужно поработать с LLM, я снова подключаю SSD, загружаюсь в NixOS и могу использовать обе видеокарты.
Это не так удобно, как меню мультизагрузки, но достаточно легко и работает безотказно. Никакого GRUB, никаких конфликтов с загрузчиком, никакого управления разделами. Просто физическое переключение.
Один досадный минус
После тёплой перезагрузки (когда перезапускается только ОС, а остальная система остаётся в рабочем состоянии) V100 периодически исчезает из вывода lspci и nvidia-smi. Похоже, это проблема перечисления устройств на шине PCIe, связанная с работой ACPI. Холодная перезагрузка (с физическим выключением и ожиданием в течение несколько секунд перед повторным запуском) всегда возвращает карту в строй.
Когда V100 отсутствует, llama.cpp не запускается, так как не может втиснуть модель в 16 ГБ одной карты. Сервис просто циклически падает, пока GPU не будет снова обнаружен. На деле это не создаёт особых проблем, поскольку обычно при перезагрузке я нахожусь рядом с ПК, но нужно иметь это в виду. Такое поведение напоминает мне печально известный баг сброса видеокарт AMD, когда проброс GPU в виртуальную машину с последующим её выключением оставляет карту в заблокированном состоянии, из которого её может вернуть только полное отключение и перезапуск машины.
Что у меня в итоге получилось
За £200 я получил:
видеокарту для дата-центра с 16 ГБ памяти, дополнившую мою игровую RTX 4080,
суммарно 32 ГБ видеопамяти для инференса LLM,
скорость генерации 32 токена/с на модели с 27 миллиардами параметров,
контекстное окно на 128k токенов,
поддержку обработки изображений,
модель, выполняющуюся полностью локально, без использования облачных сервисов и без оплаты за токены.
Единственным реальным минусом был шум, с которым я справился, определив распиновку разъёма и подобрав подходящий кабель-переходник. V100 — это не самая быстрая видеокарта для инференса, и тензорное распределение вычислений по двум разным архитектурам работает хуже, чем в случае с одним GPU. Но за такие деньги это очень удачное решение.
Если вы хотите запускать мощные модели локально, смотрите в сторону рынка б/у видеокарт. Вам даже не обязательно иметь в ПК второй GPU. У меня уже была RTX 4080, но даже одна V100 в дешёвом серверном корпусе обеспечит вам 16 ГБ VRAM и возможность спокойно использовать LLM локально за очень скромную сумму. Причём V100 SXM2 — это не единственный вариант. За похожие деньги можно взять P40 с 24 ГБ, хотя она медленнее и не имеет тензорных ядер. Ещё один хороший вариант — это V100 на 32 ГБ. Стоит дороже, но всё равно выходит намного дешевле любого потребительского GPU с аналогичным объёмом памяти.
Главное, будьте готовы к шумному вентилятору.

