リポジト リのアーキテクチャと設計
このページは、ライブラリの構造、各コンポーネントの役割、およびモジュールとランタイムの整合性を損なうことなくフレームワークを拡張する方法を理解する必要があるコントリビューターを対象としています。
コンパイル済み Scheduler 境界
Core は SimaScheduler::frontend と、独立した所有者を持つ simaai::scheduler::client 型を使用します。数値演算の記述、検査、動的選択、停止中のグラフへの接続、選択したメモリへのアクセス、動画レイアウトの問い合わせは、このコンパイル済み境界を通ります。Core は Runner セッションを開かず、Kernels や Codecs の実装インターフェースをインクルードしません。
flowchart LR
Core[Core graph and application policy] --> Scheduler[Scheduler client and GStreamer]
Scheduler --> Runner[Runner execution and memory authority]
Runner --> Kernels[Kernels numerical providers]
Scheduler --> Codecs[Codecs providers]
GenAI[Core GenAI API] --> LLiMa[LLiMa generation runtime]
Benchmark[Core benchmark reports] --> Sentinel[Optional Sentinel telemetry]
Model と単独の Resize は、値のみの ResizeInterpolation 列挙型と共通のサンプラートークン変換を使います。Model の計画処理は、画像処理の意図、ステージへの反映、グラフの来歴を扱う前に、任意の型付き選択を解決します。従来の文字列は互換性の境界として残ります。
モデルと単独の画像オプションは、同じ通常の Preproc リクエストへ変換されます。固定された元の演算は、元の FP32 再スケーリング、リサイズ後の平均値と除数、量子化ステップの境界を保持します。任意順序の変換インタープリターではありません。入力 dtype、量子化、物理レイアウトは引き続き MPK が決定します。新しいオプションは明示的に有効化し、省略時は従来のバイト列を保持します。Core は意図とジオメトリのみを投影し、数値的な受け入れ判定と実行は Kernels が担います。
Kernels は引き続き演算カタログと数値演算の受け入れ判定を管理します。Scheduler は Runner を介して汎用リクエストを転送します。Scheduler と Core のどちらも、ファームウェア ID や演算別のディスパッチテーブルを管理しません。Core は公開ノード API、幾何ポリシー、ワイヤ形式を保持します。コホート検証後、Scheduler が新しいアダプター/リゾルバーファクトリをインスタンス化します。キャッシュされた動的選択は演算を保持しつつ、現在のフレームのメモリにバインドします。
GenAI は Runner や Scheduler の GenAI アダプターを介さず、LLiMa を直接呼び出します。MLA プロファイリングはデフォルトで無効な別のパスです。Core は Scheduler のクライアントを呼び出し、Runner がインストール済みの mla-rt コマンドラインツールを実行します。他の MLA 処理がないアイドル状態の DevKit が必要です。
GStreamer インターフェースの所有権
Scheduler は、インストールされる gst/SimaaiGstErrors.h ヘッダーを含め、GStreamer の転送と構造化エラーのインターフェースを所有します。Core はこれらを利用し、別の実装は保持しません。Core 0.6.0 には、このファイル所有権の移行が含まれます。対応する Core/Scheduler パッケージ一式を同時に更新してください。このパッケージバージョンは、プラットフォームや数値演算の契約を変更しません。
フレームワークと環境
「Neat」という言葉は、関連性はあるものの、それぞ れ異なる2つの問題に対して使用されます。
- Neat Library: このリポジトリにある C++/Python ライブラリおよびランタイムです。モデルを読み込みます。 パッケージ化、パイプラインの構築、コントラクトの検証、Modalix ハードウェア上での実行、およびパブリック API の公開を行います。
- Palette SDK / 環境: フレームワークを中心としたコンテナ化された開発ワークフロー。 DevKit Sync、共有ワークスペース、およびエージェントツールなど。
このリポジトリを変更する際は、人間とエージェントの両方をサポートするフレームワークのプロパティを最適化してください。具体的には、明確な API、決定的な動作、構造化された診断、厳格な検証、および安定した公開インターフェースです。
このライブラリの目的は何ですか。
主な利用者
以下のことを実現したい開発者:
- 再利用可能な構成要素からパイプラインを組み立てます(生のGStreamerのテンプレートコードを記述する必要はありません)。
- パイプラインを早期に検証し(CIに対応)、問題発生時に迅速に原因を特定できる ようにする。
- C++で
appsinkを使用して、パイプラインを実行し、フレームを処理します。 - オプションとして、RTSP(
gst-rtsp-serverを介して)を通じてパイプラインを配信できます。 - テンソル処理に適した形式で出力することで、機械学習コードをパイプライン処理し、GStreamer の複雑な設定を記述することなく、機械学習モデルにデータを供給します。
パッケージの所有権
選択した Core アーティファクトが、まとめてインストールする Core、LLiMa、および対応する Scheduler 依存パッケージの信頼できる情報源です。Core は依存バージョンを選び直したり書き換えたりせず、そのアーティファクトの依存関係全体を引き渡します。含まれないパッケージはプラットフォームが所有します。互換性のないプラットフォームは Core や LLiMa で修復せず、更新してください。
Core はインストール済みの SimaScheduler クライアントコンポーネントを使用し、下位の CMake 開発インターフェースは使用しません。Scheduler の依存関係コーディネーターは、選択された Kernels/Runner/Codecs 一式を検証し、正確な来歴を保持します。メタデータのみの SimaRuntime 互換エイリアスは別の実装を所有しません。ビルドエントリーポイントは引き続き、Kernels → Runner → Scheduler → Core の順で兄弟ソースを準備するか、明示的に選択されたパッケージを再利用します。これはビルドの調整であり、ランタイム実行やファームウェアの有効化ではありません。ローカル依存関係ビルドを参照してください。
レンダラーとオプションのバックエンドプロバイダー
Core はボックス/マスクの公開ポリシーを所有します。既存の軸に平行な BBOX ペイロードは int32 座標を使います。別形式の BBOX_OBB_V1 は FP32 の回転ボックスジオメトリを保持し、軸に平行なボックス用レンダラーでは拒否されます。Scheduler は caps、ライフサイクル、初期準備時のプロバイダー受け入れを所有します。本番構成にはレンダラーの型付き int32 機能が必要です。値を float として解釈し直したり、フレームごとの変換を追加したりしません。Kernels は標準 A65 render 演算を所有し、Runner は実行と ReadWrite 画像の使用完了処理を所有します。Scheduler は検証済み演算と、使用した Kernels/Runner の識別情報を記録します。Core はこのコホートを検証し、a65apps アーカイブなしで通常の依存関係を構成します。
Runner はプラットフォーム所有のプロバイダーを再配布可能な依存関係とは分けて記録します。Core はそのレシートを保持し、インストール済みプラットフォームを検 証します。プラットフォームのビルド番号だけで互換性を判断したり、プラットフォームの DSO を利用側パッケージへ同梱したりしません。プロバイダーの受け入れと構成はローカル依存関係を参照してください。
ランタイム転送の所有権
Core はインストール済みの SimaScheduler パッケージを使用します。SimaScheduler::elements は、GObject 型とプロセス内の登録を含め、neatcamerabridge、neatmultipartjpegdemux、neatlatestbystreammux を所有します。Core の src/gst/ エントリーポイントは互換性のための転送処理であり、別の実装ではありません。これらの要素は数値演算エグゼキューターを使用せず、Kernels も必要としません。
Core は公開 C++/Python API、Node オプション、グラフの低レベル化、Sample/Tensor オブジェクト、グラフ専用クレジットを保持します。src/pipeline/gst/RealtimeMuxCredits.cpp は、Scheduler の値のみの借用インターフェースを通じて、それらのクレジットを投影します。mux 借用レジストリと共有入力フレームカウンターの所有者は、単一の Scheduler です。カメラ ABI のレイアウトは、Core 内部のコピーではなく、対応するアロケーターヘッダーから取得します。
mux の公平性/バックプレッシャー、multipart 解析、キャプチャ親オブジェクトの寿命に関する実装テストは Scheduler にあります。Core は公開 API、グラフクレジット、エンドツーエンドのデバイステストを保持します。Core をビルドする前に、対応する Runner と Scheduler パッケージをインストールしてください。Core の内部テストは、その転送ターゲットに直接リンクします。プロバイダーなしのホストテストで、ハードウェアキャプチャやコンパクト TensorBuffer メタデータを検証済みとしないでください。
数値演算カーネルの追加
既存のテンソルと実行の契約で表現できる演算の場合、開発対象は Kernels と Core のみです。
- Kernels に、演算固有の型付きリクエスト、検証済みプラン、数値演算実装、実行ファイルファクトリ、名前付きリクエストデコーダーを追加します。Kernels 所有のカタログに演算を一度登録し、正しさのテストを追加します。
- Core に Node を追加し、そのオプションを標準リクエストへ変換します。演算、明示的なターゲット、入出力仕様、型付きパラメーターを含めます。Scheduler の汎用準備 API を呼び出し、演算ファクトリを直接呼び出したり、Runner や Scheduler に演算の分岐を追加したりしないでください。
- Kernels → Runner → Scheduler → Core の順で再ビルド/インストールします。EV カタログの変更には、Runner ソースが変わらない場合でも、対応するファームウェアを明示的に組み合わせる必要があります。排他的なデバイス手順を使って検証してください。
準備は Core → Scheduler → Runner → Kernels の順に進みます。Kernels が数値演算を検証し、Runner が汎用ゲートウェイになります。初期検証ではハードウェアを開かず、実行リソースも確保しません。返された検証済み実行ファイルを保持し、ステージ全体を受け入れる前に標準要件を確認してください。ストリーミングでは演算名を再度デコードせず、同じ実行ファイルを使用します。
動的バリアントは、セットアップ時にバインドされる、カーネル所有のオプション機能を使用します。Core はグラフ/メタデータのポリシーと既存の上限付きキャッシュを保持します。キャッシュミス時には不変パラメーターを具体化でき、プロバイダーが、正確なテンソル契約とリソースを共有できるか、完全な再検証が必要かを証明します。キャッシュヒットで別の演算を作成したり、カメラ/コーデックのフレーム借用を保持したりしません。
Runner は実行、リソース、コヒーレンシ、使用完了処理を所有し、Scheduler は Gst キャリア、プラグイン、転送統合を所有します。標準のインストール済みパッケージは SimaRunner と SimaScheduler です。メタデータのみの SimaRuntime 互換パッケージは、従来のターゲットを同じ実装に転送します。ヘッダーのエイリアスは標準 Kernels 型を再利用し、静的リンク依存関係は推移的に残る場合があります。別のテンソルスキーマ、アロケーター、実行キュー、数値演算レジストリはありません。
数値演算ステージは neatkernelrunner を生成します。廃止された ProcessCVU プラグインへの切り替えやフォールバックはありません。Core が所有する公開出力のパッキングは、元のメトリクス境界を保つ依存ホスト演算です。Codecs は独立したエンコード/デコードバックエンドであり、Gst ラッパーは Runner や数値 Kernels ではなく Scheduler が所有します。
ビルドレシートは、正確なインストール済みバイト列と使用した依存関係の識別情報を結び付けます。ハードウェアや性能の検証結果ではありません。対応していないパッケージのヘッダー、アーカイブ、ファームウェア、Codecs を混在させないでください。
新しい転送方式、テンソル表現、実行機能はフレームワークの拡張であり、Runner の変更が必要になる場合があります。Kernels/Core のみという保証は、そのような変更には適用されません。タイムアウトやキャンセルは DMA の使用完了を証明しません。確定した完了または検証済みのプラットフォーム復旧まで、既存の割り当て所有者を存続させる必要があります。
Core はファームウェアのグラフ ID ではなく、意味的な名前で演算を選択します。Kernels は演算名とコンパイル済みターゲットの不変カタログを公開し、Runner と Scheduler は別の演算レジストリを持たずにそれを転送します。Core は必須の DetessCast と DetessDequant の融合を含め、型付きグラフ書き換え規則を所有します。必要な融合実装が利用できない場合、別々のカーネルへ分割するのではなく準備に失敗します。Core のステージが 1 つの演算に対応する必要はありません。TrackKLT は引き続き既存の複合リクエストを準備します。
TrackKLT の公開テンソルリストは位置順で、前の画像、現在の画像、整数のシード点を渡します。省略可能な名前はその役割を確認するもので、ストレージの順序を変更しません。Core はシードの推論前とキュー受け入れ前に、テンソルデータをマップまたはコピーせず、記述された入力契約を確認します。名前のないテンソルも位置順です。このポリシーは明示的に記述された直接の公開入力だけに適用され、内部ステージ間リンクやモデル入力の変換には適用されません。
トラッカーのリクエストが数値品質の制御と省略可能な残差の公開を所有します。Core は点、ステータス、要求された特徴点の後に残差を追加します。ステータスを無条件の追跡信頼度とは解釈しません。検出を無効にすると、その演算と出力割り当てを除去します。Kernels はバージョン付きネイティブパケットと数値検証を所有し、Runner と Scheduler は引き続き汎用の検証済みリクエストを転送してバインドします。
ダイレクトドライバーの復旧
deps/manifest.json は Scheduler と LLiMa を選択します。Scheduler のインストール済みコーディネーターが対応する Kernels、Runner、Codecs の依存関係全体を検証し、Core は下位のプラットフォーム検証を重複実装せず、検証済みコホートを使用します。
復旧は、ディスパッチャーのエラー照合ではなく、選択したプラットフォームの責任です。Core は推論失敗後に AppComplex を起動したり、ディスパッチャー サービスを再起動したり、リモートプロセッサーをリセットしたりしません。Runtime はドライバー契約を通じて完了と使用完了を報告します。完了が不明であることは、DMA ストレージの再利用を許可するものではありません。プラットフォーム起動時の MLA 初期化は、引き続きプラットフォーム依存関係です。
メモリの所有権
Core は Scheduler の割り当てとマッピングのインターフェースを使い、メタデータから付加した物理アドレス、libsimaaimem、別の割り当てレジストリは使いません。CPU アクセス、マッピングの寿命、インポートメモリ、親バッチの制約は、メモリモデルを参照してください。
Core はグラフトポロジーからキャッシュコヒーレンシのモードを選びません。RunAdvancedOptions::prepare_output_cpu_visible はオプションのレイアウト互換性のために残されています。実際のマッピング前に冗長な先行同期は行いません。ソース互換の defer_output_invalidate オプションは true のままにする必要があります。false は、生成側の遅いパスを復活させるのではなく拒否されます。
非同期 MLA 送信と順序付き出力は、別々の既存パスを使います。完了コールバックは終端状態を記録し、出力処理は CPU キャッシュのメンテナンスなしで結果を公開します。送信パスは、上限付きレーン容量と独立した割り当て所有権の条件下で、出力処理中 に後続フレームを受け入れられます。完了だけでは受け入れクレジットは戻りません。完了済みスロットは、出力処理が解放するまで所有されたままです。出力プールの借用はその解放より長く残る場合があり、引き続きストレージの再利用を防ぎます。
この重なりによってキャッシュのメンテナンスがなくなったり、1 フレーム内の依存チェーンが短くなったりすることはありません。同期ワーカーを追加せずに、独立した CPU とデバイスの処理が直列のパイプライン停止として現れるのを避けます。グラフ構築時に上限を一度設定するため、フレームごとの演算固有スケジューリングポリシーは不要です。
FrameLayout によるメモリ計画
Core はビルド内で 1 つの計画経路を使います。
- モデル経路を選択し、呼び出しの識別を維持します。
- 検証済みレシピをコンパイルし、各実行先を一度だけ決定します。
- ルートキャリア、ビュー、消費者、所有権グループを解決します。
- ヒープを選び、共通の物理 DAG 寿命証明に基づいて配置します。
- ステージごとの
FrameLayoutと公開情報を確定し、配置を修復せず一度だけレンダリングします。
EV74 がアクセスする場合は CMA が必須です。所有する MLA/A65 専用キャリアは DMS を使います。条件を満たす新規 A65 公開終端は HostCpu を使用できま す。インポートしたストレージ、オフセット、形状、生成元の貸与は固定です。ファンアウトは全消費者を考慮し、ビューはルートキャリアを共有します。
AllocationPolicy::PreferDmsThenCma は、対象の所有 DMS 割り当てが容量不足になった場合に CMA へフォールバックする明示的な指定です。通常の Linux メモリは選びません。プール境界、Queue 境界、独立した呼び出し、保持された出力が寿命の再利用を制約します。
Scheduler は Runner を通じて各レイアウトの割り当てグループを準備します。インデックスとオフセットはバッファーグループ内の値です。異なるグループの同じオフセットは重複しません。Core と Scheduler は対応するパッケージを一緒に再ビルドしてください。
デフォルトのデバイスから CPU へのコヒーレンシ
準備済みメモリエンジンは 1 つです。SIMA_CORE_DEMAND_COHERENCY_V1 と Runner の実験的ビルドオプションは削除されています。新しいビルドでは設定しないでください。環境変数による明示的な有効化や、グラフ全体の Legacy への格下げは残っていません。Core は Scheduler の割り当て、マッピング、ステージインターフェースだけを使います。公開テンソルの幾何情報、Kernels リクエスト、数値動作は変わりません。
共有のアクセス取得と寿命の契約は、メモリモデルで定義しています。
DMA に裏付けられた論理テンソルのマッピング
公開 Tensor::map() とその view() エイリアスは、既存のストレージマッピング契約を維持します。byte_offset を一度適用し、末尾のバッキング領域を公開する場合があります。名前付きセグメントの境界とアプリケーションのマッピングコールバックが引き続き正となります。TensorBuffer::map() は引き続きストレージを直接マップします。
形状で範囲を制限する内部コンシューマーは、代わりに map_dense_tensor_read() を使用します。現在の幾何情報に対して正のストライドとオーバーフローを検証し、ストライドの隙間を含む物理テンソル範囲だけを公開します。Core 所有の DMA ストレージは、その正確な範囲を許可できます。ラップされたコールバックやカスタムコールバックは、既存のマッピングと後処理動作を維持します。ヘルパーは返された範囲を検証してから、論理ビューを狭めます。可変のテンソルビューをまたいで幾何情報をキャッシュしません。複合画像、エンコード済みの幾何、未解決の幾何は既存のマッピングパスを使用します。密な論理範囲が、ほかのプレーンへのアクセスを許可するわけではあり ません。
Scheduler は、正確なビューについて Runner がすでに検証した現在世代の可視性を再利用できます。デバイス書き込み後の最初の読み取り、未包含範囲、未検証の取り込みでは、エクスポーター同期を維持します。アクティブな書き込み側、保留中のデバイス処理、隔離状態は引き続きエラーです。マッピングは CPU アクセス終了まで、元の Gst サンプルと、現在の公開ストレージ/生成元の借用の両方を保持します。所有権モード、ペイロードコピー、WRITE-END クリーン処理、公開オブジェクトのレイアウトは変更しません。
カーネルステージの resource_busy エラーは、必ずしも送信容量の枯渇を意味しません。無害化され、長さが制限された Reason は、元のアクセス、登録、所有権、容量の診断を保持します。同時処理数を変える前にその原因を確認してください。所有権やデバイス完了が未解決の間は、バッファーを再利用しないでください。
コーデックの所有権
Scheduler は neatdecoder、neatencoder とその GStreamer アダプターを所有します。Codecs はデコーダー/エンコーダーのセッションと数値実装を所有します。対応するインストール済みヘッダーとライブラリを使用し、バックエンドコードを Runner にコピーしたり、異なるバックエンド ABI のラッパーと組み合わせたりしないでください。
ハードウェアエンコーダーの設定
SimaEncode と生入力の VideoSender は、ネゴシエートされた入力 caps から解像度を導出します。実行中は解像度を固定し、変更には新しい実行が必要です。エンコーダーオプションに幅や高さは含まれず、入力アダプターはリサイズせずに表示ジオメトリを保持します。入力寸法が不明な場合、上流入力から得られるまでビルド時の出力コントラクトでも不明のままです。
SimaEncode は生入力を一度だけ準備し、コーデック固有のオプションを neatencoder に対応付けます。Scheduler は GStreamer の適合処理と出力公開を、Codecs はエンコーダーセッションを所有します。Runner はメモリの所有権と同期の権限を維持します。Core はエンコーダー実行スレッドを追加しません。従来の H264EncodeSima は、エンコーダープロパティの生成を共有しつつ、アダプターを持たない入力契約を維持します。公開クラスのレイアウト変更は ABI 6 と再ビルドしたバイナリコンシューマーに含まれ、既存のソースエントリーポイントは引き続き利用できます。
一般的なワークフロー
- デコード/取り込み: ファイルまたは 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 を確認してください。 パイプライン境界では、バンドル全体を 1 フレームとし て保持します。 |
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 は、構築後のライブオブジェクトです。
コントリビューター向けの設計原則
これらは、フレームワークの基盤となる耐荷重構造の原則です。実装方法を決定する際に、これらの原則を参考にしてください。
- 決定性こそが重要です。 要素名、生成されたパイプライン文字列、シリアライズされたパイプラインデータを保持してください。 レポートの項目と、再現可能なテストを記載します。診断とエージェントのループは、安定した識別子に依存します。
- デバッグのしやすさが最優先事項です。 障害が発生した場合は、文字列だけでなく、構造化されたデータを出力するようにしてください。
GraphReport.error_code、repro_note、バスメッセージ、および再現可能なバックエンドパイプライン。 - 無音での代替処理は行わないでください。 モデルへの入力に関するバグや、ハードウェアまたはランタイムの障害を、音を立てずに隠蔽しないでください。 フォーマットの変換、グラフの種類変更、CPUへのフォールバック、またはプラグインのエラーの処理など。
- 実行前に検証する。 ランタイム前に、構造、大文字・小文字、形状、および契約に関する検証を優先する。 スレッドが開始されるか、ハードウェアリソースが割り当てられます。
- MPK契約は、信頼できる情報源のモデルです。 コアルーティング、データ型、形状、量子化など。
ステージごとの決定は、
mpk.json/*_mpk.jsonから行われる必要があります。ステージごとの JSON ファイルは、プラグイン専用です。 - Detess の論理ランクとランタイム形状は別です。 MPK が定義した
frame_shapeを保持し、バイト範囲から形状を一意に特定できる場合だけランク 2 の NC/HW 解釈を認めます。融合 DetessDequant は両方の記述子を単一のフレーム単位コントラクトで運びます。タイルランクがカーネルランクを決め、先頭のバッチ次元は独立したままで、意味的な軸、バイト範囲、ストライド、明示的なタイル格納エンコーディングが権威を持ちます。Core はこれらの標準型付きコントラクトを Scheduler 経由で渡し、Kernels が選択した演算とエンコーディングを検証します。DSO 境界で ProcessCVU の準備済み要求を再構築しないでください。 - 数値演算バックエンドのポリシーには唯一の権威があります。 検証済み機能が対応ターゲットと 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と通常のテンソルのレイアウトで動作します。フレームワークは、マニフェスト駆動のアダプターステージを使用して、このギャップを埋めます。
前処理と後処理は、フレームワークの明示的なステージ/オプションです。フォーマットの不一致、必要な前処理メタデータの欠落、選択したハードウェア転送機構が利用できないこと、無効なモデルアーカイブまたはMPKコントラクト、またはキャップネゴシエーションの失敗は、隠れたランタイムでの修正ではなく、対処可能な構造化されたエラーとして表示されるべきです。
公開実行プラン
Model::execution_plan(...) は、同じ引数の build(...) が実行する内容を返します。モデルのグラフノードをパイプライン順に並べ、各ノードの実行場所(A65、EV74、MLA)と、ノード間のエッジを流れるテンソルを示します。スタートアップのプリフライトを無効にして build(...) を呼び出し、ビルドが配置と公開メタデータの計画後に DiagCtx に記録したプランを読み取ってから、パイプラインを閉じます。そのため、build(...) と同じデバイスが必要です。これは公開の診断ビューであり、後述する内部の ModelExecutionPlan とは別のものです。JSON コントラクトは schemas/execution_plan_v1.schema.json です。schema_version は、既存の読み取り側を壊す変更のときにのみ変わります。 メモリ概要は所有する割り当てを一度ずつ集計し、CMA、DMS、HostCpu、または Mixed と表示します。明示的な DMS フォールバックは優先ヒープで表示します。
ボードテレメトリ
TelemetryMonitor は、ボードテレメトリデーモンである Sentinel から、/run/simaai-sentinel/api.sock 上の HTTP API を通じて電力とボードのテレメトリを読み取ります。Core が電力モニタチップを直接読むことはありません。start() は Sentinel のサンプルキャッシュを 1 回読み取り、メトリクスの定義、サンプル間隔、最新のサンプルを取得します。この最新のサンプルは測定期間より前のものなので、集計には含めません。その後、ワーカースレッドが各サンプルの取得予定時刻の少し前に最新のサ ンプルを問い合わせ、新しいサンプルをタイムスタンプで識別して、それぞれ 1 回だけ累積サマリーに集計します。タイムスタンプが最後に集計したサンプルのちょうど 1 間隔後でない場合、ワーカーは取りこぼしたサンプルをキャッシュから集計します。このキャッシュは Sentinel の最新 240 サンプルを保持しています。モニタは Sentinel 内に何も作成しないため、任意の数のモニタを同時に実行でき、プロセスが強制終了されても何も残りません。
既定のモニターは上記のソケットを使います。明示的な TelemetryMonitor(socket_path) は、そのインスタンスだけに別の Sentinel Unix ソケットを選びます。Model::benchmark() は既定の接続先を維持します。
Model::benchmark() は別のトレースエンジンではなく、同じモニターを使用します。スループットタイマーの開始前に接続と待機ワーカーを準備し、測定開始後に区間を有効化し、必要な出力がすべて完了した後、測定停止前に区間を確定します。有効化と確定では割り当て、mutex の取得、join、Sentinel への通信を行いません。その後で初めてワーカーを join し、キャッシュを最終読み取りします。進行中のポーリングには停止確認より前の UTC 読み取りによる上限があるため、区間の確定後に新しいサンプルが入ることはありません。ベンチマークへの帰属では UTC サンプル時刻と UTC/単調時計の境界ペアを検証します。時計の不連続を検出した場合は、測定スループットを変更せずにテレメトリを無効にします。単独のモニターは、時計が巻き戻った後もキャッシュ順序による復旧を維持します。
Sentinel はおよそ 2 秒ごとにサンプリング するため、スループット測定パスは少なくとも BenchmarkOptions::min_duration_ms(デフォルトは 10 秒)の間実行されます。レイテンシ測定パスも同じ下限に従うため、両方のパスは同じ規則で停止します。Sentinel が動作していない、または測定期間にサンプルがない場合でも、ベンチマークはレイテンシと FPS を返します。この場合、電力フィールドは 0 になり、telemetry.status が理由を示します。tools/install_neat_framework.sh のボードモードは、Sentinel をインストールするか、最新の本番ビルドにアップグレードします。失敗した場合、インストーラは警告を出して続行します。後で sima-cli neat install sentinel を実行するか、CI と同様に NEAT_INSTALLER_SENTINEL_REQUIRED=ON を設定して失敗をエラーにしてください。非推奨の Run 電力モニタ(RunOptions::power_monitor)も Sentinel から値を取得します。Core は Sentinel の最新サンプルをポーリングし、I2C 経由で電力モニタチップを読むことはありません。
MLA プロファイリングは、デフォルトが false の 2 つの BenchmarkOptions フィールド include_mla_layer_stats と include_mla_stage_stats で明示的に有効にします。レイテンシとスループットのランナーが終了した後、Core は Scheduler のクライアントを通じて展開済みモデルの MLA 実行ファイルを測定し、プロファイリングパスを 1 つずつ順に行います。MLA レイヤー統計は、終端ポリシーを適用した推論ルート内の MLA ステージだけを測定します。Runner は実行ファイルごとに別プロセスで mla-rt を実行します。MLA レイヤー統計はコンパイラの統計 YAML も使います 。MLA ステージ統計は各 MLA 実行ファイルを中断なしで 200 回実行し、mla-rt の統計ファイルから tile.lat の平均を読み取ります。Runner は入力と出力を検証し、一時ファイルを削除します。1 回の実行が 120 秒を超えた場合は mla-rt を停止します。MLA-RT はハードウェアのプロファイリングとカーネル実行への制御の引き継ぎを担当します。プロファイリングは他の MLA ワークロードと重複させないでください。ベンチマークのゲートが直列化するのはベンチマーク呼び出しだけであり、ほかの推論 API やアプリケーションではありません。
失敗、クラッシュ、または停止した mla-rt の実行は MLA の処理を未完了のまま残す可能性があるため、Runner はそのプロセスで mla-rt をそれ以上起動しません。以降のプロファイリングパスは、MLA の回復が必要であることを報告します。MLA の回復を確認するまで、DevKit をアイドル状態に保ってください。
プロファイリングはベストエフォートです。mla-rt が見つからない、失敗する、タイムアウトする、または使用できない出力を書き込んだ場合、Core は主要な測定値を保持し、該当するリストを空のままにして警告を出力し、mla_layer_stats.status または mla_stage_stats.status に理由を設定します。それ以外の場合、ステータスは "not requested" または "ok" です。
BenchmarkReport::mla_layer_stats には、コンパイル済みの各 MLA レイヤーのゼロ始まりの実行ステージ番号、名前、レイヤーごとに 1 回のプロファイリングパスで測定したマイクロ秒単位のハードウェアレイテ ンシが含まれます。BenchmarkReport::mla_stage_stats には、同じ番号付けによる各 MLA ステージの番号と、マイクロ秒単位のハードウェアレイテンシの平均が含まれます。これらの測定には別のプロファイリングパスを使うため、レイヤーのレイテンシの合計はステージのレイテンシや全体のレイテンシとは一致しません。BenchmarkReport::save(file_path) は、公開フィールド名と単位を使い、完全なレポートを明示的に保存します。.json は JSON、.yaml とその他の末尾は YAML を選択します。テレメトリと両方のステータスが含まれ、プロファイリングが無効の場合は MLA のリストが空になります。存在しない親ディレクトリを作成し、既存の保存先ファイルをアトミックに置き換えます。
廃止済み PreparedRunner オプションは既定値のままにします。並行実行には processcvu.async と GraphOptions::async_queue_depth を使います。旧逆量子化・プロファイリングフラグに直接の代替はありません。advanced_execution.defer_output_cache_sync=true を維持し、出力への CPU アクセスには Tensor/GstMemory マッピングを使います。RunOptions::advanced.prepare_output_cpu_visible は互換用の無操作フィールドであり、事前のキャッシュ同期を要求しません。
コンパイル済みモデルの実行コントラクト
DMA-BUF ドライバーへの移行では、モデルの意味とフレームごとのストレージを区別します。Core はモデル読み込み時の事実を、変更不可の内部 ModelExecutionPlan にコンパイルします。
- 値は、正確な名前、必要バイト数、任意の論理型情報、任意のルート相対読み取り式
{source ValueId, byte offset, byte strides}を含みます。 - 操作は、順序が確定した正確な接続と、操作固有の設定を含みます。
- MLA バックエンドのポートは、ELF/モデルの順序、正確な必要バイト数、アラインメントの根拠、アクセス方向を含みます。
- 公開出力は、公開順序と公開する値のみを含みます。
MPK マニフェストは MpkDecoder を使用します。MpkDecoder::load はマニフェストの唯一の入口です。モデルの読み込み、準備済みランタイムの構築、PCIe ホストは、これを通じて mpk.json を一度だけ読み込みます。また、受け入れ判定でデコードするのと同じバイト列から、意味的な MpkContract を構築します。任意の model_sdk_version 文字列は由来の記録として保持され、受け入れを制限しません。デコーダーは登録済みの正確な (processor, kernel) 語彙だけを受け付け、完全なテンソル名を解決し、操作のバイト数の等式を検証します。また、MPK の各 MLA ステージを、その正確な ELF IFM/OFM トポロジーと個別に照合します。実行ファイルの根拠を結び付ける際は、コンパイラーが記述した論理ステージ ID と、マニフェストの実行ファイルトークンの両方を使用します。アーカイブの順序やファイル名の拡張子は、意味を決める根拠ではあ りません。生成された変更不可のプランは、各 MLA 操作について検証済みの {stage index, op ID, logical stage ID, executable} キーと、事前に索引化された順序付きポート範囲を公開します。曖昧さ、スロットの欠落、根拠の矛盾はモデル読み込みエラーになります。付随 JSON、部分文字列の照合、環境の状態、ランタイムバッファーは根拠として扱いません。
対応が一意であれば、Core は入力と出力の異なるバッファー順序を照合できます。バッチ入力と出力も対象です。アプリケーションには、モデルの公開テンソル名、順序、サンプル順序が維持されます。
通常の空間ストレージを持つ単一入力、バッチ 1 のモデルでは、入力チャネルの自動パディングを使用できます。アプリケーションにはモデルの論理テンソル形状が維持されます。独自の空間ストレージパディングはサポート範囲外です。
.so で終わる AFE アーティファクトは MPK ステージで分類します。processor="MLA" では、Core はホストプロセスにロードせず ELF トポロジーを検証し、アーティファクトを MLArt に渡します。コンパイラーの input_names、input_types、output_types を持つ A65 ホストモジュールは型付き TVM プログラムになります。従来の EVO アラインメントは明示的な 4096 バイトの LegacyPolicy のままです。新しい型付き契約は独自のアラインメントを宣言します。
ランタイムフレームは静的プランをコピーしません。直接経路は標準 DMA-BUF の所有権、検証済みの絶対 {fd, offset, length} ビュー、制限されたフレームスロットの寿命を保持します。Unpack と Slice は、ラ ンタイム操作ではなく、コンシューマーの読み取り式です。デコーダーは、正確なオフセット、バイトストライド、物理範囲を検証した後でのみ、これらを 1 つの実体化されたルートキャリアに合成します。Pack、テッセレーション、精度変換は、下位変換で正確なバックエンド出力や同等の融合を証明できない限り、生成側/計算の意味を維持します。これにより、ストレージの配置が MLA ポートの数やモデルの動作を暗黙的に変更することを防ぎます。
FrameLayout は各ステージのストレージ契約で、割り当てリスト、割り当て内の範囲、入力経路、出力の所有権を持ちます。ReuseInput は識別済み入力の割り当てグループを保持します。Core は所有キャリアを一度だけ配置し、Scheduler は Runner を通じてプールを準備します。MLA のパディング済み物理容量は論理公開バイト数と別です。インポートしたストレージと生成元の貸与は固定です。
Core の不変 MPK パッケージが、推論契約の信頼できる情報源です。公開論理形状は、ネイティブ MLA サンプル範囲、バッチ全体の CVU 実行ビュー、バッキング容量とは別のままです。ランク 2 の Detess ビューは、実際の入出力バイト幾何が実行形状を一意に示す場合にのみ正規化します。融合は意味的な演算検出で選択し、Core 所有のグラフ ID テーブルで選ぶことはありません。
標準識別情報と選択した出力の公開
Core はコンパイル済み契約を構築する際に、数値演算ステージの識別情報を確定します。対応するモデル表記を正規化し、演算、ファミリー、ファミリー列挙値の不一致を拒否します。従来のグラフ ID と記述子 ID は実行権限ではありません。識別情報の正規化によって不完全なセマンティック契約が完全とされることはなく、演算の検出と数値演算の受け入れは引き続き Kernels が所有します。
モデル管理の Preproc 引き渡しでは、画像の幾何情報とストレージ範囲は別の情報です。タイルのパディングによって、必要ストレージが密なスカラー数より大きくなる場合があります。Core は、取り込まれた変換チェーンを型付きモデルプランに対して検証し、キャリア配置と選択出力ルートを確定してから、公開出力ビューを構築します。ランタイム記述子、ルート、公開ビューは、同じ確定済みストレージを参照する必要があります。親の割り当てが大きくても、小さすぎる論理ビューが許可されるわけではなく、バイト数が等しくても幾何情報の一致は証明されません。
単独のパック形式 Preproc は、情報の公開やアリーナの割り当て前に、標準の検証済み実行ファイルへ必要ストレージを問い合わせます。論理寸法の積からパック形式の容量を導きません。複数 ROI の容量は公開形状にバッチ軸を保持し、単一画像の単独ビューは既存の HWC 形状を保持します。
型付きモデル記述子は、バッチ次元を含むテンソル全体を表します。明示的にバッチ化されたランク 4 の HWC テンソルでは、先頭の軸は N です。実行の繰り返し回数は 1 です。意味的なバッチサイズは、 テンソル全体の繰り返し実行を要求しません。パックされて交互に配置されたバッチの各ヘッドは、サンプルごとにバインドされ、ヘッドごとに完全なテンソルとして公開され、順序を保つ単一次元軸ビューを保持します。バッチサイズだけを理由に DetessCast や DetessDequant の融合を無効にはしません。融合された DetessCast と DetessDequant は、公開ランクが実行幾何と異なる場合、明示的に証明された内部の単一次元軸ビューを保持します。
この単一次元の引き渡し規則は、KLT ステータスの公開のように、意図的に絞り込んだ出力ビューを置き換えません。変更はフレーム実行時ではなく準備時に行います。融合演算、明示的なオフセット、量子化メタデータを保持してください。契約の不一致を、ステージングコピーや数値演算のフォールバックで修復しないでください。
型付き変換の準備
Core はグラフ準備時に、外部 dtype 名と MPK テンソル記述子を一度解決します。引き渡すのは、入力ごとの精度を含む標準 TensorSpec と DType 契約を持つ検証済み実行ファイルです。Runner と Scheduler は演算固有の dtype 文字列を再解析しません。Core の公開情報とキャリアメタデータは、数値型の権限情報とは別に明示的なままです。
実行形状と公開形状は同一でなくても構いません。Core は、セマンティック出力契約から単一次元軸ビューを、コンパイル済みモデルの転送契約からパックされた物理ストレージビューを明示的に許可します。Scheduler は準備時に、dtype、レイアウト、ストライド、ストレージ境界を含め、各出力バインディングをその関係に対して検証します。バイト数が等しいだけでは reshape は許可されません。これらのビューは元の割り当てを保持し、テンソルコピーや数値変換を追加しません。出力契約の変更には、動的に準備するバリアントを含め、新たな検証が必要です。
同等の dtype 表記は大文字・小文字を区別せずに受け付けます。未知の名前や矛盾した記述子は実行前に失敗します。従来の共有 BF16/INT16 エンコーディングには、明示的な意味上の型が必要です。リクエストエラーは、詳細な GStreamer 診断を有効にしなくても理由を示します。
検証済み数値演算ステージ
FrameSpan のオフセットは割り当てとバッファーグループ内の値で、グラフ全体のアドレスではありません。異なるグループの同じオフセットは重複しません。BoxDecode と ArgMax は、ヘッド相対のテンソルオフセットをストレージオフセットと分離します。直接メモリ入力と実行時物理バインディング入力は、それぞれのアドレス方式を維持します。
Core は ArgMax、BoxDecode、SuperPoint、LiDAR/BEV カーネルノード(SimaVoxelize、SimaPillarScatter、SimaBEVPoolPlan、SimaBEVPool)を含む Preproc、変換、ビジョンステージを、標準リクエストと明示的なテンソルポートマッピングへ 低レベル化します。Scheduler の汎用テンソルステージエンジンは GStreamer のバインディングと公開を所有し、Runner は依存関係、非同期実行、実行時バッファーの寿命を所有します。Core はキャリア容量を上流の割り当て契約または入力ストレージから取り込み、論理形状だけから求めることはありません。BoxDecode と SuperPoint の数値出力は非公開のままで、依存する Core のワイヤシリアライズ実行ファイルが、デコード演算を重複実装せずに公開 BBOX と特徴ペイロードを保持します。 回転ボックスには、同じ数値演算完了依存関係を持つ、独立したバージョン付き BBOX_OBB_V1 シリアライザーを使います。数値演算が失敗した場合、古い結果を公開してはなりません。
不変のカーネルレシピは、型付きノード契約の変換後も、生成側が定義したテンソルのワイヤ形式を保持します。コールドパスの公開処理は、新規とキャッシュ済みの両方の caps にその形式を適用し、カーネル名やバイト形状から意味を推測しません。公開 OBB テンソルは、BBOX_OBB_V1 の意味を持つ密なランク 1 の UInt8 のままです。
InputStream は、所有コピーとキャッシュ済みメタデータの経路を含め、Sample を公開する前に、定義済みの形式を各返却テンソルに反映します。そのため、生の Sample.tensors と TensorList の便利 API は同じ検出セマンティクスを持ちます。
検証済みの MLA タイル形式の数値出力では、形状と dtype が検証済みの生成側と一致する場合に限り、Core は各論理出力に物理レイアウトを付加します。InputStream はデコードキャッシュの初期化時にこの不変の caps メタデータを読み取り、キャッ シュされた Tensor テンプレートに保持します。生バイトのエイリアスと、バイト列がすでに密な NHWC と一致する INT8 セルタイルは変更しません。TessSpec::storage_bytes は、明示的なタイル形式のストレージと、形式のみを示す従来の注釈を区別します。copy_payload_bytes() と clone() は格納バイト、パディング、レイアウトを保持します。一方、密なコピー、型付きアクセス、DLPack は明示的なタイル形式のストレージを拒否します。レイアウト対応のグラフコンシューマーは、暗黙の変換なしに検証済みレイアウトを受け取ります。
画像サイズが変わる場合、バインド前に、不変でリソース互換の準備済み BoxDecode バリアントを選択します。処理中のフレームが使う演算を変更しません。RCNN ステージ 1 は、レベル別 top-K の件数と FP16 の提案グループを保持します。Core が廃止された objectdecode プラグインをフォールバックとしてロードしてはいけません。
A65 は実行ターゲットであり、GStreamer のメモリドメインではありません。プラグインは引き続き DMA-BUF キャリアを取り込みます。テンソルの直接入力には、たとえば Tensor::from_vector(values, shape, TensorMemory::EV74) のような共有 CMA 割り当てを使います。選択された実行ファイルは引き続き A65 上で動作します。
リポジトリの構成
上位構造
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 のみを使用する必要があります。
Core の共有 CMake ターゲットは C++20 と公開 GStreamer、OpenCV、JSON 要件をエクスポートします。Core はインストール済み Scheduler frontend と LLiMa に対してビルドします。下位ランタイムライブラリは配備時の依存関係であり、Core が直接使う開発インターフェースではありません。静的リンクの利用側は Static コンポーネントを明示的に要求し、実装のリンク依存関係を用意します。
ランタイム環境に関する注意事項:
- インストール済み Scheduler プラグインは
${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/neat/gst-pluginsにあります。システム以外のプレフィックスでは、そのディレクトリをGST_PLUGIN_PATHまたはGST_PLUGIN_PATH_1_0に含めます。 - Runner ランタイムライブラリは
${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/neat/runtimeにあります。ビルドツリーのライブラリではなく、インストール済み CMake ターゲットを使用します。 - システム全体のプラグインを更新したら、システムの GStreamer キャッシュを再構築します。
Core とそのインストール済みコンシューマーは、選択した LLiMa パッケージと ABI 互換の JSON ヘッダーバージョンでビルドしてください。LLiMa は JSON を含む C++ メソッドをエクスポートします。ソースの構文に互換性があるだけでは、リンク互換性は証明されません。SDK/ライブラリのレシートと実際のリンク検証は、パッケージに記載された広い最小バージョン条件より優先されます。
計画段階と安定版(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、および主要なノード/グループヘルパーです。 |