Путь к локальному LLM: как требвоания по ИБ и “дух авантюризма” привели меня к 125B-модели под столом — и почему агенты больше не просят облако
ИИ-агенты у меня не демо для презентаций, а производственная сила: пишут код, расследуют инциденты по трассировкам, формируют постанвоки и прототипы, развивают платформы и закрывают кучу процессов бекофиса. Внутри компании у нас уже давно идет процесс ИИзации процессов и повышения личной эффективности за счет ИИ-агентов. Но чем больше они работают, тем настойчивее вопрос — сначала от ИБ Заказчиков, потом и мой собственный для контроля использовании ИИ во внутренних командах: а куда именно уходят постановки задач, куски кода и данные? Рассказываю, как я прошел путь от «это отправлять в облако нельзя» до 125B MoE-модели, которая живет на моей рабочей станции и тянет реальные волны агентных задач — со скоростью 22-25 токенов в секунду, качеством топ-кванта и без единого байта за периметр =)*
Я не претендую на оригинальность — мне много попадаются статьи про разный локальный инференс в целом и про Strata в частности, и решил рассказать свою историю (со своим железом и цифрами на реальных Кейсах использования — а не “запустил и выбил 100-500 генерации токенов”) и историю развития использования своего локального инференса и в целом немного про ИБ, вдруг кому то будут полезны цифры и примеры настроек.
Выводы сразу (для тех кто не любит много читать)
-
Требование ИБ — не каприз. Для постановок, кода и данных Заказчиков у облачных API в чистом виде хода нет. Маскирование — обязательный слой гигиены, но частичное решение: реконструкция по косвенным признакам, падение качества на замаскированном контексте, немаскируемые код и конфиги, метаданные.
-
Локальный контур перестал быть игрушкой. 125B MoE + специализированный движок = рабочая скорость на самом обычном железе — и за очень скромную его стоимость: 22-25 t/s генерации и 500+ t/s префилла с качеством топ-кванта (93.1% согласия с 8-битным эталоном).
-
Практика тюнинга, если соберетесь повторять: квант выбирает не качество, а раскладку VRAM; версия движка — самый дешевый апгрейд (+79% decode, после каждого апдейта — перекалибровка); на Windows смотрите на commit, а не на RAM (+48% за pagefile); KV-кеш почти бесплатен, а параллельные слоты — нет; спекулятивный декодер — must have.
-
Результат определяет подготовка, а не только модель. Скиллы с отточенными процессами, заранее собранные знания по продуктам (факт-базы, чек-листы), верифицируемый результат (тесты, гейты, e2e) — при комфортной скорости генерации и префилла и подготовленном харнессе агентные волны идут на локальной модели как надо: расследования, ревизии беклога, реализация по отревьюенному дизайну — это уже сегодня.
-
Локальный контур — это еще и резервный канал. Настроенные ИИ-процессы переживают пропажу подписок, снятие deployment’ов и даже пропажу интернета — а для чувствительных данных он вообще единственный путь.
-
И это лаборатория с полигоном. Свой инференс дает реальный опыт — как режимы и параметры движка ведут себя под живой нагрузкой (та же «карусель» слотов) — и полигон для обкатки навыков агентов: что стабильно работает на локальной модели, на облачных топах работает тем более. Прогноз (ИМХО): гибрид — облако для дизайна и сложных решений, локально — массовые волны и всё чувствительное — станет нормой для команд разработки уже в ближайший год-два. А в энтерпрайсе уже сейчас «агенты живут внутри контура» будет базовым условием внедрения, как сегодня «реестр отечественного ПО».
Часть 1. Почему у облачных API в энтерпрайзе растет сопротивление
Мои Заказчики — госкорпорации, банки, промышленные холдинги. Это мир, где «коммерческая тайна» стоит на каждом втором документе, контуры разделены физически, а слово «ФСТЭК» в требованиях — не украшение (да у нас есть и сертифицированное СЗИ на 4 уровень доверия ФСТЭК — и в 2026 мы проходили сертификацию по новому процессу). Когда приносишь туда «мы подключим вам ИИ», первый же вопрос не «сколько стоит», а «куда уходят данные» — и это правильный вопрос.
Посмотрим честно, что уходит в облачный API, когда работают агенты:
-
постановка задачи — со названиями проектов, контрагентами, суммами, сроками, ФИО ответственных;
-
куски кода и конфигов, CICD — с URL-ами внутренних систем, именами серверов, схемами данных, а часто и ключами доступа;
-
логи и фрагменты данных, которые агент подгребает как контекст для расследования;
-
КТ, перс данные и , перекрестился, ДСП документы — с ИБ заказчиков или ФСТЭК шутки плохи.
-
и всё это — с метаданными: кто, когда, сколько и о чем спрашивал.
Список проблем, который я собрал из практики (свой и чужой):
-
Данные физически покидают периметр. Не «копируются куда-то для анализа», а уходят на чужую инфраструктуру, в чужую юрисдикцию, под чужие регламенты.
-
Retention и политики конфиденциальности меняются анонсом. Сегодня «промпты не используются для обучения», завтра — «для улучшения качества сервиса». Облачным провайдерам выгодно называть это безопасным — спросите, что происходит с вашими запросами через 30 дней.
-
152-ФЗ и персональные данные — для иностранных API это отдельный класс риска, который юрист Заказчика разруливает дольше, чем длится проект.
-
Rate limits и пики. Настоящая агентная работа — это не один запрос, а дюжина параллельных субагентов, каждый из которых тащит контекст на десятки тысяч токенов. Облачный лимит на такие залпы рассчитан на человека, а не на орду.
-
Счета. Агентные циклы кушают токены нелинейно: один расследователь за вечер спокойно съедает миллионы входных токенов и скушанный лимит у подписки.
Итого: для задач, где в контекст попадает что-то ценное, нужен контур, из которого данные не выходят в принципе. Но тут историческая засада — «локальный LLM» в представлении большинства до сих пор означает «медленно и плохонько». Чем меньше модель — тем хуже она держит формат, tool calling и длинный контекст, то есть всё то, что и делает агента агентом.
Часть 2. Маскирование: необходимо, но не серебряная пуля
Первое, что предлагают вместо локального запуска — маскирование: имена, ИНН, суммы и прочие критичные сущности заменяются плейсхолдерами перед отправкой в облако. Это правильно, это надо делать, и это реально снижает риск. Но полной гарантией это НЕ является, и вот почему:
-
реконструкция по косвенным признакам. Идентификатор задачи, структура JSON, имена полей, остатки контекста — часто достаточно, чтобы понять, о каком контракте и о каком Заказчике речь, даже без прямых имен;
-
качество падает. Замените в постановке отрасль на ORG_1 и продукт на PRODUCT_2 — и половина отраслевой специфики для модели исчезла. Замаскированный контекст рвет смысловые связи, и агент начинает путаться ровно там, где нужна точность;
-
код и конфиги не маскируются. Регэкспом убрать «Росатом» из текста можно; убрать ценное из интеграционного конфига или из куска схемы БД — уже нет;
-
метаданные остаются. Кто, когда, сколько и в каком ритме спрашивает — это тоже информация, и она уходит целиком;
-
конвейер маскировки — это свой код. Со своими багами, своими правилами и своей поддержкой. Я как ответственный за развитие внутренних платформ знаю, чем заканчиваются «простые» конвейеры посередине =)
Так что маскирование — обязательный слой гигиены и это закрывает ряд проблем, но оно решает задачу лишь частично. Определенный класс задач — а у меня это как раз агентные волны с кодом и внутренними данными — должен считаться только локально.
Часть 3. Что я выбрал: 125B MoE, которая влезает в 16 ГБ VRAM
Промежуточные станции я тоже пробовал: модели класса 30-35B на локальном инференсе — это «точечно ок, полноценно агентами — нет». Для агентной работы, где нужен длинный контекст, строгое следование формату и tool calling, они сыплются. Значение имеет класс модели, и вот тут помогла архитектура.
Модель: 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) — движок, написанный специально под qwen4exp, в отличие от универсального llama.cpp: адаптивный кэш горячих экспертов в VRAM (~700 экспертов на гигабайт), CPU и GPU считают экспертов параллельно (пул воркеров на CPU работает одновременно с GPU), встроенный спекулятивный декодер (сначала MTP-слой, позже собственный DFlash2), префилл чанками по 8192 токенов и KV-streaming (KV-кеш в pinned 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-потоков не быстрее 8 физических). Главный рычаг калибровки — --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 у эксперт-кэша, второй слот ≈ −50% к decode на запрос. Контекст при этом почти бесплатен (KV живет в RAM), а слоты — нет (сессии живут в VRAM). Остановился на 512k×1. Эксперимент с 1M не включал: конфиг yarn×4 поверх нативных 262144 лежит готовый (KV на 1M ≈ 12.4 ГиБ pinned против 3.06 ГиБ на 262k), по бенчам сообщества на быстром железе префилл не падает, но у нас ожидаемо ~13-17 t/s decode — рабочий сценарий того не требует.
Отдельно честный тест с параллельными запросами: бенчмарк с четырьмя запросами одной темы показал «×3.6» — но это оказался прогрев кэша экспертов (до 96% hit, отдельные запросы 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) — дело не в диске и не в RAM-бюджете. Калибровка подняла квадбит с 11-15 до 14-17 t/s, дальше — потолок моего DDR4. Зато качество топ-кванта — согласие с 8-битным эталоном 93.1% против 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, и piped-ответ легко калибрует не ту модель — лечится сверкой 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: окна до 6 токенов, у меня принимается 89% драфтов (130 из 146 в контрольном прогоне), и это на тяжелом Q4_K_XL дает hit rate эксперт-кэша 47-53%. Спекулятивный декодер — must have: это разница между 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 minus4 GiB headroom and a 0.25 GiB margin): 59.79 GiB
Ограничитель — Windows commit limit (RAM + pagefile), а не физическая RAM. С системным pagefile commit-лимит был ~136 ГиБ, и хвост экспертов уходил в file tier — читался с диска на каждом проходе. Фикс — фиксированные pagefile F: 48 ГБ + C: 16 ГБ → 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-размен, сам файл почти не читается. Грабли по пути: pagefile на USB-диске Windows молча не создает (диск с моделями у меня как раз USB SSD — пришлось задействовать внутренний), и «pagefile на HDD — жесть» здесь не аргумент: это страховка commit-лимита, а не рабочий своп.
Ловушки эксплуатации
-
WDDM: если после загрузки модели свободно меньше 256 МиБ VRAM — decode замедляется примерно в 7 раз, драйвер уходит в 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, -ot + ub4096 (потолок DDR4)
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, 1 слот, KV int8 + resident-окно 32768, DFlash2, pcie-frac 0.35, 7 воркеров, vision на GPU, резерв VRAM ~1.8 ГиБ, все 70.3 ГиБ экспертов page-locked в RAM. Сервер доступен и локально, и через rathole-туннель наружу — туннель, к слову, скорость не режет: 17.4 t/s по публичному URL против тех же 17.4 локально. Приватное «облако» из одного человека =)
Часть 5. Главное: что эта модель реально сделала (кейсы из логов)
Скорость без пользы — игрушка. У меня агентный харнесс — opencode v2 (+ КАПАЙ — скоро будет его анонс в ПРИИСК), и модель подключена туда как обычный провайдер: те же сессии, те же субагенты, те же инструменты. Вот три кейса за октябрь, все цифры — из логов.
Кейс 1: волна расследования и фиксов по трассировкам — целиком на локальной модели, за один день
31 октября у меня отработала типовая промпт-команда «аудит трассировок и итогов работы команды аудита»: смотрим ошибки в трассировках прода платформы, ищем корневые причины, чиним. Вся волна — от первого промпта до коммитов — прошла на локальной qwen3.8-flash-next:
-
Лид-сессия (62k токенов на выходе) разобрала журнал аудита, распределила блоки.
-
Субагент-расследователь (47k токенов, read-only) по SQL-выборкам прод-трассировок нашел корневые причины: узкое место — процесс гейта, а не хост —
eventLoopDelayMaxMs=95563, «process was frozen ~84354ms», 25 freeze-событий по 60-293 секунд за окно; триггеры — config hot reload на 84-96 секунд (12:15:15 reload detected → 12:16:51 applied— вот вам и «быстрый патч конфига») и хронический heap-голод (606 critical memory-pressure за 3 дня, heap 951 из 960 MiB в момент заморозки). -
Рефери-гейт (11k токенов) отревьюил дизайн фиксов — два варианта были отвергнуты ДО кода, принят третий. Рефери окупается, зафиксировано.
-
Субагент-исполнитель (46k токенов) реализовал 6 фиксов с тестами: маппинг ошибок API (400/404/401/403/503/502 по классам), пре-валидация координат без похода на апстрим, single-flight для circuit breaker с Retry-After, каскад резолвера и прочее. Итог из отчета субагента: «все 6 фиксов реализованы, гейты зеленые» — с перечнем файлов и количеством тестов по каждому фиксу.
-
E2E-спеки (21k токенов) — приемочные сценарии классов на эти фиксы.
-
Закрытие волны: рефлексия сессии, живые уроки, 8 локальных коммитов — все с pathspec, чужое не захвачено (в параллельных сессиях это отдельная дисциплина).
Один рабочий день: инцидент на проде → корневая причина → отревьюенный дизайн → 6 фиксов с тестами → e2e-спеки → коммиты.
Кейс 2: доработка блока «Аудит документов» — от постановки до UI за один день
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 сценарии классов на эти доработки + автоесты + само тестирование через playwrigth.
Один рабочий день: постановка → три исследования → отревьюенный план → схема БД + миграция + API + фронт, тесты и всё под моим ревью.
Кейс 3: месяц работы. Счетчик — не главное
1 из постоянных треков — октябрь целиком прошел на локальной qwen3.8-flash-next: 60 сессий, из них больше половины — субагентные волны. По составу работ месяц был такой:
-
Ревизия беклога (9 шт) — дюжина параллельных read-only субагентов, каждый проверял свою группу задач tech-debt и выносил вердикт «актуальна / уже исправлена» с доказательствами файл:строка.
-
Доработки аудита документов (3 шт) — пример кейс 2 выше.
-
Волна traces (~2 раза в неделю) — пример кейс 1 выше.
-
Уборка md (~2 раза в неделю) — проверка статусов рабочих md файлов и привдение всего в порядок.
-
Эксперименты — 26 сессий разных доработок.
Один месяц: 60 сессий → 90.2 млн входных и 4.2 млн выходных токенов → 963 млн прочитано из кеша → счет только за электричество (порядка 300 Вт, сотни рублей). Ноль рублей за токены, ноль байт за периметр.
Про деньги — вскользь, и тема закрыта: сама станция стоит очень скромных денег (списанный серверный Xeon, одна потребительская видеокарта и много б/у ECC-памяти — по бюджету обычный рабочий ПК, а не «ИИ-сервер»), а те же объемы в облаке у flash-класса стоили бы единицы долларов — экономия тут не главный аргумент, а приятный фон.
Главных аргумента три, и все — не про деньги.
Первый — чувствительные данные. Постановки с бюджетами и контрагентами, код с внутренними URL-ами, логи прода, КТ, перс данные, ДСП, документы наших Заказчкиов и другая чувствительная информация — всё это работает на машине и не покидает её вообще.
Второй — резервный канал для настроенных ИИ-процессов. Облачная зависимость ломается по-разному: у провайдера кончился лимит или бюджет, deployment сняли с обслуживания (у меня на шлюзах облачные модели «выбывают» буквально за дни — то исчерпан лимит, то 404), сменились условия, и наконец — просто пропал интернет. Настроенные процессы — скиллы, промпт-команды, конвейеры субагентов — при этом продолжают работать на локальном контуре: он сам себе и модель, и шлюз. Не самый умный режим из доступных, но рабочий — а это уже управление непрерывностью, а не эксперимент.
Третий — лаборатория для реального опыта. Когда инференс стоит под столом, движки, режимы и их параметры можно щупать руками — и узнавать, как всё реально ведет себя под нагрузкой, а не из документации. Свежий пример — «карусель» слотов и потеря контекста, ноябрь. Симптом: агентная сессия с контекстом 300-400K токенов работает нормально, пока между ходами агента не проскочат чужие мелкие вызовы (другой клиент, tool-запрос) — и следующий ход выглядит как «модель зависла». Разбор по логам показал: метрика переиспользования контекста (доля KV-префикса, взятая из кеша) падала в ноль, и сервер молча перечитывал весь промпт с нуля — 300-400K токенов, 540-730 секунд, в течение которых генерации нет вообще. Клиент смотрит на «зависание», а сервер честно трудится — просто над чтением, а не над генерацией. Причин оказалось две: вытеснение кэша диалогов в однопоточном режиме и «карусель» слотов в параллельном — сессия попадала не в «свой» слот, KV чужой, свой контекст утерян. В свежей версии движка слоты сделали «липкими» (97-98% попаданий в свой контекст), но параллельный режим заплатил 41% скорости декода. Итог — осознанный выбор профиля под нагрузку: редкие длинные сессии — один режим, частые короткие (heartbeat-агент, ход раз в 5-10 минут, по wall time выходит в 2.3 раза быстрее) — другой, переключение одной строкой конфига. Такой опыт на облачном API не купишь: там ты видишь «модель молчит», а здесь — видишь почему, с метрикой reuse в каждой serve-строке лога.
И неожиданный бонус лаборатории: это идеальный полигон для обкатки навыков агентов. Скиллы и промпт-команды, которые стабильно работают на локальной модели — медленнее, капризнее к контексту, с очередью параллельных субагентов — на облачных топах работают тем более. Правило простое: если «тут» не накосячили — «там» точно не накосячат. Все кейсы этой статьи обкатаны именно так.
И отдельно про скорость, потому что именно она делает всё выше не теорией. При достаточно комфортной скорости генерации — 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 вторая, а проверку на орфографию — третья.
Источник: habr.com