저장소 아키텍처 및 설계
이 페이지는 라이브러리의 구조, 책임 범위, 그리고 모듈 및 런타임 계약을 깨뜨리지 않고 프레임워크를 확장하는 방법을 이해해야 하는 기여자들을 위한 것입니다.
프레임워크 대 환경
"Neat"이라는 용어는 관련되어 있지만 분리된 두 가지 측면을 나타내는 데 사용됩니다.
- Neat Library: 이 저장소의 C++/Python 라이브러리 및 런타임입니다. 모델 패키를 로드하고, 파이프라인을 구성하고, 계약을 검증하고, Modalix 하드웨어에서 실행하며, 공개 API를 제공합니다.
- Neat SDK / 환경: 프레임워크를 중심으로 구축된 컨테이너화된 개발 워크플로로, DevKit Sync, 공유 작업 공간 및 에이전트 도구를 포함합니다.
이 저장소를 변경할 때, 사람과 에이전트 모두를 지원하는 프레임워크 속성을 최적화하십시오. 즉, 명시적인 API, 결정론적 동작, 구조화된 진단, 엄격한 검증 및 안정적인 공개 계약을 제공해야 합니다.
이 라이브러리의 용도
주요 사용자
다음 작업을 수행하려는 개발자:
- 재사용 가능한 빌딩 블록에서 파이프라인을 조립합니다(원시 GStreamer 보일러플레이트 코드를 작성하지 않고).
- 파이프라인을 조기에 검증하고(CI에 적합) 오류를 빠르게 이해합니다.
appsink를 통해 C++에서 파이프라인을 실행하고 프레임을 소비합니다.- 선택적으로 RTSP를 통해 파이프라인을 제공합니다(
gst-rtsp-server사용). - GStreamer 파이프라인 코드를 작성하지 않고 텐서 친화적인 출력을 통해 ML 코드를 공급합니다.
패키지 소유권
선택된 Core 아티팩트는 함께 설치되는 Neat, LLiMa 및 Internals Debian 패키지의 단일 진실 공급원입니다. Core는 종속성 버전을 선택하거나 다시 작성하지 않고 해당 아티팩트 집합을 사용하고 전달합니다. 아티팩트 외부의 패키지는 플랫폼이 소유하며, 호환되지 않는 플랫폼은 Core 또는 LLiMa에서 임시로 수정하는 대신 업데이트해야 합니다.
일반적인 워크플로
- 디코딩/수집: 파일 또는 RTSP -> 디페이/디멀티플렉스/파싱 -> 디코딩 -> 변환/캡스 -> appsink -> C++ 소비자
- 검증: 빌드 + 파싱 + 프리롤(PAUSED)을 통해 초기 협상 문제를 감지
- RTSP 제공:
appsrc를 사용하여 합성 프 레임을 RTSP 서버 파이프라인으로 푸시 - 이미지/비디오 텐서 어댑터: 이미지/비디오/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 계약 파싱 및 그래프 내부 요소와 함께 작업합니다.
| 개념 | 역할 |
|---|---|
| 모델 아카이브 | MPK 추론 계약, 플러 그인 전용 구성, 모델 바이너리 및 커널 아티팩트를 포함하는 밀봉된 .tar.gz 아티팩트입니다. |
Model | .tar.gz 모델 아카이브의 공개 로더입니다. MPK 계약을 파싱하고, 경로 계획을 실행하며, 모델 단계를 노출하고, 간단한 run(...) / Graph 구성 진입점을 제공합니다. |
Tensor | dtype, shape, 레이아웃, 스토리지, 장치 및 의미 메타데이터를 포함하는 형식화된 숫자 페이로드입니다. |
Sample | 텐서, 텐서 목록 또는 번들을 둘러싼 런타임/미디어 컨테이너입니다. 필드를 읽기 전에 Sample::kind를 확인하십시오. |
Node | 결정적인 GStreamer 조각과 소유된 요소 이름을 출력하는 원자적 파이프라인 단계입니다. |
| 재사용 가능한 그래프 조각 | 디코딩된 RTSP 입력 또는 모델 단계와 같이 여러 노드로 확장되는 미리 만들어진 Graph입니다. |
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, 버스 메시지 및 재현 가능한 백엔드 파이프라인을 제공해야 합니다. - 자동 대체는 허용되지 않습니다. 모델 입력 오류 또는 하드웨어/런타임 오류를 조용히 형식 변환, 그래프 패밀리 변경, CPU로 대체하거나 플러그인 오류를 무시하여 숨기지 마십시오.
- 실행 전에 검증합니다. 런타임 스레드가 시작되거나 하드웨어 리소스가 할당되기 전에 구조, 캡, 모양 및 계약 검증을 우선적으로 수행합니다.
- MPK 계약은 모델의 단일 진실 공급원입니다. Core의 라우팅, dtype, 형상, 양자화 및 단계 결정은
mpk.json/*_mpk.json에서 가져와야 합니다. 단계별 JSON 파일은 플러그인 전용입니다. - 논리적 랭크와 런타임 지오메트리는 분리되어야 합니다. 코어는 MPK에서 작성된
frame_shape를 논리적 출력 계약으로 유지하고 필요에 따라 명시적인 MLA 지오메트리를 파생시킵니다. 랭크-2 모양은 선언된 바이트 범위가 고유한 해석을 식별하는 경우에만 NC 또는 HW로 허용됩니다. 모호하거나 일관성이 없는 계약은 모델 로딩 중에 실패합니다. - 공개 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/... 헤더를 직접 포함합니다. 애플리케이션, 예제 및 공개 문서는 <neat.h>에서 제공하는 단일 공개 simaai::neat::Graph를 사용해야 합니다.
내부 헤더 및 런타임 플러그인 경로
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 캐시를 다시 빌드합니다.
계획된 것과 안정적인 것 (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 및 핵심 노드/그룹 헬퍼에 중점을 둡니다. |