本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
推理
本指南介绍如何在 PyTorch 或 TensorFlow 模型上运行推理服务。
如果您已经创建了集群并在上部署 KubeflowAWS,则可以开始本教程。如果不是,请按照中的步骤操作AWS安装时的 Kubeflow。根据您的集群设置选择 CPU 或 GPU 示例。推理示例在单节点配置上运行。
TensorFlow使用 kServe 进行CPU推断
KServe 在 Kubernetes 上为常见的机器学习 (ML) 框架启用无服务器推理。框架包括 TensorFlow xgBoost 或 PyTorch。kServe 是在开启 Kubeflow 的情况下预安装的AWS。在本教程中,您将创建一个 kServe 服务来在 CPU 集群上运行 TensorFlow 模型推断。
注意
在本示例中,该服务在集群内部 IP 上公开ClusterIP
。在生产环境中,您可能需要使用负载均衡器在外部公开推理服务。
-
在 Kubeflow 1.7 中,默认情况下,推理服务不通过 kubeflow-gateway 配置外部 DNS。要解决此问题,请运行以下命令,除非您已经配置了自定义域。有关更多详细信息,请关注此GitHub 问题
。 kubectl patch cm config-domain --patch '{"data":{
"example.com"
:""}}' -n knative-serving -
利用以下内容创建
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" -
将服务描述应用于集群中的 pod。
kubectl apply -f tf_inference.yaml -n ${NAMESPACE}
如下所示。
inferenceservice.serving.kserve.io/flower-sample created
-
READY
通过运行以下命令检查推理服务的状态以确保其处于状态。推理服务可能需要几分钟才能启动。kubectl get inferenceservices flower-sample -n ${NAMESPACE}
在命令输出中,部署状态应
true
在READY
列下方。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
-
使用以下命令查看集群状态。
kubectl get pods -n ${NAMESPACE}
通过检查命令输出来确认 pod
Running
处于状态。STATUS
NAME READY STATUS RESTARTS AGE flower-sample-predictor-default-00001-deployment-76c89dc6c47cvl 3/3 Running 0 24s
-
要进一步描述 pod,请运行以下命令。
kubectl describe pod
pod_name
-n ${NAMESPACE} -
要访问推理服务,请将端口从容器转发到主机。在典型的推理服务部署中,您很可能需要使用负载均衡器设置更永久的解决方案。此命令在终端的前台持续运行。
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
-
使用此命令下载输入样本数据。该命令创建一个
flower_input.json
包含示例数据的文件。curl https://raw.githubusercontent.com/kserve/kserve/release-0.8/docs/samples/v1beta1/tensorflow/input.json -o flower_input.json
-
在单独的终端中,通过创建和运行以下脚本登录推理服务。
-
打开
vi
或vim
,然后将以下脚本复制并粘贴到名为的文件中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))
-
要使用示例输入数据运行预测,请使用以下命令运行上面的脚本。
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
-
-
如下所示。
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 ] } ] }
清除有关在使用完集群后对其进行清理的信息,请参阅。