在 GKE 上使用 vLLM,透過 DeepSeek-V3.1-Base 執行推論

本教學課程說明如何使用 vLLM 架構,部署及提供 DeepSeek-V3.1-Base 語言模型。您會在 Google Kubernetes Engine (GKE) Enterprise 版 Autopilot 叢集上部署這個模型,並使用單一 A4 虛擬機器 (VM),其中包含 8 個 B200 GPU。

本教學課程的適用對象為機器學習 (ML) 工程師、平台管理員和操作員,以及有興趣使用 Kubernetes 容器自動化調度管理功能處理推論工作負載的資料和 AI 專家。

目標

  1. 透過 Hugging Face 存取 DeepSeek-V3.1-Base。
  2. 準備環境。
  3. 在 Autopilot 模式中建立 GKE 叢集。
  4. 建立 Hugging Face 憑證的 Kubernetes 密鑰。
  5. 建立 Cloud Storage bucket。
  6. 將模型下載至 Cloud Storage bucket。
  7. 將 vLLM 容器部署至 GKE 叢集。
  8. 使用 curl 與 DeepSeek-V3.1-Base 互動。
  9. 清除所用資源。

費用

本教學課程使用 Google Cloud的計費元件,包括:

如要根據預測用量估算費用,請使用 Pricing Calculator

事前準備

  1. 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自評估產品在實際工作環境中的成效。新客戶還能獲得價值 $300 美元的免費抵免額,可用於執行、測試及部署工作負載。
  2. 安裝 Google Cloud CLI。

  3. 若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI

  4. 執行下列指令,初始化 gcloud CLI:

    gcloud init
  5. 建立或選取 Google Cloud 專案

    選取或建立專案所需的角色

    • 選取專案:選取專案時,不需要具備特定 IAM 角色,只要您在專案中獲派角色,即可選取該專案。
    • 建立專案:如要建立專案,您需要「專案建立者」角色 (roles/resourcemanager.projectCreator),其中包含 resourcemanager.projects.create 權限。瞭解如何授予角色
    • 建立 Google Cloud 專案:

      gcloud projects create PROJECT_ID

      PROJECT_ID 替換為您要建立的 Google Cloud 專案名稱。

    • 選取您建立的 Google Cloud 專案:

      gcloud config set project PROJECT_ID

      PROJECT_ID 替換為 Google Cloud 專案名稱。

  6. 確認專案已啟用計費功能 Google Cloud

  7. 啟用必要的 API:

    啟用 API 時所需的角色

    如要啟用 API,您必須具備 serviceusage.services.enable 權限。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「服務使用情形管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色

    gcloud services enable container.googleapis.com
  8. 安裝 Google Cloud CLI。

  9. 若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI

  10. 執行下列指令,初始化 gcloud CLI:

    gcloud init
  11. 建立或選取 Google Cloud 專案

    選取或建立專案所需的角色

    • 選取專案:選取專案時,不需要具備特定 IAM 角色,只要您在專案中獲派角色,即可選取該專案。
    • 建立專案:如要建立專案,您需要「專案建立者」角色 (roles/resourcemanager.projectCreator),其中包含 resourcemanager.projects.create 權限。瞭解如何授予角色
    • 建立 Google Cloud 專案:

      gcloud projects create PROJECT_ID

      PROJECT_ID 替換為您要建立的 Google Cloud 專案名稱。

    • 選取您建立的 Google Cloud 專案:

      gcloud config set project PROJECT_ID

      PROJECT_ID 替換為 Google Cloud 專案名稱。

  12. 確認專案已啟用計費功能 Google Cloud

  13. 啟用必要的 API:

    啟用 API 時所需的角色

    如要啟用 API,您必須具備 serviceusage.services.enable 權限。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「服務使用情形管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色

    gcloud services enable container.googleapis.com
  14. 將角色授予使用者帳戶。針對下列每個 IAM 角色,執行一次下列指令: roles/container.admin

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE

    更改下列內容:

    • PROJECT_ID:專案 ID。
    • USER_IDENTIFIER:使用者帳戶的 ID。 例如:myemail@example.com
    • ROLE:授予使用者帳戶的 IAM 角色。
  15. 登入或建立 Hugging Face 帳戶

透過 Hugging Face 存取 DeepSeek

如要使用 Hugging Face 存取 DeepSeek,請按照下列步驟操作:

  1. 登入 Hugging Face,並探索 DeepSeek-V3.1-Base 模型
  2. 建立 Hugging Face read 存取權杖
  3. 複製並儲存 read access 權杖值。本教學課程稍後會用到這項資訊。

準備環境

如要準備環境,請設定預設環境變數:

export PROJECT_ID="YOUR_PROJECT_ID"
export RESERVATION_URL="YOUR_RESERVATION_NAME"
export REGION="YOUR_REGION"
export CLUSTER_NAME="YOUR_CLUSTER_NAME"
export GCS_BUCKET="YOUR_GCS_BUCKET"
export HUGGING_FACE_TOKEN="YOUR_HF_TOKEN"
export NETWORK="YOUR_NETWORK_NAME"
export SUBNETWORK="YOUR_SUBNETWORK_NAME"
export PROJECT_NUMBER=$(gcloud projects describe "${PROJECT_ID}" --format="value(projectNumber)")

gcloud config set project "${PROJECT_ID}"
gcloud config set billing/quota_project "${PROJECT_ID}"

更改下列內容:

  • YOUR_PROJECT_ID:您要在 Google Cloud 專案中建立 GKE 叢集,請輸入該專案的 ID。

  • YOUR_RESERVATION_NAME:您要用來建立 GKE 叢集的預留項目網址。根據預留項目所在的專案,指定下列其中一個值:

    • 專案中已有預留項目: RESERVATION_NAME

    • 預留項目位於其他專案,且您的專案可以使用該預留項目: projects/RESERVATION_PROJECT_ID/reservations/RESERVATION_NAME

  • YOUR_REGION:要建立 GKE 叢集的區域。您只能在預訂項目所在的區域建立叢集。

  • YOUR_CLUSTER_NAME:要建立的 GKE 叢集名稱。

  • YOUR_GCS_BUCKET:下載模型的 Cloud Storage bucket 名稱。

  • YOUR_HF_TOKEN:您在上一個章節中建立的 Hugging Face 存取權杖。

  • YOUR_NETWORK_NAME:GKE 叢集使用的網路。請指定下列其中一個值:

    • 如果您建立的是自訂網路,請指定網路名稱。

    • 否則,請指定 default

  • YOUR_SUBNETWORK_NAME:GKE 叢集使用的子網路。請指定下列其中一個值:

    • 如果您建立的是自訂子網路,請指定子網路名稱。您只能指定與預留項目位於相同區域的子網路。

    • 否則,請指定 default

在 Autopilot 模式中建立 GKE 叢集

如要在 Autopilot 模式中建立 GKE 叢集,請執行下列指令:

gcloud container clusters create-auto $CLUSTER_NAME \
    --project=$PROJECT_ID \
    --region=$REGION \
    --release-channel=rapid \
    --network=$NETWORK \
    --subnetwork=$SUBNETWORK

建立 GKE 叢集可能需要一段時間才能完成。如要確認 Google Cloud 已完成叢集建立作業,請前往 Google Cloud 控制台的「Kubernetes clusters」(Kubernetes 叢集) 頁面。

建立 Hugging Face 憑證的 Kubernetes Secret

如要為 Hugging Face 憑證建立 Kubernetes 密鑰,請按照下列步驟操作:

  1. 設定 kubectl,與 GKE 叢集通訊:

    gcloud container clusters get-credentials $CLUSTER_NAME \
        --location=$REGION
  2. 建立 Kubernetes 密鑰,儲存您的 Hugging Face 權杖:

    kubectl create secret generic hf-secret \
        --from-literal=hf_token=${HUGGING_FACE_TOKEN} \
        --dry-run=client -o yaml | kubectl apply -f -

建立 Cloud Storage bucket

如要使用新的 bucket 儲存模型,請執行下列指令:

gcloud storage buckets create gs://$GCS_BUCKET --location=$REGION --uniform-bucket-level-access

將 Cloud Storage 值區的 write 權限授予預設服務帳戶:

gcloud storage buckets add-iam-policy-binding gs://$GCS_BUCKET \
    --member="principal://iam.googleapis.com/projects/$PROJECT_NUMBER/locations/global/workloadIdentityPools/$PROJECT_ID.svc.id.goog/subject/ns/default/sa/default" \
    --role="roles/storage.objectAdmin"

如要使用現有的 Cloud Storage bucket,可以略過這個步驟。不過,您必須確保值區與叢集位於相同區域,且服務帳戶具備值區的必要write權限。

將模型下載至 Cloud Storage bucket

  1. 建立 deepseek-download-job.yaml 檔案:

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: deepseek-download-job
      namespace: default
    spec:
      template:
        metadata:
          labels:
            app: deepseek-oss-downloader
        spec:
          restartPolicy: OnFailure
          containers:
          - name: downloader
            image: google/cloud-sdk:slim
            resources:
              requests:
                cpu: "8"
                memory: "32Gi"
              limits:
                cpu: "8"
                memory: "32Gi"
            env:
            - name: HUGGING_FACE_HUB_TOKEN
              valueFrom:
                secretKeyRef:
                  name: hf-secret
                  key: hf_token
            - name: HF_XET_HIGH_PERFORMANCE
              value: "0"
            - name: PIP_BREAK_SYSTEM_PACKAGES
              value: "1"
            command: ["/bin/sh", "-c"]
            args:
            - |
              set -e
              echo "Installing Hugging Face Hub CLI..."
              pip install -U "huggingface_hub[cli]"
    
              LOCAL_DIR="/mnt/model-download/deepseek-v3-1"
              mkdir -p "$LOCAL_DIR"
    
              echo "Downloading model from HF to local SSD using parallel workers..."
              hf download deepseek-ai/DeepSeek-V3.1-Base \
                --token "$HUGGING_FACE_HUB_TOKEN" \
                --local-dir "$LOCAL_DIR" \
                --max-workers 8
    
              DOWNLOAD_STATUS=$?
    
              if [ $DOWNLOAD_STATUS -ne 0 ]; then
                echo "ERROR: Model download failed with exit code $DOWNLOAD_STATUS"
                exit $DOWNLOAD_STATUS
              fi
    
              echo "Download to SSD complete. Syncing to GCS..."
              gcloud storage rsync "$LOCAL_DIR" "gs://$GCS_BUCKET/deepseek-v3-1" --recursive
    
              echo "Process successfully completed!"
            volumeMounts:
            - mountPath: /mnt/model-download
              name: download-storage
          volumes:
          - name: download-storage
            ephemeral:
              volumeClaimTemplate:
                spec:
                  accessModes: [ "ReadWriteOnce" ]
                  storageClassName: premium-rwo
                  resources:
                    requests:
                      storage: 800Gi
  2. 套用 deepseek-download-job.yaml 資訊清單,初始化下載工作:

    envsubst '$GCS_BUCKET' < deepseek-download-job.yaml | kubectl apply -f -
  3. 如要查看完成狀態,請執行下列指令:

    kubectl wait \
        --for=condition=Complete \
        --timeout=7200s job/deepseek-download-job

    --timeout 旗標會指定指令監控工作多久後逾時。

    這項工作資源會使用 SSD 磁碟區,將 DeepSeek-V3.1-Base 模型權重從 Hugging Face 下載至 Google Cloud Storage bucket。下載作業大約需要 40 分鐘才能完成。下載完成後,請前往下一節啟動模型部署作業。

  4. 如要刪除作業,請執行下列指令:

    kubectl delete job deepseek-download-job

將 vLLM 容器部署至 GKE 叢集

將模型下載至 Cloud Storage bucket 後,請完成下列步驟,將 vLLM 容器部署至 GKE 叢集:

  1. 建立 vllm-deepseek3-1-base.yaml 檔案,並選擇 vLLM 部署作業:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: deepseek3-1-deploy
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: deepseek
      template:
        metadata:
          labels:
            app: deepseek
            ai.gke.io/model: deepseek-v3-1-base
            ai.gke.io/inference-server: vllm
            examples.ai.gke.io/source: user-guide
          annotations:
            gke-gcsfuse/volumes: "true"
        spec:
          containers:
          - name: vllm-inference
            image: us-docker.pkg.dev/vertex-ai/vertex-vision-model-garden-dockers/pytorch-vllm-serve:20250819_0916_RC01
            resources:
              requests:
                cpu: "10"
                memory: "1000Gi"
                ephemeral-storage: "1Ti"
                nvidia.com/gpu: "8"
              limits:
                cpu: "10"
                memory: "1000Gi"
                ephemeral-storage: "1Ti"
                nvidia.com/gpu: "8"
            command: ["python3", "-m", "vllm.entrypoints.openai.api_server"]
            args:
            - --model=/mnt/gcs/deepseek-v3-1
            - --tensor-parallel-size=8
            - --host=0.0.0.0
            - --port=8000
            - --max-model-len=8192
            - --max-num-seqs=4
            volumeMounts:
            - mountPath: /dev/shm
              name: dshm
            - mountPath: /mnt/gcs
              name: gcs-bucket-volume
              readOnly: true
            livenessProbe:
              httpGet:
                path: /health
                port: 8000
              initialDelaySeconds: 1800
              periodSeconds: 10
            readinessProbe:
              httpGet:
                path: /health
                port: 8000
              initialDelaySeconds: 1800
              periodSeconds: 5
          volumes:
          - name: dshm
            emptyDir:
                medium: Memory
          - name: gcs-bucket-volume
            csi:
              driver: gcsfuse.csi.storage.gke.io
              volumeAttributes:
                bucketName: $GCS_BUCKET
                mountOptions: "implicit-dirs,file-cache:max-size-mb:-1,file-cache:enable-parallel-downloads:true,file-cache:max-parallel-downloads:32,file-cache:parallel-downloads-per-file:8,file-cache:download-chunk-size-mb:16"
          nodeSelector:
            cloud.google.com/gke-accelerator: nvidia-b200
            cloud.google.com/reservation-name: $RESERVATION_URL
            cloud.google.com/reservation-affinity: "specific"
            cloud.google.com/gke-gpu-driver-version: latest
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: deepseek-service
    spec:
      selector:
        app: deepseek
      type: ClusterIP
      ports:
        - protocol: TCP
          port: 8000
          targetPort: 8000
    ---
    apiVersion: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
      name: deepseek-monitoring
    spec:
      selector:
        matchLabels:
          app: deepseek
      endpoints:
      - port: 8000
        path: /metrics
        interval: 30s
  2. vllm-deepseek3-1-base.yaml 檔案套用至 GKE 叢集:

    envsubst < vllm-deepseek3-1-base.yaml | kubectl apply -f -
  3. 如要查看完成狀態,請執行下列指令:

    kubectl wait \
      --for=condition=Available \
      --timeout=7200s deployment/deepseek3-1-deploy

    --timeout 旗標可讓指令在指定時間內監控部署作業。

使用 curl 與 DeepSeek-V3.1-Base 互動

如要驗證您部署的 DeepSeek-V3.1-Base 模型,請按照下列步驟操作:

  1. 設定通訊埠轉送至 DeepSeek-V3.1-Base:

    kubectl port-forward service/deepseek-service 8000:8000
  2. 開啟新的終端機視窗。然後,您可以使用 curl 與模型對話:

    curl http://127.0.0.1:8000/v1/chat/completions \
    -X POST \
    -H "Content-Type: application/json" \
    -d '{
      "model": "deepseek-ai/DeepSeek-V3.1-Base",
      "messages": [
        {
          "role": "user",
          "content": "Describe how generative AI works in one short and easy to understand sentence"
        }
      ],
    "stream":false
    }' | jq .
  3. 您看到的輸出內容類似如下:

    {
      "id": "chatcmpl-1a47172070544a5d83199ed5548befca",
      "object": "chat.completion",
      "created": 1755891024,
      "model": "deepseek-ai/DeepSeek-V3.1-Base",
      "choices": [
        {
          "index": 0,
          "message": {
            "role": "assistant",
            "content": "\nGenerative AI uses patterns from existing data to create new, similar content, like text, images, or music.\n",
            "refusal": null,
            "annotations": null,
            "audio": null,
            "function_call": null,
            "tool_calls": [],
            "reasoning_content": null
          },
          "logprobs": null,
          "finish_reason": "stop",
          "stop_reason": null
        }
      ],
      "service_tier": null,
      "system_fingerprint": null,
      "usage": {
        "prompt_tokens": 17,
        "total_tokens": 42,
        "completion_tokens": 25,
        "prompt_tokens_details": null
      },
      "prompt_logprobs": null,
      "kv_transfer_params": null
    }
    

觀察模型效能

如要觀察模型效能,可以使用 Cloud Monitoring 中的 vLLM 資訊主頁整合功能。這個資訊主頁可協助您查看模型的關鍵效能指標,例如權杖輸送量、網路延遲和錯誤率。詳情請參閱 Monitoring 說明文件中的「vLLM」。

清除所用資源

為避免因為本教學課程所用資源,導致系統向 Google Cloud 帳戶收取費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。

刪除資源

完成本教學課程後,請刪除不再需要的資源:

  1. 如要刪除 vllm-deepseek3-1-base.yaml 檔案中定義的部署作業和服務,以及 GKE 叢集中的 Kubernetes 密鑰,請執行下列指令:

    envsubst < vllm-deepseek3-1-base.yaml | kubectl delete -f -
    kubectl delete secret hf-secret
  2. 如要刪除 Cloud Storage bucket,請執行下列指令:

    gcloud storage rm --recursive gs://$GCS_BUCKET
  3. 如要刪除 GKE 叢集,請按照下列步驟操作:

    gcloud container clusters delete $CLUSTER_NAME \
        --region=$REGION \
        --quiet

刪除專案

刪除 Google Cloud 專案:

gcloud projects delete PROJECT_ID

後續步驟