メインコンテンツまでスキップ

dtype契約

Neatモデルのルートには、次の2つの契約があります。

  • パブリック契約: アプリケーションがTensorSampleInputOptions、モデル仕様、およびグラフエンドポイントを通じて見るもの。
  • モデルルート契約: Neatが、コンパイルされたモデルアーカイブと選択された前処理/後処理パスから解決するもの。

すべてのパブリック境界がFP32であると想定しないでください。一部の境界は、画像、エンコードされたメディア、パックされた検出ペイロード、INT8テンソル、BF16テンソル、またはアプリケーション定義のテンソルセマンティクスを伝達します。まず仕様を確認してください。仕様が契約です。

ルート内では、Neatは、コンパイルされたモデルの契約で必要な場合に、量子化、テッセレーション、キャスト、非テッセレーション、非量子化、および後処理ステージを挿入します。

4つのMLA入力ケース

モデルアーカイブは、最初のMLAステージについて、Neatに次の2つの重要なことを伝えます。

  • MLA入力のdtype。通常はBF16またはINT8
  • MLA側のテッセレーションが、すでにコンパイルされたカーネルの一部であるかどうか。

これにより、次の4つの前処理グラフファミリーが得られます。

MLA dtypeMLA tess前処理グラフファミリーNeatがMLAの前に挿入するもの
BF16はいPreprocリサイズ、カラー変換、正規化。MLAステージは内部でテッセレーションを実行します。
BF16いいえTessリサイズ、カラー変換、正規化、テッセレーション。
INT8はいQuantリサイズ、カラー変換、正規化、量子化。MLAステージは内部でテッセレーションを実行します。
INT8いいえQuantTessリサイズ、カラー変換、正規化、量子化、テッセレーション。

ResolvedPreprocessPlanを確認して、プランナーが選択した内容を確認してください。

テッセレーションの意味

テッセレーションは、テンソルバイトを、MLA入力スクラッチパッドが期待するタイルジオメトリに配置します。これはレイアウト変換です。同じ論理テンソルですが、メモリの順序が異なります。

対応する非テッセレーションは、ルートが次のステージまたはアプリケーションに自然なテンソルレイアウトを返す必要がある場合に、MLA出力の後に発生します。

境界のアップグレード

Neatは、4つのケースのdtype決定の上に、より高レベルのルートステージを追加できます。

  • 汎用前処理: PreprocessOptionsを使用して、リサイズ、カラー、レイアウト、正規化、量子化、テッセレーション、または明示的な変換意図を推論前に適用します。
  • BoxDecode: 検出後処理ステージを必要とするモデルの検出ヘッドをデコードします。アプリケーションは、BoxDecodeType(例:YoloV8)などのファミリーと、score_thresholdnms_iou_threshold、およびtop_kなどのフィルタリングフィールドを選択します。

これらのアップグレードにより、実行されるカーネルと、アプリケーションが受信する出力契約が変更されます。たとえば、生のモデル出力テンソルとデコードされた検出テンソルは、同じパブリック契約ではありません。

アプリケーションコードへの影響

  • 入力または出力のデコードを行う前に、model.input_specs()model.output_specs()を確認してください。
  • ModelOptions.preprocessを使用して、どのような種類の入力を提供するか(画像入力、テンソル入力、リサイズ、色、レイアウト、正規化、量子化、またはテッセレーションの意図など)を指定します。
  • model.resolved_preprocess_plan()/model.preprocess_plan()を使用して、Neatが、指定したオプションとモデルアーカイブに基づいてどのような処理を計画したかを確認します。
  • 出力dtype、形状、またはレイアウトを推測しないでください。出力仕様を読み、必要に応じて、返されたテンソルのメタデータを読み取ります。
  • 出力コントラクトが一致するパック形式の場合にのみ、ボックス、ポーズ、またはセグメンテーションをデコードします。
  • INT8/BF16/テッセレーションの詳細については、公開された仕様またはテンソルで明示的に公開されていない限り、ランタイムの動作として扱います。

余計なことはせず、コントラクトを読み、次にバイトを移動します。

出力を意図的にデコードする

出力コントラクトに一致するデコードヘルパーを使用します。

出力コントラクトC++Python
生のテンソル返されたTensor/TensorListを直接使用します返されたテンソルを直接使用するか、to_numpy(...)/to_torch(...)を使用します
パックされたボックスsimaai::neat::decode_bbox(...)pyneat.decode_bbox(...)
パックされたポーズsimaai::neat::decode_pose(...)pyneat.decode_pose(...)
パックされたセグメンテーションsimaai::neat::decode_segmentation(...)pyneat.decode_segmentation(...)

デコードされたボックスは、[N, 6]のテンソル(float32)を使用し、列はx1y1x2y2score、およびclass_idです。ポーズとセグメンテーションのデコーダーは、ボックスに加えて、キーポイントまたはマスク用のタスク固有のテンソルを返します。

座標メタデータを保持する

検出座標は、多くの場合、モデル空間からソースフレーム空間にマッピングするために、前処理メタデータが必要です。レターボックス、リサイズ、ROIリスト、レンダリング、または検出デコードを使用する場合は、グラフを通じてメタデータを保持します。

関連するメタデータには、ターゲットサイズ、スケーリングされたサイズ、パディング、カラー変換、軸の順序変更、正規化、量子化、テッセレーション、ROIウィンドウ、およびROIごとのアフィン変換が含まれる場合があります。

デコードされたボックスが間違った場所に配置されている場合は、NMSを非難する前に、メタデータの伝播を確認してください。データ形式ROIリストを前処理するを参照してください。

関連する型

詳細