Почему мы собрали LLM-сервер, который жжёт миллиард токенов в сутки
Часть 1 серии «Наш опыт»: мотивация self-hosted LLM-инференса и путь железа от Tesla M40 до 4×(2×RTX 3090) — с цифрами на каждой фазе.
Хук: момент, когда API стал болью
В марте 2026 мы посмотрели на счёт за Claude API — $4,200 за месяц — и поняли: наш код-агент сжигает больше токенов, чем мы зарабатываем.
Это было не абстрактное «API дорогой». Конкретика: наш pi.dev-агент за одну сессию генерирует ~200K токенов. 10 сессий в день — это 2 млн токенов. По API это ощутимые деньги каждый день, по локальному — электричество.
Мы не «решили собрать сервер из любопытства». Мы перестали быть заложниками чужого API: теперь наш код-агент работает в air-gapped среде, без лимитов провайдера и без зависимости от чужого uptime.
Почему не API
Сначала — цифры. Сколько стоил бы наш объём через API (blended-тарифы $0.14–0.50 за 1M токенов в зависимости от модели и провайдера):
| Объём в месяц | API (blended $0.14–0.50/1M) |
|---|---|
| 100M токенов | $14–50 |
| 500M токенов | $70–250 |
| 1B токенов | $140–500 |
На пиковых нагрузках агентов это не «оплата по факту» — это постоянная статья расходов, которая растёт вместе с продуктом.
Но деньги — не единственная причина. Для нас критичны три вещи:
- Приватность. Данные не уходят наружу. Для RU-рынка с чувствительным кодом и внутренними документами это не «nice to have», а требование.
- Автономность. Нет зависимости от доступности чужого API: rate limits, инциденты провайдера, региональные блокировки.
- Контроль. Мы видим каждый токен: где он сгенерирован, сколько стоит, почему запрос занял 8 секунд.
«API дорогой, локально дешевле» — скучная аргументация. Наша: мы перестали быть пользователями API и стали операторами инфраструктуры.
Железо: путь от 0 до 4×(2×RTX 3090)
Мы не начинали с 8 GPU. Мы начинали с Tesla M40, которая уже стояла в офисе. Четыре фазы:
| Фаза | Железо | Стек | Модель | Скорость | Контекст | Пользователи |
|---|---|---|---|---|---|---|
| 0 | Tesla M40 24GB | Ollama | — | 10–20 tok/s | 4–32K | 1 |
| 1 | 2×(RTX 3060 + RTX 4070 Ti), Xeon | Proxmox + GPUStack + llama.cpp | — | 50–70 tok/s | 32–64K | 2–3 |
| 2 | 2×RTX 3090 (TP=2) | vLLM | Qwen3.8-27B-AWQ-MTP | 75–100 tok/s | 256K | до 2 (max-num-seqs 2) |
| 3 | 4×(2×RTX 3090) | vLLM + свой балансер + GPUStack | Qwen3.8-27B-AWQ-MTP | 80–100 tok/s/чел | 256K | 10 (у каждого 3 потока) |
Фаза 0: Tesla M40. 24GB вроде бы хватает, но карта очень шумная — 250W, вентилятор на 100% под нагрузкой, — и NVIDIA её уже не поддерживает. Ollama дал 10–20 tok/s с контекстом 4–32K (дефолт Ollama). Плюс три особенности: холодный старт (keep_alive 5m — модель выгружается из VRAM спустя 5 минут), тяжело организовать доступ по ключам, без доступа через VPN. Один пользователь, и всё очень долго.
Фаза 1: два consumer-сервера. Два сервера: RTX 3060 + RTX 4070 Ti, Xeon 3-го поколения, 24GB VRAM на карту. Серверы объединили в Proxmox-кластер — централизованный контроль RAM, VRAM, SSD. GPUStack — скачивание моделей, запуск, auto-restart, статистика по пользователям и API-ключам. llama.cpp — рантайм: контекст под задачу, модель держим в VRAM, без холодных стартов. Итог: 50–70 tok/s, контекст 32–64K, 2–3 пользователя — и это предел, не хватает пропускной способности. Цена этапа: первый счёт за электричество 24/7 и китайские материнские платы.
Фаза 2: 2×RTX 3090, TP=2. Tensor parallelism по двум картам, vLLM, Qwen3.8-27B-AWQ-MTP. 75–100 tok/s, контекст 256K влез (как — в части 3). Проблема: один сервер — single point of failure. Crash vLLM на середине сессии = потерянный контекст и остановленный агент.
Фаза 3: четыре узла. 4×(2×3090) = 8 GPU + свой балансировщик + GPUStack. 10 сотрудников работают, каждый может кодить в 3 параллельных потока, 80–100 tok/s на человека, пик — 1 млрд токенов/сутки. Single point of failure исчез: потерять один узел — перестало быть катастрофой.
Для каждой фазы мы замеряли три вещи: tok/s, максимальный контекст и степень параллельности. Цифры в таблице — не из документации, а из наших замеров на конкретном железе.
Что НЕ работает (честно)
RTX 3090 — это Ampere, не Ada и не Hopper. Честные ограничения:
- Нет нативного FP8. Аппаратного FP8-инференса на 3090 нет — поэтому мы квантуем в AWQ (INT4), а не FP8.
- NVLink-мосты в нашем конфиге не используются. TP=2 работает по PCIe 4.0 — для 27B модели этого достаточно, и мы это замерили (см. часть 3).
- 24GB VRAM на GPU — потолок. Контекст 256K + веса 27B — это постоянный расчёт «что влезает, а что нет».
Мы не собирали H100-кластер. Мы собирали то, что было доступно и по карману. И этого хватило для 1 млрд токенов/сутки.
Что дальше
В части 2 — как мы выбрали Qwen3.8 из 12 протестированных моделей. И почему MTP-спекулятивное декодирование дало нам до ×2.7 скорости.
Смежные материалы: Что ожидают пользователи от LLM-инференса в 2026, Какой движок инференса выбрать.
Мы прошли этот путь сами — и теперь делаем то же самое для компаний. Подбор железа и модели, настройка vLLM, балансировка, токономика: если у вас есть LLM-нагрузка и вопрос «сколько это стоит и как ускорить», обсудим ваш проект.
Хотите так же?
Расскажите о задаче — ответим с планом и оценкой в течение 2 рабочих дней.
Обсудить задачу