介绍
在这篇博客中,您将学习如何使用OpenVINO Model Server中的gRPC API对JPEG图像执行推理。Model servers在顺利地将模型从开发环境引入生产方面发挥着重要作用。它们通过网络终结点提供模型,并公开用于与之交互的 API。提供模型后,需要一组函数才能从我们的应用程序调用 API。
OpenVINO™ Model Server和TensorFlow Serving共享相同的前端API,这意味着我们可以使用相同的代码与两者进行交互。对于Python开发人员来说,典型的起点是使用tensorflow-serving-api pip包。不幸的是,由于这个软件包包含TensorFlow作为依赖项,因此它的占用空间相当大。
迈向轻量级客户之路
由于tensorflow-serving- api及其依赖项的大小约为1.3GB,因此我们决定创建一个轻量级客户端,仅具有执行API调用所需的功能。在最新版本的OpenVINO Model Server中,我们引入Model了Python客户端库的预览版 - ovmsclient。这个新软件包及其所有依赖项都不到100MB - 使其 比tensorflow-serving-api小13倍。
Python 环境比较。请注意与客户端一起安装的包数的差异。
除了具有更大的二进制大小之外,在应用程序中导入tensorflow-serving- api还会消耗更多内存。请参阅下面为执行相同操作的 Python 脚本运行 top 命令的结果 —
一个使用 tensorflow-serve-api,另一个使用内存使用情况比较。
包 |
VIRT [KB] |
RES [KB] |
SHR [KB] |
tensorflow-serving-api |
4543760 |
293516 |
155708 |
ovmsclient |
3500296 |
52008 |
23040 |
请注意 RES [KB] 列中的差异,该列指示任务使用的物理内存量。
导入占用空间较大的包也会增加初始化时间,这是使用轻量级客户端的另一个好处。新的Python客户端包也比tensorflow-serving- api更易于使用,因为它为与模型服务器的端到端交互提供了实用程序。使用 ovmsclient 时,应用程序开发人员不需要知道服务器 API 的详细信息。该软件包为交互的每个阶段提供了一组方便的功能 -从设置连接和进行API调用,到以标准格式解压缩结果。以前,开发人员需要知道哪个服务接受什么类型的请求,或者如何手动准备请求和处理响应。
让我们使用 ovmsclient
要使用 ResNet-50 图像分类模型运行预测,请使用该模型部署 OpenVINO Model Server。您可以使用以下命令执行此操作:
docker run -d --rm -p 9000:9000 openvino/model_server:latest \
--model_name resnet --model_path gs://ovms-public-eu/resnet50-binary \
--layout NHWC:NCHW --port 9000
此命令使用从 Google Cloud Storage 上的公共存储桶下载的 ResNet-50 模型启动服务器。 使用模型服务器侦听 端口 9000 上的 gRPC 调用,您可以开始与服务器交互。接下来,让我们使用 pip 安装 ovmsclient 包:
pip3 install ovmsclient
在运行客户端之前,下载图像进行分类和相应的ImageNet标签文件,以解释预测结果:
wget https://raw.githubusercontent.com/openvinotoolkit/model_server/main/demos/common/static/images/zebra... wget https://raw.githubusercontent.com/openvinotoolkit/model_server/main/demos/common/python/classes.py
用于预测的斑马的图片
步骤 1:创建与服务器的 gRPC 连接:
现在,您可以打开 Python interpreter并创建 与模型服务器的 gRPC 连接。
$ python3
Python 3.6.9 (default, Jul 17 2020, 12:50:27)
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>> from ovmsclient import make_grpc_client
>> client = make_grpc_client("localhost:9000")
步骤 2:请求模型元数据:
客户端对象有三种方法: get_model_status、get_model_metadata和预测。要创建有效的推理请求,您需要知道模型输入。为此,让我们请求模型元数据:
>> client.get_model_metadata(model_name= "resnet")
{'model_version': 1, 'inputs': {'0': {'shape': [1, 224, 224, 3], 'dtype': 'DT_FLOAT'}}, 'outputs': {'1463': {'shape': [1, 1000], 'dtype': 'DT_FLOAT'}}}
步骤 3:将 JPEG 图像发送到服务器:
从模型元数据中,我们了解到模型有一个输入和一个输出。输入名称为“0”,它需要形状为 (1,224,224,3)的数据,并带有浮点数据类型。现在,您拥有了运行推理所需的所有信息。让我们使用在上一步中下载的斑马的图像。在此示例中,我们将使用模型服务器二进制输入功能,该功能只需要加载 JPEG 并请求对编码的二进制文件进行预测 - 使用二进制输入时不需要预处理。
>> with open("zebra.jpeg", "rb") as f:
... img = f.read()
...
>> output = client.predict(inputs={ "0": img}, model_name= "resnet")
>> type(output)
>> output.shape
(1, 1000)
步骤 4:将输出映射到 imagenet 类:
预测成功返回,输出形状为 numpy ndarray (1, 1000) - 与“输出”部分的模型元数据中描述的相同。下一步是解释模型输出并提取分类结果。
输出的形状为 (1, 1000),其中第一个维度表示批大小(处理的图像数),第二个维度表示图像属于每个 ImageNet 类的概率。若要获取分类结果,需要获取输出第二维度中最大值的索引。然后 使用imagenet_classes 上一步中下载的 classes.py 字典执行索引号到类名的映射并查看结果。
>>> import numpy as np
>>> from classes import imagenet_classes
>>> result_index = np.argmax(output[0])
>>> imagenet_classes[result_index]
'zebra'
结论
新的 ovmsclient 包比 tensorflow-serving-api 更小,消耗更少的内存,并且更易于使用。在这篇博客中,我们学习了如何获取模型元数据,以及如何通过 OpenVINO 模型服务器中的 gRPC 接口对二进制编码的 JPEG 图像运行预测。
查看有关使用 NumPy 数组运行预测、检查模型状态以及在 GitHub 上使用 REST API 的更多详细信息示例:https://github.com/openvinotoolkit/model_server/tree/main/client/python/ovmsclient/samples
要了解有关 ovmsclient 功能的更多信息,请参阅 API 文档:
https://github.com/openvinotoolkit/model_server/blob/main/client/python/ovmsclient/lib/docs/README.m...
这是客户端库的第一个版本。它将 随着时间的推移而发展,但 已经能够使用 OpenVINO Model Server和TensorFlow Serving运行预测,只需一个最小的Python包。有问题或建议吗?请在 GitHub 上提出问题。