290 lines
55 KiB
Markdown
290 lines
55 KiB
Markdown
# AI Inference — принципы работы и фактическая архитектура
|
||
|
||
Срез на 5 сентября 2026 года. Репозиторий MISSION CORE, ветка `main`, исходный код аудита `e56eb42507d005cc372ac4a53785a080b116e227`. Изменения этого среза: терминология интерфейса и фиксация архитектуры. Исполнитель, модели, очередь, Rerun и способы обмена данными не рефакторились.
|
||
|
||
## 01. Решение и границы закрытия
|
||
|
||
AI Inference — текущий лабораторный путь применения выбранной AI-конфигурации к сохранённой физической записи и просмотра сохранённых доказательств. Раздел находится в LAB приложения Mission Core. Название «Обсерватория» больше не используется в текущем пользовательском интерфейсе. Технические `observatory` в URL, схемах, именах Python/TypeScript, Docker labels и старых evidence сохраняются для совместимости.
|
||
|
||
По решению владельца этот этап временно зафиксирован. Завершены архитектурный срез и консолидация контекста; пользовательская приёмка ещё не завершена. Это не статус production-ready, не доказательство real-time и не разрешение на управление транспортом. Поля `actuation_allowed`, `commands_enabled`, `navigation_or_safety_accepted`, `production_accepted` у действующих portable definitions имеют значение false.
|
||
|
||
Новые эксперименты строятся через этот путь. Старые LAB V1/M4.x и их приложения не становятся основой новых пользовательских поверхностей. Их результаты, код квалификации и происхождение алгоритмов сохраняются как история. Использование действующего TGS executor, выросшего из M4.9, не требует возвращать старый интерфейс лаборатории.
|
||
|
||
Worker выключен. В этом аудите его не включали, Docker daemon на нём не опрашивали, ничего не устанавливали и не запускали. Факты разделены на код и текущую конфигурацию Core, локальный сохранённый каталог/журнал, исторические измерения и непроверенные возможности.
|
||
|
||
## 02. Что является источником правды
|
||
|
||
Для текущей реализации первичны `config/observatory-ai-modules.json`, `config/observatory-portable-run-definitions.json`, `config/observatory-worker-runtime-candidates.json`, `config/observatory-domain-ontology.json` и соответствующие исполнители в `src/k1link/observatory/`. Наличие записи `executor.state=ready` означает сохранённую регистрацию executor identity, а не работающую сейчас машину.
|
||
|
||
Машинный срез: [2026-09-05-ai-inference-evidence.json](2026-09-05-ai-inference-evidence.json). В нём сохранены каталожные identities, ресурсные профили, текущая композиция и отобранные поля локальных jobs. Снимок не содержит ключей доступа, исходного видео, облаков, весов моделей и полных runtime-логов.
|
||
|
||
Связанные решения: [ADR 0051](../adr/0051-modular-observatory-profiles.md), [история маршрута](../OBSERVATORY_REALTIME_PROFILES_EXECPLAN.md), [handoff 3 сентября](../../experiments/perception/OBSERVATORY_MODULAR_HANDOFF_2026-09-03.md), [runbook Worker](../runbooks/OBSERVATORY_PORTABLE_WORKER_006.md). Старые слова CURRENT/«следующий шаг» в исторических отчётах не являются новыми поручениями и не отменяют этот срез.
|
||
|
||
Ops MISSION CORE: #75 «AI Inference · Принципы работы и архитектура» (`e5768b6c-0817-4e9e-a786-f9167586c7dc`) с полным содержанием этого отчёта; #73 — история перехода к модульным профилям; #74 — подробный реестр кастомизации Rerun; #66 — канон Rerun; #9 — история AI Worker; #65 — историческая LAB V1. Новая карта не стирает свидетельства ошибок в старых картах. Статус Done у #75 означает завершение документирования среза; открытые пункты пользовательской/target-приёмки перечислены в checker и ниже.
|
||
|
||
## 03. Основные сущности и их владельцы
|
||
|
||
| Сущность | Значение и владелец |
|
||
|---|---|
|
||
| Физическая сессия | Запись оборудования: видео, LiDAR, pose/trajectory, временные шкалы, калибровка и provenance. Каталог сессий Core; не результат AI. |
|
||
| Версия модуля | Модель либо связанная алгоритмическая функция с точными image/code/model/contract identities, входами и выходами. Реестр модулей и sealed package. |
|
||
| CompositionSpec | Неизменяемый проверенный набор версий, параметров, зависимостей и execution policy; не привязан к одной конкретной записи. |
|
||
| LAB / composition run | Применение композиции к точному source snapshot; связывает состав, member jobs и опубликованные результаты. |
|
||
| Recorded job / attempt / lease | Единица выдачи работы и её конкретное владение исполнителем. Durable очередь Core, claim token и generation fencing. |
|
||
| Portable result | Неизменяемые артефакты и метаданные доказательства, identities, покрытие и authority. Публикуются на Core. |
|
||
| LAB display profile | Изменяемое оформление просмотра, отдельно от расчётной конфигурации и raw evidence. Хранится на Core по result_id. |
|
||
| Viewer session | Временное положение камеры, FOLLOW, включённые слои и пропорции окон. Не следует отождествлять с сохранением всего LAB profile. |
|
||
| Worker / installed executor | Доверенный исполнитель, которому разрешены конкретные версии packages и ресурсы. Не произвольная удалённая shell-машина из UI. |
|
||
|
||
Изменение цвета или размера точек не пересчитывает модель. Переименование отображаемой LAB не меняет immutable composition/result identity. Удаление из пользовательского каталога не следует трактовать как переписывание доказательства или автоматический Docker prune.
|
||
|
||
## 04. Пользовательский путь
|
||
|
||
Оператор выбирает сохранённую сессию. Core сообщает доступные каналы и применимость setup. Кнопка «Сконфигурировать AI-слой» открывает выбор по функциональным группам. UI получает каталог с сервера; он не извлекает возможности из свободного названия LAB.
|
||
|
||
Выбранные модули проходят проверку зависимостей и совместимости источника. Сохраняется точная композиция. Core создаёт либо использует уже существующие подходящие member jobs/results, показывает их совместный статус, а после публикации открывает связанный визуальный разбор. Повторный просмотр готовой LAB не должен запускать inference.
|
||
|
||
Название строки состоит из реальных конфигурационных значений. Название исходной сессии в строках списка не дублируется; в заголовке открытого результата сохраняется полный контекст. Дата и время расчёта, сортировка по времени, просмотр, переименование и удаление доступны в каталоге. Прогресс относится к активной обработке; готовая строка не должна навсегда оставаться шкалой 100%.
|
||
|
||
Глобальный смысл состояний: инициализация → передача на сервер → расчёт. Внутри расчёта могут быть подготовка камеры/LiDAR, загрузка модели, собственно inference и сборка результата. Эти подэтапы должны называться по фактической операции. Процент очереди/пакета нельзя интерпретировать как долю кадров модели или обещание точного ETA.
|
||
|
||
## 05. Каталог модулей и зависимости
|
||
|
||
| Модуль | Входы → выходы | Текущее назначение |
|
||
|---|---|---|
|
||
| camera-source | source.camera → camera.frames | Служебная подготовка камеры, добавляется зависимостью. Не отдельный пользовательский эксперимент. |
|
||
| DDRNet-39 · GOOSE | camera.frames → segmentation.mask | Семантическая сегментация выбранной версией DDRNet. |
|
||
| EoMT Large · Cityscapes | camera.frames → segmentation.mask | Альтернативный провайдер сегментации. |
|
||
| RF-DETR Large | camera.frames → detections.2d | Детекция объектов; текущий package содержит TensorRT engine. |
|
||
| Дистанция до объектов | detections.2d + source.calibration + source.lidar + source.pose → objects.ranged | Сопоставление детекций с калиброванными LiDAR/pose; собственных обученных весов нет. |
|
||
| TRAVEL TGS | source.calibration + source.lidar + source.pose → geometry.costmap + geometry.ground | Геометрическая обработка, ground/costmap; без отдельной ML-модели. |
|
||
|
||
В новой композиции допускается не более одного провайдера в группе. DDRNet и EoMT — альтернативы, не два одновременно выбранных segmentation provider. Зависимости включаются детерминированно; range требует RF-DETR. Циклы, неоднозначные провайдеры и пустой недопустимый граф отвергаются.
|
||
|
||
Группы motion и policy присутствуют в модели каталога, но в текущем реестре пусты. Это не доказательство установленных модулей движения или управления. Полный исторический perception prototype имел более широкий состав; его нельзя автоматически приписать текущему UI.
|
||
|
||
Разрешённые параметры расчёта ограничены версией модуля: у текущих stateless AI modules cadence допускает 1; у TGS causal history-seconds допускает 1 и действует reset-at-source-start. Это вычислительные контракты. Пользовательский slider накопления SLAM 0–500 секунд относится к отображению и не увеличивает расчётную историю TGS.
|
||
|
||
## 06. Граф: декларация и реальное исполнение
|
||
|
||
`modular_composition.py` проверяет capabilities, identities, параметры и топологический порядок. `modular_composition_store.py` сохраняет неизменяемую спецификацию. Execution policy текущих композиций: `recorded-observation-only`, `max_parallel_nodes=1`. `composition_runs.py` связывает source, composition и результаты запуска.
|
||
|
||
Важная граница реализации: `web/modular_observatory_api.py` переводит известный набор модулей в заранее поддержанные setup IDs. Это работающий ограниченный композитор, но ещё не универсальный runtime, который исполняет произвольный DAG из любого числа новых Docker-узлов под одной lease.
|
||
|
||
Текущие AI setup IDs: `ai-segmentation-ddrnet-v1`, `ai-segmentation-eomt-v1`, `ai-detection-rf-detr-v1`, `ai-range-object-distance-v1`; геометрия — `m49-tgs-portable-v2`. Когда выбран range, отдельный standalone RF-DETR job не создаётся: RF-DETR выполняется внутри range package. Поэтому полная выбранная конфигурация DDRNet + RF-DETR + range + TGS даёт три member jobs, а не четыре.
|
||
|
||
Подходящий ранее созданный non-failed job может быть использован снова; опубликованный member result связывается с новой композиционной проекцией. Точная повторная отправка композиции с существующей допустимой работой не должна размножать расчёты; конфликт сообщает API. Failed execution допускает повторную попытку по действующему маршруту.
|
||
|
||
Очередь отдельного job durable. Создание группы member jobs и запись composition-run projection не являются одной общей SQL-транзакцией универсального DAG. Нельзя обещать атомарность всей композиции на основании транзакционности очереди. Полноценное расширение scheduler и его аварийная приёмка остаются отдельной работой.
|
||
|
||
## 07. Схема коммуникации
|
||
|
||
```mermaid
|
||
flowchart LR
|
||
UI[Web UI: AI Inference] -->|same-origin HTTP| Core[Mission Core API :8000]
|
||
Core --> Catalog[Sessions / composition / ontology projection]
|
||
Core --> Queue[Durable recorded queue]
|
||
Worker[Installed Worker agent] -->|claim / renew / progress / terminal| Core
|
||
Core -->|verified source package| Worker
|
||
Worker -->|local Docker API| Steps[Sequential compute containers]
|
||
Steps -->|sealed output| Worker
|
||
Worker -->|manifest + verified member uploads| Core
|
||
Core --> Publish[Publication / artifact store / result catalogue]
|
||
Publish -->|base + overlay + profile| Viewer[Official Rerun in Web UI]
|
||
```
|
||
|
||
Браузер обращается к Core, не управляет Docker и не соединяется напрямую с Worker. Worker забирает работу у Core по HTTP pull-протоколу. Нынешний recorded-путь не отправляет каждый кадр через отдельный браузерный запрос или gRPC-поток: исходный пакет передаётся, вычислительные шаги работают с локальными входами, выход затем публикуется обратно.
|
||
|
||
Live telemetry оборудования — отдельный контур. Telegraf → MQTT → normalizer → Timescale → Core/System не заменяет HTTP job protocol. Свежая телеметрия не доказывает успешную публикацию LAB, а сохранённая LAB остаётся читаемой без работающего Worker.
|
||
|
||
## 08. Адресация, туннель и доверие
|
||
|
||
Файлы: `worker_http_transport.py`, `worker_tunnel_launchd.py`, `worker_container_proxy.py`, `worker_agent.py`. Текущий Core слушает локально `127.0.0.1:8000`. На Mac управляется SSH reverse tunnel через alias `mission-gpu`: `-R 127.0.0.1:18080:127.0.0.1:8000`, с BatchMode, ExitOnForwardFailure и keepalive.
|
||
|
||
Внутри agent container клиент обращается к loopback proxy :18080. Proxy направляет запросы на `host.docker.internal:18080`; на Windows host это loopback endpoint SSH-туннеля к Core. Следовательно, loopback HTTP защищён транспортом SSH на межмашинном участке. Здесь нет утверждения о публичном HTTP-порту Worker без защиты.
|
||
|
||
Transport принимает HTTPS либо HTTP только для loopback, передаёт Bearer auth и contour identity. Текущее исполнение привязано к `worker-006`. Два HTTP connection slots оставляют возможность служебного обмена при передаче пакета. Ключи, значения credentials и файлы с ними намеренно не входят в карту.
|
||
|
||
Это конкретная топология Mac Core ↔ Windows/Docker Desktop Worker. Наличие протокола не означает, что имя другого компьютера можно просто подставить в UI. Linux host networking и `host.docker.internal`, доверие SSH, токен, contour binding и установленный release потребуют согласованной адаптации. Реализация регистрации нового Worker в этот этап не входит.
|
||
|
||
## 09. Lease, очередь и восстановление
|
||
|
||
Worker вызывает `/api/v1/worker/observatory/recorded-jobs/claims` с claim schema v3 и перечнем поддержанных executor identities. При отсутствии работы получает 204. Затем идут start, lease renew, progress и terminal; upload result package имеет отдельные plan/member/complete операции.
|
||
|
||
Core сверяет source/definition/executor/resource/result contracts. Claim token и generation защищают от публикации запоздалым исполнителем. UI не может передать произвольный image, shell command, mount или network target через job. Вычислитель получает выбранный установленный package.
|
||
|
||
Ресурсные профили текущего Worker закрепляют последовательную работу на NVIDIA RTX 4090 и concurrency=1. Это не доказательство параллельного исполнения всех модулей. Политика допускает преимущество live-работы над recorded; текущие тяжёлые recorded jobs non-checkpointable. После вытеснения/ошибки до sealed результата нельзя обещать продолжение ровно с последнего кадра.
|
||
|
||
Worker имеет ограниченное восстановление транспортных ошибок и heartbeat; Core хранит durable job/publication state. Если вычисление завершено и результат запечатан, повтор публикации не должен повторять inference. Если результат ещё не запечатан, повторный запуск может начать обработку заново. История failed attempts сохраняется, а не становится фиктивным успехом при появлении следующего успешного результата.
|
||
|
||
## 10. Docker: что действительно упаковано
|
||
|
||
Нужно различать agent image, compute module image, installed package и реально запущенный контейнер. Agent опрашивает Core и управляет этапами. Compute container выполняет ограниченный шаг. Package закрепляет последовательность, изображения, assets, команды и contracts. Контейнерный ID — конкретный экземпляр на машине; его текущего значения этот offline-аудит не устанавливает.
|
||
|
||
Dockerfiles находятся в `experiments/perception/worker/observatory_portable/`: `Dockerfile.ai-module-camera-source`, `Dockerfile.ai-module-ddrnet`, `Dockerfile.ai-module-eomt`, `Dockerfile.ai-module-rf-detr`, `Dockerfile.ai-module-object-distance`, файлы installed-lab worker agent и специализированного M4.9 executor. Builder: `scripts/build_modular_ai_worker_release.py`. Исполнение: `installed_lab_packages.py`, `installed_lab_package_runner.py`, `modular_installed_package_steps.py`, installed worker service/container main; для TGS — `m49_worker_service.py` и соответствующий main.
|
||
|
||
Модульность сейчас прежде всего логическая и контрактная. Camera-source использует private base `ndc/mission-core-installed-lab-v1-eomt-step:ee0efdd9af72`; DDRNet — `ndc/mission-core-installed-lab-v1-ddrnet-step:439127908dba`; RF-DETR и object-distance опираются на `ndc-k1-perception-ddrnet39-rfdetr-tgs:stage1-joint-20260901`. Поэтому нельзя описывать каждый модуль как уже минимальный полностью независимый образ без наследованных окружений.
|
||
|
||
Некоторые FROM закреплены tag, хотя установленный release и готовые images проверяются по SHA. Для воспроизводимой чистой пересборки нужны именно соответствующие private bases, внешние assets и версии инструментов; один текст Dockerfile без них недостаточен. Отдельные conda/Python/model environments внутри compute stages остаются частью переносимого комплекта.
|
||
|
||
`ModuleSpec.docker_name` и ownership labels задают идентичность/наименование, а не доказывают наличие отдельного постоянно работающего сервиса на каждый модуль. В частности, TRAVEL TGS в текущем пути использует квалифицированный специализированный executor. Старые контейнеры LAB V1/других исследований не удалялись этой фиксацией.
|
||
|
||
## 11. Зафиксированные образы, модели и releases
|
||
|
||
SHA ниже взяты из текущих versioned registries; это конфигурационный срез, не сегодняшняя команда docker inspect на выключенном Worker.
|
||
|
||
| Модуль | Compute image SHA-256 |
|
||
|---|---|
|
||
| camera-source | da926459aee0a841bbdfaf80a0eb5fbead354c56794d1f3384eeba66d0a49e00 |
|
||
| DDRNet | 489fc7d1157fd0f1cd1d82e06a15737b7b2aaaf72b2ddb2aca2992b91a97488e |
|
||
| EoMT | 5b770178e4a5c8fbe8f8ddab3b83a598973dbe103b669851110b11a0918ab846 |
|
||
| RF-DETR | 2b8b44be8e9ee4060aa6997fc4c025ad7120f37ecd720a9e59b5e02ac6c90f66 |
|
||
| object-distance | 69d68f64981b41e5bcce1e642433e3d466b88c51942a5ba3aec9180d8ed04263 |
|
||
| TRAVEL TGS | f9278ab21aa65045be993dd19bffc25f49955e19598893ac78cc4761ca63ecf3 |
|
||
|
||
Веса DDRNet: `b99c2838051bcd7b092fd3970aa62a77d5c0bbb809c9b9afb2ff4b0ebdaa4ee6`. EoMT weights: `c265da9a74f58f5c3f4826d23ca4ca78beac0b106cca5842beca61580de5b782`. RF-DETR TensorRT engine: `b8a40b3580edff001ec9680de68707242294ff590ab296000fae371f1083f695`. TensorRT engine не следует считать универсальным переносимым checkpoint для любого GPU/runtime.
|
||
|
||
У четырёх новых AI setup текущий executor image SHA `7a1d425b4678dcade7d7d6ffd14733d639a4df29f45e1759ba4c512e930da8ab`, release ID `ai-modular-installed-package-v1`, release SHA `97bfe743689766285b22627c4020d10df7949ef1f4546ef904dccb9ca4c6f721`. Все привязаны к worker-006.
|
||
|
||
TGS definition v3 использует image `f9278ab2…`, release `m49-tgs-portable-executor-v1`, release SHA `c5b0670d943fe0452ef4bbfbc144ab2439a1a674f9ef164798ad9f8b1ecc29fa`. Старая совместная LAB V1 definition v2 с executor `5ad7d95b…` и release `66785862…` остаётся в совместимом реестре; она не заменяет новые modular setups.
|
||
|
||
Важно сохранять provenance каждого результата: успешно опубликованный DDRNet member произведён предыдущим release `ecbb0edc1c4c3708329247a2210ef98dfa776bf948974e778ba6d131ad17a924`, хотя image agent совпадает. Range member использует текущий `97bfe743…`. Совпадение agent image не означает одинаковость sealed package. Каталоги `.runtime/*v8/v9/v10` — локальные артефакты сборки; наибольший номер папки не является источником истины о фактически установленном release.
|
||
|
||
## 12. Ресурсы и изоляция compute
|
||
|
||
Installed agent — доверенный оркестратор с доступом к Docker API/socket. Его нельзя описывать как полностью непривилегированный компонент без влияния на host.
|
||
|
||
Дочерние вычислительные контейнеры запускаются с ограничениями package runner: `network=none`, read-only root filesystem, drop ALL capabilities, no-new-privileges, без privileged mode. Входы, модели и проверенные code assets монтируются read-only; writable output ограничен каталогом шага. Заданы RAM/MemorySwap, CPU NanoCpus, Pids, SHM/tmpfs и GPU DeviceRequests. Точное значение бюджета зависит от resource profile/package, а не от свободного UI ввода.
|
||
|
||
GPU device admission не является жёсткой квотой VRAM. На имеющейся конфигурации действует последовательный допуск. Обещание безопасной параллельной работы N разных GPU моделей требует отдельного замера памяти и admission policy.
|
||
|
||
Историческая инвентаризация 3 сентября сообщала 11 containers, 7 running/4 stopped, 80 images, 9 volumes. Эти числа сохранены в архиве, но не являются текущим состоянием выключенного Worker. Другие исследования/сервисы, включая Gaussian и retained LAB packages, не следует автоматически считать зависимостями AI Inference или удалять по этой карте.
|
||
|
||
## 13. Передача данных и фактический кэш
|
||
|
||
Source package строится из конкретной сессии и проверенных members. Проверяются digest, размер и допустимость путей. `worker_source_cache.py` содержит source CAS (`.source-cas-v1`), который позволяет повторно использовать совпадающие исходные bytes. Кэш не разрешает смешивать похожие записи или произвольные версии калибровки.
|
||
|
||
Холодная подготовка остаётся существенной: загрузка camera archive завершается до extraction; декодирование/согласование камеры и LiDAR может предшествовать модельному этапу. Model-neutral camera-source убирает логическую зависимость подготовки от выбора segmentation, но не доказывает, что каждый отдельный job уже использует один готовый общий prepared-frame cache.
|
||
|
||
`portable_result_cache.py` и composition member reuse работают на уровне совпадающих сохранённых результатов. Чтение уже опубликованного результата не должно требовать GPU Worker.
|
||
|
||
Особенно важная проверка: `modular_node_cache.py` и `node_input_identity` существуют и покрыты тестами, но поиск production call sites обнаруживает определения и тесты без подключения `ModularNodeCache` к основному исполнителю. Поэтому универсальный кэш каждого узла композиции пока не заявляется работающей функцией. Старое намерение «каждый модуль считается один раз для всех LAB» ещё не равно реализации.
|
||
|
||
## 14. Результат и публикация
|
||
|
||
Результат связывает source snapshot, exact definition, module/package/model identities, временное покрытие и артефакты. `portable_artifact_transport.py` принимает manifest и members, `portable_result_publisher.py` создаёт опубликованную проекцию, `portable_publication_reconciler.py` доводит durable publication/outbox до согласованного состояния.
|
||
|
||
Результат проверки/расчёта и построенный для Rerun cache — разные артефакты. Смена renderer identity может потребовать перестроить производный cache; она не должна переписать исходные sealed results. Недоступный или неподходящий source должен давать явное состояние, а не демонстрационные точки вместо реальных данных.
|
||
|
||
Готовность полной LAB означает доступность требуемых member results по composition projection. Она не делает timestamps всех member jobs одинаковыми и не доказывает, что весь состав был вычислен одним совместным запуском. Сохранённая точная конфигурация важнее свободного названия строки.
|
||
|
||
## 15. Что действительно есть в текущем каталоге
|
||
|
||
Проверено через локальный Core API 5 сентября, без подключения Worker. Источник: `20260828T130511Z_viewer_live`, имя RAVNOVES004TREE, XGRIDS LixelKity K1, capture profile `xgrids-k1.viewer-live.fw-3.0.2.v1`, длительность 808.779 секунды (13:28.779).
|
||
|
||
В текущей проекции есть ready composition `ai-composition-33389babab33b801e8892f7b991683487eef2deea507486e52569fe943082e4b`, composition SHA `230396b858b09eea3d1d3a190c5e32d1d5e379da0058d32341026937fbb5cf24`. Создана 4 сентября в 06:59:35 UTC. Состав: DDRNet, RF-DETR, object-distance, TGS. Связаны три опубликованных member result; в UI также доступны отдельные сохранённые DDRNet и TGS строки.
|
||
|
||
| Member | Job | От создания job до публикации, UTC |
|
||
|---|---|---|
|
||
| DDRNet | observatory-run-ef3c14a64fca4d5a8674df82a5a0fca2 | 04.09 03:57:16.996 → 04:26:44.704; 29 мин 27.708 с |
|
||
| TRAVEL TGS | observatory-run-b230216709dc4c59bc56c98c7e329bf1 | 03.09 08:08:03.013 → 08:31:39.776; 23 мин 36.763 с |
|
||
| object-distance, включая RF-DETR | observatory-run-185e25280d58472ab8b4a0245a35c888 | 04.09 06:29:36.181 → 07:00:02.263; 30 мин 26.082 с |
|
||
|
||
Result IDs: `ai-layer-ddrnet-7c6a79942683933390f5ff0ecf2c6da1867d40032e91303746a567198772ce5c`; `m49-tgs-portable-review-a09d2b4a07d103e4f3693ba746a51be2197214768774eabfded4f109ae80dce4`; `ai-layer-object-distance-05f3931621585c9ac32132bef8c7afa961cea317cc29def09a8312339f8421e4`.
|
||
|
||
Это wall time конкретных успешных jobs, включая всё между enqueue и publication; это не model latency. Не надо складывать эти числа и называть суммой latency одного composition run: его members переиспользованы из разных дат.
|
||
|
||
История по этой сессии и setup при запросе до 100 jobs: DDRNet — 7, из них 1 succeeded/published и 6 failed; range — 7, из них 1 succeeded/published и 6 failed; TGS — 4, из них 1 succeeded/published, 1 succeeded с publication not-required и 2 failed. У новых standalone EoMT и RF-DETR setup — 0 jobs для этой сессии. Ноль здесь не означает отсутствия модели или старых экспериментов; успешный standalone recorded прогон ими в этом срезе не подтверждён. Действующие failures не стираются итоговой готовностью одной LAB.
|
||
|
||
## 16. Реальное покрытие и смысл измерений
|
||
|
||
Полная длительность источника и фактическое покрытие результатов должны быть отдельными полями. Исторический TGS handoff для этой записи указывает 6830 camera anchors, 6811 LiDAR matches и 19 unobserved; processing schedule примерно 39.215–757.160 секунды внутри источника 808.779 секунды. Надпись «полный маршрут» не должна скрывать начальные/конечные непокрытые интервалы и отсутствующие наблюдения.
|
||
|
||
В сохранённом TGS performance: candidate TGS p50=1.204 ms, p95=2.6075 ms, p99=3.2357 ms, max=4.651 ms. Более широкий stage wall: p50=17.676102 ms, p95=29.99172 ms, p99=36.24682261 ms, max=1269.499327 ms. Это разные границы измерения внутри алгоритма и обвязки; они не опровергают десятки минут enqueue→publish при подготовке записи.
|
||
|
||
Для честного сравнения нужно сохранять source rate, coverage, cold/warm режим, hardware/runtime identity, sample count и границы: queue wait; source transfer; decode/align; warmup; model/algorithm compute; serialize/seal; result upload/publication; replay preparation. Нельзя вычитать p95 одной фазы из p95 другой и получать корректный p95 остатка. FPS визуального воспроизведения Rerun тоже не является inference FPS.
|
||
|
||
Текущий recorded-first путь предназначен для воспроизводимых сравнений и сохранённых доказательств. Из имеющихся результатов не следует ни обещание полного real-time, ни утверждение, что модель сама считает один кадр две секунды. Долгие пользовательские ожидания из истории были реальными и должны оставаться частью performance backlog.
|
||
|
||
## 17. Предыдущий streaming experiment и его результат
|
||
|
||
Сохранены исследования `experiments/perception/worker/streaming_profile_stage1/`, [stage 1](../../experiments/perception/PERCEPTION_STREAM_STAGE1_2026-09-01.md), [cross-host graph](../../experiments/perception/PERCEPTION_STREAM_STAGE2_CROSSHOST_GRAPH_2026-09-02.md), [control clock](../../experiments/perception/PERCEPTION_STREAM_STAGE2_CONTROL_CLOCK_2026-09-02.md), [TLS attribution](../../experiments/perception/PERCEPTION_STREAM_STAGE2_TLS_ATTRIBUTION_2026-09-02.md), [LAN route](../../experiments/perception/PERCEPTION_STREAM_STAGE2_LAN_ROUTE_2026-09-02.md). Подробные receipts также перенесены из Desktop в архив.
|
||
|
||
Это отдельный resident perception prototype: DDRNet/RF-DETR, LiDAR/range, motion, TGS/costmap и policy stages, бинарный обмен gRPC/TLS и pacing источника 1×. Он не является текущим recorded HTTP worker protocol и не становится автоматически модулем motion/policy в сегодняшнем UI.
|
||
|
||
Исторический joint image: `986dbe7126992359c69da0ddda674925a5efe8e3429a6d5f60765f9c9ad34a4e`, tag `ndc-k1-perception-ddrnet39-rfdetr-tgs:stage1-joint-20260901`. Использовались model/code mounts; это не полностью автономный образ. Конкретный приёмочный фрагмент: 32 released/accepted results с byte-exact доставкой; fresh scene outputs — 12. Эти числа нельзя заменять фразой «32 полностью свежих результатов сцены».
|
||
|
||
На Worker локально compute→local receiver p95/p99 = 74.243/76.322 ms. Межмашинная граница Mac source-due→consumer-ready p95/p99 = 205.864/213.751 ms при gate 125 ms: FAIL. Min 86.598 ms, median 121.85 ms не превращают хвосты в PASS. Историческая проверка выявила Wi-Fi с обеих сторон и TCP tails 67.921–91.142 ms ниже приложения; это основание изучать сеть, а не основание объявить всё задержкой модели. Истощение VRAM в этом конкретном опыте не было доказано.
|
||
|
||
Опыты показывают полезный compute budget и нерешённый end-to-end gate на тогдашней сети. Перенос resident runtime на будущий борт, совместимость другого GPU и абсолютный real-time не квалифицированы этим отчётом. Повторный streaming benchmark сейчас не запускался.
|
||
|
||
## 18. Локальная онтология и связи с оборудованием
|
||
|
||
В Mission Core уже есть предметная проекция: `config/observatory-domain-ontology.json` и `src/k1link/observatory/domain_ontology.py`. Она связывает transport/equipment/mount, capture profile, source session, module version/image, worker, composition, run/job/result, LAB view profile и layers/panes.
|
||
|
||
Она обслуживает согласованные запросы планирования, dispatch, публикации и replay: точная подпись конфигурации, состав member results, доступные слои и готовность. Идентичности берутся из существующих реестров/хранилищ; это не конкурирующая база, самовольно переименовывающая raw evidence.
|
||
|
||
Онтология отдельного NDC Platform repository не изменялась, runtime dependency на неё для AI Inference не добавлялась. Архитектурный принцип связанной модели применён локально. Формальное присутствие transport/equipment сущностей не равно готовой регистрации любого оборудования, универсальному драйверу RealSense или автоматическому конструктору 50 камер.
|
||
|
||
## 19. Rerun: один runtime, локальные контролы и сохранение
|
||
|
||
Полная самостоятельная карта: Ops #74 и [2026-09-05-rerun-customization-inventory.md](2026-09-05-rerun-customization-inventory.md), с [проверкой upstream](2026-09-05-rerun-upstream-evidence.json). В ней перечислены все действующие и архивные надстройки, точные файлы, хеши и upgrade gates. Здесь только роль в AI Inference.
|
||
|
||
Используется официальный Rerun 0.36.3; установленные JS/WASM и Python SDK в предыдущем аудите побайтно сверены с upstream. Recorded viewer живёт в same-origin iframe, имеет один native renderer/store/clock. Камера и spatial — виды внутри общего viewer. Внешний SplitPane владеет разделением, контролы принадлежат своим секциям, native layout получает согласованную долю. Верхняя панель переносит не помещающиеся группы; refresh/fullscreen относятся к общему layout.
|
||
|
||
Слои строятся из capabilities результата: фон КАМЕРА независим от segmentation и РАМОК; кнопка рамок зависит от detections; TGS от geometry evidence. Отключённый фон камеры не должен выключать остальные 2D layers. Один тип источника допускает одно окно. Сегодня реализованы camera/spatial и single-pane варианты, а не произвольное дерево из 50 камер.
|
||
|
||
ИСХ. ТОЧКИ и ЛОК. SLAM сейчас используют одно sealed `/world/points`. Отличаются отображение/накопление и дополнительные trajectory controls; это не две независимые коллекции «математические» и «декоративные». Изменения размера/цвета не меняют raw/AI расчёт.
|
||
|
||
Надстройка FOLLOW и восстановления eye использует прикладной журнал native gestures и blueprint. Это не официальный универсальный get-camera-pose API. Не все gestures покрыты: WASD, double-click/picking-fit, inertia могут расходиться с журналом. Такие ограничения явно оставлены в #74; этот документ не объявляет все пользовательские сценарии зума принятыми.
|
||
|
||
Server-side LAB display profile сохраняет point_size, accumulation_seconds, color_mode, palette, show_grid, show_labels, show_camera_frustums отдельно от immutable result. Применение point size/накопления/цвета/grid подключено; show_labels и show_camera_frustums сохраняются, но визуально не подключены к текущему canonical LAB пути. Layer toggles, FOLLOW, eye и split ratio в этот durable profile не входят.
|
||
|
||
Slider накопления 0–500 s и точный ввод конечного неотрицательного значения без верхнего product cap; размер slider 0.1–10 px, точный ввод ≥0.1 без верхнего cap. Закрытие настроек отправляет PUT; ошибка не должна блокировать закрытие и показывается компактным сообщением. Только успешная серверная запись подтверждает сохранение после очистки локального кэша. Сохранение в памяти/localStorage само по себе этого не доказывает.
|
||
|
||
## 20. Переносимость — что возможно и чего ещё нет
|
||
|
||
| Объект переноса | Реальное условие |
|
||
|---|---|
|
||
| Просмотр готовых LAB на другом Core | Перенести каталог, source/result artifacts, lineage и profiles с сохранением identities; обеспечить renderer/SDK и восстановление производных caches. Worker для просмотра не требуется. |
|
||
| Та же композиция на другой записи K1 | Источник обязан пройти admission по требуемым каналам, калибровке, media epoch/codec, геометрии и timestamps. Один совпавший label недостаточен. |
|
||
| GPU-модули на другом AI Worker | Нужны compatible CPU architecture/GPU/CUDA/TensorRT, exact images, private bases для rebuild, models/code assets, installed package, resource profiles и протокол связи. Не один docker load. |
|
||
| Worker с другим именем/contour | Сейчас имеются worker-006 bindings и проверки. Общая динамическая регистрация/автовыбор любого Worker не заявляется готовой. В эту задачу не входит. |
|
||
| Linux вместо Windows Docker Desktop | Нужна проверка network/host bridge, paths, mounts, GPU runtime и SSH topology; host.docker.internal нельзя молча считать одинаковым. |
|
||
| Новая модель | Требуются ModuleSpec, versioned image/contract, adapter/installed steps, setup projection, input/result verification, capability→viewer mapping и evidence. Сейчас UI не универсальный marketplace Docker images. |
|
||
| Другое оборудование / 50 камер | Нужны source adapters, calibration/time contracts, admission и расширение layout/ресурсной модели. Сущности онтологии дают место для этого, но не готовую реализацию. |
|
||
| Бортовой real-time | Resident prototype, recorded LAB и бортовая qualification — разные границы. Нужен отдельный измеренный deployment на выбранном target. |
|
||
|
||
Переносимость достигнута в identities, пакетах, протоколах и сохранённых результатах. Привязки к Worker-006, K1 и имеющимся окружениям остаются конкретными. Утверждение «полностью независимо от host» сегодня было бы неточным. Изменять эти границы ради красивого отчёта без работающего Worker не стали.
|
||
|
||
## 21. Архив Desktop без потери контекста
|
||
|
||
Два относящихся к AI Inference документа перенесены побайтно в `docs/handoff/ai-inference-source-documents/` и снабжены [manifest.json](../handoff/ai-inference-source-documents/manifest.json). Это полные исходные тексты, включая ошибки, планы, замеры, списки Docker и последовательные обновления; не только краткий пересказ.
|
||
|
||
| Исходный файл Desktop | Bytes | SHA-256 |
|
||
|---|---:|---|
|
||
| _MISSING_CORE_MODULAR_AUDIT_AND_PLAN_2026-09-03.md | 53637 | d6c201d083fbec4b1db031379b515ff821a09ccfa0cea62443e211a9d76cb1c2 |
|
||
| _MISSING_CORE_OBSERVATORY_DOCKER_LABS_FINAL_STATUS_2026-09-01.md | 330260 | 45e870700baddab8f31a2f0f0bfe1f9e99e8e73a490195c1e6a3beb5265e49ee |
|
||
|
||
Другие документы на Desktop не объявляются перенесёнными этой картой. Исходники не удалялись автоматически. После публикации commit пользователь может удалить именно эти два оригинала: versioned копии и хеши остаются в репозитории, а их актуальная интерпретация — здесь и в Ops.
|
||
|
||
Исторические указания из этих файлов не исполняются как команды. Раннее требование «весь профиль в одном монолитном образе» заменено ADR 0051. Историческое описание node cache как цели отделено от фактического отсутствия production wiring. Старые Docker inventories и streaming receipts датированы; не выдаются за результаты сегодняшнего запуска.
|
||
|
||
## 22. Проверки этого изменения и открытые границы
|
||
|
||
Для переименования выполнены архитектурные frontend tests (4 passed), полный frontend typecheck, полный unit suite (759 passed), production build и targeted Python tests `test_modular_observatory_api.py`/`test_observatory_setups.py` (22 passed). Изменения runtime поведения и новые вычислительные jobs в этом этапе не выполнялись.
|
||
|
||
В открытом in-app browser обновлена сборка и пройден путь LAB → AI Inference. Новые sidebar label, eyebrow, title и aria-подсказки удаления подтверждены реальным UI. Проверены обычный и развёрнутый shell, три сохранённых строки с датами/действиями; открыта полная сохранённая конфигурация с камерой, DDRNet, рамками и TGS. Fullscreen самого результата и возврат по Escape проверены. Escape на shell сам по себе не меняет его состояние; это не объявляется успешным закрытием shell. Текущая задача не меняет политику Escape/диалогов. Реальная сохранённая конфигурация оставляется для просмотра владельцем.
|
||
|
||
Срез временно закрыт по документации. Открыты: окончательная пользовательская приёмка навигации Rerun и настроек; два неподключённых display fields; полный native camera-state API вместо неполного gesture journal; универсальный multi-pane constructor; универсальное исполнение DAG/production node cache; новые Worker/оборудование и target CUDA qualification; end-to-end real-time gate и полноценные cold/warm phase metrics. Это границы текущего продукта, не скрыто выполненные пункты.
|
||
|
||
При возобновлении работы исходная точка — этот срез, actual registry и конкретные new measurements. Legacy LAB приложения автоматически не возвращаются; неизвестные состояния выключенного Worker сначала проверяются после его появления. Любое следующее обновление Rerun проходит отдельно по карте #74.
|
||
|
||
## 23. Изменённые файлы и эксплуатационная фиксация
|
||
|
||
Переименование: `apps/control-station/src/productModel.ts`, `components/laboratory/LaboratoryPresentation.tsx`, `workspaces/observatory/ObservatoryWorkspace.tsx`, `core/observatory/{aiComposition,catalogMutations,useObservatoryCatalog}.ts` внутри frontend; `src/k1link/observatory/setups.py`, `src/k1link/web/{observatory_api,modular_observatory_api}.py`. Обновлены ожидания существующих `observatoryWorkspace.test.mjs` и `observatoryCatalogMutations.test.mjs`. Дизайн, identifiers, параметры расчёта и бинарные модели не изменены.
|
||
|
||
Документация: этот отчёт, JSON evidence, README/manifest и две полные копии в `docs/handoff/ai-inference-source-documents/`; указатели текущего среза в ADR 0051 и историческом ExecPlan. Ops #75 создана как текущая архитектурная карта; #73 переименована в историческую карту с указателем #75 и сохранением всех прежних блоков.
|
||
|
||
Production frontend bundle пересобран. Канонический локальный LaunchAgent `com.nodedc.mission-core.local` перезапущен из того же checkout для применения Python-текстов. `/api/health` на :8000 подтверждает operational=true, plugin runtimes 1/1, готовность источников и artifact store. Новый сервер на другом порту не создавался; удалённый Worker не запускался. Код и архив публикуются в main обычным commit/push без переписывания истории. Точный итоговый commit указывается в финальном блоке Ops #75.
|