使用 OpenVINO™ 和 Kubernetes 部署 AI 推理产品

openlab_4276841a 更新于 1年前

作者: Dariusz Trawinski

译: 李翊玮

模型服务器(Model Server)将AI模型从产品开发到生产方面发挥着至关重要的作用。模型通过网络节点提供,这些节点公开 API 以运行预测。这些微服务执行抽象推理,同时提供可扩展性和高效的资源利用率。

在这篇博客中,您将可学习到如何使用 OpenVINO™ Operator for Kubernetes 里的主要功能。我们将演示如何在以下两种情况下部署和使用OpenVINO模型服务器:

1. 提供单一模型服务

2. 为多个模型的管道(Pipeline)提供服务

Kubernetes 为部署模型服务器提供了最佳环境,但在大规模部署中管理这些资源可能具有挑战性。使用 Kubernetes 运算符可以简化此操作。


通过 OperatorHub 安****>

OpenVINO Operator 可以从 OperatorHub 安装到 Kubernetes 集群(Cluster)中。只需搜索OpenVINO,然后单击“安装(Install)”按钮。



在 Kubernetes 中提供单个 OpenVINO 模型服务

通过使用CRD 定义名为 ModelServer 的自定义资源,创建 OpenVINO 模型服务器的新实例。此处介绍了所有参数  。

在下面的示例中,我们部署了一个功能齐全的模型服务器以及从 Google Cloud 存储中提取的 ResNet-50 图像分类模型。

kubectl apply -f https://raw.githubusercontent.com/openvinotoolkit/operator/main/config/samples/intel_v1alpha1_ovms.yaml

成功的部署将创建一个名为 ovms-sample 的服务。

kubectl get serviceNAME         TYPE       CLUSTER-IP    EXTERNAL-IP  PORT(S)            AGEovms-sample  ClusterIP  10.98.164.11  <none>       8080/TCP,8081/TCP  5m30s

现在模型已经部署并准备好接受请求,我们可以将 ovms-sample 服务与 Python 客户端( ovmsclient)一起使用


已建好的服务发送推理请求

下面的示例演示如何使用 ovms-sample服务运行在同一 Kubernetes 集群中。要创建客户端容器,请在安装了 Python pod 的启动interactive session:

kubectl create deployment client-test --image=python:3.8.13 -- sleep infinitykubectl exec -it $(kubectl get pod -o jsonpath=“{.items[0].metadata.name}” -l app=client-test) -- bash

从客户端容器内部,我们将连接到模型服务器 API 结点。一个简单的 curl 命令列出了服务模型及其版本和状态:

curl http://ovms-sample:8081/v1/config{“resnet” :{ “model_version_status”: [ { “version”: “1”, “state”: “AVAILABLE”, “status”: { “error_code”: “OK”, “error_message”: “OK” } }]}

文档中介绍了其他 REST API 调用。

现在,让我们使用 ovmsclient Python 库来处理推理请求。创建一个虚拟环境并使用 pip 安装客户端:

python3 -m venv /tmp/venvsource /tmp/venv/bin/activatepip install ovmsclient

下载斑马的示例图像:

curl https://raw.githubusercontent.com/openvinotoolkit/model_server/main/demos/common/static/images/zebra.jpeg -o /tmp/zebra.jpeg

下面的 Python 代码使用 ovmsclient 库来收集模型的元数据:

from ovmsclient import make_grpc_clientclient = make_grpc_client(“ovms-sample:8080”)model_metadata = client.get_model_metadata(model_name=“resnet”)

print(model_metadata)

上面的代码返回以下响应:

{'model_version': 1, 'inputs': {'map/TensorArrayStack/TensorArrayGatherV3:0': {'shape': [-1, -1, -1, -1], 'dtype': 'DT_FLOAT'}}, 'outputs': {'softmax_tensor': {'shape': [-1, 1001], 'dtype': 'DT_FLOAT'}}}

现在创建一个简单的Python脚本来对斑马的JPEG图像进行分类:

cat >> /tmp/predict.py <<EOL 

from ovmsclient import make_grpc_client

import numpy as np

client = make_grpc_client(“ovms-sample:8080”)with open(“/tmp/zebra.jpeg”, “rb”) as f: data = f.read()

input*******ap/TensorArrayStack/TensorArrayGatherV3:0”: data}results = client.predict(inputs=input****odel_name=“resnet”)

print(“Detected class:”, np.argmax(results))EOLpython /tmp/predict.py

Detected class: 341

从 imagenet 检测到的类是 341,表示“斑马”。


为多个模型的管道(Pipeline)提供服务

在运行了为单个 OpenVINO 模型提供服务的简单用例之后,让我们探索多模型车辆分析管道的更高级场景。此管道利用  OpenVINO 模型服务器中的Directed Acyclic Graph功能。

此演示中的其余步骤需要 ‘mc ’ minio client binary并访问与兼容 S3的存储桶。有关详细信息,请参阅 Minio 快速入门

首先,使用下面的车辆分析管道示例准备所有依赖项:

git clone https://github.com/openvinotoolkit/model_server
cd model_server/demos/vehicle_****ysis_pipeline/pythonmake

上面的代码用来下载所需的模型并生成自定义库以运行管道,然后将这些文件放在工作区目录中。

将文件**到可在集群内访问的与 S3 兼容的共享存储。在下面的示例中,S3 服务器别名为 mys3

mc cp — recursive workspace/vehicle-detection-0202 mys3/models-repository/
mc cp — recursive workspace/vehicle-attributes-recognition-barrier-0042 mys3/models-repository/
mc ls -r mys3
43MiB models-repository/vehicle-attributes-recognition-barrier-0042/1/vehicle-attributes-recognition-barrier-0042.bin
118KiB models-repository/vehicle-attributes-recognition-barrier-0042/1/vehicle-attributes-recognition-barrier-0042.xml
7.1MiB models-repository/vehicle-detection-0202/1/vehicle-detection-0202.bin
331KiB models-repository/vehicle-detection-0202/1/vehicle-detection-0202.xml

为了在 workspace/config.json 中使用以前创建的模型服务器配置文件,我们需要调整模型和自定义节点库的路径。

下面的命令将模型路径更改为我们的 S3 存储桶,并将自定义节点库更改为 /config 文件夹,该文件夹将作为 Kubernetes 配置映射挂载。

sed -i ‘s/\/workspace\/vehicle-detection-0202/s3:\/\/models-repository\/vehicle-detection-0202/g’ workspace/config.json
sed -i ‘s/\/workspace\/vehicle-attributes-recognition-barrier-0042/s3:\/\/models-repository\/vehicle-attributes-recognition-barrier-0042/g’ workspace/config.json
sed -i ‘s/workspace\/lib/config/g’ workspace/config.json

接下来,将配置文件和自定义名称库添加到 Kubernetes 配置映射中:

kubectl create configmap ovms-pipeline --from-file=config.json=workspace/config.json \

--from-file=libcustom_node_model_zoo_intel_object_detection.so=workspace/lib/libcustom_node_model_zoo_intel_object_detection.so

现在,我们已准备好使用管道配置部署模型服务器。使用 kubectl 应用以下 ovms-pipeline.yaml 配置。

apiVersion: intel.com/v1alpha1
kind: ModelServer
metadata:
  name: ovms-pipeline
spec:
  image_name: openvino/model_server:latest
  deployment_parameters:
    replicas: 1
  models_settings:
    single_model_mode: false
    config_configmap_name: "ovms-pipeline"
  server_settings:
    file_system_poll_wait_seconds: 0
    log_level: "INFO"
  service_parameters:
    grpc_port: 8080
    rest_port: 808
    service_type: ClusterIP
  models_repository:
    storage_type: "s3"
    aws_access_key_id: minioadmin
    aws_secret_access_key: minioadmin
    aws_region: us-east-1
    s3_compat_api_endpoint: http://mys3.example.com:9000kubectl apply -f ovms-pipeline.yamlThat creates the service with the model server
kubectl get service
NAME           TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)              AGE
ovms-pipeline  ClusterIP   10.99.53.175  <none>      8080/TCP,8081/TCP    26m

若要测试管道,我们可对单个模型使用与上一示例相同的客户端容器。从客户端容器 shell 内部,下载示例映像以进行分析:

curl https://raw.githubusercontent.com/openvinotoolkit/model_server/main/demos/common/static/images/cars/road1.jpg -o /tmp/road1.jpg

cat >> /tmp/pipeline.py <<EOL

from ovmsclient

import make_grpc_clientimport numpy as np

client = make_grpc_client(“ovms-pipeline:8080”)with open(“/tmp/road1.jpg”, “rb”) as f: data = f.read()

inputs = {“image”: data}

results = client.predict(inputs=input****odel_name=“multiple_vehicle_recognition”)

print(“Returned outputs:”,results.keys())

EOL

使用以下命令运行预测:

python /tmp/pipeline.py

Returned outputs: dict_keys(['colors', 'vehicle_coordinates', 'types', 'vehicle_images', 'confidence_levels'])

上面的示例代码仅返回一个管道输出列表,而不进行数据解释。GitHub 上提供了更多用于车辆分析的客户端代码示例。


结论

OpenVINO 模型服务器使在 Kubernetes 环境中部署和管理推理服务变得容易。在这篇博客中,我们学习了如何使用 ovmsclient Python 库在单个模型方案和使用 DAG 管道的多个模型中运行预测。

大家可以在 https://github.com/openvinotoolkit/operator 上了解有关操作员的更多信息

另欢迎查看 https://docs.openvino.ai/2022.1/ovms_docs_demos.html 上使用OpenVINO Model Server的其他演示

0个评论