目录
介绍
模型服务器在将AI模型从开发引入生产方面发挥着至关重要的作用。模型通过网络终结点提供,这些终结点公开API以运行预测。这些微服务抽象推理执行,同时提供可扩展性和高效的资源利用率。
在这篇博客中,您将学习如何使用OpenVINO™ Operator for Kubernetes 的关键功能。我们将演示如何在两种情况下部署和使用OpenVINO模型服务器:
- 提供单个模型
- 为多个模型的管道提供服务
Kubernetes为部署模型服务器提供了最佳环境,但在大规模部署中管理这些资源可能具有挑战性。使用我们的Kubernetes运算符使这变得更容易。
通过操作员中心安装
OpenVINO Operator可以从OperatorHub 安装在Kubernetes集群中。只需搜索OpenVINO,然后单击“安装”按钮。
在Kubernetes中提供单个OpenVINO模型
通过使用提供的CRD定义名为模型服务器的自定义资源,创建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 service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
AGE
ovms-sample ClusterIP 10.98.164.11 <none> 8080/TCP,8081/TCP
5m30s
现在模型已经部署并准备好接受请求,我们可以将ovms-sample服务与我们的Python客户端(称为ovmsclient)一起使用。
向服务发送推理请求
下面的示例显示了如何在运行它的同一个Kubernetes集群中使用ovms-sample服务。要创建客户端容器,请启动与安装了Python的容器的交互式会话:
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
下载zebra的示例图像:
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,它代表“斑马”。
为多模型管道提供服务
在运行提供单个OpenVINO模型的简单用例后,让我们探索多模型车辆分析管道的更高级方案。此管道利用OpenVINO模型服务器中的有向无环图功能。
本演示中的其余步骤需要’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配置映射挂载。
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.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
为了测试管道,我们可以对单个模型使用与上一个示例相同的客户端容器。从客户端容器外壳内部下载示例映像进行分析:
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模型服务器使在Kubernetes环境中部署和管理推理服务变得容易。在此博客中,我们学习了如何使用ovmsclient Python库运行预测,该库既有单个模型场景,也有使用DAG管道的多个模型。
在GitHub - openvinotoolkit/operator: OpenVINO operator for OpenShift and Kubernetes 上了解有关操作员的更多信息
另请查看OpenVINO模型服务器的其他演示Demos — OpenVINO™ documentation
资源
通知和免责声明
性能因使用、配置和其他因素而异。在性能指数网站上了解更多信息。
没有任何产品或组件是绝对安全的。
英特尔不控制或审核第三方数据。您应该咨询其他来源以评估准确性。
英特尔不承担所有明示和暗示的担保,包括但不限于对适销性、特定用途适用性和不侵权的暗示担保,以及因履行过程、交易过程或贸易使用而产生的任何保证。
您的费用和结果可能会有所不同。
英特尔技术可能需要启用硬件、软件或服务激活。
©英特尔公司。英特尔、英特尔徽标和其他英特尔标志是英特尔公司或其子公司的商标。其他名称和品牌可能声称是他人的财产。
本文最初发表于https://medium.com/openvino-toolkit/deploy-ai-inference-with-openvino-and-kubernetes-a8905df45e47
https://www.codeproject.com/Articles/5337273/Deploy-AI-Inference-with-OpenVINO-and-Kubernetes