搭載 TPU 的 GKE Autopilot 叢集、GKE 管理的 DRANET 和 Gemma 4

1. 總覽

本實驗室將介紹可用於執行 AI 工作負載的 AI 基礎架構,您將使用下列項目:

Google Kubernetes Engine (GKE):基礎容器調度管理平台。

GKE 管理的 DRANET - 動態資源分配網路,可直接將高速互連結構指派給 TPU Pod。

Tensor Processing Unit (TPU):Google 專為加速 AI 工作負載打造的晶片。

如要設定,您將部署自訂 VPC 和 Autopilot GKE 叢集。如要啟用代管 DRANET,請建立 ComputeClass 和 Resource Claim Template。接著,您會部署使用 vLLMHugging FaceComputeClass資源聲明範本 的工作負載。最後,您將測試網路設定,以及與 Gemma 4 模型的連線。

設定會使用 Terraformgcloudkubectl 的組合。

在本實驗室中,您將瞭解如何執行下列工作:

  • 設定虛擬私有雲網路
  • 設定 GKE Autopilot 叢集
  • 建立 ComputeClass 和 ResourceClaimTemplate。
  • 透過 Hugging Face 建立部署作業,執行 TPU、vLLM、監控和 Gemma 4
  • 測試與 LLM 的連線

在本實驗室中,您將建立下列模式。

圖 1. d38a898255a06e25.png

2. 設定 Google Cloud 服務

自修實驗室環境設定

  1. 登入 Google Cloud 控制台,然後建立新專案或重複使用現有專案。如果沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶

295004821bab6a87.png

37d264871000675d.png

96d86d3d5655cdbe.png

  • 專案名稱是這個專案參與者的顯示名稱。這是 Google API 未使用的字元字串。你隨時可以更新。
  • 專案 ID 在所有 Google Cloud 專案中都是專屬 ID,而且不可變更 (設定後就無法變更)。Cloud Console 會自動產生專屬字串,通常您不需要在意這個字串。在大多數程式碼研究室中,您需要參照專案 ID (通常會標示為 PROJECT_ID)。如果您不喜歡產生的 ID,可以產生另一個隨機 ID。或者,您也可以嘗試使用自己的 ID,看看是否可用。完成這個步驟後,ID 就無法變更,而且會在專案期間保持不變。
  • 請注意,部分 API 會使用第三個值,也就是「專案編號」。如要進一步瞭解這三個值,請參閱說明文件
  1. 接著,您需要在 Cloud 控制台中啟用帳單,才能使用 Cloud 資源/API。完成這個程式碼研究室的費用不高,甚至可能完全免費。如要關閉資源,避免在本教學課程結束後繼續產生費用,請刪除您建立的資源或專案。Google Cloud 新使用者可參加價值$300 美元的免費試用計畫。

啟動 Cloud Shell

雖然可以透過筆電遠端操作 Google Cloud,但在本程式碼研究室中,您將使用 Google Cloud Shell,這是可在雲端執行的指令列環境。

Google Cloud 控制台中,點選右上角工具列的 Cloud Shell 圖示:

啟用 Cloud Shell

佈建並連線至環境的作業,應該很快就能完成。完成後,您應該會看到如下的內容:

Google Cloud Shell 終端機的螢幕截圖,顯示環境已連線

這部虛擬機器搭載各種您需要的開發工具,而且主目錄提供 5 GB 的永久儲存空間。此外,這部虛擬機器可在 Google Cloud 運作,大幅提升網路效能並強化驗證功能。您可以在瀏覽器中完成本程式碼研究室的所有工作,不需安裝任何軟體。

3. 使用 Terraform 設定環境

如要完成這個實驗室,您必須有權存取 TPU。使用的確切版本為 TPU v6e。

  • 請按照 TPU 計畫文件啟用 TPU 配額,取得存取權。
  • 我們使用的小型部署作業需要 4 個 TPU v6e 晶片 (也就是單一區域中的 2x2 切片)。ct6e-standard-4t)
  • Hugging Face 權杖:下載 Gemma 模型權重時,需要存取權杖

我們會建立含有防火牆規則的自訂虛擬私有雲、子網路,然後建立自動駕駛叢集。開啟 Cloud 控制台,然後選取要使用的專案。

  1. 開啟控制台右上方的 Cloud Shell,確認 Cloud Shell 中顯示正確的專案 ID,並確認允許存取的任何提示。b51b80043d3bac90.png
  2. 建立名為 gke-auto-tpu 的資料夾,然後移至該資料夾
mkdir -p gke-auto-tpu && cd gke-auto-tpu
export PROJECT_ID=$(gcloud config get-value project)
echo $PROJECT_ID
  1. 現在新增一些設定檔。這些檔案會建立下列 terraform.tfvarsvariables.tfnet.tf 檔案。
cat << EOF > terraform.tfvars
project_id = "${PROJECT_ID}"
EOF

cat << 'EOF' > variables.tf
variable "project_id" {
  type = string
}

variable "region" {
  type    = string
  default = "us-east5"
}

variable "network_name" {
  type    = string
  default = "tpu-gke-vpc"
}

variable "subnet_name" {
  type    = string
  default = "tpu-sub1"
}

variable "cluster_name" {
  type    = string
  default = "tpu-auto-dra-cluster"
}
EOF

cat << 'EOF' > net.tf
terraform {
  required_version = ">= 1.5.0"
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "~> 7.32.0"
    }
  }
}

provider "google" {
  project = var.project_id
  region  = var.region
}

resource "google_compute_network" "tpu_vpc" {
  project                 = var.project_id
  name                    = var.network_name
  auto_create_subnetworks = false
  mtu                     = 8896
}

resource "google_compute_subnetwork" "tpu_subnet" {
  project       = var.project_id
  name          = var.subnet_name
  ip_cidr_range = "192.168.100.0/24"
  region        = var.region
  network       = google_compute_network.tpu_vpc.id
}

resource "google_compute_firewall" "allow_ssh" {
  project     = var.project_id
  name        = "${var.network_name}-allow-ssh"
  network     = google_compute_network.tpu_vpc.id
  direction   = "INGRESS"
  priority    = 1000

  allow {
    protocol = "tcp"
    ports    = ["22"]
  }

  source_ranges = ["0.0.0.0/0"]
}

resource "google_compute_firewall" "allow_internal" {
  project     = var.project_id
  name        = "${var.network_name}-allow-internal"
  network     = google_compute_network.tpu_vpc.id
  direction   = "INGRESS"
  priority    = 1000

  allow {
    protocol = "all"
  }

  source_ranges = ["172.16.0.0/12", "192.168.0.0/16"]
}

resource "google_container_cluster" "tpu_autopilot" {
  project  = var.project_id
  name     = var.cluster_name
  location = var.region

  enable_autopilot = true

  network    = google_compute_network.tpu_vpc.id
  subnetwork = google_compute_subnetwork.tpu_subnet.id

  release_channel {
    channel = "RAPID"
  }

  ip_allocation_policy {}

  deletion_protection = false 
}
EOF
  1. 請確認您位於 gke-auto-tpu 目錄中,然後執行下列指令:
    terraform init 初始化工作目錄。這是第一個步驟,會下載指定設定所需的供應商。
    terraform plan -out 產生執行計畫,顯示 Terraform 將採取哪些動作來部署基礎架構。-out 可讓您將執行計畫儲存至具名的二進位檔。您可以在不進行任何變更的情況下,查看會發生什麼情況。
    terraform apply 執行更新。
terraform init 
terraform plan -out vpc 
  1. 現在請在執行 terraform apply 後執行部署作業,由於您要套用已儲存的執行計畫,系統會立即執行,不會提示您確認 (這可能需要 6 到 10 分鐘)
terraform apply vpc
  1. 驗證設定
echo -e "\n=== Verifying GKE Autopilot Cluster ==="
gcloud container clusters list --filter="name:tpu-auto-dra-cluster" --project=$PROJECT_ID

echo -e "\n=== Verifying VPC Network ==="
gcloud compute networks list --filter="name:tpu-gke-vpc" --project=$PROJECT_ID

echo -e "\n=== Verifying Subnetwork ==="
gcloud compute networks subnets list --filter="name:tpu-sub1" --project=$PROJECT_ID

echo -e "\n=== Verifying Firewall Rules ==="
gcloud compute firewall-rules list --filter="name~tpu-gke-vpc-allow" --project=$PROJECT_ID

4. 建立運算類別和資源宣告範本

我們需要建立自訂 ComputeClass 資源,定義節點集區的設定。在本例中,我們將使用 TPU v6e 晶片 (ct6e-standard-4t)) 和代管 DRANET 網路。

  1. 連線至您建立的叢集。(附註:請將區域變更為您部署叢集的區域。)
gcloud container clusters get-credentials tpu-auto-dra-cluster --region us-east5 --project=$PROJECT_ID
  1. 請確認您位於 gke-auto-tpu 目錄中,然後執行下列指令。這會建立 ComputeClass 資訊清單。請注意,如果您使用其他區域,則需要將區域資訊變更為叢集區域內的區域
cat << 'EOF' > computeclass.yaml
apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
  name: dranet-auto
spec:
  nodePoolAutoCreation:
    enabled: true
  nodePoolConfig:
    dra:
      networking:
        enabled: true
  priorities:
  - tpu:
      type: tpu-v6e-slice
      count: 4
      topology: "2x2" 
    acceleratorNetworkProfile: auto
    location:
      zones: 
      - us-east5-b
EOF
  1. 現在請建立 ComputeClass。
kubectl apply -f computeclass.yaml

kubectl describe computeclass dranet-auto
  1. gke-auto-tpu 目錄中執行下列指令。這會建立支援非 RDMA 網路裝置的 ResourceClaimTemplate 資訊清單。
cat << 'EOF' > resourceclaimtpu.yaml
apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
  name: all-netdev
spec:
  spec:
    devices:
      requests:
      - name: req-netdev
        exactly:
          deviceClassName: netdev.google.com
          allocationMode: All
EOF
  1. 現在建立 ResourceClaimTemplate。
kubectl apply -f resourceclaimtpu.yaml

kubectl describe resourceclaimtemplate all-netdev

建立密鑰

  1. 本實驗室使用 google/gemma-4-31B-it ,因此您需要建立 HF 權杖。請將下方的 YOUR_ACTUAL_HUGGING_FACE_TOKEN 替換為實際權杖。
export HF_TOKEN="YOUR_ACTUAL_HUGGING_FACE_TOKEN"
  1. 確認您位於 gke-auto-tpu 目錄,然後執行下列指令。
kubectl create secret generic hf-secret --from-literal=hf_token=${HF_TOKEN} 

kubectl get secrets hf-secret

5. 部署工作負載 vLLM 和 Gemma

這項設定會使用 ComputeClass 自動佈建所需的硬體和網路 (TPU v6e 和代管 DRANET)。它會使用 ResourceClaimTemplate 定義藍圖,要求存取該高速網路,並使用部署作業將兩者繫結在一起,在每個 Pod 擴充時,為其產生個別的網路聲明。

  1. 確認您位於 gke-auto-tpu 目錄,然後執行下列指令。
cat << 'EOF' > gem4-auto-dra-tpu.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: gem4-dra-auto
spec:
  replicas: 1
  selector:
    matchLabels:
      app: gemma4-tpu
  template:
    metadata:
      labels:
        app: gemma4-tpu
        ai.gke.io/model: gemma-4-31b-it
        ai.gke.io/inference-server: vllm-tpu
    spec:
      dnsPolicy: Default
      resourceClaims:
      - name: netdev-claim        
        resourceClaimTemplateName: all-netdev
      containers:
      - name: vllm-tpu-inference
        image: vllm/vllm-tpu:latest
        resources:
          requests:
            cpu: "30"
            memory: "240Gi"
            ephemeral-storage: "100Gi"
            google.com/tpu: "4"
          limits:
            cpu: "30"
            memory: "240Gi"
            ephemeral-storage: "100Gi"
            google.com/tpu: "4"
          claims:
          - name: netdev-claim
        command: ["python3", "-m", "vllm.entrypoints.openai.api_server"]
        args:
        - --model=$(MODEL_ID)
        - --tensor-parallel-size=4
        - --host=0.0.0.0
        - --port=8000
        - --max-model-len=32768
        - --max-num-batched-tokens=8192
        env:
        - name: MODEL_ID
          value: google/gemma-4-31B-it
        - name: HUGGING_FACE
          valueFrom:
            secretKeyRef:
              name: hf-secret
              key: hf_token
        - name: HF_TOKEN
          valueFrom:
            secretKeyRef:
              name: hf-secret
              key: hf_token
        volumeMounts:
        - mountPath: /dev/shm
          name: dshm
        startupProbe:
          httpGet:
            path: /health
            port: 8000
          failureThreshold: 240
          periodSeconds: 10
        livenessProbe:
          httpGet:
            path: /health
            port: 8000
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /health
            port: 8000
          periodSeconds: 5
      volumes:
      - name: dshm
        emptyDir:
          medium: Memory
      nodeSelector:
        cloud.google.com/compute-class: dranet-auto
---
apiVersion: v1
kind: Service
metadata:
  name: gem4-dra-service
spec:
  selector:
    app: gemma4-tpu
  type: ClusterIP
  ports:
    - protocol: TCP
      port: 8000
      targetPort: 8000
---
apiVersion: monitoring.googleapis.com/v1
kind: PodMonitoring
metadata:
  name: gem4-monitoring
spec:
  selector:
    matchLabels:
      app: gemma4-tpu
  endpoints:
  - port: 8000
    path: /metrics
    interval: 30s
EOF
  1. 建立部署作業。
kubectl apply -f gem4-auto-dra-tpu.yaml
  1. 如要監控完成狀態,請執行下列指令。Pod 會等待節點佈建完成,才能繼續執行,這可能需要 13 分鐘以上
kubectl get pods

kubectl get deployments

kubectl describe pods -l app=gemma4-tpu

echo "       __|__"
echo "  --@--(_|_)--@--"
echo ""
echo "Waiting for Autopilot to register the TPU node (this takes a few minutes)..."

until kubectl get nodes -l gke.networks.io/accelerator-network-profile=auto -o name | grep -q "node/"; do
  sleep 60
done

echo "TPU Node detected in cluster! Waiting for hardware to provision and become Ready..."

kubectl wait --for=condition=Ready nodes -l gke.networks.io/accelerator-network-profile=auto --timeout=900s
  1. 建立節點並排定 Pod 後,您可以執行指令來查看 Pod 的記錄。(附註:你可以新增 **-f** **串流標記**)。如果您在看到字串「the model is ready to serve」時觀看記錄,這項作業最多需要 **15 分鐘以上** 才能完成。(APIServer pid=1) INFO: 169.254.4.6:44290 - "GET /health HTTP/1.1" 200 OK
kubectl logs -l app=gemma4-tpu -f | sed -u '\,"GET /health HTTP/1.1" 200 OK,q'
  1. 部署作業完成後,您可以確認高速網路是否已正確附加至 TPU Pod。執行下列指令:
for pod in $(kubectl get pods -l app=gemma4-tpu -o name); do
  echo "=== Checking Networking for $pod ==="
  kubectl exec $pod -- ls /sys/class/net
  echo ""
done

應注意的事項:您應該會看到標準 eth0,以及 eth1ethxx 等額外介面。

這些額外介面會確認高速受管理 DRANET 結構已成功附加至 Pod。

6. 使用 curl 與 AI 模型互動

如要驗證部署的 gemma-4-31B 模型,請從服務設定通訊埠轉送至本機。

  1. 在目前的 Cloud Shell 中執行下列指令:
kubectl port-forward service/gem4-dra-service 8000:8000 &
  1. 現在,請為同一個專案開啟額外的 Cloud Shell 視窗,然後使用 curl 與模型對話。這項指令會傳送提示,並將輸出內容直接串流至終端機。
time curl -sN http://127.0.0.1:8000/v1/chat/completions \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{
    "model": "google/gemma-4-31B-it",
    "messages": [
      {
        "role": "user",
        "content": "How can GKE help deployment of AI workloads? Provide concise information. Keep the explanation under 300 words."
      }
    ],
    "max_tokens": 1024,
    "temperature": 0.7,
    "stream": true,
    "stream_options": {"include_usage": true}
  }' | grep '^data:' | sed 's/^data: //' | grep -v '\[DONE\]' | jq --unbuffered -j '
    (.choices[0].delta.content // empty), 
    if .usage then "\n\n--- Usage ---\nPrompt: \(.usage.prompt_tokens)\nCompletion: \(.usage.completion_tokens)\nTotal: \(.usage.total_tokens)\n" else empty end 
  '
  1. 查看模型的回覆

觀測能力

由於我們已套用PodMonitoring自訂資源,Cloud Monitoring 會從 8000 連接埠的 vLLM 容器擷取指標。您可以前往 Google Cloud 控制台 「監控」->「資訊主頁」,以原生方式查看權杖產生延遲時間、佇列長度和 KV 快取用量等指標。

607bcf95ce4d9a82.png

7. 清理

  1. 執行下列指令,刪除資源。
cd ~/gke-auto-tpu

kubectl delete -f gem4-auto-dra-tpu.yaml
kubectl delete -f resourceclaimtpu.yaml
kubectl delete -f computeclass.yaml
kubectl delete secret hf-secret
  1. 使用下列指令清理基礎架構,然後輸入 yes 確認
terraform destroy

8. 恭喜

您已成功在 GKE Autopilot 上部署代管 DRANET 環境、動態佈建 TPU v6e 硬體,並使用 vLLM 提供 310 億個參數的大型 Gemma 4 模型。

使用 GKE Autopilot 時,您可以讓 Kubernetes 處理底層節點佈建和基礎架構管理作業,專心部署 AI 工作負載。

後續步驟/瞭解詳情

您可以進一步瞭解 GKE 網路

挑戰下一個實驗室

繼續完成 Google Cloud 任務,或查看下列其他 Google Cloud 實驗室: