获得性能数据¶
本指南介绍了如何使用 benchmark_app 获取性能数据。它还解释了如何通过内部推理性能计数器和执行图来反映性能数据。此外,它也包含有关使用 ITT 和英特尔® VTune™ Profiler 获取性能洞察的信息。
使用 benchmark_app 测试性能¶
必备条件¶
要运行基准测试,您需要同时安装 OpenVINO 开发者工具和 OpenVINO 运行时。请按照 安装指南 进行操作,并确保安装最新的通用发行包,且该发行包支持您要测试的模型的框架。
要测试模型的性能,请确保 做好模型的准备工作,使其适用于 OpenVINO 。例如,如果使用 OpenVINO 的自动化工具 ,则这两行代码会下载 resnet-50-tf 并将其转换为 OpenVINO IR。
omz_downloader --name resnet-50-tf
omz_converter --name resnet-50-tf
运行基准测试应用¶
如需查看详细描述,请参阅专门的文章: 适用于 C++ 的 benchmark_app 和 适用于 Python 的 benchmark_app 。
benchmark_app 包含许多特定于设备的选项,但主要用法非常简单:
benchmark_app -m <model> -d <device> -i <input>
每个 OpenVINO™ 支持的设备 都提供性能设置,这些设置在基准测试应用中包含命令行等效项。
虽然这些设置提供非常低级别的控制,能够在_特定_设备上实现最佳模型性能,但建议始终首先按照 OpenVINO 高级性能提示 开始进行性能评估,例如:
# for throughput prioritization
benchmark_app -hint tput -m <model> -d <device>
# for latency prioritization
benchmark_app -hint latency -m <model> -d <device>
基准测试的其他考虑因素¶
1 - 选择一组适当的操作进行测量¶
使用 OpenVINO 运行时评估模型的性能时,需要对一组适当的操作进行测量。
避免包括模型加载等一次性成本。
单独跟踪发生在 OpenVINO™ 运行时之外的操作(例如视频解码)。
2 - 尝试获取可靠的数据¶
性能结论应基于可复制的数据。性能测量应该通过对同一例程的大量调用来完成。由于第一次迭代几乎总是比后续迭代慢得多。因此最终预测的执行时间可以使用合计值:
如果热身运行没有帮助或执行时间仍然变化,您可以尝试运行大量迭代,然后对结果求平均值。
如果时间值范围太大,请考虑几何平均值。
请注意过热降频和其他功率异常。设备可以处于几种不同电源状态中的一种。优化模型时,请考虑固定设备频率以获得更好的性能数据重现性。然而,端到端(应用)基准测试也应在实际操作条件下执行。
3 - 将性能与原生/框架代码进行比较¶
在将 OpenVINO™ 运行时性能与框架或其他参考代码进行比较时,请确保两个版本尽可能相似:
内部推理性能计数器和执行图¶
可以通过设备特定的性能计数器和/或执行图获得有关推理性能分解的更详细的洞察。
C++ 和 Python 版本的 benchmark_app
都支持输出内部执行分解的 -pc
命令行参数。
例如,下表是 CPU 插件 上 ResNet-50 模型推理的量化 TensorFlow 实现的 性能计数器的一部分。
请记住,由于设备是 CPU。因此 realTime
挂钟和 cpu
时间层相同。有关层精度的信息也存储在性能计数器中。
layerName |
execStatus |
layerType |
execType |
realTime (ms) |
cpuTime (ms) |
---|---|---|---|---|---|
resnet_model/batch_normalization_15/FusedBatchNorm/Add |
EXECUTED |
Convolution |
jit_avx512_1x1_I8 |
0.377 |
0.377 |
resnet_model/conv2d_16/Conv2D/fq_input_0 |
NOT_RUN |
FakeQuantize |
undef |
0 |
0 |
resnet_model/batch_normalization_16/FusedBatchNorm/Add |
EXECUTED |
Convolution |
jit_avx512_I8 |
0.499 |
0.499 |
resnet_model/conv2d_17/Conv2D/fq_input_0 |
NOT_RUN |
FakeQuantize |
undef |
0 |
0 |
resnet_model/batch_normalization_17/FusedBatchNorm/Add |
EXECUTED |
Convolution |
jit_avx512_1x1_I8 |
0.399 |
0.399 |
resnet_model/add_4/fq_input_0 |
NOT_RUN |
FakeQuantize |
undef |
0 |
0 |
resnet_model/add_4 |
NOT_RUN |
Eltwise |
undef |
0 |
0 |
resnet_model/add_5/fq_input_1 |
NOT_RUN |
FakeQuantize |
undef |
0 |
0 |
此表的 exeStatus
列包括以下可能的值:
EXECUTED
- 层通过独立的基元执行。NOT_RUN
- 层不是通过独立基元执行的,或者与其他操作融合并在另一个层基元中执行。
此表的 execType 列包括具有特定后缀的推理基元。层可以具有以下标记:
I8
后缀适用于具有 8 位数据类型输入并以 8 位精度计算的层。FP32
后缀适用于以 32 位精度计算的层。
所有 Convolution
层都以 int8
精度执行。其余层使用操作后优化融合到卷积中,如 CPU 设备 中所述。
这包含层名称(如 OpenVINO™ IR 中所示)、层类型和执行统计信息。
此外,两个 benchmark_app
版本都支持 exec_graph_path
命令行选项。它要求 OpenVINO™ 在每层输出相同的执行统计信息,但以插件特定的 Netron 可查看 图形的形式输出到指定文件中。
特别是在对 延迟] 进行性能调试时,请注意计数器不反映在 plugin/device/driver/etc
队列中花费的时间。如果计数器之和与推理请求的延迟差异太大,请考虑使用较少的推理请求进行测试。例如,运行具有多个请求的单个 OpenVINO™ 流 将产生与运行单个推理请求几乎相同的计数器,而实际延迟可能大不相同。
最后,性能计数器和执行图的性能统计信息是平均值。因此应仔细测量 动态形状输入 的此类数据,最好通过隔离特定形状并循环多次执行,以收集可靠的数据。
使用 ITT 获得性能洞察¶
一般来说,OpenVINO™ 及其各个插件都大量使用英特尔® 检测和跟踪技术 (ITT)。因此,您还可以在启用 ITT 的情况下从源代码编译 OpenVINO,并使用 英特尔® VTune™ Profiler 等工具在时间线视图上获取详细的推理性能分解和应用级性能的其他洞察。