リポジトリのアーキテクチャと設計
このページは、ライブラリの構造、各コンポーネントの役割、およびモジュールとランタイムの整合性を損なうことなくフレームワークを拡張する方法を理解する必要があるコントリビューターを対象としています。
フレームワークと環境
「Neat」という言葉は、関連性はあるものの、それぞれ異なる2つの問題に対して使用されます。
- Neat Library: このリポジトリにある C++/Python ライブラリおよびランタイムです。モデルを読み込みます。 パッケージ化、パイプラインの構築、コントラクトの検証、Modalix ハードウェア上での実行、およびパブリック API の公開を行います。
- Neat SDK / 環境: フレームワークを中心としたコンテナ化された開発ワークフロー。 DevKit Sync、共有ワークスペース、およびエージェントツールなど。
このリポジトリを変更する際は、人間とエージェントの両方をサポートするフレームワークのプロパティを最適化してください。具体的には、明確な API、決定的な動作、構造化された診断、厳格な検証、および安定した公開インターフェースです。
このライブラリの目的は何ですか。
主な利用者
以下のことを実現したい開発者:
- 再利用可能な構成要素からパイプラインを組み立てます(生のGStreamerのテンプレートコードを記述する必要はありません)。
- パイプラインを早期に検証し(CIに対応)、問題発生時に迅速に原因を特定できるようにする。
- C++で
appsinkを使用して、パイプラインを実行し、フレームを処理します。 - オプションとして、RTSP(
gst-rtsp-serverを介して)を通じてパイプラインを配信できます。 - テンソル処理に適した形式で出力することで、機械学習コードをパイプライン処理し、GStreamer の複雑な設定を記述することなく、機械学習モデルにデータを供給します。
パッケージの所有権
選択されたコア・アーティファクトは、Neat、LLiMa、および一緒にインストールされた Internals Debian パッケージの信頼できる情報源です。コアは、そのアーティファクトの完全性を消費し、依存関係のバージョンを選択または書き換えることなく、それを転送します。アーティファクト外のパッケージは、プラットフォームによって管理されます。互換性のないプラットフォームは、コアまたは LLiMa によって修復されるのではなく、更新する必要があります。
一般的なワークフロー
- デコード/取り込み: ファイルまたは RTSP → デペイロード/デマルチプレックス/解析 → デコード → 変換/キャプチャ → アプリシンク → C++ コンシューマー
- 検証: ビルド、解析、およびプレロール(一時停止)を実行し、早期にネゴシエーションの問題を検出します。
- 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 | データ型、形状、レイアウト、ストレージ、デバイス、およびセマンティックメタデータとともに型指定された数値ペイロード。 |
Sample | テンソル、テンソルのリスト、またはバンドルを囲むランタイム/メディアの範囲。フィールドを読み取る前に、Sample::kind を確認してください。 |
Node | 決定的な結果を出力するアトミックパイプラインステージ GStreamer フラグメントと所有する要素の名前。 |
| 再利用可能なグラフフラグメント | デコード済み RTSP 入力やモデルステージなど、複数のノードへ展開される構築済みの Graph。 |
Graph | アセンブリと検証の境界。ノード、モデル、再利用可能なグラフフラグメントを、ネゴシエーション済みでビルド可能なパイプラインにします。 |
Run | Graph::build(...) によって返される、アクティブなパイプラインのハンドル。このハンドルは、データのプッシュ、プル、およびランタイムのライフサイクルを管理します。 |
| グラフ | 1 つのパイプライン内で DAG(有向非巡回グラフ)を構成するには、ビルダーグラフを使用します。複数のパイプラインにまたがるステージや実行を調整するには、ランタイムグラフを使用します。 |
左から右へ関係性を読み取ってください。
model archive on disk -> Model -> Graph fragments/Nodes -> Graph -> Run
|
v
Tensor/Sample flow
Model は、初心者向けの最初のステップですが、独立した実行エンジンではありません。これは、Graph に追加できるモデルのグラフ断片/ノードを解決します。Graph は、中心となる組み立ての概念です。Run は、構築後のライブオブジェクトです。