プラグインのテスト#

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 ベースのクラスであることがわかります。

typedef std::tuple< 
        std::vector<size_t>, // Kernel size 
        std::vector<size_t>, // Strides 
        std::vector<ptrdiff_t>, // Pad begin 
        std::vector<ptrdiff_t>, // Pad end 
        std::vector<size_t>, // Dilation 
        size_t, // Num out channels 
        ov::op::PadType // Padding type 
> convSpecificParams; 
typedef std::tuple< 
        convSpecificParams, 
        ov::element::Type, // Model type 
        std::vector<InputShape>, // Input shapes 
        std::string // Device name 
> convLayerTestParamsSet; 

class ConvolutionLayerTest : public testing::WithParamInterface<convLayerTestParamsSet>, 
                             virtual public ov::test::SubgraphBaseTest { 
public: 
    static std::string getTestCaseName(const testing::TestParamInfo<convLayerTestParamsSet>& obj); 

protected: 
    void SetUp() override; 
};
  • それに基づいて、Template プラグインの機能テストのインスタンス化パラメーターのセットを定義します:

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);
  1. サブグラフテスト (subgraph_tests サブフォルダー)。このグループのテストは、小さなパターンまたはレイヤーの組み合わせをテストするように設計されています。例えば、特定のトポロジーがプラグインで有効になっている場合、TF ResNet-50 では、トポロジー全体をテストに追加する必要はありません。逆に、特定の繰り返しサブグラフまたはパターンを ResNet-50 から抽出してテストに追加することができます。サブグラフテストのインスタンス化は、単一レイヤーテストと同じ方法で行われます。

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

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

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

    • 実行グラフのテスト

    • その他

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

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

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

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

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

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