Архітектура та проєктування репозиторію
Ця сторінка призначена для розробників, яким необхідно зрозуміти, як структурована бібліотека, де розташовані основні компоненти та як розширити структуру, не порушуючи її модульність і контракти середовища виконання.
Володіння диспетчером EV74
Збірки Graph і Model резервують канали EV74 RPMsg під час ініціалізації диспетчера, ще до завершення запуску, навіть якщо попередню перевірку корисного навантаження вимкнено. Кожен робочий процес володіє окремою кінцевою точкою. Графи в одному процесі спільно використовують диспетчер; закриття останнього клієнта звільняє його канали. Періоди простою їх не звільняють.
Вичерпання місткості призводить до помилки збірки infra.dispatcher_unavailable. Диспетчер у стані помилки не може приймати нові графи; закрийте всіх його клієнтів перед повторною збіркою. Реалізація та блокування каналів належать до Neat Internals, а не до Core.
Фреймворк проти середовища
Слово «Neat» використовується для позначення двох пов’язаних, але різних аспектів:
- Neat Library: бібліотека C++/Python і середовище виконання, що міститься в цьому репозиторії. Вона завантажує модель. створює пакети, формує конвеєри, перевіряє контракти, працює на апаратному забезпеченні Modalix і надає доступ до публічного API.
- Neat SDK / середовище: контейнеризований процес розробки, що охоплює роботу з фреймворком. зокрема, DevKit Sync, спільні робочі простори та інструменти для агентів.
Під час внесення змін до цього репозиторію оптимізуйте його для властивостей фреймворку, які підтримують як людей, так і агентів: чіткі API, детермінована поведінка, структуровані засоби діагностики, сувора перевірка та стабільні публічні контракти.
Для чого призначена ця бібліотека?
Основні користувачі
Розробники, які бажають:
- Створюйте конвеєри з використанням повторно використовуваних складових (без написання стандартного коду GStreamer).
- Забезпечте перевірку конвеєрів на ранніх етапах (з урахуванням вимог безперервної інтеграції) та швидко аналізуйте причини збоїв.
- Запускайте конвеєри та обробляйте кадри мовою C++ за допомогою
appsink. - За бажанням, можна передавати дані конвеєра через RTSP (за допомогою
gst-rtsp-server). - Надавайте код машинного навчання через вихідні дані, оптимізовані для тензорів, без необхідності писати складний код для GStreamer.
Права власності на пакет
Обраний основний артефакт є джерелом істини для пакетів Neat, LLiMa та Internal Debian, які встановлюються разом. Основний модуль використовує та передає цей артефакт без вибору або переписування версій залежностей. Пакет, що знаходиться поза межами артефакту, залишається у власності платформи; у разі виникнення несумісності платформу слід оновити, а не ремонтувати за допомогою основного модуля або LLiMa.
Типові робочі процеси
- Декодування/обробка: файл або RTSP -> демультиплексування/розбір -> декодування -> перетворення/налаштування параметрів -> appsink -> споживач, написаний на C++
- Перевірка: збірка + аналіз + попередня обробка (У СТАНІ ПАУЗИ), щоб на ранніх етапах виявити проблеми, пов’язані з узгодженням.
- Надання RTSP: передавайте синтезовані кадри в конвеєр RTSP-сервера, використовуючи
appsrc. - Адаптер тензорів зображень/відео: зображення/відео/RTSP -> декодування -> перетворення/масштабування ->
add_output_tensor(...)->Run::pull_tensors(). - Навчальні матеріали: почніть з Навчальні матеріали, щоб отримати доступ до структурованого навчального курсу, який можна використовувати на практиці.
Стандартизований виробничий конвеєр (джерело істини).
Канонічний «шлях для виробничого середовища» для цього репозиторію такий:
вхідні дані -> попередня обробка -> MLA -> постобробка. Джерело істини знаходиться тут:
tests/e2e_pipelines/obj_detection/sync_yolov8_test.cpp.
Коли цей тест змінюється, оновіть файл README та розділ «Архітектура», щоб забезпечити узгодженість документації.
Концептуальна модель (бізнес-логіка ↔ сполучна ланка конвеєра)
Ваша програма зберігає бізнес-логіку, а фреймворк забезпечує зв’язок між елементами конвеєра.
Business logic
|
v
Nodes/Graph fragments -> GStreamer fragments -> caps negotiation -> runtime (Run)
| |
+-----------------------------------------------------------+
Sample / Tensor
Основні поняття
Ця структура навмисно організована навколо невеликої кількості ключових понять. Більшість коду, який пише користувач, стосується лише Model, Graph, Run, Tensor та Sample; розробники, що працюють на ни жчому рівні, також працюють з Node, повторно використовуваними фрагментами графа, аналізом MPK-контрактів і внутрішньою структурою графа.
| Концепція | Роль |
|---|---|
| Архів моделі | Запакований у формат .tar.gz артефакт, що містить контракт для виконання MPK, конфігурації, призначені лише для плагінів, бінарні файли моделі та артефакти ядра. |
Model | Публічний завантажувач для архіву моделі у форматі .tar.gz. Він аналізує контракт MPK, виконує планування маршруту, надає доступ до етапів моделі та забезпечує прості точки входу для виконання run(...) / Graph. |
Tensor | Введений числовий блок даних із зазначенням типу даних, розмірності, структури, способу зберігання, пристрою та семантичних метаданих. |
Sample | Оболонка для даних, що використовуються під час виконання, навколо тензорів, списків тензорів або наборів. Перевірте Sample::kind перед читанням полів. |
Node | Атомарна стадія конвеєра, яка генерує детермінований фрагмент GStreamer і повертає імена відповідних елементів. |
| Фрагмент графа, який можна повторно використовувати. | Готовий Graph, який розширюється до кількох вузлів, наприклад, декодованого вхідного потоку RTSP або етапів моделі. |
Graph | Межа збірки та перевірки. Вузли, моделі та фрагменти графа, які можна повторно використовувати, стають узгодженим, структурованим конвеєром. |
Run | Активний об’єкт конвеєра, який повертається функцією Graph::build(...); він відповідає за життєвий цикл операцій над даними (завантаження/вивантаження/середовище виконання). |
| Граф | Використовуйте граф для побудови DAG (направленого ациклічного графа) всередині одного конвеєра; використовуйте граф середовища виконання для координації етапів/виконань між різними конвеєрами. |
Читайте зв’язки зліва направо:
model archive on disk -> Model -> Graph fragments/Nodes -> Graph -> Run
|
v
Tensor/Sample flow
Model є початковою точкою для користувачів-початківців, але це не окремий модуль виконання. Він використовується для створення фрагментів/вузлів графа, які можна додавати до Graph. Graph є центральною концепцією для збирання; Run – це активний об’єкт після створення.
Принципи дизайну для авторів
Це основні принципи архітектури, що забезпечують надійність роботи фреймворку. Використовуйте їх, коли обираєте між різними варіантами реалізації.
- Детермінованість перемагає. Зберігайте назви елементів, згенеровані рядки для конвеєра, серіалізовані дані конвеєра. поля звіту та результати тестування мають бути відтворюваними. Діагности ка та цикли роботи агента залежать від стабільних ідентифікаторів.
- Зручність налагодження є пріоритетною. У разі виникнення помилок мають генеруватися структуровані дані, а не лише текстові рядки:
GraphReport.error_code,repro_note, повідомлення шини та конвеєри бекенду, які можна повторно запускати. - Не використовуйте непомітний механізм резервного копіювання. Не приховуйте помилки вхідних даних моделі або збої апаратного забезпечення/середовища виконання, просто мовчки ігноруючи їх. перетворення форматів, зміна сімейств графів, перехід на використання центрального процесора або обробка помилок плагінів.
- Здійснюйте перевірку перед запуском. Віддавайте перевагу структурній перевірці, перевірці великих літер, форми та відповідності вимогам перед початком роботи в середовищі виконання. починаються потоки або виділяються апаратні ресурси.
- Контракт MPK є еталонним джерелом істини. Основні функції: маршрутизація, тип даних, форма, квантування та
рішення щодо кожного етапу мають надходити з файлів
mpk.json/*_mpk.json. Файли JSON для кожного етапу є приватною власністю плагіна. - Логічний ранг і геометрія, що використовується під час виконання, є окремими поняттями. Основний модуль зберігає дані, створені MPK.
frame_shapeвикористовується як логічний контракт вихідних даних і, за потреби, генерує чітку геометрію MLA. Об’єкт 2-го рангу приймається як NC або HW лише тоді, коли оголошені діапазони байтів ідентифікують єдину інтерпретацію; неоднозначні або суперечливі контракти призводять до помилок під час завантаження моделі. - Політика бекендів ProcessCVU має один авторитет. Результат перевірки можливостей етапу визначає доступність бекенда та налаштування AUTO, що використовується для розв'язання й діагностики. Явно задані цілі етапу чи сеансу або виконуються на запитаному підтримуваному бекенді, або завершуються помилкою; пізніші перевизначення на основі ролей не повинні мовчки суперечити оголошеному рішенню AUTO.
- Публічні API залишаються стабільними. Публічні заголовні файли, що містяться в
include/*, встановлюються та підтримуються. Віддавайте перевагу поступовим змінам і механізмам відмови від застарілих функцій, а не різким змінам у структурі. - Паралельність має бути обмеженою та відстежуваною. Робота в потоці даних має бути легкою; діагностика на стороні зонда потребує використання атомарних операцій або еквівалентних механізмів безпечної обробки в багатопотоковому середовищі; завершення процесу не повинно призводити до зависання.
Шлях виконання моделі.
Для конвеєрів, що базуються на моделях, загальна схема така:
input Sample/Tensor
-> optional preprocessing / format normalization
-> MLA inference stages selected from MPK contract
-> optional postprocessing / box decode
-> output Sample/Tensor
Видима для користувача угода Model навмисно простіша, ніж апаратна угода MLA.
MLA може вимагати використання INT8/BF16 і тесельованих макетів, тоді як код користувача зазвичай працює з FP32 і звичайними макетами тензорів. Фреймворк усуває цю різницю за допомогою адаптерних етапів, керованих маніфестом.
Попередня та остаточна обробка є чіткими етапами/параметрами фреймворку. Несумісність форматів, відсутність необхідних метаданих для попередньої обробки, недоступний диспетчер MLA, недійсний архів моделі або угода MPK, або невдала угода щодо обмежень повинні відображатися як структурована помилка, з якою можна працювати, а не як прихована корекція в середовищі виконання.
Структура репозиторію.
Структура високого рівня.
include/– загальнодоступні заголовкові файли (підтримуваний інтерфейс API).src/– реалізації.docs/– документація (цей файл)examples/– невеликі приклади, які можна запустити.tests/– модульні/інтеграційні тести.python/– вихідні коди пакетаpyneat, прив’язки nanobind і тести для Python.old_*— знімки застарілої монолітної реалізації, що зберігаються для довідки/переходу на нову систему.
Відкрите дерево заголовкових файлів (include/).
Загальнодоступні заголовкові файли розміщуються в include/<module>/....
Приклади: include/pipeline/Graph.h, include/model/Model.h.
Загальнод оступні заголовкові файли, що містять корисні функції:
include/neat.h(парасолька)include/neat/runtime.hinclude/neat/models.hinclude/neat/nodes.hinclude/neat/node_groups.h
Навмисно не передбачено загальнодоступного include/neat/graph.h заголовного файлу. Тести середовища виконання/компілятора, які потребують базової структури графа нижчого рівня, повинні безпосередньо використовувати вузький набір include/graph/... заголовних файлів. Програми, приклади та загальнодоступна документація повинні використовувати єдиний загальнодоступний simaai::neat::Graph з <neat.h>.
Внутрішні заголовки та шляхи до плагінів середовища виконання.
Публічні заголовкові файли, що розміщені в include/, встановлюються та розглядаються як стабільний API.
Внутрішні заголовкові файли, що розміщені в src/**/internal, не встановлюються; у прикладах/навчальних матеріалах слід використовувати лише публічний API.
Примітки щодо середовища виконання:
- Якщо ви використовуєте вбудовані плагіни GStreamer у
deps/gst-plugins, встановіть.GST_PLUGIN_PATHта/абоGST_PLUGIN_PATH_1_0, щоб додати цю директорію. - Якщо встановлено за допомогою
cmake --install, плагіни розміщуються в каталозі:${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/sima-neat/gst-plugins. Додайте цей шлях доGST_PLUGIN_PATHта/абоGST_PLUGIN_PATH_1_0. - Використовуйте
scripts/use_neatdecoder.sh, щоб задати шляхи до плагінів для поточної оболонки. - Якщо встановлюєте плагіни для всієї системи, перезберіть кеш GStreamer.
Запланований vs. стабільний (інтерфейс API)
| Площа / API | Статус | Примітки |
|---|---|---|
Основний API конвеєра (Graph, Run, Tensor, Sample) | Стабільний | Основна підтримувана поверхня C++. |
Внутрішні компоненти конструктора (Node, приватні допоміжні функції для роботи з векторними вузлами, GraphPrinter). | Внутрішній | Підтримка лише формату STL, попереднє компонування перед використанням GStreamer. |
API моделі (Model, фрагменти графа, які можна повторно використовувати) | Стабільний | Стандартний шлях інтеграції з архівом моделей. |
include/policy/* | Стабільний | Мінімальні перевірені контракти та налаштування політики за замовчуванням (Decoder, Encoder, Memory, RTSP). |
include/nodes/groups/ImageToH264RtspGroup.h | Заплановано | Порожня група-заповнювач. |
Зв’язки для Python (python/, pyneat) | Бета | Зв’язування та пакування на основі Nanobind розміщуються безпосередньо в репозиторії; API зосереджується на Tensor, Graph/Run, Model та основних допоміжних функціях для вузлів/груп. |