プラグインのテスト

OpenVINO テストインフラでは、事前定義された機能テストとユーティリティーのセットを提供します。これらは、OpenVINO パブリック API を使用してプラグインを検証するのに使用されます。すべてのテストは Google Test C++ フレームワークで記述されています。

OpenVINO プラグインテストは、OpenVINO リポジトリー内に構築される openvino::funcSharedTests の CMake ターゲットに含まれています (CMake を使用したプラグインのビルドガイドを参照)。このライブラリーには、プラグインが特定の機能、サポートされる操作セットのテスト用のパラメーターのセットなどをサポートするかに応じて、プラグインでパラメーター化およびインスタンス化できるテスト定義 (テスト本体) が含まれています。

テスト定義は、テストクラス宣言 (src/tests/functional/plugin/shared/include を参照) とテストクラス実装 (src/tests/functional/plugin/shared/src を参照) に分割され、プラグイン適合性テストの次のスコープが含まれます。

  1. 動作テスト (behavior サブフォルダー) は、プラグインが OpenVINO の基本的な概念 (プラグインの作成、複数のコンパイル済みモデルのサポート、複数の同期および非同期推論要求のサポートなど) を満たしていることを確認する別個のテストグループです。プラグイン固有のパラメーターを使用してテスト定義クラスをインスタンス化する方法の詳細は、次のセクションを参照してください。

  2. 単一レイヤーのテスト (single_layer_tests サブフォルダー) は、デバイス上で特定の単一レイヤーを推論できるかどうか確認します。
    openvino::funcSharedTests ライブラリーのテスト定義に基づくテストのインスタンス化の例:

    • 畳み込みテストクラスの宣言から、それがパラメーターの convLayerTestParamsSet タプルを持つパラメーター化された GoogleTest ベースのクラスであることが分かります。

    • それに基づいて、テンプレート・プラグインの機能テストのインスタンス化パラメーターのセットを定義します。

      const std::vector<ov::element::Type> model_types = {
          ov::element::f32,
          ov::element::f16,
      };
      
      /* ============= 2D Convolution ============= */
      
      const std::vector<std::vector<size_t>> kernels = {{3, 3}, {3, 5}};
      const std::vector<std::vector<size_t>> strides = {{1, 1}, {1, 3}};
      const std::vector<std::vector<ptrdiff_t>> padBegins = {{0, 0}, {0, 3}};
      const std::vector<std::vector<ptrdiff_t>> padEnds = {{0, 0}, {0, 3}};
      const std::vector<std::vector<size_t>> dilations = {{1, 1}, {3, 1}};
      const std::vector<size_t> numOutChannels = {1, 5};
      const std::vector<ov::op::PadType> padTypes = {ov::op::PadType::EXPLICIT, ov::op::PadType::VALID};
      
      const auto conv2DParams_ExplicitPadding = ::testing::Combine(::testing::ValuesIn(kernels),
                                                                   ::testing::ValuesIn(strides),
                                                                   ::testing::ValuesIn(padBegins),
                                                                   ::testing::ValuesIn(padEnds),
                                                                   ::testing::ValuesIn(dilations),
                                                                   ::testing::ValuesIn(numOutChannels),
                                                                   ::testing::Values(ov::op::PadType::EXPLICIT));
      
    • 標準の GoogleTest マクロ INSTANTIATE_TEST_SUITE_P を使用してテスト自体をインスタンス化します。

      INSTANTIATE_TEST_SUITE_P(
          Convolution2D_ExplicitPadding,
          ConvolutionLayerTest,
          ::testing::Combine(conv2DParams_ExplicitPadding,
                             ::testing::ValuesIn(model_types),
                             ::testing::Values(ov::test::static_shapes_to_test_representation({{1, 3, 30, 30}})),
                             ::testing::Values(ov::test::utils::DEVICE_TEMPLATE)),
          ConvolutionLayerTest::getTestCaseName);
      
  3. サブグラフテスト (subgraph_tests サブフォルダー)。このグループのテストは、小さなパターンまたはレイヤーの組み合わせをテストするように設計されています。例えば、特定のトポロジーがプラグインで有効になっている場合、TF ResNet-50 では、トポロジー全体をテストに追加する必要はありません。逆に、特定の繰り返しサブグラフまたはパターンを ResNet-50 から抽出してテストに追加することができます。サブグラフテストのインスタンス化は、単一レイヤーテストと同じ方法で行われます。

    このようなサブグラフまたはサブグラフテストのパターンは、最初に openvino::ov_models ライブラリーに追加し (このライブラリーは小さな ov::Model の事前定義されたセットです)、その後のサブグラフテストで再利用する必要があります。

  4. HETERO テスト (subgraph_tests サブフォルダー) には、HETERO シナリオのテスト (手動または自動のアフィニティー設定、query_model のテスト) が含まれています。

  5. その他のテストには、他のシナリオのテストが含まれており、次の種類のテストがあります。

    • 実行グラフのテスト

    • その他

これらのテストを独自のプラグイン開発に使用するには、openvino::funcSharedTests ライブラリーをテストバイナリーにリンクし、必要なパラメーター値を使用してテストケースをインスタンス化します。

プラグインには、ハードウェア固有のユースケースや、広範なテストが必要なユースケースの独自のテストが含まれている場合があります。

テストバイナリーを他のビルド・アーティファクトと一緒にビルドするには、make all コマンドを使用します。詳細は、CMake を使用してプラグインをビルドを参照してください。

OpenVINO プラグインテストを拡張する方法

OpenVINO プラグインテストは皆さんの協力を受け付けています。すべてのプラグインに適用できる共通のテストケース定義を、OpenVINO リポジトリー内の openvino::funcSharedTests ターゲットに追加します。その後、対応する機能をサポートする他のプラグインが、新しいテストをインスタンス化できます。

新しいサブグラフのテストを実装するとき、テストが存在しない場合は、サブグラフの各操作に対して新しい単一レイヤーのテストを追加します。