性能调优¶
简介¶
本文档概述了为实现最高的性能效率可供配置的各种参数。
模型示例¶
下载 ResNet50 模型
mkdir models
docker run -u $(id -u):$(id -g) -v ${PWD}/models:/models openvino/ubuntu20_dev:latest omz_downloader --name resnet-50-tf --output_dir /models
docker run -u $(id -u):$(id -g) -v ${PWD}/models:/models:rw openvino/ubuntu20_dev:latest omz_converter --name resnet-50-tf --download_dir /models --output_dir /models --precisions FP32
mv ${PWD}/models/public/resnet-50-tf/FP32 ${PWD}/models/public/resnet-50-tf/1
性能提示¶
借助 PERFORMANCE_HINT 插件配置属性,您可以指定性能模式,让插件在特定用例中更高效。
吞吐量提升¶
此模式优先考虑高吞吐量,在延迟和功率之间保持平衡。它最适合涉及多个作业的任务,例如视频源或大量图像的推理。
要对您的应用启用性能提示,请使用以下命令:
CPU
docker run --rm -d -v ${PWD}/models/public/resnet-50-tf:/opt/model -p 9001:9001 openvino/model_server:latest \
--model_path /opt/model --model_name resnet --port 9001 \
--plugin_config '{"PERFORMANCE_HINT": "THROUGHPUT"}' \
--target_device CPU
图形处理器
docker run --rm -d --device=/dev/dri --group-add=$(stat -c "%g" /dev/dri/render* | head -n 1) -u $(id -u):$(id -g) \
-v ${PWD}/models/public/resnet-50-tf:/opt/model -p 9001:9001 openvino/model_server:latest-gpu \
--model_path /opt/model --model_name resnet --port 9001 \
--plugin_config '{"PERFORMANCE_HINT": "THROUGHPUT"}' \
--target_device GPU
延迟¶
此模式优先考虑低延迟,为每个推理作业提供较短的响应时间。它最适合需要对单个输入图像进行推理的任务,例如超声扫描图像的医学分析。它还适合实时或近实时应用的任务,例如工业机器人对其环境中的动作做出响应或无人驾驶汽车自主避障。
请注意,目前只有 CPU 和 GPU 设备支持 PERFORMANCE_HINT 属性。 更多信息
要对您的应用启用性能提示,请使用以下命令:
CPU
docker run --rm -d -v ${PWD}/models/public/resnet-50-tf:/opt/model -p 9001:9001 openvino/model_server:latest \
--model_path /opt/model --model_name resnet --port 9001 \
--plugin_config '{"PERFORMANCE_HINT": "LATENCY"}' \
--target_device CPU
图形处理器
docker run --rm -d --device=/dev/dri --group-add=$(stat -c "%g" /dev/dri/render* | head -n 1) -u $(id -u):$(id -g) \
-v ${PWD}/models/public/resnet-50-tf:/opt/model -p 9001:9001 openvino/model_server:latest-gpu \
--model_path /opt/model --model_name resnet --port 9001 \
--plugin_config '{"PERFORMANCE_HINT": "LATENCY"}' \
--target_device GPU
Note
不应将 NUM_STREAMS 和 PERFORMANCE_HINT 结合使用。
调整 CPU 和 GPU 目标设备中的流的数量¶
可以针对单客户端用例或高并发场景调优 OpenVINO™ 模型服务器。此操作通过设置执行流的数量来完成。它们将分割可用资源,方便并行执行多个请求。 对于无法有效使用全部 CPU 核心的模型,或者对于核心数高的 CPU 而言,这种方法特别高效。
默认情况下,根据可用 CPU 的数量来计算流的数量。它在单客户端场景和高并发场景之间提供了一个折衷方案。
如果此默认配置不适合,请使用作为设备插件配置的一部分定义的 NUM_STREAMS 参数对其进行调整。
在并行连接数接近于 1 的场景中,设置以下参数:
--plugin_config '{"NUM_STREAMS": "1"}'
当并发请求数较高时,请增加流的数量。但是,要确保流的数量低于并发推理操作的平均数量。否则,服务器可能得不到充分利用。 流的数量不应超过 CPU 核心数。
例如,如果有大约 50 个客户端向 48 核服务器发送请求,那么将流的数量设置为 24:
--plugin_config '{"NUM_STREAMS": "24"}'
REST API 调用中的输入数据¶
使用 REST API 时,您可以调整数据格式,以优化 json 格式通信和反序列化。以下是要在使用 OpenVINO 模型服务器时有效使用 REST 接口的一些技巧:
可能的情况下使用 二进制数据格式 (对于 TFS API,仅支持对 JPEG/PNG 输入采用二进制数据格式,对于 KFS API,没有此类限制),二进制数据在大小上要小于请求大小,更容易在服务器端进行处理。
使用图像时,请考虑直接发送 JPEG/PNG,压缩后的数据将大大减少流量,加快通信。
采用 JPEG/PNG 时,使用配置模型的分辨率发送图像最为高效。这样即可避免在服务器上调整图像大小以适应模型。
如果决定发送 JSON 对象中的数据,请尝试调整数字数据类型,以缩减消息大小,即采用类似
np.round(imgs.astype(np.float),decimals=2)的命令降低 JSON 消息中的数字精度。
可扩展性¶
OpenVINO 模型服务器可通过添加更多资源实现纵向扩展,或者通过在多个主机上添加更多服务实例实现横向扩展。
当托管 CPU 资源受限的 OVMS 的多个实例时,最好确保容器的 CPU 相关性。 可通过 面向 Kubernetes 的 CPU 管理器 进行排列。
Docker 中的对等项将通过选项 --cpuset-cpus (而非 --cpus )启动容器。
如果使用 CPU 插件进行推理,那么调整诸如以下的配置参数也可能有所帮助:
参数 |
描述 |
|---|---|
INFERENCE_NUM_THREADS |
指定 CPU 插件应用于推理的线程数。 |
相关性 |
将推理线程与 CPU 核心绑定。 |
NUM_STREAMS |
指定吞吐量模式的执行流的数量 |
Note
如欲了解有关所有参数的其他信息,请阅读 OpenVINO 支持的插件 。
示例:遵循 Docker 命令可将
NUM_STREAMS参数设置为值1:
docker run --rm -d --cpuset-cpus 0,1,2,3 -v ${PWD}/models/public/resnet-50-tf:/opt/model -p 9001:9001 openvino/model_server:latest \
--model_path /opt/model --model_name resnet --port 9001 \
--plugin_config '{"NUM_STREAMS": "1"}'
Note
利用运算器,可以在 Kubernetes 和 OpenShift 中自动部署 OpenVINO 模型服务器(包括自动扩展功能)。 阅读更多相关信息 <https://github.com/openvinotoolkit/operator/blob/main/docs/autoscaling.md>`__
CPU 功耗管理设置¶
为节省功耗,操作系统可以降低 CPU 频率并增加延迟值的波动。同样,英特尔® 睿频加速技术也会影响结果的稳定性。为尽可能提高重现性,请考虑将频率锁定在处理器基本频率(请参阅 https://ark.intel.com/ 了解特定 CPU 的基本频率)。例如,在 Linux 中,为 /sys/devices/system/cpu/cpu* 条目设置相关值时就运用了这一技巧。阅读更多内容 。另外还存在 cpupower 等高级命令:
$ cpupower frequency-set --min 3.1GHz
调整模型服务器配置参数¶
C++ 实现中的 OpenVINO 模型服务器使用可扩展的多线程 gRPC 和 REST 接口,但在某些硬件配置中,这可能会成为 OpenVINO 高性能后端的瓶颈。
为增加吞吐量,引入了参数
--grpc_workers,用于增加 gRPC 服务器实例的数量。在大多数情况下,使用默认值1即可。如果负载特别重且存在许多并行连接,那么较高的值可能会提高传输速率。影响性能的另一个参数是
nireq。它定义用于执行推理的模型队列的大小。此大小应至少等于分配的 OpenVINO 流的数量量或预期的并行客户端数 (grpc_wokers >= nireq)。参数
file_system_poll_wait_seconds定义模型服务器将检查是否在模型存储库中创建了新模型版本的频率。默认值为 1 秒,以确保对创建新模型版本及时作出响应。在某些情况下,可能建议降低轮询频率,甚至将其禁用。例如,使用云存储时,这可能给存储云提供商带来 API 调用成本。检测新版本的功能 可通过值0禁用。当结合使用大小和复杂度处于平均水平的模型时,收集指标所造成的性能开销可以忽略。然而,当结合使用轻量级的快速模型时,与实际推理相比,指标增量所耗用的 CPU 时间占比明显。在启用此类模型的指标时需要考虑到这一点。
日志级别
DEBUG会生成大量日志。通常,生成日志对总体性能的影响可忽略不计,但对于吞吐量很高的用例,考虑使用--log_level INFO,这也是默认设置。
插件配置¶
您可以借助一系列参数来调整执行行为,具体取决于进行推理操作所采用的设备。每个设备均由其 OpenVINO 插件处理。
Note
如欲了解更多信息,请阅读 全部插件的支持配置参数 。
模型的插件配置是通过网络负载传递至 OpenVINO 插件的 param:value 对的词典。可通过 plugin_config 参数进行设置。
遵循 Docker 命令可将参数 NUM_STREAMS 设置为值 32 ,将 AFFINITY 设置为 NUMA 。
docker run --rm -d -v ${PWD}/models/public/resnet-50-tf:/opt/model -p 9001:9001 openvino/model_server:latest \
--model_path /opt/model --model_name resnet --port 9001 --grpc_workers 8 --nireq 32 \
--plugin_config '{"NUM_STREAMS": "32", "AFFINITY": "NUMA"}'
分析性能问题¶
调查可实现的性能并发现瓶颈的建议步骤:
-
注意 :使用
-dump_config将插件配置从基准测试应用中删除,然后使用加载到 OVMS 的模型中的相同插件配置,这将十分有帮助 注意: 启动基准测试应用时使用-inference_only=false。否则,如果推理与 OVMS 的流不同类,则 OV 每次会避开设置其输入张量。 在 OVMS 所在的同一机器上 启动 OVMS 基准测试客户端
从远程机器 启动 OVMS 基准测试客户端
使用 iperf 等工具测量可实现的网络带宽