第 4 章 部署 Red Hat AI Inference Server and inference service the model
通过配置 secret、持久性存储和部署自定义资源(CR)来使用 OpenShift Container Platform 部署语言模型,该资源从 Hugging Face 拉取模型,并使用 Red Hat AI Inference Server 为对模型提供服务。
先决条件
-
已安装 OpenShift CLI(
oc)。 -
您已以具有
cluster-admin权限的用户身份登录。 - 您已为底层 AI 加速器硬件安装了 NFD 和所需的 GPU Operator。
流程
为 Hugging Face 令牌创建
Secret自定义资源(CR)。集群使用SecretCR 从 Hugging Face 中拉取模型。使用您在 Hugging Face 中设置的令牌,设置
HF_TOKEN变量。$ HF_TOKEN=<your_huggingface_token>将集群命名空间设置为与部署 Red Hat AI Inference Server 镜像的位置匹配,例如:
$ NAMESPACE=rhaiis-namespace在集群中创建
SecretCR:$ oc create secret generic hf-secret --from-literal=HF_TOKEN=$HF_TOKEN -n $NAMESPACE
创建 Docker secret,以便集群可以从容器 registry 下载 Red Hat AI Inference Server 镜像。例如,要创建一个包含本地
~/.docker/config.json文件内容的SecretCR,请运行以下命令:oc create secret generic docker-secret --from-file=.dockercfg=$HOME/.docker/config.json --type=kubernetes.io/dockercfg -n rhaiis-namespace创建
PersistentVolumeClaim(PVC)自定义资源(CR),并在集群中应用它。以下示例PVCCR 使用默认的 IBM VPC Block 持久性卷。您可以使用PVC作为存储您下载的模型的位置。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: model-cache namespace: rhaiis-namespace spec: accessModes: - ReadWriteOnce resources: requests: storage: 20Gi storageClassName: ibmc-vpc-block-10iops-tier注意配置集群存储以满足您的要求超出了此步骤的范围。如需更多信息,请参阅 配置持久性存储。
创建一个
Deployment自定义资源(CR),从 Hugging Face 拉取模型,并部署 Red Hat AI Inference Server 容器。参考以下示例DeploymentCR,它使用 AI Inference Server 在 CUDA 加速器上提供 Granite 模型。apiVersion: apps/v1 kind: Deployment metadata: name: granite namespace: rhaiis-namespace1 labels: app: granite spec: replicas: 1 selector: matchLabels: app: granite template: metadata: labels: app: granite spec: imagePullSecrets: - name: docker-secret volumes: - name: model-volume persistentVolumeClaim: claimName: model-cache2 - name: shm emptyDir: medium: Memory sizeLimit: "2Gi" - name: oci-auth secret: secretName: docker-secret items: - key: .dockercfg path: config.json serviceAccountName: default initContainers:3 - name: fetch-model image: ghcr.io/oras-project/oras:v1.2.0 env: - name: DOCKER_CONFIG value: /auth command: ["/bin/sh","-c"] args: - | set -e # Only pull if /model is empty if [ -z "$(ls -A /model)" ]; then echo "Pulling model..." oras pull registry.redhat.io/rhelai1/granite-3-1-8b-instruct-quantized-w8a8:1.5 \ --output /model \ else echo "Model already present, skipping model pull" fi volumeMounts: - name: model-volume mountPath: /model - name: oci-auth mountPath: /auth readOnly: true containers: - name: granite image: 'registry.redhat.io/rhaiis/vllm-cuda-rhel9@sha256:a6645a8e8d7928dce59542c362caf11eca94bb1b427390e78f0f8a87912041cd' imagePullPolicy: IfNotPresent env: - name: VLLM_SERVER_DEV_MODE value: '1' command: - python - '-m' - vllm.entrypoints.openai.api_server args: - '--port=8000' - '--model=/model' - '--served-model-name=granite-3-1-8b-instruct-quantized-w8a8' - '--tensor-parallel-size=1' resources: limits: cpu: '10' nvidia.com/gpu: '1' memory: 16Gi requests: cpu: '2' memory: 6Gi nvidia.com/gpu: '1' volumeMounts: - name: model-volume mountPath: /model - name: shm mountPath: /dev/shm4 restartPolicy: Always- 1
metadata.namespace必须与配置 Hugging FaceSecretCR 的命名空间匹配。- 2
spec.template.spec.volumes.persistentVolumeClaim.claimName必须与您创建的PVC的名称匹配。- 3
- 这个示例部署使用在主应用程序容器之前运行的简单
initContainers配置,从 Hugging Face 下载所需的模型。如果模型目录已经填充了之前部署中,则会跳过模型拉取步骤。 - 4
- NVIDIA Collective Communications 库(NCCL)需要
/dev/shm卷挂载。当/dev/shm卷挂载没有设置时,Tensor parallel vLLM 部署会失败。将部署副本数增加到所需的数量。例如,运行以下命令:
oc scale deployment granite -n rhaiis-namespace --replicas=1可选:查看部署并确保它成功:
$ oc get deployment -n rhaiis-namespace --watch输出示例
NAME READY UP-TO-DATE AVAILABLE AGE granite 0/1 1 0 2s granite 1/1 1 1 14s
为模型推测创建
ServiceCR。例如:apiVersion: v1 kind: Service metadata: name: granite namespace: rhaiis-namespace spec: selector: app: granite ports: - protocol: TCP port: 80 targetPort: 8000可选:创建一个
RouteCR 以启用对模型的公共访问。例如:apiVersion: route.openshift.io/v1 kind: Route metadata: name: granite namespace: rhaiis-namespace spec: to: kind: Service name: granite port: targetPort: 80获取公开的路由的 URL。运行以下命令:
$ oc get route granite -n rhaiis-namespace -o jsonpath='{.spec.host}'输出示例
granite-rhaiis-namespace.apps.example.com
验证
通过查询模型来确保部署成功。运行以下命令:
curl -X POST http://granite-rhaiis-namespace.apps.example.com/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "granite-3.1-2b-instruct-quantized.w8a8",
"messages": [{"role": "user", "content": "What is AI?"}],
"temperature": 0.1
}'