65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 OpenVINO™ 和 Kubernetes 部署 AI 推理

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.64/5 (4投票s)

2022 年 7 月 19 日

CPOL

4分钟阅读

viewsIcon

4017

在本文中,您将学习如何使用 OpenVINO™ Operator for Kubernetes 的主要功能。

引言

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

在本博客中,您将学习如何使用 OpenVINO™ Operator for Kubernetes 的主要功能。我们将演示如何在两种场景下部署和使用 OpenVINO Model Server

  1. 服务单个模型
  2. 服务多个模型的管道

Kubernetes 为部署模型服务器提供了理想的环境,但在大规模部署中管理这些资源可能具有挑战性。使用我们的 Kubernetes Operator 可以使这一切变得更容易。

通过 OperatorHub 安装

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

在 Kubernetes 中服务单个 OpenVINO 模型

通过定义一个名为 ModelServer 的自定义资源,并使用提供的 CRD,来创建 OpenVINO Model Server 的新实例。所有参数都在这里进行了说明

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

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

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

kubectl get service

NAME         TYPE       CLUSTER-IP    EXTERNAL-IP  PORT(S)
AGE
ovms-sample  ClusterIP  10.98.164.11  <none>       8080/TCP,8081/TCP
5m30s

模型已部署并准备好接收请求,现在我们可以使用我们的 Python 客户端(称为 ovmsclient)来使用 ovms-sample 服务。

向服务发送推理请求

下面的示例展示了如何在其运行所在的同一个 Kubernetes 集群内部使用 ovms-sample 服务。要创建客户端容器,请启动一个安装了 Python 的 Pod 的交互式会话。

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/venv

source /tmp/venv/bin/activate

pip 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_client

client = 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()
inputs = {"map/TensorArrayStack/TensorArrayGatherV3:0": data}
results = client.predict(inputs=inputs, model_name="resnet")
print("Detected class:", np.argmax(results))
EOLpython /tmp/predict.py
Detected class: 341

从 imagenet 检测到的类别是 341,代表 `zebra`(斑马)。

服务多模型管道

在运行了服务单个 OpenVINO 模型的简单用例后,让我们探索更高级的场景:一个多模型的车辆分析管道。该管道利用了 OpenVINO Model Server 中的 有向无环图(DAG) 功能。

此演示的其余步骤需要 `mc` minio 客户端二进制文件以及对 S3 兼容存储桶的访问。有关更多信息,请参阅Minio 快速入门指南

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

git clone https://github.com/openvinotoolkit/model_server
cd model_server/demos/vehicle_analysis_pipeline/python
make

上面的命令下载所需的模型并构建一个自定义库来运行管道,然后将这些文件放在工作区目录中。将这些文件复制到集群内可访问的 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 ConfigMap 挂载。

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 ConfigMap 中。

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.yaml

That 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_client
import 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=inputs, model_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 Model Server 使在 Kubernetes 环境中部署和管理推理服务变得容易。在本博客中,我们学习了如何使用 ovmsclient Python 库进行预测,包括单模型场景和使用 DAG 管道处理多模型。

https://github.com/openvinotoolkit/operator 上了解更多关于该 Operator 的信息。

还可以查看 OpenVINO Model Server 的其他演示:https://docs.openvino.ai/2022.1/ovms_docs_demos.html

资源

声明和免责声明

性能因使用情况、配置和其他因素而异。在性能指标网站上了解更多信息。

没有任何产品或组件可以绝对安全。

英特尔不控制或审计第三方数据。 您应该查阅其他来源来评估准确性。

英特尔不对任何明示或暗示的保证承担任何责任,包括但不限于对适销性、特定用途的适用性以及非侵权性的暗示保证,以及因履行过程、交易过程或贸易用途而产生的任何保证。

您的成本和结果可能会有所不同。

英特尔技术可能需要启用硬件、软件或服务激活。

© 英特尔公司。英特尔、英特尔徽标和其他英特尔标志是英特尔公司或其子公司的商标。其他名称和品牌可能是其他方的财产。

© . All rights reserved.