docs(perception): record full graph recovery and separate availability latency

This commit is contained in:
DCCONSTRUCTIONS
2026-09-02 16:01:36 +03:00
parent 70927ea585
commit e91721fe6a
3 changed files with 162 additions and 9 deletions
@@ -2032,3 +2032,111 @@ control/network boundary и самостоятельная упаковка. С
TARGET предыдущего инкремента уточнён, но его историческое evidence не переписано.
GPU latency заново не измерялась: conditional PASS / auto-clock FAIL и source
gaps остаются прежними. Этап 2 не закрыт; этапы 3–4 не начаты, actuation=false.
## 2026-09-02 15:56 МСК — этап 2, инкремент 9: recovery полного GPU-графа
**Результат:** `70927ea` подключает pause/resume к полному PilotController,
RecordingSource, BinaryGraphBridge и collector. Это больше не CPU sentinel:
на Worker работали настоящие DDRNet, RF-DETR, geometry/motion и TGS/costmap.
Внутри двух faulted запусков все четыре PID (Triton, DDRNet, decoder, TGS)
сохранились после обоих обрывов; warmup повторно не выполнялся.
`--recover-input` и bounded `--input-gap sequence:milliseconds` включены явно
и записаны в effective configuration. Входная epoch проходит через bundle,
GPU/CPU work, publication и receipt; old work освобождается с `input-gap`, а
не останавливает модели. Source clock продолжает исходный 1×: новые timestamps
не выдумываются, отставшие события не догоняются. Reconnect неблокирующе ждёт
старые callback/receiver/input ownership, открывает новую epoch и init. Decoder
не получает predictive fragment, пока нет keyframe и свежей causal пары sensors.
Frame index декодера локален epoch, исходные sequence остаются оригинальными.
`JointGraph.reset_temporal()` действительно заменяет CPU surface, current store,
geometry, temporal, motion, rolling и threat instances с прежними config objects.
Model backends и дочерние процессы остаются прежними, DDRNet cache очищается.
TGS C++ создаёт estimator на каждый запрос, costmap arrays — локальные; его
скрытой истории между запросами нет. Sensor window сбрасывается отдельно.
На review удалена лишняя локальная ссылка collector на предыдущий input tuple;
после этой правки оба полных прогона повторены с immutable review snapshot.
### Проверки и численные результаты
Сначала два CPU-only source/decoder прогона без GPU: normal 128/128 exact BGR и
sensor bundles к прежнему oracle; gap 76 decoded + 52 skipped, два resume.
Затем четыре последовательных full GPU-прогона, ни одного параллельного профиля.
Во всех — прежний diagnostic image, model assets, 8 CPU / 8 GiB, input ≤16 MiB,
pending ≤2 и временный штатный envelope SM2610/memory10251 MHz.
| Прогон | Обработано / намеренно пропущено | p95 / p99 accepted-frame latency, ms |
| --- | --- | --- |
| Normal | 128 / 0 | 84.043 / 88.362 |
| Gap | 76 / 52 | 79.318 / 99.380 |
| Review normal, финальный код | 128 / 0 | 85.775 / 89.385 |
| Review gap, финальный код | 76 / 52 | 83.163 / 89.729 |
Normal raw parity — exact 128/128 по BGR, segmentation, proposals, observations,
tracks, threats, range estimator, material, lineage/sensor binding и raw costmap.
Gap BGR/segmentation/proposals exact 76/76 к тем же source frames. Сравнивать его
temporal/costmap outputs с непрерывной историей некорректно: история намеренно
сброшена. В обоих faulted trials сумма completed/skipped равна 128, unaccounted=0,
overload drops=0. Поле legacy-report `source_failed=52` содержит здесь известные
input-gap/keyframe-wait omissions, не 52 неучтённые аварии модели.
| Обрыв | Новый вход принят на кадре | До resume runtime | До первой свежей полной сцены |
| --- | ---: | ---: | ---: |
| Seq16, 150 ms | 30 | 1432.447 ms | 1476.169 ms |
| Seq72, 2200 ms | 110 | 3801.820 ms | 3857.475 ms |
Это финальный repeat; первый gap trial дал 1474.895 / 3856.521 ms до scene.
Разница с длительностью обрыва — ожидание keyframe и подходящих camera/pose/points,
а не загрузка моделей или проигрывание backlog. Отдельный recovery-availability
budget ещё не квалифицирован; accepted-frame p95 не скрывает эту паузу.
При reset старые surface-cache/body-history/components/rolling-cells меняются
92/16/6/291 → 0/0/0/0 и 507/42/6/358 → 0/0/0/0. Все post-resume costmap timestamps
не раньше новой cutoff и не из будущего; track history начинается заново.
Первая scene каждой epoch имеет fresh шесть слоёв, новый DDRNet inference,
available sensors и motion unknown / без прежней history. Результатов внутри
обоих интервалов waiting нет. Lease generation внутри activation неизменна.
GPU/CPU calls в момент этих инъекций были idle; они доказывают resident-profile
continuity, не отмену работающего CUDA kernel. Mid-compute discard покрыт пока
focused tests, actual child/CUDA failure сохраняет прежнюю terminal семантику.
Peak input 8,761,039 bytes normal / 8,065,853 gap; после каждого прогона input=0,
children stopped, lease released. Peak VRAM во всём окне ≤2368 MiB, RAM контейнера
≤3361 MiB. Эти значения — данный профиль/окно, не общий capacity guarantee.
Обычный проход сохраняет исходные 52 sensor gaps; full-route freshness и прежний
auto-clock FAIL не отменены. Ни network, ни standalone/quality/autonomy gate не
закрыт условным fixed-clock timing PASS.
### Прерванный preflight, cleanup и evidence
Первая GPU попытка остановилась ДО запуска моделей/clock setters: новый
проверочный порог 512 MiB был ошибочно ниже уже известного quiesced Windows
baseline 534 MiB, фактически было 530 MiB. Все четыре сервиса восстановлены.
Неиспользованный owned lease volume затем read-only проверен как пустой и удалён.
Повтор проверяет baseline +128 MiB и отдельно отсутствие GPU-capable контейнеров;
низкая память не объявляется доказательством эксклюзивного владения. Первый
abort и оба набора before/quiesced/after сохранены, не перезаписаны.
После trials GPU/memory clocks возвращены в auto, power limit 450 W не менялся.
Финальный read-only snapshot: 978 MiB, P5, 300/810 MHz. Четыре Mission Core
сервиса восстановлены, Triton ready=200; Ollama/Frigate exited/restart=no.
Известные legacy-agent restart loops не исправлялись и не объявляются здоровыми.
Temporary containers/lease volumes отсутствуют. Удалены только временные
экспериментальные объекты; записи, веса, прошлое evidence сохранены.
Mac canonical8000=200,8765 закрыт; no model/load/full build на Mac.
383 focused tests PASS (4.30 s), Ruff/format 10 files PASS, mypy двух common
runtime modules PASS; единственное прежнее Starlette/httpx предупреждение.
Manifest `.runtime/perception-stage2-resume-worker-20260902T1545MSK/manifest.json`:
330 artifacts, SHA-256
`a9449fa4c012e30ce8a06025790c0e110eeebab7c1859fdebf56d5e785961ea3`.
236 Worker snapshot hashes и 114 текущих source files сверены. Сохранены обе
версии кода, CPU/4 GPU reports/scenes, команды, telemetry, состояния/clock reset,
analysis и local checks; sealed manifest скопирован на Worker.
**Далее:** trusted continuous GPU/inventory collector и bounded control-plane
adapter, внешний transport/recovery с отдельным availability budget, затем
standalone packaging. Gap policy работает в enabled полном пилоте; это ещё не
product queue/registry/UI cutover. Этап 2 продолжается, этапы 3–4 не начаты;
physically-live scanner, управление ровером и actuation=false остаются за границей.