コンテンツにスキップ

メモリと実行に関する契約

タスク、要素、モデルの準備、バッチ処理、SDK の使い方はフレームワークのインターフェースとサンプル を参照してください。このドキュメントでは、アプリケーションの UI や結果の送信方法とは切り離して、GPU メモリに関する契約を定めます。

映像と前処理

解析要素が受け付けるのは、video/x-raw(memory:VAMemory),format=NV12、または子がこの caps を持つ映像だけの GstAnalytics バッチコンテナーです。幅と高さは偶数で、プログレッシブである必要があります。宣言されたマトリクスは BT.709、レンジは limited でなければなりません。色情報が不明な場合は BT.709 limited として扱います。P010、HDR、インターレース、システムメモリの入力、任意の DMA-BUF デコーダー入力は拒否します。NVR が受け付ける上限は 2560x1440 で、単体の watermark は 4096x4096 まで受け付けます。推論要素の caps は 32766 までを公開していますが、それより大きい解像度は、ドライバーと中間メモリの制限を受けます。

推論の変換処理では、元の映像の GstMemory と PTS を保持します。デコーダーの GstVaDisplay は借用して保持します。サーフェス ID は同じ VA ディスプレイ上でのみ有効だからです。コンテナー内のストリームごとに前処理器を分け、保持するディスプレイも分けます。あるストリームでディスプレイが変わった場合は、そのストリームの前処理器を作り直す必要があります。上流から新しい stream-start の識別情報が届くと、このリセットを行います。

VPE は NV12 の切り出し、スケーリング、線形 BGRA のモデル用サーフェスへの変換を行います。VAの処理ごとに、プロセス内のDRMクライアントのdrm-engine-vpeカウンターが増える必要があります。シェーダーやCPUによるスケーリングを代替手段にはしません。ドライバー・デバイス・クライアントごとに増加を比較し、無関係なクライアントの終了がVPEクライアントの増加を打ち消さないようにします。カーネルの仕様では、カウンターが一時的に前回値より小さくなる場合もあります。増加を確認できなければ、20 msの観測時間内で最大8回まで同じVPE処理を再実行し、それでも増えなければエラーにします。別の処理経路への切り替えは行いません。DRMの代表fdのパスを保持し、値は毎回読み取ります。クライアントの一覧は100 msごと、fdの再利用・終了時、実行量を観測できない時に更新し、人物ROIごとに録画やRTSPソケットを含む全fdを走査する負荷を避けます。NV12 の ROI の境界は 2x2 の色差境界に合わせて外側に広げ、逆幾何変換には広げた後の矩形を記録します。共有の前処理器は、4 倍を超える倍率を明示的に複数の VPE 段階に分解します。検証済みの Mesa ドライバーでは、オフセット付きや縦横非対称のスケーリングが失敗するためです。中間の VA サーフェスは最大 2 つを再利用します。中間画像はそれぞれ 64M ピクセルが上限です。解像度が変わると VideoProc コンテキストを作り直し、ドライバーの古い係数キャッシュが使われないようにします。モデル出力用のサーフェスは確保したまま保持します。

内部の BGRA 出力では、DRM の linear モディファイア 0 を要求します。インポート時には DRM オブジェクトを 1 つだけ受け付け、オフセット、ピッチ、サイズ、プレーンの重なりを検証します。タイル配置、複数オブジェクト、範囲外のレイアウトは拒否します。AMD の ROCm 外部メモリの経路は、ランタイムとドライバーの組み合わせごとに検証する必要があります。任意の DMA-BUF ハンドルが Vulkan の Opaque FD と同等であるとは想定していません。検証済みの AMD ランタイムはエクスポートした FD を引き取らないため、呼び出し側がマップ後にその FD を閉じます。インポートしたオブジェクトのハンドルとマッピングは、終了処理で破棄します。

HIP は、インポートして保持している BGRA 画像を読み取り、新たに確保した float32 NCHW の GPU メモリに書き込みます。このとき、RGB/BGR の並び、scale/mean/std による正規化、省略可能なレターボックスのパディングを適用します。画像を中継するための memcpy はありません。VA サーフェスとインポートは HIP の完了イベントまで保持します。投入した各テンソルは、ROI も含めてそれぞれ独立してメモリを所有するため、後続の前処理がキュー内のバッチ入力を上書きすることはありません。

NPU用の共有テンソル

任意プラグインのamdnpuは、AmdSharedTensorMeta内のSharedTensorを受け取ります。HIPはmapped host memoryのGPU側ポインターへ直接書き込みます。保持した完了イベントで前処理の終了を待ってからVitis AI EPを呼び出し、ORTは同じホストポインターを入力に使います。アプリケーションで入力をコピーしません。amdpreproc output-memory=host-mappedは、元のVA映像バッファーを保持したままこのメタデータを作ります。NVRではMobileCLIPのネイティブ前処理が同じ共有テンソルを作り、常設のappsrc → amdnpu → appsinkへ渡します。

AmdNpuResultMetaは、名前・型・形状とともにORT出力領域を共有所有し、停止後や後続推論の後も保持します。バッファー全体のコピーでは所有権を共有し、部分コピーでは両NPUメタデータを引き継ぎません。下流が入力を参照している間は再書き込みを避けてください。NPU EP内部のコピー、DMA、キャッシュ同期はアプリケーションの契約の対象外です。静的なバッチ1のfloat32 NCHW画像入力と数値テンソル出力に対応します。プロパティと検証手順を参照してください。

モデル、バッチ、結果

準備済みのモデルには、SHA256、GPU アーキテクチャ、offload_copy=false を記録したマニフェストがあります。スキーマ 1 の YOLO の成果物も引き続き読み込めます。汎用のコンパイラーはスキーマ 2 を出力します。名前付きの入力テンソルについて、固定形状、dtype、バイトサイズ、連続したレイアウト、GPU デバイス上にあることを確認します。出力バインディングは、それを所有する結果が残っていない場合に限ってプールから再利用し、それ以外の場合は新たに GPU メモリを確保します。使用できる外部出力バインディングを持たないモデルでは、デバイス間コピーで所有権を移します。出力は、次の推論の後も、実行器の終了処理の後も有効です。

SharedBatchExecutor は FIFO に上限(既定は 64 リクエスト)を設け、1 つのバッチにソースごとに 1 件のリクエストを受け入れ、未充足バッチの待機をタイムアウトさせ、GPU から GPU へのコピーで入力を組み立てます。バッチの未使用分は、GPU 上で生成した正規化済みのパディングです。明示的な取り消し世代を使うと、キュー内の future を失敗させ、すでに実行中のジョブの結果を破棄します。ソースを最終的に廃止すると、実行中の処理が終わった後に取り消しの管理情報を解放します。完了済みの GPU カーネルは、GStreamer の flush で中断できません。

GPU での後処理には、クラスを考慮した貪欲法の NMS(最大 300 オブジェクト)、分類の softmax/top-k(最大 100 クラス)、セマンティックセグメンテーションの argmax、インスタンスマスクのプロトタイプからの再構成、姿勢推定のキーポイント抽出が含まれます。結果として CPU に読み戻すのは、簡潔な形式の検出、分類、キーポイントのレコードだけです。マスクと raw の出力テンソルは GPU 上に残ります。大きなテンソルとマスクの確保には、形状と上限の明示的な確認があります。逐次処理の GPU NMS 実装は、検出器の最大スループットよりも正しさを優先しています。

画像の逆変換では、丸めたスケール後の寸法、切り出し、パディングを使い、ボックスをソースの範囲に収め、空のボックスを捨てます。オブジェクト/分類/トラッキング/キーポイントのメタデータは、標準の GstAnalytics の関連として保持します。AmdAnalysisMeta は、ソースの識別情報と GPU の付加情報を保持します。メタデータ全体のコピーでは、変更可能なリストを複製し、GPU メモリの所有者を共有します。領域単位の変換は拒否します。採用した gvametaaggregate パッチは、GPU の所有権を保持したまま、親メタデータの ID を付け替え、付加情報の幾何情報をスケーリングし直します。ソース/世代/PTS が一致しない統合は拒否します。異なる独自 JSON の値が複数ある場合は、custom.branches 以下に保持します。

描画と出力

amdwatermark は、VPE と HIP を使って BGRA DMA-BUF を出力します。4 スロットのプールは、出力 GstMemory のすべてのコピーが解放されるまで、VA ディスプレイ、サーフェス、HIP のインポート、エクスポートした FD を保持します。4 フレームすべてが保持されていると、上限付きのバックプレッシャーがかかります。flush すると、待機中の生成側を起こします。出力のメタデータと PTS は保持し、映像レイアウトのメタデータは BGRA のオフセットとピッチに置き換えます。ボックス、ASCII のクラスラベル/ID、マスク、COCO-17 の骨格は GPU 上で生成します。描画コマンドの上限は 8192 です。テキストはラテン文字、数字、# に対応します。NVR の EGL レンダラーは、共有のオーバーレイ幾何情報を使ってタイルのボックスとラベルを描画し、画像メモリはマップしません。

メタデータだけを扱う Python フックは、ストリーミングスレッド上で GIL を取得して実行します。JSON のシリアライズでは画像やマスクを読み取りません。非同期の送信器は、レコード数とバイト数に上限を設け、満杯になるとキュー内の最も古いレコードを破棄し、送信先への再試行と配信失敗の計数を行います。ブローカーとのやり取りの間、映像バッファーや GPU メモリの所有権は保持しません。確実な配信が必要なアプリケーションは、独自のイベントストアを追加する必要があります。

コピー監査とライフサイクル

監査用のプリロードライブラリは、デコード済み画像の CPU へのマップと、マークのないホスト/デバイス間の転送を拒否します。デバイス間のバッチ/所有権のコピー、従来の 7204 バイトの検出結果の読み戻し、明示的にマークした 256 KiB までのメタデータ転送は許可します。アップロードに含まれるのは上限付きの描画コマンドで、読み戻しに含まれるのは簡潔な形式の結果です。これは API レベルの監査であり、ドライバー内部のすべての転送について証明するものではありません。圧縮された RTSP パケットの解析/録画と JSON は CPU で処理しますが、デコード済みのピクセルは扱いません。

モデルの準備とオフラインの参照ツールは、比較のために意図的にテンソルや画像を転送するため、実行時の監査契約の対象外です。実行時のコピーを計測する場合は、定常状態の監査を始める前にモデルとカーネルを初期化してください。ドライバーの初期化とモデル定数の読み込みは、フレームごとのピクセル処理ではありません。

要素の設定プロパティは、すべて NULL/READY 状態で変更できます。厳格モードは無効にできません。初期化、推論、対応していない解像度、GPU の障害はバスのエラーになり、通知なしに CPU 処理へ切り替わることはありません。プロパティと caps は処理の前に検証します。EOS を受けると同期推論の残りを処理します。flush すると古い世代を廃止し、共有の所有者が、投入済みの入力と出力を完了まで保持します。root 権限を使わないユーザー空間のプレフィックスは、ホストのカーネル、ファームウェア、Mesa、デバイスの権限を置き換えるものではありません。