Chạy quy trình suy luận của mô hình Gemma 4 trên Cloud Run bằng GPU RTX 6000 Pro với vLLM

1. Giới thiệu

Tổng quan

Kiến thức bạn sẽ học được

  • Cách triển khai mô hình Gemma 4 trên GPU Cloud Run RTX 6000 Pro
  • Cách sử dụng vLLMRun:ai Model Streamer để suy luận nhanh hơn và rút ngắn thời gian khởi động thực thể.

Gemma 4 là một nhóm các mô hình trọng số mở được cấp phép theo Apache 2 của Google DeepMind. Các mô hình này là đa phương thức, đa ngôn ngữ, cung cấp khả năng suy luận và có cấu trúc hiệu quả. Cloud Run là một môi trường không máy chủ dành cho các vùng chứa có hỗ trợ GPU.

2. Thiết lập và yêu cầu

Sau đây là các biến môi trường sẽ được sử dụng trong suốt lớp học lập trình này. Bạn có thể lưu các biến này trong một tệp môi trường và "nguồn" tệp đó. Hãy nhớ đặt đúng giá trị của mã dự án và tuỳ chọn khu vực.

# Model name on HuggingFace Hub
export MODEL_NAME="google/gemma-4-31B-it"

# Cloud Run Service name
export SERVICE_NAME=gemma-rtx-vllm-codelab

# Cloud Project and Region for Cloud Run
export GOOGLE_CLOUD_PROJECT=<YOUR_PROJECT_ID> # Change to your Project Id
export GOOGLE_CLOUD_REGION=europe-west4

# Optional HuggingFace User Access Token for accessing model weights
# (https://huggingface.co/docs/hub/en/security-tokens),
# if you are loading a private model.
export HF_TOKEN=""

# Service account for Cloud Run service
export SERVICE_ACCOUNT="vllm-service-sa"
export SERVICE_ACCOUNT_EMAIL="${SERVICE_ACCOUNT}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com"

# GCS Bucket for the model cache.
export MODEL_CACHE_BUCKET="${GOOGLE_CLOUD_PROJECT}-${GOOGLE_CLOUD_REGION}-hf-model-cache"
# Model cache location in GSC bucket
export GCS_MODEL_LOCATION="gs://${MODEL_CACHE_BUCKET}/model-cache/${MODEL_NAME}"

# VPC Network for Direct VPC Egress
export VPC_NETWORK="vllm-${GOOGLE_CLOUD_REGION}-net"
export VPC_SUBNET="vllm-${GOOGLE_CLOUD_REGION}-subnet"
export SUBNET_RANGE="10.8.0.0/26"

# set the project
gcloud config set project $GOOGLE_CLOUD_PROJECT
gcloud config set run/region $GOOGLE_CLOUD_REGION

Bật các API cần thiết cho lớp học lập trình này

gcloud services enable --project "${GOOGLE_CLOUD_PROJECT}" \
    run.googleapis.com \
    cloudbuild.googleapis.com \
    artifactregistry.googleapis.com \
    iam.googleapis.com \
    compute.googleapis.com \
    vpcaccess.googleapis.com \
    storage.googleapis.com

3. Tạo tài khoản dịch vụ

Nếu bạn không chỉ định tài khoản dịch vụ khi tạo dịch vụ hoặc công việc Cloud Run, thì Cloud Run sẽ sử dụng tài khoản dịch vụ mặc định của Compute Engine. Bạn nên sử dụng Tài khoản dịch vụ riêng cho dịch vụ Cloud Run để tránh chạy dịch vụ với các quyền quá mức.

Tạo tài khoản dịch vụ cho dịch vụ Cloud Run

gcloud iam service-accounts create ${SERVICE_ACCOUNT} \
  --project "${GOOGLE_CLOUD_PROJECT}" \
  --display-name "vLLM Service Account"

4. Thiết lập Cloud Storage

Tạo một bộ chứa Cloud Storage để lưu trữ trọng số mô hình. Điều này cho phép sử dụng Direct VPC Egress để tải trọng số mô hình xuống nhanh hơn mỗi khi Cloud Run khởi động một thực thể dịch vụ.

Khi kết hợp với tính năng Run:ai Model Streamer trong vLLM, tính năng này sẽ giảm đáng kể thời gian tải mô hình.

Tạo bộ chứa

Đảm bảo đây là bộ chứa một khu vực được đặt cùng vị trí với dịch vụ Cloud Run.

gcloud storage buckets create "gs://${MODEL_CACHE_BUCKET}" \
    --uniform-bucket-level-access --public-access-prevention \
    --project "${GOOGLE_CLOUD_PROJECT}" --location "${GOOGLE_CLOUD_REGION}"

5. Truy xuất và lưu vào bộ nhớ đệm trọng số mô hình

Tiếp theo, hãy tải mô hình Gemma 4 xuống bộ chứa Cloud Storage.

Trọng số mô hình có dung lượng hàng chục gigabyte và bạn có thể không tải được các trọng số này xuống máy cục bộ hoặc Cloud Shell.

Thay vào đó, chúng tôi sử dụng Cloud Build với đủ dung lượng lưu trữ để chứa trọng số mô hình.

gcloud builds submit --project="${GOOGLE_CLOUD_PROJECT}" --region="${GOOGLE_CLOUD_REGION}" --no-source \
    --substitutions="_MODEL_NAME=${MODEL_NAME},_HF_TOKEN=${HF_TOKEN},_GCS_MODEL_LOCATION=${GCS_MODEL_LOCATION}" \
    --config=/dev/stdin <<'EOF'
steps:
- name: 'gcr.io/google.com/cloudsdktool/google-cloud-cli:slim'
  entrypoint: 'bash'
  args:
  - '-c'
  - |
    set -e
    pip3 install --root-user-action=ignore --break-system-packages huggingface_hub[cli]
    echo "Downloading the model..."
    if [[ "$_HF_TOKEN" != "" ]]; then
      hf download "$_MODEL_NAME" --token $_HF_TOKEN --local-dir "./model-cache/$_MODEL_NAME"
    else
      hf download "$_MODEL_NAME" --local-dir "./model-cache/$_MODEL_NAME"
    fi
    echo "Uploading the model..."
    gcloud storage cp -r "./model-cache/$_MODEL_NAME" "$_GCS_MODEL_LOCATION"
options:
  machineType: 'E2_HIGHCPU_32'
  diskSizeGb: 500
EOF

6. Định cấu hình mạng cho Direct VPC Egress

Để định cấu hình Direct VPC Egress, bạn cần tạo một mạng và mạng con có bật tính năng Truy cập riêng tư vào Google.

Điều này cho phép các dịch vụ Cloud Run kết nối với tập hợp địa chỉ IP ngoài mà các API và dịch vụ của Google sử dụng, bao gồm cả Cloud Storage.

Tạo mạng

gcloud compute networks create "$VPC_NETWORK" \
        --subnet-mode=custom \
        --bgp-routing-mode=regional \
        --project "$GOOGLE_CLOUD_PROJECT"

Tạo mạng con

gcloud compute networks subnets create "$VPC_SUBNET" \
        --network="$VPC_NETWORK" \
        --region="$GOOGLE_CLOUD_REGION" \
        --range="$SUBNET_RANGE" \
        --enable-private-ip-google-access \
        --project "$GOOGLE_CLOUD_PROJECT"

7. Định cấu hình chính sách truy cập tài khoản dịch vụ

Tài khoản dịch vụ Cloud Run cần có quyền truy cập vào trọng số mô hình trong Bộ chứa lưu trữ mà bạn đã tạo.

gcloud storage buckets add-iam-policy-binding "gs://${MODEL_CACHE_BUCKET}" \
    --member "serviceAccount:${SERVICE_ACCOUNT_EMAIL}" \
    --role "roles/storage.admin" \
    --project "${GOOGLE_CLOUD_PROJECT}"

8. Khởi chạy các biến cấu hình

Xác định các biến cho cả công cụ suy luận vLLM và dịch vụ Cloud Run.

# vLLM variables
export MAX_MODEL_LEN="32767"    # 32767 to improve concurrency. Keep it empty to use model's maximim context length (256K)
export QUANTIZATION_TYPE="fp8"  # Model quantization for faster performance and lower memory usage.
export KV_CACHE_DTYPE="fp8"     # KV-cache quantization to save GPU memory.
export GPU_MEM_UTIL="0.95"      # Fraction of GPU memory to be used by the vLLM engine.
export TENSOR_PARALLEL_SIZE="1" # Partitioning model across GPUs (1 here as we have only 1 GPU).
export MAX_NUM_SEQS="8"         # Max concurrent requests vLLM processes in one batch.

# Cloud Run variables
export CLOUD_RUN_CPU_NUM=20
export CLOUD_RUN_MEMORY_GB=80
export CLOUD_RUN_MAX_INSTANCES=3
export CLOUD_RUN_CONCURRENCY=16

9. Triển khai lên Cloud Run

Chuẩn bị dòng lệnh vùng chứa vLLM

vLLM yêu cầu nhiều tham số để chạy các mô hình lớn một cách nhanh chóng và hiệu quả. Các tham số này sẽ được truyền dưới dạng đối số cho vùng chứa được triển khai lên Cloud Run.

CONTAINER_ARGS=(
    "vllm"
    "serve"
    "${GCS_MODEL_LOCATION}"
    "--served-model-name" "${MODEL_NAME}"
    "--enable-log-requests"
    "--enable-chunked-prefill"
    "--enable-prefix-caching"
    "--generation-config" "auto"
    "--enable-auto-tool-choice"
    "--tool-call-parser" "gemma4"
    "--reasoning-parser" "gemma4"
    "--dtype" "bfloat16"
    "--quantization" "${QUANTIZATION_TYPE}"
    "--kv-cache-dtype" "${KV_CACHE_DTYPE}"
    "--max-num-seqs" "${MAX_NUM_SEQS}"
    "--gpu-memory-utilization" "${GPU_MEM_UTIL}"
    "--tensor-parallel-size" "${TENSOR_PARALLEL_SIZE}"
    "--load-format" "runai_streamer"
    "--port" "8080"
    "--host" "0.0.0.0"
)

if [[ "${MAX_MODEL_LEN}" != "" ]]; then
    CONTAINER_ARGS+=("--max-model-len" "${MAX_MODEL_LEN}")
fi

export CONTAINER_ARGS_STR="${CONTAINER_ARGS[*]}"
echo "Deployment string: ${CONTAINER_ARGS_STR}"

Triển khai dịch vụ Cloud Run

Chạy lệnh sau để triển khai dịch vụ Cloud Run. Lưu ý loại GPU (RTX 6000 Pro), hình ảnh cơ sở (pytorch-vllm-serve:gemma4) và cần được xác thực để gọi dịch vụ (--no-allow-unauthenticated).

gcloud beta run deploy "${SERVICE_NAME}" \
    --image="us-docker.pkg.dev/vertex-ai/vertex-vision-model-garden-dockers/pytorch-vllm-serve:gemma4" \
    --project "${GOOGLE_CLOUD_PROJECT}" \
    --region "${GOOGLE_CLOUD_REGION}" \
    --service-account "${SERVICE_ACCOUNT_EMAIL}" \
    --execution-environment gen2 \
    --no-allow-unauthenticated \
    --cpu="${CLOUD_RUN_CPU_NUM}" \
    --memory="${CLOUD_RUN_MEMORY_GB}Gi" \
    --gpu=1 \
    --gpu-type=nvidia-rtx-pro-6000 \
    --no-gpu-zonal-redundancy \
    --no-cpu-throttling \
    --max-instances ${CLOUD_RUN_MAX_INSTANCES} \
    --concurrency ${CLOUD_RUN_CONCURRENCY} \
    --network ${VPC_NETWORK} \
    --subnet ${VPC_SUBNET} \
    --vpc-egress all-traffic \
    --set-env-vars "MODEL_NAME=${MODEL_NAME}" \
    --set-env-vars "GOOGLE_CLOUD_PROJECT=${GOOGLE_CLOUD_PROJECT}" \
    --set-env-vars "GOOGLE_CLOUD_REGION=${GOOGLE_CLOUD_REGION}" \
    --port=8080 \
    --timeout=3600 \
    --cpu-boost \
    --startup-probe tcpSocket.port=8080,initialDelaySeconds=240,failureThreshold=40,timeoutSeconds=10,periodSeconds=15 \
    --command "bash" \
    --args="^;^-c;${CONTAINER_ARGS_STR}"

Quá trình này sẽ mất vài phút để triển khai. Sau khi hoàn tất, bạn sẽ có một môi trường được hỗ trợ bằng GPU để phân phát Gemma 4 bằng cơ sở hạ tầng không máy chủ có tính năng tự động mở rộng quy mô, bao gồm cả việc mở rộng quy mô về 0 (không có lưu lượng truy cập, không tốn chi phí).

10. Kiểm thử dịch vụ

Sau khi triển khai, bạn có thể tương tác với mô hình Gemma 4 bằng API tương thích với vLLM OpenAI.

Nhận URL dịch vụ

Truy xuất URL của dịch vụ Cloud Run đã triển khai.

SERVICE_URL=$(gcloud run services describe $SERVICE_NAME --project "${GOOGLE_CLOUD_PROJECT}" --region "${GOOGLE_CLOUD_REGION}" --format 'value(status.url)')
echo "Service URL: $SERVICE_URL"

Chạy suy luận

Gửi lời nhắc đến mô hình bằng curl.

curl -s "$SERVICE_URL/v1/chat/completions" \
  -H "Authorization: Bearer $(gcloud auth print-identity-token)" \
  -H "Content-Type: application/json" \
  -d '{
  "model": "'"${MODEL_NAME}"'",
  "messages": [
    {"role": "user", "content": "Why is the sky blue?"}
  ],
  "chat_template_kwargs": {
    "enable_thinking": true
  },
  "skip_special_tokens": false
}' | jq -r '.choices[0].message.content'

11. Xin chúc mừng!

Chúc mừng bạn đã hoàn thành lớp học lập trình này!

Bạn nên xem lại tài liệu về Cloud Run.

Nội dung đã đề cập

  • Cách triển khai mô hình Gemma 4 trên GPU Cloud Run RTX 6000 Pro
  • Cách định cấu hình tính năng truyền trực tuyến mô hình Direct VPC Egress và vLLM bằng Cloud Storage để khởi động dịch vụ nhanh hơn.

12. Dọn dẹp

Để tránh bị tính phí vào tài khoản Google Cloud cho các tài nguyên được sử dụng trong hướng dẫn này, bạn có thể xoá dự án hoặc xoá từng tài nguyên.

Cách 1: Xoá tài nguyên

Xoá dịch vụ Cloud Run

gcloud run services delete $SERVICE_NAME \
      --project "${GOOGLE_CLOUD_PROJECT}" \
      --region "${GOOGLE_CLOUD_REGION}" \
      --quiet

Xoá tài khoản dịch vụ

gcloud iam service-accounts delete \
      ${SERVICE_ACCOUNT_EMAIL} \
      --project "${GOOGLE_CLOUD_PROJECT}" \
      --quiet

Xoá bộ chứa Cloud Storage

gcloud storage rm --recursive gs://$MODEL_CACHE_BUCKET

Xoá mạng và mạng con VPC

gcloud compute networks subnets delete $VPC_SUBNET \
    --region "${GOOGLE_CLOUD_REGION}" \
    --project "${GOOGLE_CLOUD_PROJECT}" \
    --quiet

gcloud compute networks delete $VPC_NETWORK \
    --project "${GOOGLE_CLOUD_PROJECT}" \
    --quiet

Cách 2: Xoá dự án

Để xoá toàn bộ dự án, hãy chuyển đến phần Quản lý tài nguyên, chọn dự án bạn đã tạo ở Bước 2 rồi chọn Xoá. Nếu xoá dự án, bạn cần thay đổi dự án trong Cloud SDK. Bạn có thể xem danh sách tất cả các dự án hiện có bằng cách chạy gcloud projects list. Nếu muốn sử dụng dòng lệnh, bạn cũng có thể dùng lệnh này:

gcloud projects delete ${GOOGLE_CLOUD_PROJECT}