Chạy quy trình suy luận bằng mô hình Gemma trên Cloud Run bằng GPU RTX 6000 Pro

1. Giới thiệu

Tổng quan

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

  • Cách triển khai một mô hình Gemma trên GPU Cloud Run RTX 6000 Pro
  • Cách tải đồng thời một mô hình xuống từ Cloud Storage trong quá trình khởi động vùng chứa

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

Thiết lập 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:

export PROJECT_ID=<YOUR_PROJECT_ID>

export REGION=europe-west4
export SERVICE_NAME=gemma-rtx-codelab

# set the project
gcloud config set project $PROJECT_ID

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

gcloud services enable artifactregistry.googleapis.com \
        cloudbuild.googleapis.com \
        run.googleapis.com \
        compute.googleapis.com

Tạo một thư mục cho lớp học lập trình

mkdir codelab-rtx
cd codelab-rtx

Bật quyền truy cập riêng tư vào Google cho mạng con để tối ưu hoá việc tải mô hình học máy từ Cloud Storage. Bạn có thể tìm hiểu thêm trong phần tài liệu về các phương pháp hay nhất cho GPU khi tải mô hình từ Cloud Storage.

gcloud compute networks subnets update default \
  --region=europe-west4 \
  --enable-private-ip-google-access

3. Thiết lập Cloud Storage

Trước tiên, hãy tạo một bộ chứa Cloud Storage để lưu trữ các trọng số mô hình.

Tạo một vùng chứa duy nhất

# Generate a unique bucket name
export MODEL_BUCKET="${PROJECT_ID}-rtx-codelab-$(python3 -c 'import uuid; print(str(uuid.uuid4())[:8])')"
echo "Bucket name: $MODEL_BUCKET"

# Create the regional bucket
gcloud storage buckets create gs://$MODEL_BUCKET \
    --location=$REGION \
    --uniform-bucket-level-access

4. Truy xuất trọng số mô hình

Tiếp theo, hãy tải mô hình Gemma 3 xuống một thư mục cục bộ rồi tải mô hình đó lên bộ chứa Cloud Storage.

Cài đặt Ollama

Bạn có thể chạy lệnh này để cài đặt Ollama:

curl -fsSL https://ollama.com/install.sh | sh

Tải mô hình xuống

Tạo một thư mục cho mô hình đã tải xuống.

mkdir model-weights

Bạn sẽ dùng 2 thẻ thiết bị đầu cuối cho quy trình này: một thẻ để chạy máy chủ Ollama và một thẻ thiết bị đầu cuối khác để truy xuất mô hình.

Thiết bị đầu cuối 1 (Máy chủ):

Khởi động máy chủ bằng cách truyền vị trí của mô hình đã tải xuống. Lệnh này sẽ tiếp tục chạy.

OLLAMA_MODELS=$(pwd)/model-weights ollama serve

Terminal 2 (Client): Mở một thẻ dòng lệnh mới rồi tải mô hình xuống. Ứng dụng sẽ tự động giao tiếp với máy chủ đang chạy.

# note if you wish to use a larger model, you can change this to gemma3:27b
ollama pull gemma3:1b

Quay lại Terminal 1: Sau khi quá trình tải xuống trong Terminal 2 hoàn tất, hãy quay lại Terminal 1 rồi nhấn tổ hợp phím Ctrl+C để dừng máy chủ.

Tải lên Cloud Storage

Bây giờ, hãy tải các trọng số lên nhóm của bạn. gcloud storage tự động xử lý các lượt tải lên song song để tăng tốc độ.

gcloud storage cp -r ./model-weights/* gs://$MODEL_BUCKET/

(Không bắt buộc) Dọn dẹp trọng số cục bộ

Vì mô hình hiện nằm trong Cloud Storage, hãy xoá bản sao cục bộ.

rm -rf model-weights

5. Tạo dịch vụ

Trước tiên, hãy tạo một thư mục cho dịch vụ này.

mkdir rtx-service
cd rtx-service

Tạo một Dockerfile có nội dung sau

FROM ollama/ollama:latest

# Install Google Cloud CLI
RUN apt-get update && apt-get install -y curl gnupg && \
    echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] http://packages.cloud.google.com/apt cloud-sdk main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && \
    curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - && \
    apt-get update && apt-get install -y google-cloud-cli && \
    apt-get clean && rm -rf /var/lib/apt/lists/*

# Listen on all interfaces, port 11434
ENV OLLAMA_HOST 0.0.0.0:11434

# Store model weight files in /models
ENV OLLAMA_MODELS /models

# Reduce logging verbosity
ENV OLLAMA_DEBUG false

# Never unload model weights from the GPU
ENV OLLAMA_KEEP_ALIVE -1

# Copy and set up the startup script
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

# Start using the entrypoint script
ENTRYPOINT ["/entrypoint.sh"]

Tạo một tệp có tên là entrypoint.sh với nội dung sau:

#!/bin/bash
set -e

# Ensure OLLAMA_MODELS directory exists
mkdir -p $OLLAMA_MODELS

# Download model weights from GCS if MODEL_BUCKET is set
if [ -n "$MODEL_BUCKET" ]; then
  echo "Downloading model weights from gs://$MODEL_BUCKET..."
  # gcloud storage handles concurrent downloads automatically
  gcloud storage cp -r "gs://$MODEL_BUCKET/*" "$OLLAMA_MODELS/"
else
  echo "MODEL_BUCKET not set. Skipping download."
fi

# Start Ollama
exec ollama serve

6. Triển khai lên Cloud Run

Trong phần này, bạn sẽ triển khai dịch vụ bằng cách sử dụng gcloud run deploy. Lệnh này sẽ tạo vùng chứa của bạn từ nguồn và triển khai vùng chứa đó đến Cloud Run bằng các cấu hình GPU và mạng cần thiết.

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

Tạo một tài khoản dịch vụ chuyên dụng cho ứng dụng này và chỉ cấp cho tài khoản đó các quyền cần thiết.

# Create a dedicated service account
gcloud iam service-accounts create rtx-codelab-identity \
    --display-name="RTX Codelab Identity"

# Grant permission to read from the model bucket
gcloud storage buckets add-iam-policy-binding gs://$MODEL_BUCKET \
    --member="serviceAccount:rtx-codelab-identity@$PROJECT_ID.iam.gserviceaccount.com" \
    --role="roles/storage.objectViewer"

# Grant access to the Compute Engine network for the Cloud Run service identity
gcloud projects add-iam-policy-binding $PROJECT_ID \
     --member="serviceAccount:rtx-codelab-identity@$PROJECT_ID.iam.gserviceaccount.com" \
     --role="roles/compute.networkUser"

# Grant access to the Compute Engine network for the default service account
gcloud projects add-iam-policy-binding $PROJECT_ID \
 --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')@serverless-robot-prod.iam.gserviceaccount.com" \
 --role="roles/compute.networkUser"

Cấu hình mạng

Để có hiệu suất tối ưu khi tải các mô hình lớn xuống, hãy sử dụng tính năng Truyền dữ liệu trực tiếp ra khỏi VPC. Điều này cho phép vùng chứa truy cập vào Cloud Storage thông qua mạng riêng của Google, bỏ qua Internet công cộng và các cổng NAT. Các cờ sau đây được dùng trong lệnh gcloud run deploy:

  • --network: Kết nối với VPC default (đảm bảo mạng này tồn tại và có một mạng con trong khu vực của bạn với tính năng Private Google Access được bật).
  • --subnet: Mạng con cụ thể trong khu vực của bạn (thường là default nếu bạn sử dụng mạng mặc định).
  • --vpc-egress: Đặt thành all-traffic để buộc tất cả lưu lượng truy cập đi ra thông qua VPC.

Lệnh triển khai

gcloud beta run deploy $SERVICE_NAME \
    --source . \
    --region $REGION \
    --project $PROJECT_ID \
    --no-allow-unauthenticated \
    --port 11434 \
    --service-account rtx-codelab-identity@$PROJECT_ID.iam.gserviceaccount.com \
    --cpu 20 --memory 80Gi \
    --gpu 1 \
    --gpu-type nvidia-rtx-pro-6000 \
    --set-env-vars MODEL_BUCKET=$MODEL_BUCKET \
    --network default \
    --subnet default \
    --vpc-egress all-traffic \
    --no-gpu-zonal-redundancy

7. 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 3 bằng API Ollama.

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 --region $REGION --format 'value(status.url)')
echo "Service URL: $SERVICE_URL"

Chạy suy luận

Gửi câu lệnh cho mô hình bằng cách sử dụng curl. Bạn có thể đặt "stream": false để nhận toàn bộ phản hồi trong một đối tượng JSON duy nhất và sử dụng jq để chỉ trích xuất văn bản.

Lưu ý: nếu đang sử dụng một mô hình lớn hơn, chẳng hạn như gemma3:27b, bạn sẽ cần thay đổi tên mô hình trong tệp json bên dưới.

curl -s "$SERVICE_URL/api/generate" \
  -H "Authorization: Bearer $(gcloud auth print-identity-token)" \
  -H "Content-Type: application/json" \
  -d '{
  "model": "gemma3:1b",
  "prompt": "Why is the sky blue?",
  "stream": false
}' | jq -r '.response'

8. 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ột mô hình Gemma trên GPU Cloud Run RTX 6000 Pro
  • Cách tải đồng thời một mô hình xuống từ Cloud Storage trong quá trình khởi động vùng chứa

9. Dọn dẹp

Để không phải trả 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 \
      --region $REGION \
      --quiet

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

gcloud iam service-accounts delete \
      rtx-codelab-identity@$PROJECT_ID.iam.gserviceaccount.com \
      --quiet

Xoá bộ chứa Cloud Storage

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

Xoá hình ảnh vùng chứa

Bản dựng này đã tạo một hình ảnh vùng chứa trong Artifact Registry. Bạn có thể tìm thấy tên hình ảnh và xoá hình ảnh đó.

Liệt kê các hình ảnh để tìm tên chính xác (thường là gcr.io/PROJECT_ID/SERVICE_NAME)

gcloud container images list --filter="name:$SERVICE_NAME"

Xoá hình ảnh (thay thế IMAGE_NAME bằng kết quả ở trên)

gcloud container images delete <IMAGE_NAME> --force-delete-tags

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.