docs(perception): record full graph recovery and separate availability latency
This commit is contained in:
@@ -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 остаются за границей.
|
||||
|
||||
Reference in New Issue
Block a user