Путь к локальной LLM: модель, которой я наконец пользуюсь каждый день
Путь к локальной LLM: как требования ИБ и дух авантюризма привели к 125B-модели под столом — и почему агентам больше не нужно облако
Для меня ИИ-агенты — не демонстрация на презентации, а рабочий инструмент: они пишут код, разбирают инциденты по трассировкам, готовят постановки и прототипы, развивают платформы и помогают с множеством задач бэк-офиса. В компании мы давно внедряем ИИ в процессы и повышаем личную эффективность с помощью агентов. Но по мере роста нагрузки всё настойчивее звучит вопрос — сначала от ИБ заказчиков, затем и от меня самого, когда речь заходит о работе внутренних команд: куда именно отправляются постановки, фрагменты кода и данные? Рассказываю, как я прошёл путь от «это нельзя отправлять в облако» до 125B MoE-модели на собственной рабочей станции, которая справляется с реальными волнами агентных задач со скоростью 22–25 токенов в секунду, качеством лучшего кванта и без передачи данных за периметр =)*
На оригинальность не претендую: статей о локальном инференсе в целом и о Strata в частности мне встречалось немало. Поэтому решил поделиться собственной историей — с конкретным железом, цифрами из реальных сценариев, а не только результатами искусственных замеров генерации, — а заодно рассказать о развитии локального инференса и вопросах ИБ. Возможно, кому-то пригодятся мои измерения и настройки.
Краткие выводы для тех, кто не любит длинные тексты
-
Требования ИБ — не формальность. Постановки, код и данные заказчиков нельзя безоговорочно отправлять в облачные API. Маскирование необходимо как базовая мера гигиены, но решает проблему лишь частично: данные можно восстановить по косвенным признакам, качество на обезличенном контексте снижается, код и конфиги не всегда поддаются маскированию, а метаданные остаются.
-
Локальный контур уже не игрушка. 125B MoE и специализированный движок обеспечивают рабочую скорость на сравнительно недорогом обычном железе: 22–25 t/s генерации и более 500 t/s префилла при качестве лучшего кванта — 93.1% согласия с 8-битным эталоном.
-
Что важно при настройке: скорость кванта определяется не столько качеством, сколько распределением VRAM; обновление движка — самый дешёвый апгрейд (+79% decode, но после каждого обновления нужна перекалибровка); в Windows следует смотреть на commit, а не только на RAM (+48% благодаря pagefile); KV-кеш почти бесплатен, параллельные слоты — нет; спекулятивный декодер практически обязателен.
-
Результат зависит не только от модели, но и от подготовки. Скиллы с выверенными процессами, заранее собранные знания о продуктах — факт-базы и чек-листы — и проверяемый результат через тесты, гейты и e2e позволяют локальной модели выполнять агентные волны при комфортной скорости генерации и префилла. Расследования, ревизии бэклога и реализация по отревьюенному дизайну доступны уже сегодня.
-
Локальный контур — ещё и резервный канал. Настроенные ИИ-процессы продолжают работать, если закончилась подписка, отключили deployment или пропал интернет. А для чувствительных данных локальная обработка может быть единственным допустимым вариантом.
-
Это также лаборатория и испытательный полигон. Собственный инференс показывает, как режимы и параметры движка ведут себя под реальной нагрузкой, включая ту же «карусель» слотов. На нём удобно обкатывать навыки агентов: то, что стабильно работает на локальной модели, как правило, работает и на сильных облачных. Мой прогноз: в ближайшие год-два гибридный подход — облако для дизайна и сложных решений, локальный контур для массовых волн и чувствительных данных — станет нормой для команд разработки. А в энтерпрайзе размещение агентов внутри контура уже сейчас может стать базовым условием внедрения, как сегодня требование к реестру отечественного ПО.
Часть 1. Почему энтерпрайз всё осторожнее относится к облачным API
Мои заказчики — госкорпорации, банки и промышленные холдинги. Здесь пометка «коммерческая тайна» встречается на каждом втором документе, контуры разделены физически, а упоминание ФСТЭК в требованиях — отнюдь не декорация. У нас, кстати, есть сертифицированное СЗИ с четвёртым уровнем доверия ФСТЭК, и в 2026 году мы проходили сертификацию по новому процессу. Когда приходишь к такому заказчику с предложением подключить ИИ, первым спрашивают не о цене, а о том, куда отправляются данные. И это правильный вопрос.
Посмотрим без прикрас, что попадает в облачный API при работе агентов:
-
постановки задач — с названиями проектов, контрагентами, суммами, сроками и именами ответственных;
-
фрагменты кода, конфигов и CI\CD — с URL внутренних систем, именами серверов, схемами данных, а нередко и ключами доступа;
-
логи и фрагменты данных, которые агент собирает в качестве контекста для расследования;
-
коммерческая тайна, персональные данные и, перекрестившись, документы ДСП — с ИБ заказчиков и ФСТЭК шутить не стоит;
-
и всё это сопровождается метаданными: кто, когда, сколько и о чём спрашивал.
Вот какие проблемы я собрал из собственной и чужой практики:
-
Данные физически выходят за периметр. Они не просто «копируются для анализа», а оказываются на чужой инфраструктуре, в другой юрисдикции и под действием чужих регламентов.
-
Сроки хранения и политики конфиденциальности могут измениться после очередного объявления. Сегодня промпты не используют для обучения, завтра — применяют «для улучшения качества сервиса». Провайдеру выгодно называть такой подход безопасным, но стоит отдельно выяснить, что происходит с запросами через 30 дней.
-
152-ФЗ и персональные данные. Иностранные API создают отдельный набор рисков, с которыми юрист заказчика порой разбирается дольше, чем длится сам проект.
-
Rate limits и пиковая нагрузка. Агентная работа — это не единичный запрос, а десяток параллельных субагентов с контекстом в десятки тысяч токенов у каждого. Облачный лимит может быть рассчитан на человека, но не на целую орду агентов.
-
Расходы. Агентные циклы потребляют токены нелинейно: один агент-расследователь за вечер способен использовать миллионы входных токенов и исчерпать лимит подписки.
Итог прост: если в контекст попадает ценная информация, нужен контур, который данные принципиально не покидают. Но здесь возникает старое предубеждение: для многих «локальная LLM» до сих пор означает «медленно и посредственно». Чем меньше модель, тем хуже она соблюдает формат, вызывает инструменты и удерживает длинный контекст — то есть справляется именно с тем, что необходимо агенту.
Часть 2. Маскирование необходимо, но не решает всё
Первое, что обычно предлагают вместо локального запуска, — маскирование: перед отправкой в облако имена, ИНН, суммы и другие критичные сущности заменяют плейсхолдерами. Это правильная и полезная мера, которая действительно снижает риск. Но полной гарантии она не даёт:
-
восстановление по косвенным признакам. Идентификатора задачи, структуры JSON, названий полей и остатков контекста нередко достаточно, чтобы определить заказчика и контракт даже без прямого упоминания;
-
снижение качества. Замените отрасль на ORG_1, а продукт на PRODUCT_2 — и модель потеряет существенную часть предметной специфики. Маскирование разрывает смысловые связи, и агент начинает ошибаться именно там, где требуется точность;
-
код и конфиги нельзя надёжно обезличить целиком. Удалить название «Росатом» из текста регулярным выражением возможно, а вот убрать ценную информацию из интеграционного конфига или фрагмента схемы БД уже гораздо сложнее;
-
метаданные никуда не исчезают. Кто, когда, сколько и с какой периодичностью обращается к сервису — тоже информация, которая передаётся целиком;
-
конвейер маскирования сам по себе является программным продуктом. У него есть собственные ошибки, правила и затраты на сопровождение. Как человек, отвечающий за развитие внутренних платформ, я хорошо представляю, во что превращаются «простые» промежуточные конвейеры =)
Поэтому маскирование обязательно как слой гигиены и снимает часть рисков, но не закрывает вопрос полностью. Некоторые задачи — в моём случае это прежде всего агентные волны с кодом и внутренними данными — необходимо обрабатывать локально.
Часть 3. Мой выбор: 125B MoE, которая помещается в 16 ГБ VRAM
Промежуточные варианты я тоже пробовал. Локальные модели класса 30–35B подходят для отдельных задач, но не для полноценной агентной работы. На длинном контексте, строгом соблюдении формата и вызове инструментов они начинают сбоить. Класс модели имеет значение, и здесь на помощь пришла архитектура.
Модель: Qwen3.8-Flash-Next, архитектура qwen4exp. Это MoE с 125 млрд параметров, из которых на каждый токен активируется около 6 млрд. Плотная модель на 125B на потребительском десктопе выдаёт единицы токенов в минуту даже при 4-битном квантовании: примерно 65 ГБ весов приходится проходить целиком. MoE меняет ситуацию: большинство экспертов при обработке конкретного токена не задействовано, поэтому их можно хранить в RAM и обращаться к ним по мере необходимости.
Есть у qwen4exp и особенность, которую легко упустить: помимо 125B основных весов модель содержит около 51 млрд параметров n-gram/PLE-таблиц — 20 миллионов биграмм и триграмм с ключами и значениями в каждом слое. Эти тензоры не занимают VRAM и не участвуют в матричных умножениях: они построчно читаются из RAM. Кроме того, предусмотрен отдельный MTP-слой (Multi-Token Prediction) для спекулятивного декодирования. Поэтому 125B вообще может работать на видеокарте с 16 ГБ: в VRAM достаточно разместить внимание, shared-слои и горячих экспертов. На диске модель в выбранных мной квантах занимает 87–104 ГБ — вполне ожидаемая цена такого решения.
Моё железо — обычный домашний компьютер:
-
GPU: RTX 5060 Ti 16 ГБ (Blackwell)
-
CPU: Xeon E5-2640 v3 — 8 физических ядер / 16 потоков, AVX2
-
RAM: 128 ГиБ DDR4 ECC (успел купить по 7 тысяч за планку на 32 ГБ — ИХУ)
-
Диски: SSD на 954 ГБ для моделей, HDD для резервных копий
Важная деталь: DDR4 на этом Xeon обеспечивает около 25 ГБ/с эффективной скорости на характерных для MoE обращениях к памяти — случайных чтениях экспертов, а не последовательных. Это главное узкое место системы, и большая часть моих настроек была направлена на борьбу именно с ним.
Часть 4. Strata: путь от 3 до 25 токенов в секунду на Windows
С чего всё началось
Изначально на станции стояла LM Studio, и первый результат разочаровал: около 60 t/s префилла и 3 t/s генерации. Модель целиком работала на CPU: в тот момент LM Studio ещё не поддерживала архитектуру qwen4 должным образом. Из llama.cpp я выжал максимум: -ngl 99 -ncmoe 999 — неэкспертные слои на GPU, эксперты на CPU — дали 7.4 t/s. Затем правила -ot разместили 4–5 слоёв экспертов целиком в VRAM. Порядок важен: применяется первое совпадение, поэтому частные правила blk.[0-3].ffn_.*_exps.=CUDA0 должны предшествовать общему .ffn_.*_exps.=CPU. Вместе с -ub 4096 это подняло префилл с 44 до 144 t/s, а генерацию — до 9.2 t/s, после чего система упёрлась в возможности DDR4. При этом MTP-драфты unsloth не загружались ни одной официальной сборкой llama.cpp 2.30–2.48: в них отсутствовал тензор output_hc_norm. О спекулятивном декодировании пришлось забыть.
Важный методологический нюанс, который сэкономит время: prefill в MoE-схеме растёт с увеличением длины промпта благодаря амортизации чтения экспертов. На 635 токенах я получил 44 t/s, на 5080 — уже 144. Сравнивать конфигурации корректно только при одинаковой длине промпта. Далее я использую свежий промпт примерно на 10k токенов, а затем — на 16.9k.
Strata и калибровка
Strata (MIT), в отличие от универсального llama.cpp, создана специально для qwen4exp. В ней есть адаптивный кеш горячих экспертов в VRAM — около 700 экспертов на гигабайт, параллельное вычисление экспертов на CPU и GPU, встроенный спекулятивный декодер — сначала MTP-слой, позднее собственный DFlash2, — префилл чанками по 8192 токена и KV-streaming: KV-кеш размещается в закреплённой RAM, а в VRAM остаётся только горячее окно. У Strata есть и собственные кванты: линейка ISTA-DASLab GSQ-RCO на 2.4–3.5 bpw, без четвёртого бита, а также семейство Unsloth UD, поддержка которого появилась в версии 0.1.39.
Установка с квантом IQ3_S и калибровка --calibrate под моё железо сразу дали следующий результат:
|
Метрика |
llama.cpp после настройки |
Strata IQ3_S после калибровки |
|---|---|---|
|
Prefill, промпт ~10k |
144 t/s |
437 t/s (×3) |
|
Генерация EN / RU |
9.2 t/s |
28.0 / 24.8 t/s (×3) |
Следующий вопрос — контекст. Начинал со 131072 токенов, затем перешёл на нативные 262144: генерация снизилась до 20.4 t/s, префилл остался на уровне около 500 t/s. Небольшая плата за резерв KV оказалась приемлемой. Отдельно измерил vision-энкодер во всех трёх режимах: на GPU фотография обрабатывается за 6.2 с против 14.1 с на CPU, при этом текстовая скорость снижается примерно на 5–9%. Выбрал GPU.
О воркерах: интуитивное правило «чем больше потоков, тем лучше» здесь не действует. Движок это учитывает, что видно в стартовом логе:
CPU pool: 7 workers by default (8 physical cores, 16 logical processors;
bounded by every physical core but the host's)
7 pool workers on logical processors 2,4,6,8,10,12,14, the host thread on 0
В пуле 7 воркеров — по одному на физическое ядро, а восьмое отдано хост-потоку, который управляет GPU и передачей по PCIe. HT-потоки намеренно не используются: ограничение здесь — пропускная способность памяти, а не ALU, и два потока на одном ядре лишь конкурируют за контроллер DDR4. Наши измерения в llama.cpp подтвердили это: 16 HT-потоков не быстрее восьми физических. Главный параметр калибровки — --pcie-frac, доля экспертов, которых выгоднее скопировать по PCIe в VRAM, чем вычислять на CPU. Для моего процессора с медленной DDR4 копирование часто обходится дешевле вычислений. Калибровка определила для IQ3_S значение 0.19–0.20 — на 13–20% быстрее настроек по умолчанию, а для более тяжёлого UD-IQ4_XS — 0.35: чем больше байтов приходится на эксперта, тем выгоднее копирование. Она же подбирает параметры адаптивного кеша (adapt-every 1 / swaps 160 / decay 0.97) и порог спекуляции spec-min-p 0.70. Перебор занимает 20–30 минут; на нестандартном железе калибровкой лучше не пренебрегать.
KV-кеш: большой контекст почти бесплатен, дополнительные слоты — нет
После экспертов KV-кеш — второй по значимости потребитель памяти 125B-модели. Strata обращается с ним интереснее, чем llama.cpp: для каждого слоя в VRAM находится только окно, остальной кеш хранится в закреплённой RAM. Вот стартовый лог для контекста 524288 и KV int8:
KV streaming: 32768 of 524288 cells per QSA layer in VRAM,
the K/V in 6.19 GiB of pinned RAM
Казалось бы, это должно замедлять работу, но почти вся нагрузка попадает в окно VRAM. Вот строка из реальной сессии:
KV streaming: 99.49% of 215868 block reads hit VRAM, 4.4 MiB read from RAM
99.49% чтений KV-блоков пришлись на VRAM, а из RAM за всю сессию было прочитано лишь 4.4 МиБ. На практике большой контекст почти не замедляет генерацию: decode для профилей 262k и 512k различался на единицы t/s.
Мы измерили профили «контекст × количество слотов» на более медленном IQ4_XS с движком 0.1.41. Для 0.1.56 показатель decode можно приблизительно умножить на 1.7:
|
Профиль |
Decode, t/s |
Слотов кеша экспертов |
|---|---|---|
|
262k × 1 |
17–21 |
3198 |
|
512k × 1 |
15.6 → на 0.1.56+DFlash2 25.6 |
1607 |
|
512k × 2 |
10.7 отдельно / 4.5 при парной работе |
784 |
|
512k × 4 |
не запускается — VRAM занята сессиями |
0 |
Закономерность очевидна: каждый слот и каждый контекст забирают VRAM у кеша экспертов; второй слот снижает decode на запрос примерно на 50%. Сам контекст при этом обходится почти бесплатно, поскольку KV находится в RAM, а слоты — нет, поскольку сессии занимают VRAM. Я остановился на 512k×1. Эксперимент с 1M пока не запускал: конфиг yarn×4 поверх нативных 262144 подготовлен, KV на 1M занимает около 12.4 ГиБ pinned RAM против 3.06 ГиБ на 262k. По тестам сообщества на быстром железе префилл не снижается, но у нас ожидается около 13–17 t/s decode, а рабочих причин для такого контекста пока нет.
Отдельно проверили параллельные запросы. Бенчмарк с четырьмя запросами на одну тему показал «×3.6», но причиной оказался прогретый кеш экспертов — до 96% попаданий и 70–90 t/s для отдельных запросов, — а не параллелизм. Запросы на разные темы показали реальную картину: Strata обрабатывает одну последовательность за раз по FIFO, а параллельные клиенты получают около 50% прироста совокупной производительности благодаря перекрытию префилла и декода. Полезно, но не решает всё.
Кванты: скорость определяет не качество, а распределение VRAM
|
Квант |
Эксперты, ГиБ |
top-1 vs Q8 |
Decode, t/s |
Prefill, t/s |
Назначение |
|---|---|---|---|---|---|
|
IQ3_S |
~50 |
— |
~25.6* |
~610* |
удалён с диска |
|
UD-IQ4_XS |
59.5 |
88.9% |
24.7 |
612 |
быстрая альтернатива |
|
UD-Q4_K_XL |
66 |
93.1% |
22.0–23.5 |
528 |
основная модель |
Переход с трёхбитного кванта на четырёхбитный поначалу снизил скорость генерации на 40% — с 28 до 17 t/s. Дело оказалось не в «плохом кванте», а в физических ограничениях железа: на токен приходилось на 19% больше байтов — 59.5 ГБ экспертов против 50 ГБ, — а в том же объёме VRAM помещалось на четверть меньше горячих экспертов: 3198 слотов кеша против 4192 у лёгкого IQ3_S. Отсюда — больше передач по PCIe и обращений к DDR4. Лог подтверждает, что все эксперты находятся в RAM (blob reads from the file: 0): проблема не в диске и не в объёме доступной памяти. Калибровка подняла скорость четырёхбитного кванта с 11–15 до 14–17 t/s, после чего проявился потолок моей DDR4. Зато лучший квант показывает 93.1% согласия с 8-битным эталоном против 88.9%. Я готов пожертвовать 10% скорости decode ради 4.2 процентного пункта качества: основной моделью стал UD-Q4_K_XL, а IQ4_XS остался в качестве переключаемой альтернативы на ступень ниже.
Версия движка — самый доступный апгрейд
Движок заслуживает отдельного разговора: за полтора месяца я сменил три версии, и каждая заметнее влияла на результат, чем любая ручная настройка.
Обновление с 0.1.30 до 0.1.41 вместе с поддержкой квантов unsloth само по себе ускорения не дало. Зато повторная калибровка подобрала другие параметры и добавила 20%: IQ3_S достиг 34.4 t/s против прежних 28.6. Здесь обнаружилась неочевидная ловушка: меню --calibrate при нескольких конфигах сортирует их по mtime, поэтому ответ через pipe может запустить калибровку не той модели. Проверять нужно значение pack в cmdline процесса.
Переход с 0.1.41 на 0.1.56 принёс скачок, которого не ждёшь от минорного релиза. Замеры IQ4_XS за один день: 14.3 t/s на 0.1.41 с MTP → 24.4 на 0.1.56 с MTP → 25.6 t/s и 616 t/s prefill с новым драфтером DFlash2. Итого +79% decode и +53% prefill. Часть прироста обеспечила сама версия, в том числе выход из зоны WDDM LOW: на 0.1.41 после загрузки оставался слишком маленький резерв VRAM. Ещё около 5% добавил DFlash2, собственный спекулятивный декодер Strata. Он использует окна до шести токенов; у меня принимается 89% драфтов — 130 из 146 в контрольном прогоне, а на тяжёлом Q4_K_XL доля попаданий в кеш экспертов составляет 47–53%. Спекулятивный декодер здесь практически обязателен: это разница между 17 и 23 t/s на том же железе.
Pagefile: когда ограничивает не RAM, а commit
Пожалуй, самая неожиданная находка. Strata размещала экспертов в RAM с бюджетом --resident-budget-gib 75, но при 80 ГиБ свободной физической памяти получала только 59.8 ГиБ и прямо сообщала об этом в логе:
--resident-budget-gib 75.00 exceeds available commit (64.04 GiB minus
4 GiB headroom and a 0.25 GiB margin): 59.79 GiB
Ограничением оказался Windows commit limit — RAM плюс pagefile, а не объём физической RAM. С системным файлом подкачки лимит составлял около 136 ГиБ, и часть экспертов попадала в file tier, откуда считывалась с диска при каждом проходе. Решение — фиксированные файлы подкачки: 48 ГБ на F: и 16 ГБ на C:, что подняло commit примерно до 192 ГБ. Результат на Q4_K_XL: decode 15.1 → 22.3 t/s (+48%), prefill 407 → 528, в памяти находятся все 70.3 из 70.3 ГиБ, file tier 0.0 GiB, blob reads from the file: 0. На IQ4_XS эффект был почти незаметен: он и прежде помещался целиком. Pagefile здесь нужен для увеличения commit-лимита, сам файл почти не читается. По пути выяснилось, что Windows молча не создаёт pagefile на USB-диске: мой SSD с моделями как раз подключён по USB, поэтому пришлось использовать внутренний диск. А возражение «pagefile на HDD — это ужасно» здесь неприменимо: он страхует commit-лимит, а не работает как активный своп.
Эксплуатационные ловушки
-
WDDM: если после загрузки модели остаётся меньше 256 МиБ свободной VRAM, decode замедляется примерно в семь раз: драйвер переходит в режим LOW. Диагностика — строка
VRAM freeв логе, решение —--vram-reserve-mib. Я оставляю около 1.8 ГиБ резерва. -
Деградация при долгой работе: примерно через 18 часов свежий префилл упал с 565 до 52 t/s, то есть в 10.9 раза. Уровни кеша движка деградируют; помогает перезагрузка модели. Моё правило: если свежая сессия стартует медленнее 450 t/s, сервер нужно перезапустить, не дожидаясь дальнейшего падения.
Итоговая лестница производительности
|
Конфигурация |
Prefill |
Gen/Decode |
|---|---|---|
|
LM Studio по умолчанию |
~60 |
~3 |
|
llama.cpp, |
144 |
9.2 |
|
Strata IQ3_S, 0.1.30, калибровка |
437 |
25–28 |
|
Strata IQ3_S, 0.1.41, повторная калибровка |
~470 |
30–34 |
|
Strata UD-IQ4_XS, 0.1.41 — повышение качества |
474 |
14–17 |
|
Strata UD-IQ4_XS, 0.1.56 + DFlash2 + pagefile |
616 |
25.6 |
|
Strata UD-Q4_K_XL, 0.1.56 + DFlash2 + pagefile — основной профиль |
528 |
22.0–23.5 |
Итоговый профиль: UD-Q4_K_XL, контекст 524288, один слот, KV int8 и resident-окно 32768, DFlash2, pcie-frac 0.35, семь воркеров, vision на GPU, резерв VRAM около 1.8 ГиБ, все 70.3 ГиБ экспертов закреплены в RAM. Сервер доступен локально и снаружи через rathole-туннель. На скорость туннель, к слову, не влияет: 17.4 t/s через публичный URL и столько же локально. Персональное «облако» для одного человека =)
Часть 5. Главное: что модель сделала на практике — кейсы из логов
Скорость без практической пользы остаётся игрушкой. В качестве агентного харнесса я использую opencode v2 и КАПАЙ, анонс которого скоро появится в ПРИИСК. Модель подключена как обычный провайдер: доступны те же сессии, субагенты и инструменты. Ниже — три октябрьских кейса; все цифры взяты из логов.
Кейс 1. Расследование и исправления по трассировкам: один день полностью на локальной модели
31 октября сработала типовая промпт-команда «аудит трассировок и итогов работы команды аудита»: мы проверяем ошибки в трассировках production-платформы, ищем первопричины и исправляем их. Вся волна — от первого промпта до коммитов — прошла на локальной qwen3.8-flash-next:
-
Лид-сессия с 62k выходных токенов разобрала журнал аудита и распределила блоки работ.
-
Субагент-расследователь на 47k токенов в режиме read-only изучил SQL-выборки production-трассировок и нашёл первопричины. Узким местом оказался процесс гейта, а не хост:
eventLoopDelayMaxMs=95563, «process was frozen ~84354ms», 25 событий заморозки длительностью 60–293 секунды за исследуемый период. Триггеры — горячая перезагрузка конфига на 84–96 секунд (12:15:15 reload detected → 12:16:51 applied— вот и «быстрый патч конфига») и хроническая нехватка heap: 606 critical memory-pressure за три дня, 951 из 960 MiB heap в момент заморозки. -
Рефери-гейт на 11k токенов проверил дизайн исправлений: два варианта отклонили до написания кода, третий приняли. Польза рефери подтверждена практикой.
-
Субагент-исполнитель на 46k токенов реализовал шесть исправлений с тестами: маппинг ошибок API — 400/404/401/403/503/502 по классам, предварительную проверку координат без обращения к апстриму, single-flight для circuit breaker с Retry-After, каскад резолвера и другие изменения. В отчёте субагент указал: «все 6 фиксов реализованы, гейты зеленые», приложив список файлов и количество тестов по каждому исправлению.
-
E2E-спеки на 21k токенов описали приёмочные сценарии классов для этих исправлений.
-
Завершение волны: рефлексия сессии, фиксация уроков и 8 локальных коммитов. Все сделаны с pathspec, без захвата чужих изменений — при параллельных сессиях это отдельная дисциплина.
За один рабочий день: инцидент в проде → первопричина → проверенный дизайн → шесть исправлений с тестами → e2e-спеки → коммиты.
Кейс 2. Доработка блока «Аудит документов»: от постановки до интерфейса за день
29 октября выполнилась промпт-команда «доработки» для модуля распознавания документов: список моделей по ключам, повторное распознавание и критерии «проблемных» страниц. Вся работа — от постановки до кнопок в UI — также прошла на локальной qwen3.8-flash-next:
-
Лид-сессия примерно на 20k токенов приняла постановку и распределила блоки: R1–R4 на исследования, B1–B4 на реализацию.
-
Три субагента-исследователя по 73–81k токенов каждый в режиме read-only собрали факты по коду. R1 выяснял, какие модели доступны по ключу и где хранить список, включая сценарий полной локальной работы на уровне Шаблона; R2 изучал повторное распознавание и мультимодельность; R3 — критерии «проблемных» документов.
-
Исполнители R1–R4 по 8–11k токенов закрыли исследовательские блоки решениями с факт-базами.
-
Рефери-гейт на 17k токенов проверил план реализации B1–B4 до написания кода, а не после.
-
Субагент-исполнитель B1 на 22k токенов реализовал активный ключ пользователя в Профиле: поле в схеме Prisma, каскад резолвера «явный выбор сессии > активный ключ > новейший», два новых POST-роута с аудитом и проверкой владения, бейдж активного ключа и кнопки в UI. Вечером того же дня начался следующий блок — B2a, мультивыбор способов OCR.
-
Тесты на 133k токенов включали приёмочные e2e-сценарии классов для доработок, автотесты и само тестирование через Playwright.
За один рабочий день: постановка → три исследования → проверенный план → схема БД, миграция, API, фронтенд и тесты. Всё — под моим ревью.
Кейс 3. Месяц работы: не только счётчик токенов
Один из постоянных треков весь октябрь выполнялся на локальной qwen3.8-flash-next: 60 сессий, более половины из них — волны субагентов. Состав работ за месяц выглядел так:
-
Ревизия бэклога — 9 запусков. Дюжина параллельных read-only субагентов проверяла свои группы задач по tech debt и выносила вердикт «актуальна / уже исправлена» с подтверждениями в формате файл:строка.
-
Доработки аудита документов — 3 запуска; пример приведён во втором кейсе.
-
Волны traces — примерно дважды в неделю; пример описан в первом кейсе.
-
Уборка md — примерно дважды в неделю: проверка статусов рабочих md-файлов и наведение порядка.
-
Эксперименты — 26 сессий различных доработок.
За месяц: 60 сессий → 90.2 млн входных и 4.2 млн выходных токенов → 963 млн токенов прочитано из кеша → расходы только на электричество: около 300 Вт, сотни рублей. Ноль рублей за токены, ноль байт за периметр.
О деньгах скажу кратко. Сама станция стоит относительно недорого: списанный серверный Xeon, одна потребительская видеокарта и много бывшей в употреблении ECC-памяти укладываются в бюджет обычного рабочего ПК, а не специализированного ИИ-сервера. При этом аналогичные объёмы в облаке на модели flash-класса стоили бы единицы долларов. Экономия здесь не главный довод, а приятное дополнение.
Главных аргументов три, и ни один не связан с деньгами.
Первый — защита чувствительных данных. Постановки с бюджетами и контрагентами, код с внутренними URL, production-логи, коммерческая тайна, персональные данные, ДСП, документы заказчиков и другая конфиденциальная информация обрабатываются на машине и вообще её не покидают.
Второй — резервный канал для настроенных ИИ-процессов. Облачная зависимость может подвести по-разному: у провайдера исчерпался лимит или бюджет, deployment сняли с обслуживания, изменились условия или просто пропал интернет. На моих шлюзах облачные модели порой выбывают буквально за считаные дни: то лимит закончился, то возвращается 404. При этом настроенные процессы — скиллы, промпт-команды и конвейеры субагентов — продолжают работать в локальном контуре, где есть и собственная модель, и собственный шлюз. Это не самый интеллектуальный из доступных режимов, но он работоспособен. Речь уже об обеспечении непрерывности, а не просто об эксперименте.
Третий — лаборатория для получения практического опыта. Когда инференс находится под столом, можно самостоятельно исследовать движки, режимы и параметры и выяснять, как они ведут себя под нагрузкой, а не только читать документацию. Свежий пример за ноябрь — «карусель» слотов и потеря контекста. Симптом: агентная сессия с контекстом на 300–400K токенов работает нормально, пока между ходами не проходят чужие небольшие вызовы от другого клиента или tool-запроса. После этого следующий ход выглядит как зависание модели. Логи показали, что показатель повторного использования контекста — доля KV-префикса из кеша — падал до нуля, а сервер незаметно перечитывал весь промпт с начала: 300–400K токенов за 540–730 секунд, в течение которых генерация не идёт. Клиент видит «зависание», хотя сервер честно работает — просто читает, а не генерирует. Причин оказалось две: вытеснение кеша диалогов в однопоточном режиме и «карусель» слотов в параллельном. Сессия попадала не в свой слот, видела чужой KV и теряла собственный контекст. В новой версии движка слоты сделали «липкими», добившись 97–98% попаданий в свой контекст, но параллельный режим потерял 41% скорости декода. В результате профиль можно осознанно выбирать под нагрузку: один режим для редких длинных сессий, другой — для частых коротких, например heartbeat-агента с ходом раз в 5–10 минут, который по общему времени выполняется в 2.3 раза быстрее. Переключение — одной строкой конфига. Такой опыт у облачного API не купишь: там видно только, что модель молчит, а здесь в каждой serve-строке лога есть метрика reuse, объясняющая причину.
Есть у лаборатории и неожиданный бонус: это отличный полигон для проверки навыков агентов. Скиллы и промпт-команды, которые устойчиво работают на более медленной локальной модели, чувствительной к контексту и очереди параллельных субагентов, обычно хорошо работают и на сильных облачных моделях. Практическое правило простое: сначала доводим процесс здесь, затем переносим его туда. Все кейсы из статьи прошли такую обкатку.
Отдельно подчеркну роль скорости: именно она превращает всё описанное из теории в рабочую практику. При 22–25 t/s decode и более 500 t/s префилла агент обрабатывает контекст в десятки тысяч токенов за секунды, ответ в реальном времени появляется быстрее, чем его успеваешь читать, а волна субагентов не растягивается на сутки. Локальная модель перестаёт восприниматься как запасная и становится полноценным инструментом конвейера.
Где локальная модель всё ещё уступает ведущим облачным? На самых сложных развилках проектирования и в длинных многошаговых рассуждениях без подготовленного контекста старшая облачная модель рассуждает точнее. Но главное наблюдение за месяц: результаты в приведённых кейсах обеспечила не только «умность» модели, а подготовка харнесса — скиллы с отлаженными процессами, заранее собранные знания о продуктах, факт-базы с выжимками файл:строка, чек-листы валидации, паспорта блоков и контекст, который не нужно собирать заново. При комфортной скорости генерации и префилла и достаточно подготовленном харнессе локальная модель тоже даёт хороший результат. В отдельных сценариях уже не так важно, какая именно модель находится под капотом. Оркестрация и дисциплина промптов значат гораздо больше, чем дополнительные условные 10% «умности».
И напоследок: эксперименты не закончились, они продолжаются постоянно. Есть ещё один сервер — полная противоположность Windows-станции: бездисплейный Linux-риг на списанном майнинговом железе. В нём плата из майнинг-фермы с множеством PCIe-слотов, двухъядерный Celeron без AVX, 8 ГБ RAM без свопа и четыре бывшие в майнинге P104-100 на 8 ГБ каждая (Pascal, sm_61), купленные по 2–3 тысячи рублей за штуку. Вся сборка обошлась примерно в 20 тысяч. Круглосуточно она запускает 35B MoE-модель Cyber-Tiel-Coder-35B-A3B для агентов, бота и других экспериментов: 27–30 t/s генерации, префилл до 785 t/s, контекст 262K и доступ снаружи по HTTPS. Видеоподсистема всего рига стоит дешевле одной бывшей в употреблении RTX 3060. А ещё за ним стоят полтора месяца железной драмы: восемь ошибок Xid 79 «GPU fallen off the bus» за месяц, сервер-зомби с «health: ok» при неработающей генерации и SSD, который умудрялся по-разному читать один и тот же участок.
Если интересно, пишите в комментариях — подготовлю вторую часть =)
ЗЫ. Иногда полезнее не отмахиваться слайдами о «безопасности облаков», а разобраться в вопросе и показать реальные логи и личные кейсы =) ЗЫЫ. Фактуру для этой статьи помогала собирать всё та же Qwen3.8-Flash-Next =) ЗЫЫЫ. И, конечно, внутри корпоративного контура ПРИИСК у нас работает множество других локальных моделей. Одна создавала картинки, вторая превращала мои голосовые замечания в текст и постановку для Qwen, третья проверяла орфографию.
В продажу поступила GeForce RTX 5090 с 96 ГБ памяти
Стали известны предполагаемые цвета Samsung Galaxy S27
Когда закончится ценовой ажиотаж и чего ждать от стоимости оперативной памяти и видеокарт?
Скорость Starlink в США достигла 120 Мбит/с, несмотря на рост числа абонентов
Rocket Lab повысила цену запуска Neutron на 27%, хотя ракета ещё ни разу не летала
На расширение Восточного для запусков «Союза-5», «Старт-1М» и многоразовой «Амур-СПГ» направят 10 млрд рублей
Музыка объединяет: «Кион Музыка» запустила «Фанзону» для новых знакомств
Дженсен Хуанг ушёл с должности главы Nvidia спустя 33 года руководства