プラグインのテスト#
OpenVINO テストインフラでは、事前定義された機能テストとユーティリティーのセットを提供します。これらは、OpenVINO パブリック API を使用してプラグインを検証するのに使用されます。すべてのテストは Google Test C++ フレームワークで記述されています。
OpenVINO プラグインテストは、OpenVINO リポジトリー内に構築される openvino::funcSharedTests
の CMake ターゲットに含まれています (CMake を使用したプラグインのビルドガイドを参照)。このライブラリーには、プラグインが特定の機能、サポートされる操作セットのテスト用のパラメーターのセットなどをサポートするかに応じて、プラグインでパラメーター化およびインスタンス化できるテスト定義 (テスト本体) が含まれています。
テスト定義は、テストクラス宣言 (src/tests/functional/plugin/shared/include
を参照) とテストクラス実装 (src/tests/functional/plugin/shared/src
を参照) に分割され、プラグイン適合性テストの次のスコープが含まれます:
動作テスト (
behavior
サブフォルダー) は、プラグインが OpenVINO の基本的な概念 (プラグインの作成、複数のコンパイル済みモデルのサポート、複数の同期および非同期推論要求のサポートなど) を満たしていることを確認する別個のテストグループです。プラグイン固有のパラメーターを使用してテスト定義クラスをインスタンス化する方法の詳細は、次のセクションを参照してください。単一レイヤーのテスト (
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);
サブグラフテスト (
subgraph_tests
サブフォルダー)。このグループのテストは、小さなパターンまたはレイヤーの組み合わせをテストするように設計されています。例えば、特定のトポロジーがプラグインで有効になっている場合、TF ResNet-50 では、トポロジー全体をテストに追加する必要はありません。逆に、特定の繰り返しサブグラフまたはパターンをResNet-50
から抽出してテストに追加することができます。サブグラフテストのインスタンス化は、単一レイヤーテストと同じ方法で行われます。
注
このようなサブグラフまたはサブグラフテストのパターンは、最初に openvino::ov_models
ライブラリーに追加し (このライブラリーは小さな ov::Model
の事前定義されたセットです)、その後のサブグラフテストで再利用する必要があります。
HETERO テスト (
subgraph_tests
サブフォルダー) には、HETERO
シナリオのテスト (手動または自動のアフィニティー設定、query_model
のテスト) が含まれています。その他のテストには、他のシナリオのテストが含まれており、次の種類のテストがあります:
実行グラフのテスト
その他
これらのテストを独自のプラグイン開発に使用するには、openvino::funcSharedTests
ライブラリーをテストバイナリーにリンクし、必要なパラメーター値を使用してテストケースをインスタンス化します。
注
プラグインには、ハードウェア固有のユースケースや、広範なテストが必要なユースケースの独自のテストが含まれている場合があります。
テストバイナリーを他のビルド・アーティファクトと一緒にビルドするには、make all
コマンドを使用します。詳細は、CMake を使用してプラグインをビルドを参照してください。
OpenVINO プラグインテストを拡張する方法#
OpenVINO プラグインテストは皆さんの協力を受け付けています。すべてのプラグインに適用できる共通のテストケース定義を、OpenVINO リポジトリー内の openvino::funcSharedTests
ターゲットに追加します。その後、対応する機能をサポートする他のプラグインが、新しいテストをインスタンス化できます。
注
新しいサブグラフのテストを実装するとき、テストが存在しない場合は、サブグラフの各操作に対して新しい単一レイヤーのテストを追加します。