推理 - AWS 深度学习容器

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

推理

本指南介绍如何在 PyTorch 或 TensorFlow 模型上运行推理服务。

如果您已经创建了集群并在上部署 KubeflowAWS,则可以开始本教程。如果不是,请按照中的步骤操作AWS安装时的 Kubeflow。根据您的集群设置选择 CPU 或 GPU 示例。推理示例在单节点配置上运行。

TensorFlow使用 kServe 进行CPU推断

KServe 在 Kubernetes 上为常见的机器学习 (ML) 框架启用无服务器推理。框架包括 TensorFlow xgBoost 或 PyTorch。kServe 是在开启 Kubeflow 的情况下预安装的AWS。在本教程中,您将创建一个 kServe 服务来在 CPU 集群上运行 TensorFlow 模型推断。

注意

在本示例中,该服务在集群内部 IP 上公开ClusterIP。在生产环境中,您可能需要使用负载均衡器在外部公开推理服务。

  1. 在 Kubeflow 1.7 中,默认情况下,推理服务不通过 kubeflow-gateway 配置外部 DNS。要解决此问题,请运行以下命令,除非您已经配置了自定义域。有关更多详细信息,请关注此GitHub 问题

    kubectl patch cm config-domain --patch '{"data":{"example.com":""}}' -n knative-serving
  2. 利用以下内容创建tf_inference.yaml名为。此示例指定了我们的推理服务使用的模型和 TensorFlow推理图像的远程位置。该模型是 kServe 提供的公开示例,无需修改即可使用。

    apiVersion: "serving.kserve.io/v1beta1" kind: "InferenceService" metadata: name: "flower-sample" annotations: sidecar.istio.io/inject: "false" spec: predictor: tensorflow: image: "763104351884.dkr.ecr.us-east-1.amazonaws.com/tensorflow-inference:2.11.1-cpu-py39-ubuntu20.04-ec2" storageUri: "gs://kfserving-examples/models/tensorflow/flowers"
  3. 将服务描述应用于集群中的 pod。

    kubectl apply -f tf_inference.yaml -n ${NAMESPACE}

    如下所示。

    inferenceservice.serving.kserve.io/flower-sample created
  4. READY通过运行以下命令检查推理服务的状态以确保其处于状态。推理服务可能需要几分钟才能启动。

    kubectl get inferenceservices flower-sample -n ${NAMESPACE}

    在命令输出中,部署状态应trueREADY列下方。

    NAME URL READY PREV LATEST PREVROLLEDOUTREVISION LATESTREADYREVISION AGE flower-sample http://flower-sample.kubeflow-user-example-com.example.com True 100 flower-sample-predictor-default-00001 3m31s
  5. 使用以下命令查看集群状态。

    kubectl get pods -n ${NAMESPACE}

    通过检查命令输出来确认 podRunning 处于状态。STATUS

    NAME READY STATUS RESTARTS AGE flower-sample-predictor-default-00001-deployment-76c89dc6c47cvl 3/3 Running 0 24s
  6. 要进一步描述 pod,请运行以下命令。

    kubectl describe pod pod_name -n ${NAMESPACE}
  7. 要访问推理服务,请将端口从容器转发到主机。在典型的推理服务部署中,您很可能需要使用负载均衡器设置更永久的解决方案。此命令在终端的前台持续运行。

    INGRESS_GATEWAY_SERVICE=$(kubectl get svc --namespace istio-system --selector="app=istio-ingressgateway" --output jsonpath='{.items[0].metadata.name}') kubectl port-forward --namespace istio-system svc/${INGRESS_GATEWAY_SERVICE} 8080:80
  8. 使用此命令下载输入样本数据。该命令创建一个flower_input.json包含示例数据的文件。

    curl https://raw.githubusercontent.com/kserve/kserve/release-0.8/docs/samples/v1beta1/tensorflow/input.json -o flower_input.json
  9. 在单独的终端中,通过创建和运行以下脚本登录推理服务。

    1. 打开vivim,然后将以下脚本复制并粘贴到名为的文件中inference_authentication.py。该脚本触发 OpenID Connect (OIDC) 交换,从而生成会话 cookie 来验证推理请求。

      import requests import os import json CLUSTER_IP = os.environ.get("CLUSTER_IP", "localhost:8080") DASHBOARD_URL = f"http://{CLUSTER_IP}" NAMESPACE = os.environ.get("NAMESPACE", "kubeflow-user-example-com") MODEL_NAME = os.environ.get("MODEL_NAME", "sklearn-iris") SERVICE_HOSTNAME = os.environ.get("SERVICE_HOSTNAME", "flower-sample.kubeflow-user-example-com.example.com") URL = f"http://{CLUSTER_IP}/v1/models/{MODEL_NAME}:predict" HEADERS = {"Host": f"{SERVICE_HOSTNAME}"} USERNAME = os.environ.get("USERNAME", "user@example.com") PASSWORD = os.environ.get("PASSWORD", "12341234") def load_json_file(filepath): with open(filepath) as file: return json.load(file) data = load_json_file("./flower_input.json") response = None def session_cookie(host, login, password): session = requests.Session() response = session.get(host) headers = { "Content-Type": "application/x-www-form-urlencoded", } data = {"login": login, "password": password} session.post(response.url, headers=headers, data=data) session_cookie = session.cookies.get_dict()["authservice_session"] return session_cookie cookie = {"authservice_session": session_cookie(DASHBOARD_URL, USERNAME, PASSWORD)} response = requests.post(URL, headers=HEADERS, json=data, cookies=cookie) print("Sending request to:", URL) status_code = response.status_code print("Status Code", status_code) if status_code == 200: print("JSON Response ", json.dumps(response.json(), indent=2))
    2. 要使用示例输入数据运行预测,请使用以下命令运行上面的脚本。

      export INGRESS_HOST=localhost export INGRESS_PORT=8080 export CLUSTER_IP=${INGRESS_HOST}:${INGRESS_PORT} export NAMESPACE=kubeflow-user-example-com export MODEL_NAME=flower-sample export SERVICE_HOSTNAME=$(kubectl get -n ${NAMESPACE} inferenceservice ${MODEL_NAME} -o jsonpath='{.status.url}' | cut -d "/" -f 3) export USERNAME=user@example.com export PASSWORD=12341234
      pip install requests
      python3 ./inference_authentication.py
  10. 如下所示。

    Sending request to: http://localhost:8080/v1/models/flower-sample:predict Status Code 200 JSON Response { "predictions": [ { "prediction": 0, "key": " 1", "scores": [ 0.999114931, 9.20989623e-05, 0.000136786606, 0.000337258854, 0.000300534302, 1.84814289e-05 ] } ] }

清除有关在使用完集群后对其进行清理的信息,请参阅。