Skip to content

TVMユーティリティ#

これはtvm_utilityパッケージの設計文書です。YOLOv2 Tinyのテストを作成する方法については、YOLOv2 Tiny例パイプラインを参照してください。テストアーティファクトを保存する場所については、TVMユーティリティアーティファクトを参照してください。

目的/ユースケース#

TVMベースの機械学習推論パイプラインを構築するために役立つ、C++ユーティリティのセットです。ライブラリにはパイプラインの構築に役立つパイプラインクラスと、機械学習によくある多数のユーティリティ関数が含まれます。

設計#

パイプラインクラスは推論パイプラインを作成するための標準化された方法です。パイプラインクラスには、プリプロセッサ、推論エンジン、およびポストプロセッサの3つの異なるステージが含まれています。TVMの推論エンジンステージの実装が提供されます。

API#

プリプロセッサとポストプロセッサは、パイプラインをインスタンス化する前にユーザによって実装される必要があります。test/yolo_v2_tinyのサンプルパイプラインで、使用例を確認できます。

パイプラインの各ステージには、入力データをパラメータとして取得し、出力データを返すschedule関数があります。パイプラインオブジェクトが作成されると、pipeline.scheduleが呼び出されてパイプラインが実行されます。

int main() {
   create_subscription<sensor_msgs::msg::PointCloud2>("points_raw",
   rclcpp::QoS{1}, [this](const sensor_msgs::msg::PointCloud2::SharedPtr msg)
   {pipeline.schedule(msg);});
}

バージョンチェック#

InferenceEngineTVM::version_check 関数は、使用中のニューラルネットワークのバージョンが、サポートされているバージョン範囲(古いものから新しいものまで)に含まれているかどうかをチェックするために使用できます。

InferenceEngineTVM クラスは、サポートされている最新のバージョンを保持しており、ターゲットバージョンが変更された場合は更新する必要があります。ただし、このバージョン変更の影響が、このバージョンの依存パッケージに及ぼされるかどうかをテストした後で変更してください。

最も古いサポートされているバージョンは、推論を利用する各パッケージによって異なります。したがって、これらのパッケージで定義(および維持)する必要があります。

モデル#

依存パッケージでは、このパッケージの get_neural_network cmake 関数を使用して、適切な外部依存関係を構築する必要があります。

エラーの検出と処理#

エラーが発生した場合はいつでも std::runtime_error がスローされる必要があります。適切なテキストエラーの説明を入力する必要があります。

ニューラルネットワークプロバイダー#

ニューラルネットワークは Model Zoo CI パイプラインの一部としてコンパイルされ、S3 バケットに保存されます。

get_neural_network 関数は、アーティファクト管理のための抽象化を作成します。ユーザーはモデル構成のヘッダーファイルが "data/user/${MODEL_NAME}/" にあるかどうかを確認する必要があります。見つからない場合、何も起こらず、パッケージのコンパイルはスキップされます。

関数を活用するパッケージのソースディレクトリの構造は次のとおりです。

.
├── data
│   └── models
│       ├── ${MODEL 1}
│       │   └── inference_engine_tvm_config.hpp
│       ├── ...
│       └── ${MODEL ...}
│           └── ...

inference_engine_tvm_config.hpp ファイルは依存パッケージでコンパイルするために必要なので、「data/models/${MODEL_NAME}/inference_engine_tvm_config.hpp」に対して準備できます。 依存パッケージは、get_neural_networkDEPENDENCY 出力パラメータで提供される名前で cmake の add_dependencies 関数を使用して、このファイルが使用される前に作成されるようにできます。

他の deploy_* ファイルは、パッケージの share ディレクトリの下の「models/${MODEL_NAME}/」にインストールされます。

他のモデルファイルはパッケージフォルダの下の autoware_data フォルダ内に、次の構造を使用して格納する必要があります。

$HOME/autoware_data

|     └──${パッケージ}
|        └──モデル
|           ├── ${モデル 1}
|           |    ├── デプロイ_グラフ.json
|           |    ├── デプロイ_ライブラリ.so
|           |    └── デプロイ_パラメータ.params
|           ├── ...
|           └── ${モデル ...}
|                └── ...

#### 入力/出力

出力:

- `get_neural_network` cmake関数: ユーザーが提供するモデルを使用するパッケージ用の適切な外部依存関係を作成します。

入出力:

- `get_neural_network`の`DEPENDENCY`引数は、関数の結果を確認できます。
  ユーザーがニューラルネットワークを提供しなかった場合、空文字列になります。

## セキュリティの考慮事項

### パイプライン

入力と出力の両方が同じアクタによって制御されるため、以下のセキュリティ上の懸念事項は対象外です:

- なりすまし
- 改ざん

データを別のアクタに漏洩するには、任意のメモリを読み取ることができるTVMまたはホストオペレーティングシステムの欠陥、それ自体が重大なセキュリティ上の欠陥を必要とします。これは、パイプラインを早期に操作する外部アクタにも当てはまります。パイプラインを開始したオブジェクトのみが出力を受け取るためのメソッドを実行できます。

サービス妨害攻撃は、対象のハードウェアを他のパイプラインで使用できなくする可能性がありますが、CPUでコードを実行できる必要があるため、より深刻なサービス妨害攻撃をすでに可能にします。

このパッケージには権限の昇格は必要ありません。

### ネットワークプロバイダー

事前コンパイルされたネットワークはS3バケットからダウンロードされ、なりすまし、改ざん、サービス妨害の脅威にさらされています。
なりすましはhttps接続を使用することで軽減されます。
改ざんとサービス妨害に対する軽減策はAWSに委ねられています。

ユーザー提供のネットワークは、ホストシステムにそのままインストールされます。
ユーザーは、情報開示に関して提供するファイルのセキュリティを確保する責任があります。

## 今後の拡張/実装されていない部分

将来のパッケージは、Perceptionスタックの一部としてtvm_utilityを使用して、機械学習の処理を実行します。

## 関連する問題

<https://github.com/autowarefoundation/autoware/discussions/2557>