作者: Dariusz Trawinski
编译: 李翊玮
模型服务器(Model Server)将AI模型从产品开发到生产方面发挥着至关重要的作用。模型通过网络节点提供,这些节点公开 API 以运行预测。这些微服务执行抽象推理,同时提供可扩展性和高效的资源利用率。
在这篇博客中,您将可学习到如何使用 OpenVINO™ Operator for Kubernetes 里的主要功能。我们将演示如何在以下两种情况下部署和使用OpenVINO模型服务器:
Kubernetes 为部署模型服务器提供了最佳环境,但在大规模部署中管理这些资源可能具有挑战性。使用 Kubernetes 运算符可以简化此操作。
OpenVINO Operator 可以从 OperatorHub 安装到 Kubernetes 集群(Cluster)中。只需搜索OpenVINO,然后单击“安装(Install)”按钮。
通过使用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
现在模型已经部署并准备好接受请求,我们可以将 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 <
- 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,表示“斑马”。
为多个模型的管道(Pipeline)提供服务
在运行了为单个 OpenVINO 模型提供服务的简单用例之后,让我们探索多模型车辆分析管道的更高级场景。此管道利用 OpenVINO 模型服务器中的Directed Acyclic Graph功能。
此演示中的其余步骤需要 ‘mc ’ minio client binary并访问与兼容 S3的存储桶。有关详细信息,请参阅 Minio 快速入门。
首先,使用下面的车辆分析管道示例准备所有依赖项:
git clone GitHub - openvinotoolkit/model_server: A scalable inference server for models optimized with OpenVINO™
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
8080/TCP,8081/TCP 26m
若要测试管道,我们可对单个模型使用与上一示例相同的客户端容器。从客户端容器 shell 内部,下载示例映像以进行分析:
- cat >> /tmp/pipeline.py <
- 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=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 上了解有关操作员的更多信息
另欢迎查看 Demos — OpenVINO™ documentation 上使用OpenVINO Model Server的其他演示
-
相关阅读:
JVM 一些常见问题Q&A
uniapp微信小程序系列(2)pages.json实用配置详解
【golang】实现通用的get/post请求(接受一个 URL 和一个结构体参数)
科研TCO-PEG-alginate|反式环辛烯-聚乙二醇-海藻酸钠|TCO-PEG-海藻酸钠
CNN反向传播源码实现——CNN数学推导及源码实现系列(4)
神经网络滤镜使用技巧图,神经滤镜为什么不能用
22-07-26 西安 ElasticSearch(01)
抗疫专题网页设计 致敬最美逆行者网页制作 疫情感动人物静态HTML网页
MySQL查询某个字段含有字母数字的值
Selenium 浏览器坐标转桌面坐标
-
原文地址:https://blog.csdn.net/gc5r8w07u/article/details/126588605