2.11. 使用 KServe 原始部署模式在单一节点 OpenShift 上部署模型
您可以通过在单一节点 OpenShift 中使用 KServe 原始部署模式来部署机器学习模型。原始部署模式与 Knative 相比提供多个优点,比如挂载多个卷。
在单一节点 OpenShift 上使用 KServe 原始部署模式部署机器学习模型是一个有限可用性功能。有限的可用性意味着您只能通过 Red Hat AI 事业部的特定批准方式安装和接收对该功能的支持。如果没有这样的批准,则不支持该功能。
先决条件
- 您已登陆到 Red Hat OpenShift AI。
- 具有集群管理员特权。
- 您已创建了一个具有至少 4 个 CPU 和 16 GB 内存的节点。
- 已安装 Red Hat OpenShift AI (RHOAI) Operator。
- 已安装 OpenShift 命令行界面(CLI)。有关安装 OpenShift 命令行界面(CLI)的更多信息,请参阅开始使用 OpenShift CLI。
- 已安装 KServe。
- 您可以访问 S3 兼容对象存储。
- 对于您要部署的模型,您知道 S3 兼容对象存储桶中的关联文件夹路径。
- 要使用 Caikit-TGIS 运行时,您需要将模型转换为 Caikit 格式。例如,请参阅 cai kit-tgis-serving 存储库中的 Hugging Face Hub 模型转换为 Caikit 格式。
- 如果要将图形处理单元(GPU)与模型服务器搭配使用,在 OpenShift AI 中启用了 GPU 支持。如果使用 NVIDIA GPU,请参阅启用 NVIDIA GPU。如果使用 AMD GPU,请参阅 AMD GPU 集成。
- 要使用 vLLM 运行时,已在 OpenShift AI 中启用 GPU 支持,并在集群中安装并配置了 Node Feature Discovery operator。如需更多信息,请参阅安装 Node Feature Discovery operator 和 启用 NVIDIA GPU。
流程
打开终端窗口并以集群管理员身份登录到 OpenShift 集群:
$ oc login <openshift_cluster_url> -u <admin_username> -p <password>
默认情况下,OpenShift 使用服务网格进行网络流量管理。因为 KServe 原始部署模式不需要服务网格,所以禁用 Red Hat OpenShift Service Mesh:
输入以下命令禁用 Red Hat OpenShift Service Mesh:
$ oc edit dsci -n redhat-ods-operator
在 YAML 编辑器中,将
serviceMesh
组件的managementState
值更改为Removed
,如下所示:spec: components: serviceMesh: managementState: Removed
- 保存更改。
创建一个项目:
$ oc new-project <project_name> --description="<description>" --display-name="<display_name>"
有关创建项目的详情,请参考使用项目。
创建数据科学项目:
-
在 Red Hat OpenShift web 控制台 Administrator 视图中,点 Operators
Installed Operators,然后点 Red Hat OpenShift AI Operator。 - 点 Data Science Cluster 选项卡。
- 点 Create DataScienceCluster 按钮。
- 在 Configure via 字段中,点 YAML 视图 单选按钮。
在 YAML 编辑器的
spec.components
部分中,配置kserve
组件,如下所示:kserve: defaultDeploymentMode: RawDeployment managementState: Managed serving: managementState: Removed name: knative-serving
- 点 Create。
-
在 Red Hat OpenShift web 控制台 Administrator 视图中,点 Operators
创建 secret 文件:
在命令行终端中,创建一个 YAML 文件来包含您的 secret 并添加以下 YAML 代码:
apiVersion: v1 kind: Secret metadata: annotations: serving.kserve.io/s3-endpoint: <AWS_ENDPOINT> serving.kserve.io/s3-usehttps: "1" serving.kserve.io/s3-region: <AWS_REGION> serving.kserve.io/s3-useanoncredential: "false" name: <Secret-name> stringData: AWS_ACCESS_KEY_ID: "<AWS_ACCESS_KEY_ID>" AWS_SECRET_ACCESS_KEY: "<AWS_SECRET_ACCESS_KEY>"
重要如果要在断开连接的部署中部署机器学习模型,请将
service.kserve.io/s3-verifyssl: '0'
添加到metadata.annotations
部分。- 使用文件名 secret.yaml 保存文件。
应用 secret.yaml 文件:
$ oc apply -f secret.yaml -n <namespace>
创建服务帐户:
创建一个 YAML 文件来包含您的服务帐户并添加以下 YAML 代码:
apiVersion: v1 kind: ServiceAccount metadata: name: models-bucket-sa secrets: - name: s3creds
有关服务帐户的详情,请参阅 了解并创建服务帐户。
- 使用文件名 serviceAccount.yaml 保存该文件。
应用 serviceAccount.yaml 文件:
$ oc apply -f serviceAccount.yaml -n <namespace>
为服务运行时创建 YAML 文件,以定义将为您的模型预测提供的容器镜像。以下是使用 OpenVino Model Server 的示例:
apiVersion: serving.kserve.io/v1alpha1 kind: ServingRuntime metadata: name: ovms-runtime spec: annotations: prometheus.io/path: /metrics prometheus.io/port: "8888" containers: - args: - --model_name={{.Name}} - --port=8001 - --rest_port=8888 - --model_path=/mnt/models - --file_system_poll_wait_seconds=0 - --grpc_bind_address=0.0.0.0 - --rest_bind_address=0.0.0.0 - --target_device=AUTO - --metrics_enable image: quay.io/modh/openvino_model_server@sha256:6c7795279f9075bebfcd9aecbb4a4ce4177eec41fb3f3e1f1079ce6309b7ae45 name: kserve-container ports: - containerPort: 8888 protocol: TCP multiModel: false protocolVersions: - v2 - grpc-v2 supportedModelFormats: - autoSelect: true name: openvino_ir version: opset13 - name: onnx version: "1" - autoSelect: true name: tensorflow version: "1" - autoSelect: true name: tensorflow version: "2" - autoSelect: true name: paddle version: "2" - autoSelect: true name: pytorch version: "2"
- 如果您使用上面的 OpenVINO Model Server 示例,请确保插入 YAML 代码中任何占位符所需的正确值。
- 使用适当的文件名保存文件。
应用包含服务运行时的文件:
$ oc apply -f <serving run time file name> -n <namespace>
创建 InferenceService 自定义资源(CR)。创建一个 YAML 文件,使其包含 InferenceService CR。使用之前使用的 OpenVINO Model Server 示例,以下是对应的 YAML 代码:
apiVersion: serving.kserve.io/v1beta1 kind: InferenceService metadata: annotations: serving.knative.openshift.io/enablePassthrough: "true" sidecar.istio.io/inject: "true" sidecar.istio.io/rewriteAppHTTPProbers: "true" serving.kserve.io/deploymentMode: RawDeployment name: <InferenceService-Name> spec: predictor: scaleMetric: minReplicas: 1 scaleTarget: canaryTrafficPercent: serviceAccountName: <serviceAccountName> model: env: [] volumeMounts: [] modelFormat: name: onnx runtime: ovms-runtime storageUri: s3://<bucket_name>/<model_directory_path> resources: requests: memory: 5Gi volumes: []
在 YAML 代码中,确保正确设置以下值:
-
serving.kserve.io/deploymentMode
必须包含RawDeployment
值。 -
modelFormat
必须包含模型格式的值,如onnx
。 -
storageUri
必须包含模型 s3 存储目录的值,如s3://<bucket_name>/<model_directory_path>
。 -
运行时
必须包含服务运行时的名称的值,如ovms-runtime
。
-
- 使用适当的文件名保存文件。
应用包含您的 InferenceService CR 的文件:
$ oc apply -f <InferenceService CR file name> -n <namespace>
验证所有 pod 是否都在集群中运行:
$ oc get pods -n <namespace>
输出示例:
NAME READY STATUS RESTARTS AGE <isvc_name>-predictor-xxxxx-2mr5l 1/1 Running 2 165m console-698d866b78-m87pm 1/1 Running 2 165m
验证所有 pod 是否在运行后,将服务端口转发到本地机器:
$ oc -n <namespace> port-forward pod/<pod-name> <local_port>:<remote_port>
确保将 <
namespace>
,<pod-name
> , <local
port> (这是模型服务器端口,如_port
> , <remote_8888
)替换为适合您的部署的值。
验证
-
使用您首选的客户端库或工具将请求发送到
localhost
inference URL。