使用 OpenVINO™ 和 Kubernetes 部署 AI 推理






4.64/5 (4投票s)
在本文中,您将学习如何使用 OpenVINO™ Operator for Kubernetes 的主要功能。
引言
模型服务器在将 AI 模型从开发引入生产方面发挥着至关重要的作用。模型通过网络端点提供服务,这些端点公开 API 来运行预测。这些微服务抽象了推理执行,同时提供了可扩展性和高效的资源利用率。
在本博客中,您将学习如何使用 OpenVINO™ Operator for Kubernetes 的主要功能。我们将演示如何在两种场景下部署和使用 OpenVINO Model Server
- 服务单个模型
- 服务多个模型的管道
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。
资源
声明和免责声明
性能因使用情况、配置和其他因素而异。在性能指标网站上了解更多信息。
没有任何产品或组件可以绝对安全。
英特尔不控制或审计第三方数据。 您应该查阅其他来源来评估准确性。
英特尔不对任何明示或暗示的保证承担任何责任,包括但不限于对适销性、特定用途的适用性以及非侵权性的暗示保证,以及因履行过程、交易过程或贸易用途而产生的任何保证。
您的成本和结果可能会有所不同。
英特尔技术可能需要启用硬件、软件或服务激活。
© 英特尔公司。英特尔、英特尔徽标和其他英特尔标志是英特尔公司或其子公司的商标。其他名称和品牌可能是其他方的财产。