• 使用 OpenVINO™和 Kubernetes 部署 AI 推理产品


    作者: 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         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 库来收集模型的元数据:

    1. from ovmsclient import make_grpc_clientclient = make_grpc_client(“ovms-sample:8080”)model_metadata = client.get_model_metadata(model_name=“resnet”)
    2. print(model_metadata)

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

    {'model_version'1'inputs': {'map/TensorArrayStack/TensorArrayGatherV3:0': {'shape': [-1, -1, -1, -1], 'dtype''DT_FLOAT'}}, 'outputs': {'softmax_tensor': {'shape': [-11001], 'dtype''DT_FLOAT'}}}

    现在创建一个简单的Python脚本来对斑马的JPEG图像进行分类:

    1. cat >> /tmp/predict.py <
    2. from ovmsclient import make_grpc_client
    3. import numpy as np
    4. client = make_grpc_client(“ovms-sample:8080”)with open(“/tmp/zebra.jpeg”, “rb”) as f: data = f.read()
    5. inputs = {“map/TensorArrayStack/TensorArrayGatherV3:0”: data}results = client.predict(inputs=inputs, model_name=“resnet”)
    6. print(“Detected class:”, np.argmax(results))EOLpython /tmp/predict.py
    7. Detected class341

    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

    1. mc cp — recursive workspace/vehicle-detection-0202 mys3/models-repository/
    2. mc cp — recursive workspace/vehicle-attributes-recognition-barrier-0042 mys3/models-repository/
    3. mc ls -r mys3
    4. 43MiB models-repository/vehicle-attributes-recognition-barrier-0042/1/vehicle-attributes-recognition-barrier-0042.bin
    5. 118KiB models-repository/vehicle-attributes-recognition-barrier-0042/1/vehicle-attributes-recognition-barrier-0042.xml
    6. 7.1MiB models-repository/vehicle-detection-0202/1/vehicle-detection-0202.bin
    7. 331KiB models-repository/vehicle-detection-0202/1/vehicle-detection-0202.xml

    为了在 workspace/config.json 中使用以前创建的模型服务器配置文件,我们需要调整模型和自定义节点库的路径。

    下面的命令将模型路径更改为我们的 S3 存储桶,并将自定义节点库更改为 /config 文件夹,该文件夹将作为 Kubernetes 配置映射挂载。

    1. sed -i ‘s/\/workspace\/vehicle-detection-0202/s3:\/\/models-repository\/vehicle-detection-0202/g’ workspace/config.json
    2. sed -i ‘s/\/workspace\/vehicle-attributes-recognition-barrier-0042/s3:\/\/models-repository\/vehicle-attributes-recognition-barrier-0042/g’ workspace/config.json
    3. sed -i ‘s/workspace\/lib/config/g’ workspace/config.json

    接下来,将配置文件和自定义名称库添加到 Kubernetes 配置映射中:

    1. kubectl create configmap ovms-pipeline --from-file=config.json=workspace/config.json \
    2. --from-file=libcustom_node_model_zoo_intel_object_detection.so=workspace/lib/libcustom_node_model_zoo_intel_object_detection.so

    现在,我们已准备好使用管道配置部署模型服务器。使用 kubectl 应用以下 ovms-pipeline.yaml 配置。

    1. apiVersion: intel.com/v1alpha1
    2. kind: ModelServer
    3. metadata:
    4. name: ovms-pipeline
    5. spec:
    6. image_name: openvino/model_server:latest
    7. deployment_parameters:
    8. replicas: 1
    9. models_settings:
    10. single_model_mode: false
    11. config_configmap_name: "ovms-pipeline"
    12. server_settings:
    13. file_system_poll_wait_seconds: 0
    14. log_level: "INFO"
    15. service_parameters:
    16. grpc_port: 8080
    17. rest_port: 808
    18. service_type: ClusterIP
    19. models_repository:
    20. storage_type: "s3"
    21. aws_access_key_id: minioadmin
    22. aws_secret_access_key: minioadmin
    23. aws_region: us-east-1
    24. s3_compat_api_endpoint: http://mys3.example.com:9000kubectl apply -f ovms-pipeline.yamlThat creates the service with the model server
    25. kubectl get service
    26. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    27. ovms-pipeline ClusterIP 10.99.53.175 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

    1. cat >> /tmp/pipeline.py <
    2. from ovmsclient
    3. import make_grpc_clientimport numpy as np
    4. client = make_grpc_client(“ovms-pipeline:8080”)with open(“/tmp/road1.jpg”, “rb”) as f: data = f.read()
    5. inputs = {“image”: data}
    6. results = client.predict(inputs=inputs, model_name=“multiple_vehicle_recognition”)
    7. print(“Returned outputs:”,results.keys())
    8. EOL

    使用以下命令运行预测:

    1. python /tmp/pipeline.py
    2. 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