使用 OpenVINO™ 和 Kubernetes 部署 AI 推理应用

9 篇文章 0 订阅

作者: 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=python3.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-sample8080”model_metadata = client.get_model_metadatamodel_name=“resnet”

printmodel_metadata

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

{'model_version' 1 'inputs' {'map/TensorArrayStack/TensorArrayGatherV30' {'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-sample8080”with open“/tmp/zebra.jpeg” “rb” as f data = f.read()

inputs = {“map/TensorArrayStack/TensorArrayGatherV30” data}results = client.predictinputs=inputs model_name=“resnet”

print“Detected class np.argmaxresults))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_analysis_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-pipeline8080”with open“/tmp/road1.jpg” “rb” as f data = f.read()

inputs = {“image” data}

results = client.predictinputs=inputs model_name=“multiple_vehicle_recognition”

print“Returned outputsresults.keys())

EOL

使用以下命令运行预测:

python /tmp/pipeline.py

Returned outputs dict_keys['colors' 'vehicle_coordinates' 'types' 'vehicle_images' 'confidence_levels']

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

结论

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

大家可以在 GitHub - openvinotoolkit/operator: OpenVINO operator for OpenShift and Kubernetes 上了解有关操作员的更多信息

另欢迎查看 Demos — OpenVINO™ documentation 上使用OpenVINO Model Server的其他演示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FoxJK1015

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值