Использование локальных моделей AI в HomeLab
опубликовано: ⏰ 15Ранее писал статью CI/CD с Gitea для HomeLab, в которой была небольшая информация о локальном сервере под нужды проектов. Использование этого сервера не ограничивается только CI/CD, так же использую для запуска локальных моделей AI.
Предпосылки для локального развёртывания
Тратить время и ресурсы на организацию окружения под локальные модели необходимо не всегда, и не всем нужно. У меня причин было несколько:
- Конфиденциальность – давно не секрет, что всё, что пишется в публичных чатах, остаётся у владельцев этих чатов. По-моему, была где-то старая новость о том, что утекало в публичный доступ содержимое бесед пользователей. То есть всё, что вы там делаете, вы больше не контролируете.
- Доступность – блокировки, это новая реальность. Постоянно и много ресурсов блокируют под различными предлогами. Надеяться на постоянную доступность публичных ресурсов сейчас могут только совсем безумные и отважные.
- Самообразование – всё же интересно понимать, как это работает снизу, а не когда дают в готовом виде окно с чатиком. Да, за это приходится платить личным временем и ресурсами.
- Стоимость – спорная метрика и зависит от объемов использования. Если они высокие, то может оказаться выгоднее иметь локальные сервера, чем по подписке.
Дополнительно стоит упомянуть о том, что локальные модели никогда не догонят по качеству и скорости работы облачные аналоги. Просто потому, что для этого потребуется железо далеко не потребительского уровня. Рассчитывать на то, что получится сделать дома так же, как в ChatGPT, не стоит – не получится. Даже банально не будет в открытом виде полной модели, а только урезанные версии. Поэтому не сильно очаровываемся идеей, чтобы потом не разочаровываться :)
Доступное железо на 2025 год
Вариантов тут на самом деле масса и всё зависит от доступных бюджетов. Рассматривать серверное железо (A100, H100, H200, L40s и т.д.) не вижу смысла. Стоимость очень высокая и требует помимо самих видеокарт и соответствующих серверов. В общем, это совсем не для домашнего использования.
Строить сервер с обычными CPU и DDR тоже бесполезно, в результате будет очень низкая скорость инференса. Просто не получится нормально работать.
Выбор зависит от доступного бюджета. Если рассматривать более “доступные” варианты для домашнего использования, то получается примерно так:
| Оборудование | RAM/VRAM, bandwidth | Комментарий |
|---|---|---|
| NVIDIA RTX PRO™ 6000 Blackwell | 96 GiB 1792 GB/s | Это так сказать RTX 5090 на максималках, но для AI в профессиональном сегменте. Ценник соответствующий. |
| GeForce RTX 5090 | 32 GiB 1792 GB/s | На текущий момент самая мощная для потребительского/профессионального сегмента. |
| GeForce RTX 4090 | 24 GiB 1008 GB/s | Брать только если она со вторичного рынка. Остатки новых стоят, как новая RTX 5090. |
| GeForce RTX 3090 | 24 GiB 936 GB/s | Можно собрать кластер из старых видеокарт со вторичного рынка и получить суммарный объем памяти, равный 48 GiB. |
| Apple Mac Studio M3 Ultra | до 512 GiB 819 GB/s | У Apple есть мощные MiniPC с двумя чипами и под полтерабайта памяти. Стоят они довольно дорого, но нужно упомянуть. |
| NVIDIA DGX Spark | 128 GiB 273 GB/s | Непонятно, для кого и для чего NVIDIA выпустила это изделие. Стоимость высокая, пропускная способность памяти низкая. |
| AMD Ryzen™ Al Max+ 395 | до 128 GiB 256 GB/s | Популярные MiniPC с чипами от AMD. По моему мнению, это некий баланс между универсальным ПК для разработки и сервером для инференса. Мощный CPU, GPU и много быстрой памяти. |
| Другие комбинации | * | Есть варианты со сборкой кластера из нескольких видеокарт или распределённых серверов, но уже сильно влияет на итоговую производительность |
NVIDIA RTX PRO™ 6000 Blackwell, Apple Mac Studio M3 Ultra, NVIDIA DGX Spark – для меня сразу же отсеялись. Цены плавают в зависимости от курса, порядок цифр – миллионы денег. Но богачи могут присмотреться. Если всё-таки есть интерес к тому как они показывают себя в работе с AI, то есть видео обзоры. Например, от Alex Ziskind.
GeForce RTX 3090 – поддерживает NVLink, поэтому их часто используют в паре. Но нужно найти не побывавшие в майнинге. Минусом может быть совокупное энергопотребление. Дополнительно к этому, потребуется соответствующий корпус с хорошим охладом и материнская плата на две линии PCIe x8.
GeForce RTX 4090 – сейчас нет смысла в покупке, так как есть GeForce RTX 5090. Наверное можно найти на вторичке, но в отличие от 3090 у неё нет NVLink. Это означает, что значит максимальное ограничение по памяти – 24 GiB.
GeForce RTX 5090 – пока единственный вариант с максимальной производительностью. Цена неадекватная, как и у всех флагманских видеокарт NVIDIA. К сожалению, Хуанг уже давно монополист и делает, что хочет.
AMD Ryzen™ Al Max+ 395 – неожиданно AMD выпустила хороший SoC. Да, он не дотягивает Apple Mac Studio M3 Ultra, но и стоит раза в 3 дешевле. MiniPC на его основе сейчас полно, база общая (типовые материнские платы), меняется только обвес в виде коробки.
Дополнительно есть обширное поле с экспериментами по объединению различных доступных железок в вычислительный кластер. Например, для распределённых вычислений можно использовать vLLM или exo, объединив доступные ПК в один кластер. Но сразу скажу, что на финальную производительность будет очень сильно влиять скорость линка между ПК. Нужно смотреть в сторону Thunderbolt 4/5. Либо можно распределять изолированные агенты по ПК, а не шарить общую модель между ними.
Если рассматривать совсем экзотические варианты, то есть возможность использовать OCuLink. Подключается внешняя видеокарта через NVMe (обычно два слота у MiniPC). Только стоимость этой внешней видеокарты и коробки к ней будет заметно дороже самого MiniPC или ноутбука. Да и будет не в полную силу работать.
Что использовал и какие проблемы были
Сначала использовал то, что было. Старая видеокарта в ПК (GeForce 970 @ 4GiB) и встройка на рабочем ноутбуке (RTX 3050 @ 6GiB). Но проблемы с нехваткой памяти вылезли практически сразу. В какой-то момент терпение кончилось, и купил GeForce RTX 4090, когда был период с самой низкой ценой (2023 год), до резкого подорожания. Прибавка по скорости получилась огромная, дальше практически до конца 2025 года всё делал на ней.
Проблема с одной видеокартой в том, что её не всегда можно использовать одновременно для нескольких моделей. Приходится либо постоянно переключаться, либо использовать модели небольшого размера, которые поместятся в 24 GiB, но теряя в качестве. Самый хороший пример – это LM Studio. В режиме сервера он может использовать только одну модель и переключается между ними. Одно из решений было запускать модели для векторизации и ранжирования на рабочем ноутбуке с RTX 3050, а крупные LLM (32b) уже на ПК. Пропала проблема постоянного переключения между моделями.
Со временем стали расти размеры уже самих моделей и 24 GiB VRAM не всегда стало хватать (особенно для LDM). Поэтому,
где-то под конец 2025 года, решил взять MiniPC с Al Max+ 395. К тому же был нужен отдельный сервер под другие
задачи, можно было совместить полезное с полезным. Брал самый дешёвый с AliExpress, что было рискованно, но доехал
целый. Правда, есть сильное подозрение, что он не новый. С MiniPC появилась возможность грузить модели до 72b без MoE
или 120b+ с MoE. Могу сразу сказать, что модели с больше 14b без MoE будут работать медленно из-за низкой пропускной
способности памяти. При этом MoE модели работают довольно быстро, например, с gpt-oss-120b-MXFP4. Что такое MoE можно
почитать здесь – Mixture of Experts (MoE)
Тестирование производительности
Всё, что связано с LDM, пропущу – это более специфичные нейронки и их лучше тестировать отдельно. Речь будет идти только о более или менее популярных LLM.
Для тестирования производительности обычно использую llama.cpp, а целевой метрикой является количество токенов в секунду. Вообще, финальную производительность можно примерно прикинуть зная пропускную способность памяти и размер модели (при условии, что CPU/GPU могут полностью загрузить память).
Например, размер Qwen2.5-Coder-14B-Instruct-GGUF = 11.29 GiB, пропускная способность памяти для AI Max+ 395 = 256 GB/s. Абсолютная пиковая скорость будет 22,67 токенов в секунду.
| model | size | params | test | t/s (Vulkan) |
|---|---|---|---|---|
| qwen2 14B Q6_K | 11.29 GiB | 14.77 B | pp512 | 360.41 ± 1.78 |
| tg128 | 18.30 ± 0.02 |
Для MoE моделей такой расчёт неприменим, так как количество активных экспертов может быть разным. Далее результаты
тестирования по некоторым моделям, которые использовал. При тестировании использовались одинаковые параметры
llama.cpp – ngl: 99, backend: Vulkan | CUDA, version: 6881 (8b11deea4). Версия llama.cpp не последняя (30
октября), но думаю, не критично. Флаг flash attention не использовался, так как не со всеми моделями корректно работает.
AMD Ryzen™ AI Max+ 395
Основное использование – это MoE модели или небольшие модели для специализированных задач. То есть вместо одной огромной используем много маленьких без необходимости выгрузки из памяти.
Ниже видно, что MoE модели выдают неплохую скорость. А вот без MoE заметно медленнее, ~10 токенов в секунду, что не так уж и много. Либо нужно снижать количество параметров и уровень квантования – теряем в качестве.
| model | size | params | test | t/s (Vulkan) |
|---|---|---|---|---|
| gpt-oss-20b-MXFP4 | ||||
| gpt-oss 20B MXFP4 MoE | 11.27 GiB | 20.91 B | pp512 | 1100.52 ± 8.49 |
| tg128 | 69.69 ± 5.59 | |||
| gpt-oss-120b-MXFP4 | ||||
| gpt-oss 120B MXFP4 MoE | 59.02 GiB | 116.83 B | pp512 | 400.90 ± 32.58 |
| tg128 | 47.61 ± 2.69 | |||
| GLM-4.5-Air-Q4_K_M- | ||||
| glm4moe 106B.A12B Q4_K - Medium | 67.85 GiB | 110.47 B | pp512 | 225.26 ± 6.30 |
| tg128 | 23.12 ± 0.05 | |||
| GLM-4.5-Air-Q6_K | ||||
| glm4moe 106B.A12B Q6_K | 92.20 GiB | 110.47 B | pp512 | 211.57 ± 6.04 |
| tg128 | 18.24 ± 0.01 | |||
| GLM-4-32B-0414-Q8_0 | ||||
| glm4 32B Q8_0 | 32.23 GiB | 32.57 B | pp512 | 196.50 ± 1.60 |
| tg128 | 6.51 ± 0.00 | |||
| THUDM_GLM-4-32B-0414-Q4_K_M GLM-Z1-32B-0414-Q4_K_M | ||||
| glm4 32B Q4_K - Medium | 18.32 GiB | 32.57 B | pp512 | 169.14 ± 2.79 |
| tg128 | 11.10 ± 0.01 | |||
| Qwen3-Coder-30B-A3B-Instruct-Q4_K_M | ||||
| qwen3moe 30B.A3B Q4_K - Medium | 17.35 GiB | 30.53 B | pp512 | 661.49 ± 133.28 |
| tg128 | 80.57 ± 7.48 | |||
| qwen3moe 30B.A3B Q8_0 | 30.25 GiB | 30.53 B | pp512 | 817.30 ± 33.48 |
| tg128 | 57.13 ± 0.12 | |||
| Qwen3-32B-Q4_K_M | ||||
| qwen3 32B Q4_K - Medium | 18.40 GiB | 32.76 B | pp512 | 156.96 ± 3.09 |
| tg128 | 10.63 ± 0.37 | |||
| Qwen3-30B-A3B-Instruct-2507-Q8_0 | ||||
| qwen3moe 30B.A3B Q8_0 | 30.25 GiB | 30.53 B | 832.17 ± 42.78 | |
| 57.41 ± 0.13 | ||||
| DeepSeek-R1-Distill-Qwen-32B-Q4_K_M | ||||
| qwen2 32B Q4_K - Medium | 18.48 GiB | 32.76 B | pp512 | 165.44 ± 2.30 |
| tg128 | 11.12 ± 0.00 | |||
| Seed-OSS-36B-Instruct-Q4_K_M | ||||
| seed_oss 36B Q4_K - Medium | 20.26 GiB | 36.15 B | pp512 | 143.77 ± 2.18 |
| tg128 | 10.07 ± 0.00 | |||
| gemma-3-27b-it-Q4_K_M | ||||
| gemma3 27B Q4_K - Medium | 15.40 GiB | 27.01 B | pp512 | 202.81 ± 3.38 |
| tg128 | 12.62 ± 0.01 | |||
| uigen-t2-7b-3600-q8_0 | ||||
| qwen2 7B Q8_0 | 7.54 GiB | 7.62 B | pp512 | 1004.14 ± 3.47 |
| tg128 | 28.57 ± 0.08 |
Пример использования памяти для gpt-oss 120B MXFP4 MoE с контекстным окном в 131072 токенов (по умолчанию).
Device 0 [Radeon 8060S Graphics] Integrated GPU RX: N/A TX: N/A
GPU 607MHz MEM 995MHz TEMP 38°C CPU-FAN POW 13 W
GPU[ 0%] MEM[|||||||||||||||||66.485Gi/96.000Gi]GeForce RTX 4090
Тут, как говорится, результат на лицо. В случае с выделенной видеокартой становится видна значительная разница по
скорости. Пропускная способность памяти в 4 раза выше (1008 GBs / 256 GBs = 3,9).
Повторять манипуляции производителей в рекламе своих MiniPC не хочу. Они грузили большие модели в видеокарту (4090/5090) размером больше доступной видеопамяти и показывали, какая же она медленная по сравнению с их коробками. Естественно, что она будет медленнее при разделении модели между видеокартой и обычным CPU/DDR. Поэтому ниже только подходящие модели.
| model | size | params | test | t/s (Vulkan) | t/s (CUDA) |
|---|---|---|---|---|---|
| gpt-oss-20b-MXFP4 | |||||
| gpt-oss 20B MXFP4 MoE | 11.27 GiB | 20.91 B | pp512 | 7447.68 ± 142.47 | 7924.12 + 316.06 |
| tg128 | 229.38 ± 1.32 | 243.25 + 1.27 | |||
| THUDM_GLM-4-32B-0414-Q4_K_M GLM-Z1-32B-0414-Q4_K_M | |||||
| glm4 32B Q4_K - Medium | 18.32 GiB | 32.57 B | pp512 | 2071.50 ± 7.69 | 2327.95 + 84.19 |
| tg128 | 43.07 ± 0.08 | 42.25 + 0.01 | |||
| Qwen3-Coder-30B-A3B-Instruct-Q4_K_M | |||||
| qwen3moe 30B.A3B Q4_K - Medium | 17.35 GiB | 30.53 B | pp512 | 6700.04 ± 198.31 | 5879.15 + 803.38 |
| tg128 | 225.99 ± 0.34 | 221.93 + 1.52 | |||
| Qwen3-32B-Q4_K_M | |||||
| qwen3 32B Q4_K - Medium | 18.40 GiB | 32.76 B | pp512 | 2281.27 ± 18.26 | 2482.88 + 22.19 |
| tg128 | 43.37 ± 0.14 | 42.32 + 0.32 | |||
| DeepSeek-R1-Distill-Qwen-32B-Q4_K_M | |||||
| qwen2 32B Q4_K - Medium | 18.48 GiB | 32.76 B | pp512 | 2394.99 ± 76.60 | 2272.80 + 80.91 |
| tg128 | 43.35 ± 0.11 | 42.81 + 0.02 | |||
| Seed-OSS-36B-Instruct-Q4_K_M | |||||
| seed_oss 36B Q4_K - Medium | 20.26 GiB | 36.15 B | pp512 | 2015.26 ± 8.86 | 1959.58 + 57.37 |
| tg128 | 39.24 ± 0.13 | 38.93 + 0.02 | |||
| gemma-3-27b-it-Q4_K_M | |||||
| gemma3 27B Q4_K - Medium | 15.40 GiB | 27.01 B | pp512 | 2750.26 ± 14.90 | 3071.58 + 8.98 |
| tg128 | 47.66 ± 0.21 | 47.84 + 0.03 | |||
| uigen-t2-7b-3600-q8_0 | |||||
| qwen2 7B Q8_0 | 7.54 GiB | 7.62 B | pp512 | 9620.73 ± 105.58 | 9553.25 + 701.28 |
| tg128 | 113.00 ± 0.11 | 106.85 + 3.04 |
Разница между Vulkan и CUDA на уровне погрешности. Возможно, что-то специфично можно включить для CUDA и станет быстрее, но я не разбирался.
А вот пример того, что бывает когда часть слоёв не помещается в видеопамять и выгружается в оперативную. Итоговая скорость на RTX 4090 + DDR4(64 GiB) в три раза медленнее, чем на AI Max+ 395 (LPDDR5x). Использовать нельзя.
| model | size | params | test | t/s |
|---|---|---|---|---|
| glm4 32B Q8_0 | 32.23 GiB | 32.57 B | pp512 | 63.61 + 0.05 |
| tg128 | 2.27 + 0.00 | |||
| gpt-oss 120B MXFP4 MoE | 59.02 GiB | 116.83 B | pp512 | 108.61 + 9.20 |
| 59.02 GiB | 116.83 B | tg128 | 18.94 + 0.21 |
gpt-oss 120B запускался с --n-cpu-moe 20. Значение больше или меньше приводило только к замедлению.
Итоговая конфигурация
В итоге использую всё, что доступно. Сейчас ПК с отдельно видеокартой используется в меньшей степени. Основная часть моделей переехала на MiniPC. В таблице ниже примерное распределение по основным группам задач.
| Что | Зачем |
|---|---|
| Laptop RTX 3050 6 GiB | Запущены пара моделей для векторизации, ранжирования. TEI – у HuggingFace есть производительные решения и они не работают с AMD. |
| MiniPC AI Max+ 395 128 GiB | Модели с MoE для чатов, автодополнение, анализа текста (llama.cpp). Выделение оперативной памяти: 32 GiB под приложения и ОС, 96 GiB под модели. |
| Desktop GeForce RTX 4090 24 GiB | Модели без MoE (LM Studio), генерации 2D/3D (ComfyUI, Automatic1111, кастомные проекты), распознавание речи (vibe, Scriberr c диаризацией). |
В планах еще установить и настроить Open WebUI, чтобы под собой объединить всё это вместе, но пока руки не доходят.
Важно учитывать, что с AMD есть проблемы на Linux с поддержкой ROCm. Она есть только в Ubuntu 22/24 и судя по отзывам работает с проблемами. Надеюсь AMD всё-таки доведёт до стабильного состояния альтернативу монополии Nvidia с их CUDA. А пока, реализация бекенда на Vulkan самая стабильная на текущий момент.
В качестве экспериментов ещё были и есть дополнительные сервисы, но почти не использую сейчас:
- n8n – первопроходцы можно сказать, удобный инструмент для выстраивания процессов.
- RAGFlow – RAG, работа с документами и базой знаний.
- OpenHands – WebIDE на базе VSCode с агентом.
- Ollama – вообще не понял почему так популярна, но пробовал использовать.
Пара примеров для llama.cpp
Ну и пример запуска llama.cpp в качестве OpenAI совместимого сервера, если кому-то интересно.
GPT-OSS-120b
#!/usr/bin/env bash
MODEL=gpt-oss-120b-MXFP4-00001-of-00002.gguf
llama-server --host 0.0.0.0 --port 1234 \
-c 0 \
--batch-size 2048 --ubatch-size 2048 \
--temp 1 --top-p 1 --top-k 0 \
--flash-attn on --no-warmup --jinja \
--alias "gpt-oss" -m ${MODEL}Qwen3-Coder-30B-A3B-Instruct
#!/usr/bin/env bash
MODEL=Qwen3-Coder-30B-A3B-Instruct-Q8_0.gguf
llama-server --host 0.0.0.0 --port 1234 \
-c 65536 \
--batch-size 1024 --ubatch-size 256 \
--n-predict 2048 \
--temp 0.7 --top-p 0.8 --top-k 20 \
--repeat-penalty 1.05 \
-ctk q8_0 -ctv q8_0 \
--flash-attn on --no-warmup --jinja \
--alias "qwen-coder" -m ${MODEL}А стоит ли оно того?
Оговорюсь сразу, что с генеративными моделями еще в где-то 2022 году начал экспериментировать. Тогда и появилась необходимость в железе, которое это всё могло локально запускать. Облачные сервисы не были так распространены, как сейчас. Совокупный бюджет на всё это – видеокарта GeForce RTX 4090 (2023 год) и MiniPC AMD Ryzen™ AI Max+ 395 (2025 год).
Окупилось ли это? Учитывая сколько времени было потрачено на эксперименты, работу с LLM/LDM, то скорее да, чем нет. Подозреваю, всякие подписки, покупки токенов и платные аккаунты сожрали бы поболее за три года. К тому же, это железо используется и будет использоваться для других целей, а не только для AI.
А если в целом смотреть, уверен, что цены для публичных сервисов будут повышаться в будущем. Сейчас многие сервисы с AI, по сути, убыточны и эта гонка с демпингом рано или поздно закончится. Нужно будет возвращать инвестиции, а “стричь” будут обычных пользователей и корпоративных клиентов, которые уже не смогут нормально работать без привычных инструментов.
Заключение
Использовать или нет локальные модели AI всё-таки зависит от насущных потребностей и интересов. В моём случае это было оправдано – сначала просто было интересно и нужно для своих проектов, потом по основной работе.
Если же всё ограничивается только рабочими задачами, вдобавок ещё бесплатно и оплачивается работодателем, то очевидно, что оно того не стоит.