插件执行提供程序库测试指南
插件 EP 负责确保其实现的表现正确。这包括以插件 EP API 文档中记录的预期方式与 ONNX Runtime 进行交互。它还包括由算子规范(例如来自 ONNX 标准)指定的算子级行为。
内容
EP 单元测试
插件 EP 实现通常应具有其自己的单元测试。
ONNX Runtime 提供的算子级测试实用程序
ONNX Runtime 包含用于验证 EP 算子实现的现有单元测试。这些测试位于单元测试程序 onnxruntime_provider_test 中。该程序支持与动态指定的插件 EP 一起使用。
特别是,利用 onnxruntime::test::OpTester 或 onnxruntime::test::ModelTester 类的单元测试也可以通过插件 EP 运行。
如果需要,插件 EP 的实现者可以使用此测试程序来帮助测试其插件 EP。本节的其余部分将解释如何执行此操作。
构建
从源码构建 onnxruntime 共享库和 onnxruntime_provider_test 目标。
cd <onnxruntime repo>
# Note: On Windows, use build.bat instead of build.sh
./build.sh --build_shared_lib --update --build --parallel --target onnxruntime_provider_test
onnxruntime 共享库和 onnxruntime_provider_test 将在二进制输出目录中生成。
运行
onnxruntime_provider_test 支持标准的 GoogleTest 参数。例如,可以使用 --gtest_filter 来运行特定的感兴趣测试。
重要的一点是,它支持通过环境变量 ORT_UNIT_TEST_MAIN_DYNAMIC_PLUGIN_EP_CONFIG_JSON 配置动态指定的插件 EP。配置值应指定为 JSON 字符串。
以下是 ORT_UNIT_TEST_MAIN_DYNAMIC_PLUGIN_EP_CONFIG_JSON 的示例值
{
"ep_library_registration_name": "example_plugin_ep",
"ep_library_path": "/path/to/libexample_plugin_ep.so",
"selected_ep_name": "example_plugin_ep",
"default_ep_options": { "ep_option_key": "ep_option_value" }
}
ep_library_registration_name 和 ep_library_path 分别对应传入 OrtApi::RegisterExecutionProviderLibrary() 的 registration_name 和 path 参数。
selected_ep_name 应设置为插件 EP 的名称。所有匹配该 EP 名称的可用 OrtEpDevice(由 OrtApi::GetEpDevices() 返回)都将被使用。
作为 selected_ep_name 的替代方案,可以将 selected_ep_device_indices 设置为一组整数列表,表示可用 OrtEpDevice 列表中的索引。这需要预先了解有哪些可用的 OrtEpDevice。可用的 OrtEpDevices 可以通过 OrtApi::GetEpDevices() 获取。onnxruntime_perf_test 工具还提供了 --list_ep_devices 选项,它可以与 --plugin_ep_libs 选项结合使用以显示它们。
可选地,可以将 default_ep_options 设置为字符串键值对,以指定特定于 EP 的选项。
EP 集成测试和模型测试
插件 EP 将实现多个 API 以与 ONNX Runtime 进行交互。尽管曾考虑过进行 EP API 级别的符合性测试,但目前认为其实用性尚不明显。目前,人们期望通过运行整个模型的高级测试来有意义地测试与 ONNX Runtime 的集成。
不同的插件 EP 在功能方面(无论是可选功能支持还是算子支持)可能会有很大差异。因此,预计插件 EP 会拥有一套与其最相关的模型,并且可以使用这些模型进行测试。