axiom

Выводы после прогонов: смоук-конвейер, A5-детерминизм и подготовка данных

Отчёт архитектора, 27.09.2026. Живые диаграммы (GitHub Pages, интерактив): конвейер A4 · карта данных · отчёт в HTML. В репо: a4-gate-flow.html · axiom-data-map.html

1. Что прогнали

Стадии конвейера A4 (скелет L3, ~1B MoE, JAX):

Стадия Результат Фактические числа
pretrain_checkpoint executed init с нуля → 1 шаг → Orbax → tree_hash
rl_environment executed 10 задач через net_executor, механические вердикты
sft executed 200 шагов, 1 638 200 токенов, 442,7 с (0,122 GPU-ч), QAT MXFP4 on
rl_base_scheme executed 10 шагов GRPO, 40 роллаутов, 2 643,5 с (0,739 GPU-ч)
spark_inference skipped инференс на RTX 4080 — подмена стенда запрещена (ADR-010)

Приёмочный сьют сети на GPU: 374 passed / 14 skipped / 1 xfail (известный xfail критерия 6 — NoPE-экстраполяция). Вердикты RL-среды 0/40 — честно: смоук-модель задачи не решает, смоук доказывает провод конвейера, а не качество.

2. Инженерные выводы (что оказалось неочевидным)

2.1. Ложный зелёный гейт — главный враг, и он был у нас в коде

Схема манифеста v1 проверяла только непустые хеши: прогон доступной части конвейера давал бы зелёный C-038 при непройденном A4. Дельта ADR-014 сделала pipeline_complete вычисляемым — переданное извне значение игнорируется, частичный прогон даёт красный с поимённым списком. Сейчас --verify возвращает код 1: покрытие частично: spark_inference — и это правильное состояние.

2.2. A5-недетерминизм оказался НЕ про GPU-ядра

test_13_integration (A5: два прогона → идентичный манифест) упал: workspace_sha256 различался. Все ждали причину в XLA-недетерминизме (ADR-013, deterministic-флаг). Реальная причина: Python-байткод __pycache__/*.pyc в workspace-снапшоте — .pyc несёт абсолютный co_filename и mtime исходника, который менялся под параллельными правками. Гейт исполняет command_succeeds внутри workspace, поэтому даже с deterministic-флагом манифест «плыл». Фикс: executor вычищает __pycache__/*.pyc из снапшота + PYTHONDONTWRITEBYTECODE. Урок: у недетерминизма могут быть несколько независимых причин — фикс первой не закрывает класс.

2.3. Совмещённый стенд: XLA-преаллокация убивает соседей

Смоук на GB10 запустили при живом SFT-прогоне (38 ГБ) и llama-server (28 ГБ) — без XLA_PYTHON_CLIENT_MEM_FRACTION. JAX по умолчанию резервирует ~75% памяти устройства → вероятный OOM-каскад: в одну минуту умерли наш смоук, SFT (3 ч 44 мин прогресса) и llama-server. Правила теперь в памяти контура: любой JAX-процесс на совмещённом стенде — с явным memory-лимитом (0,15–0,5), предполёт nvidia-smi + free -g, разрешение владельца — текстом в лок-файле.

2.4. Двойной pytest на одной GPU = ложные падения

Первый базлайн-сьют дал test_04_forward_8k: FFF — сирота-процесс от прерванного прогона делил 16 ГБ VRAM. На чистой карте те же тесты — 4 passed за 1:41. Инвариант «одна GPU-нагрузка за раз» (AD-7) верен и для рабочей машины, не только для Spark.

2.5. Скраб секретов: ловушки реальных данных

Пайплайн эпизодов (1378 сессий) нашёл то, чего не предвидели:

2.6. Gated-датасеты: curl-обман и two-token проблема

resolve/README.md в gated-репо отдаёт 200 без согласия — README и листинг публичны, закрыт только контент. Проверять доступ надо контентным файлом (-r 0-100 на parquet → честный 403/206). Второй слой: fine-grained токен с пустыми скопами не читает gated-контент даже с согласием. Диагностика: whoami-v2 → роль + scopes; контентный curl.

2.7. Выбор источника кода — по измеренному потолку, а не по маркету

Проба stack-smol-xl (публичный срез) показала потолок ровно 10 000 файлов/язык → 0,079B токенов при цели 3B — в 38 раз меньше. Поэтому шард C: The Stack v2-dedup (доступ получен, схема data/<Язык>/parquet подтверждена контентным запросом), fallback — v1-dedup, план B — codeparrot-clean. Решение по факту измерения, не по названию датасета.

2.8. Канонизация форматов — тоже гейт

Мета-валидатор отклонил наши новые ADR за нестандартные заголовки (## Alternatives вместо ## Alternatives Considered, свёрнутые негативные последствия). Формат — часть контракта, канон восстанавливается перед интеграцией.

3. Диаграммы (живые, интерактивные)

4. Состояние гейтов

5. Дальше

  1. GB10 (после окончания SFT laguna): смоук-луп l3-full + оркестратор A4 на стенде → spark_inference=executed → --verify = 0 → A4 закрыт (рецепт: ~/Загрузки/gb10-smoke-full-run.md).
  2. A5 (drift): повтор по манифесту, сверка хешей/вердиктов.
  3. Претрейн-данные: W качается (~12%, resume), C стартовал (v2-dedup), Q после них; карточка с sha256 → смета C-041 → старт претрейна 20B (~$200) на аренде.
  4. Пост-трейн: доменная адаптация — явная CPT-фаза на GB10/4080: K/D/S → CPT-корпус (дельта-2 сериализации, межкомпонентный дедуп) → CPT-луп до SFT; затем SFT/RL на E-эпизодах (дельта-3: карточка с долями E/K/D/S).