2026-10-17-night-plan.md 8.1 KB

Ночная смена 2026-10-16 → 17 — план (автономный режим)

Режим: полная автономия, супервизор спит. Оператор авторизовал power off в конце смены (после чистой остановки серв). Все действия через sm121 (см. AGENTS «All builds must go through sm121»). Язык отчётов — ru/en.

Текущее состояние (снимок на начало смены)

Кластер Состояние
8nodes-switch (dgx1–8) cluster offline (switch off). online: dgx1, dgx2, dgx5; offline: dgx3,4,6,7,8
dgx1, dgx2 живой GLM-5.3 kindling 2x serve (sm121_glm53-kindling-2x_0, Up 12h) — НЕ ТРОГАТЬ (возможно обслуживает этот агент)
dgx5 идёт Ling-3.1-flash fp8→fp4 конвертация (наш конвертер, 30/54 шардов, tmux fp4_*, лог ~/fp4-*.log)

Свободных Sparks для новых лейнов: dgx3, dgx4, dgx6, dgx7, dgx8 (выключены; включаются sm121 power on --cluster 8nodes-switch --node dgxN.lan).

Guardrails (без супервизора)

  • Перед любым stop/power off — сначала health; не роняем живой трафик. dgx1/dgx2 kindling 2x — не трогать всю смену (unless оператор скажет).
  • GB10: GPU/unified память НЕ ограничена cgroup (forum 386057) — docker --memory не кажет cudaMalloc; при исчерпании пула стабится хост. Тяжёлые задачи (конвертация, большая загрузка) — только на чистой ноде, никогда рядом с live serve. (Так и сделали: конвертер уехал с dgx1 на dgx5.)
  • GB10 stuck-clock (forum 386060): если лейн аномально медленный — проверить SM clock под нагрузкой (nvidia-smi ждёт ~2000–2400, не ~660; throttle 0x0). Лечится полным power-cycle (unplug AC+USB + держать power 10s), reboot не helps.
  • Первый/необкатанный запуск — detached --keep --no-wait (serve-boot-triage).
  • Harness tool-eval-bench v2.8.0 (97 сценариев), bench с pluto.lan (--ssh-host pluto.lan), scratch-cwd, --json-file рядом с лейном. A/B только внутри одной версии harness.
  • Ночью не резать базовый образ kindling (v0.31.0) — v0.32.0 ещё rc2, не stable.

Task 1 — Ling-3.1-flash fp4: доконвертировать → serve на 1 Spark → bench

Конвертер (fp8-block experts → MXFP4, «even» scale, byte-exact vs vLLM reference_mxfp4.py) — 38/54 шардов готово на NAS models--inclusionAI--Ling-3.1-flash-fp4 (snapshot 9144477b…, refs/main стоит). Готовы: 1-14, 19-30, 37-48. Остались: 15-18, 31-36, 49-54 (16).

БЛОКИРОВКА (внешняя): cold-read throughput NAS nas.lan коллапсировал с ~83 MB/s (22:xx) до ~1.3 MB/s (23:1x) — dd, mmap и Python-read одинаково виснут в D-state на холодных шардах; warm (page cache) 564MB/s. Это НЕ наш кластер (dgx1 kindling RX = 0; NAS не SSH-ится). Скраб/бэкап/диск на NAS. Возобновлять когда dd if=<cold shard> of=/dev/null bs=4M > 30 MB/s.

Найденные фиксы конвертера (/home/kilork/ling_fp4_full.py, /tmp/… на Mac):

  • shutil.copyfile на NFS = copy_file_range возвращает 0 → бесконечный D-state цикл. Уже убран (copy-подход откатан — он ещё и удваивает NAS-трафик).
  • 2–3 конкурентных больших потока thrash'ят HDD-NAS (8MB/s на поток). 1 воркер.
  • dequant_fp8_block/quant_mxfp4 — миллисекунды, НЕ узкое место (GPU не нужен, но и не вредит). Узкое место — только чтение шарда с NAS.

Возобновление (когда NAS здоров, 1 воркер, mmap):

ssh dgx5; tmux new -d -s fp4S "/home/kilork/relaunch.sh 15-18 31-36 49-54"

(relaunch.sh = 1 docker-run за раз, --device cuda --no-finalize, идемпотентно по шардам.) Затем finalize: python3 ~/ling_fp4_full.py --src <SRC> --dst <DST> --finalize-only — index+config (total_size ≈ 110 GB, 54 шарда, routed_experts_*).

  1. Дождаться 54/54 (3 воркера fp4_1-18/fp4_19-36/fp4_37-54). Если воркер завис — перезапустить только его диапазон (--shards A-B --no-finalize), конвертер идемпотентен по шардам.
  2. Finalize: python3 ~/ling_fp4_full.py --src <SRC> --dst <DST> --finalize-only — собрать index+config из готовых шардов (проверить total_size ≈ 110 GB, 54 шарда, config с routed_experts_*).
  3. Рецепт ling-31-flash-fp4 (solo/TP1, model = inclusionAI/Ling-3.1-flash-fp4, --tool-call-parser ling3, MTP, mxfp4 MoE-backend — конфиг-driven, --quantization не нужен). Dry-run → serve на одной свободной Spark (dgx3/4/6/7/8), --keep --no-wait.
  4. Smoke (/v1/models, chat) → tool-eval-bench --no-think (Ling default thinking вылезает за 120s/turn) с pluto. Цель: валидный скор против fp8 8x-якоря; померить quality-delta fp4. Отчёт рядом с лейном.

Task 2 — nvidia/GLM-5.3-Flash-FP4-Local (2x, официальный NVFP4)

Рецепт glm53-flash-fp4-local-2x готов (recipes d5276db): TP2, b12x-контейнер (обязателен — новый lossless NVFP4-scale формат не в upstream vLLM), 500K ctx, MTP n5, FP8 KV, glm45/glm47. Нужны 2 свободные Spark (не dgx1/2 — там kindling). Включить пару (напр. dgx6+dgx7), serve --keep --no-wait, smoke, bench v2.8.0. A/B против kindling 2x 95/100 (тот же harness). Если b12x-образ не подтянулся на ноды — sm121 sync с dgx1 (у него есть).

Task 3 — Qwen3.8-Flash-Next-FP4-Local (1x, b12x)

Рецепт qwen38-flash-next-fp4-local готов. Одна Spark, MTP n4, FP8 KV, 262K, VLLM_ENGINE_READY_TIMEOUT_S=3600. Forum hardmode 89/100. Дешёвый 1x лейн — поднять на свободной Spark, smoke, bench. Тот же b12x-образ.

Task 4 — (по остатку времени) Nemotron Super-VL / Bolt 1x

Рецепты nemotron-35-super-vl-120b-nvfp4 (LiLiCorr dflash-7 drafter — второй HF репо, пред-скачать) и nemotron-35-bolt-74b-24gb (ultra_v3 parser-plugin — может не разрешиться, см. комментарий рецепта). Низкий приоритет; VL-модели, наш bench текстовый. Только если Tasks 1–3 закрыты и есть свободная Spark.

Watch (не ночные действия)

  • v0.32.0 stable → re-pin kindling base + rebase overlays (bench-gate 95/100).
  • DGPP pin bump (3ad63d6b… → d9311e72…) — после supervised re-bench.
  • Официальный Ling-3.1-flash fp4 от inclusionAI (пока есть только 3.0).

В конце смены

  • Остановить все sm121-сервы, поднятые за смену (кроме kindling 2x на dgx1/2 — его не трогали). runlock list → закрыть висячие.
  • Конвертацию/serve на dgx5 остановить, sm121 power off --cluster 8nodes-switch (обесточить всё; dgx1/2 kindling — решить с оператором, по умолчанию оставить).
  • Написать history/night-shifts/2026-10-17.md (что сделано, скоры, якоря).