Сайт в разработке. Корзина и онлайн-оплата ещё не подключены — выбрать и заказать можно в Telegram: @bigmurz. Контент, цены и поддержку сайта ведёт ИИ-бот.
Написать @bigmurz

Qwen3.8-Flash-Next на двух Tesla V100: как мы поднимали Strata и боролись за 120K контекста

На домашнем сервере у меня две Tesla V100 по 16 ГБ. Это 32 ГБ видеопамяти, и для большинства моделей 2026 года этого уже мало. А тут на глаза попалась Qwen3.8-Flash-Next — MoE-модель, у которой только весов ~55 ГБ. В VRAM она не влезает никогда, сколько карт ни поставь. Спас Strata — движок, который держит «мозги» модели в обычной оперативке, а на GPU оставляет только кэш самых горячих экспертов. В этой статье — как я поднимал Strata на V100, как всё падало с out of memory и как в итоге выжал контекст в 120K токенов. Всё по шагам, с реальными логами и цифрами.

Железо и задача

  • Сервер: Intel i7-7700 (4 ядра / 8 потоков), 62 ГБ RAM, Ubuntu 24.04.
  • GPU: 2x Tesla V100-SXM2-16GB, соединены NVLink.
  • Модель: Qwen3.8-Flash-Next-GSQ-RCO-IQ3_S — два GGUF-файла, 54.8 ГБ + 28.8 ГБ (PLE-таблица).
  • Движок: Strata 0.1.42, CUDA 12, Docker-образ strata-v100.

Идея Strata простая и красивая: у MoE-модели в каждый момент времени «активны» далеко не все эксперты. Значит, все 24576 экспертов можно держать в RAM, а на видеокарте — только те ~4–5 тысяч, которые реально дёргаются чаще всего (по заранее снятому профилю маршрутизации). Остальные подтягиваются по PCIe. Так 55-гигабайтная модель живёт на картах, у которых на двоих 32 ГБ.

Установка

Всё заворачивается в контейнер. Ключевое — конфиг /opt/strata-data/config/strata-iq3_s.json. Вот он целиком в финальном, рабочем виде:

{
 "exe": "/opt/strata/engine-cuda12/strata",
 "args": [
  "--pack", "/data/packs/iq3_s",
  "--native", "/data/models/IQ3_S/Qwen3.8-Flash-Next-GSQ-RCO-IQ3_S-00001-of-00002.gguf",
  "--ple-gguf", "/data/models/IQ3_S/Qwen3.8-Flash-Next-GSQ-RCO-IQ3_S-00002-of-00002.gguf",
  "--expert-profile", "/opt/strata/data/expert-profile.bin",
  "--expert-cache", "auto",
  "--prefill", "auto",
  "--spec", "4",
  "--spec-min-p", "0.5",
  "--mtp", "/data/mtp/rt",
  "--max-context", "122880",
  "--kv", "q4_0",
  "--peer-device", "1",
  "--remote-expert-opt",
  "--peer-reserve-mib", "2048",
  "--kv-resident", "20480"
 ],
 "model_name": "qwen3.8-flash-next-iq3_s",
 "port": 8080,
 "cuda": 12,
 "gpu": [0, 1],
 "host": "0.0.0.0"
}

Разбор главных флагов:

  • --expert-cache auto — сколько экспертов влезает в VRAM, движок считает сам.
  • --peer-device 1 — вторая карта (GPU 1) работает как «peer tier»: держит дополнительный слой экспертов и считает их строки по P2P.
  • --max-context — размер контекста, под который резервируется KV-кэш.
  • --kv — формат KV-кэша: fp16 / int8 / q4_0.
  • --spec 4 + --mtp — спекулятивная генерация (MTP-драфты), сильно ускоряет вывод.

Первый запуск: всё взлетело

Стартовая конфигурация была на layer_split auto — движок сам режет слои модели между двумя картами. Загрузка весов:

[strata] loading the experts into RAM (about 55 GB) and locking part of them for the GPU.
[strata] experts loaded: 46.84 GiB at 2.54 GiB/s (31 s so far)
[strata] filling the GPU's expert cache (4596 experts, 8.27 GiB of VRAM) ...
ready: http://127.0.0.1:8080/v1  (OpenAI: /v1/chat/completions, context 122880 tokens)

Всё красиво: 46.8 ГБ экспертов легли в RAM за полминуты, кэш в 8.27 ГБ занял VRAM, сервер поднялся. Контекст 122880, скорость ~50–60 ток/с. Живи и радуйся.

Эксперимент, который всё сломал

Захотел выжать больше — включил --peer-device 1, чтобы вторая карта разгрузила первую и подняла hit-rate кэша экспертов. И Strata перестал стартовать вообще. Лог краша:

strata generate: peer GPU 1: 7738 experts, 14.71 GiB (filled in 3.4 s);
                 with the primary's 4068 that is 11806 of 24576 on the GPUs
strata serve: the accepted VRAM plan lends the prompt path 2192 cache slots (4.12 GiB)
strata serve: prefill peer: the peer's buffers do not fit
              (raise --peer-reserve-mib or lower --peer-prefill-rows)
              - the prompt path stays on the primary GPU
gather_rows: out of memory
EngineDied: the engine exited before it was ready

Что произошло. С --peer-device меняется топология: GPU 1 забивается экспертами под завязку (7738 штук = 14.71 ГБ из 16), а весь prompt-путь, attention и KV-кэш остаются на GPU 0. И вот на GPU 0 при сборке строк (gather_rows) память кончилась. Движок честно подсказывает в том же логе: мол, буферы peer не влезают, подними --peer-reserve-mib или уменьши --peer-prefill-rows.

Лечение: резерв на peer-карте

Первое, что починило запуск — резерв памяти под prefill-буферы на второй карте плюс поменьше контекст:

--max-context 65536 --kv int8 --peer-device 1 --remote-expert-opt --peer-reserve-mib 2048

Взлетело за ~40 секунд, expert cache 4473 слота / 8.47 ГБ. Но 65536 контекста меня не устраивало — нужно 120K.

Возврат 120K: KV в 4 бита + стриминг

Чтобы вернуть 122880 на peer-топологии, ужал сам KV-кэш. Два рычага из --help:

  • --kv q4_0 — 4-битный KV после Hadamard-поворота: вдвое меньше, чем int8.
  • --kv-resident 20480 — KV-стриминг: в VRAM держится только 20480 позиций, остальное стримится из RAM, а логический --max-context не меняется.

Финальный запуск:

--max-context 122880 --kv q4_0 --peer-device 1 --remote-expert-opt --peer-reserve-mib 2048 --kv-resident 20480

[strata] experts loaded: 46.84 GiB at 2.58 GiB/s (32 s so far)
[strata] filling the GPU's expert cache (4769 experts, 9.03 GiB of VRAM) ...
ready: http://127.0.0.1:8080/v1  (context 122880 tokens)

Итог по VRAM (nvidia-smi): GPU 0 — 15.9 из 16.4 ГБ, GPU 1 — 14.8 из 16.4. Впритык, но стартует за 40 секунд и держится. Свободные ~1.3 ГБ на второй карте — это не пропащий ресурс, а тот самый резерв под prefill-буферы; именно из-за его нехватки всё и падало.

Веб-UI и телеметрия

Strata поднимает свой веб-интерфейс прямо на http://<ip>:8081/ — чат, настройки сэмплирования и переключатель Thinking. Ничего не уходит с машины, всё локально.

Веб-интерфейс Strata: чат и настройки

Скорость в цифрах

Вкладка Monitor в веб-UI Strata показывает живую телеметрию. Реальные цифры после прогона:

Вкладка Monitor: decode, prefill, expert cache

  • Decode: 50–59 ток/с.
  • Prefill: 816 ток/с (промпт на 50K+ токенов проглатывается за минуту).
  • Time to first token: ~2.7 с.
  • Expert cache hit: 87% — то есть 87% экспертов берутся прямо из VRAM, без PCIe.
  • Draft acceptance: 67.7% (спекуляция окупается).
  • Experts in VRAM: 4769 слотов / 9.0 ГБ.
  • Context fill: 64% (79K из 120K занято).

Для агентной работы (tool-вызовы, код, длинные контексты) — более чем комфортно.

Соседство с llama-server

На тех же двух V100 у меня живёт и обычный llama-server (Qwen3.8-27B, порт 8080). Два сервера в 2×16 ГБ не помещаются — Strata съедает почти всю VRAM. Поэтому переключение между ними — двумя скриптами, которые сначала гасят одного, потом поднимают другого:

# strata-up.sh — переход на Strata (:8081)
docker stop llama-server
docker start strata
# ждёт строку "ready: http" в логе, до 150 с

# llama-up.sh — переход на llama-server (:8080)
docker stop strata
docker start llama-server
# ждёт /health на :8080, до 120 с

Порты разведены: llama-server на 8080, Strata на 8081 (8080 внутри контейнера проброшен наружу на 8081, чтобы не конфликтовать).

Подводные камни

  • «Сервер висит 1–3 минуты при старте» — это нормально. Strata грузит 55 ГБ в RAM и локирует их; в это время машина реально может тормозить. Не закрывайте окно.
  • Два режима режут память по-разному. layer_split (слои пополам между картами) и --peer-device (вторая карта = слой экспертов) — это разные стратегии. На layer_split у меня влезал даже контекст 262144, но expert cache был меньше. На --peer-device hit-rate выше, но VRAM впритык и нужен резерв.
  • Не смешивайте. --peer-device несовместим с --layer-split и --expert-cache-device1..3.
  • Нет api_key — модель открыта всей локалке. Strata сам предупреждает. Для домашней сети терпимо, но в конфиг стоит вписать "api_key".
  • q4_0 KV — это компромисс. 4-битный KV экономит память, но теоретически чуть роняет качество на очень длинных контекстах. Hadamard-поворот потерю смягчает; на агентных задачах разницу я не заметил.

Что работает / что нет

Работает ✓

  • ✓ 55-гигабайтная MoE на двух 16-гигабайтных картах.
  • ✓ Контекст 122880 при KV в 4 бита и стриминге.
  • ✓ 50–60 ток/с, prefill 816 ток/с, expert cache 87%.
  • ✓ OpenAI-совместимый API (/v1/chat/completions) — подключается куда угодно.

Не работает / осторожно ✗

  • ✗ Два LLM-сервера одновременно в 2×16 ГБ — только переключением.
  • ✗ --peer-device без --peer-reserve-mib на забитой карте = gather_rows: out of memory.
  • ✗ Контекст 262144 на peer-топологии — не влезает, только на layer_split.

Советы от себя

  • Читайте лог до конца — Strata почти всегда пишет подсказку прямо рядом с ошибкой («raise —peer-reserve-mib or lower —peer-prefill-rows»). Это половина решения.
  • Начинайте с layer_split auto и консервативного контекста, убедитесь что стартует, и только потом включайте --peer-device.
  • Не гонитесь за максимальным контекстом ради цифры. 120K при 4-битном KV и 87% hit-rate лучше, чем 262144 с постоянными OOM.
  • Держите RAM с запасом: 55 ГБ модели + KV + буферы на 62 ГБ уже впритык, swap под нагрузкой подтормаживает.

В сухом остатке: Strata превращает «нерелевантную» для таких карт модель в полностью рабочего агента с огромным контекстом. Потрачено полдня на борьбу с VRAM — зато теперь Qwen3.8-Flash-Next крутится дома, ничего не уходит в облако, и тянет задачи, которые на 32 ГБ видеопамяти раньше просто не стартовали.

Статья полезная?
Оценок пока нет — будь первым
Сайт в разработке · тексты, оформление и поддержку ведёт ИИ-бот.