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 RTX 6000 Pro của Cloud Run
- Cách sử dụng vLLM và Run:ai Model Streamer để suy luận nhanh hơn và khởi động phiên bản nhanh hơn.
Gemma 4 là một dòng sản phẩm mô hình nguồn mở có trọng số được cấp phép theo Apache 2 của Google DeepMind. Các mô hình này là mô hình đa phương thức, đa ngôn ngữ, có 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 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à "source" tệp đó. Đảm bảo bạn đặt đúng giá trị của mã dự án và khu vực (không bắt buộ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 một 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 không cần thiết.
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. Việc này sẽ cho phép sử dụng tính năng Truyền dữ liệu trực tiếp ra khỏi VPC để tải trọng số mô hình xuống nhanh hơn mỗi khi Cloud Run khởi động một phiên bản dịch vụ.
Kết hợp với tính năng Run:ai Model Streamer trong vLLM, tính năng này giúp giảm đáng kể thời gian tải mô hình.
Tạo một nhóm
Đảm bảo đây là một vùng chứa một khu vực được đặt cùng 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 các 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 là hàng chục gigabyte và việc tải các mô hình này xuống máy cục bộ hoặc Cloud Shell trước tiên có thể là không khả thi. Thay vào đó, hãy sử dụng Cloud Build với đủ bộ nhớ để lưu trữ trọng số mô hình.
Cách 1: Sao chép trọng số mô hình từ một Nhóm lưu trữ trên đám mây dùng chung
Google Cloud có một bộ chứa Cloud Storage có thể truy cập công khai với các trọng số mô hình Gemma 4.
Để sao chép các tệp đó vào nhóm lưu trữ, hãy chạy lệnh:
gcloud builds submit --project="${GOOGLE_CLOUD_PROJECT}" --region="${GOOGLE_CLOUD_REGION}" --no-source \
--substitutions="_MODEL_NAME=${MODEL_NAME},_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'
- |
gcloud config set storage/parallel_composite_upload_enabled True
gcloud config set storage/parallel_composite_upload_threshold 150M
gcloud config set storage/sliced_object_download_threshold 150M
MODEL_NAME="$_MODEL_NAME"
SHORT_NAME="$${MODEL_NAME#*/}"
gcloud storage cp -r -D "gs://vertex-model-garden-public-us/gemma4/$${SHORT_NAME}" "$_GCS_MODEL_LOCATION"
options:
machineType: 'E2_HIGHCPU_32'
diskSizeGb: 500
EOF
Cách 2: Tải trọng số mô hình xuống từ Hugging Face Hub
Ngoài ra, bạn có thể truy xuất trọng số mô hình trực tiếp từ Hugging Face Hub.
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 config set storage/parallel_composite_upload_enabled True
gcloud config set storage/parallel_composite_upload_threshold 150M
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 tính năng truyền dữ liệu trực tiếp ra khỏi VPC
Cấu hình Truy cập trực tiếp ra khỏi VPC yêu cầu bạn tạo một mạng và mạng con có bật chế độ Quyền 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 bên 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 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 cần 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ố đến vùng chứa được triển khai cho 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[*]}"
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à nhu cầu 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 dựa trên GPU để phân phát Gemma 4 bằng cách sử dụng cơ sở hạ tầng phi máy chủ có tính năng tự động mở rộng quy mô, bao gồm cả khả năng mở rộng quy mô về 0 (không có lưu lượng truy cập, không mất 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 OpenAI của vLLM.
Lấy 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 câu lệnh đến mô hình bằng cách sử dụ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 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 RTX 6000 Pro của Cloud Run
- Cách định cấu hình tính năng Truyền dữ liệu trực tiếp ra khỏi VPC và truyền trực tuyến mô hình vLLM bằng Cloud Storage để khởi động dịch vụ nhanh hơn.
12. Dọn dẹp
Để không bị tính phí cho tài khoản Google Cloud đối với các tài nguyên được 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 sẽ cần thay đổi dự án trong Cloud SDK. Bạn có thể xem danh sách tất cả các dự án có sẵn 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 sau:
gcloud projects delete ${GOOGLE_CLOUD_PROJECT}