在 Cloud Run 上使用 RTX 6000 Pro GPU 运行 Gemma 模型的推理

1. 简介

概览

学习内容

  • 如何在 Cloud Run RTX 6000 Pro GPU 上部署 Gemma 模型
  • 如何在容器启动期间从 Cloud Storage 并发下载模型

2. 设置和要求

设置将在本 Codelab 中全程使用的环境变量:

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

启用此 Codelab 所需的 API

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

为 Codelab 创建文件夹

mkdir codelab-rtx
cd codelab-rtx

为子网启用专用 Google 访问通道,以优化从 Cloud Storage 加载机器学习模型。如需了解详情,请参阅 GPU 最佳实践文档中有关从 Cloud Storage 加载模型的部分。

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

3. 设置 Cloud Storage

首先,创建一个 Cloud Storage 存储分区来存储模型权重。

创建唯一的存储分区

# 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. 检索模型权重

接下来,将 Gemma 3 模型下载到本地目录,然后将其上传到您的 Cloud Storage 存储分区。

安装 Ollama

您可以运行以下命令来安装 Ollama:

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

下载模型

为下载的模型创建目录。

mkdir model-weights

在此过程中,您将使用两个终端标签页:一个用于运行 Ollama 服务器,另一个用于检索模型。

终端 1(服务器)

通过传递下载的模型的位置来启动服务器。此命令将继续运行。

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

终端 2(客户端):打开新的终端标签页并下载模型。客户端会自动与正在运行的服务器通信。

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

返回到终端 1:终端 2 中的下载完成后,返回到终端 1,然后按 Ctrl+C 停止服务器。

将内容上传到 Cloud Storage

现在,将权重上传到您的存储分区。gcloud storage 会自动处理并行上传,以提高速度。

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

(可选)清理本地权重

由于模型现在位于 Cloud Storage 中,因此请移除本地副本。

rm -rf model-weights

5. 创建服务

首先,为服务创建一个文件夹。

mkdir rtx-service
cd rtx-service

创建一个包含以下内容的 Dockerfile

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"]

创建一个名为 entrypoint.sh 且包含以下内容的文件:

#!/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. 部署到 Cloud Run

在本部分中,您将使用 gcloud run deploy 部署服务。此命令将从源代码构建容器,并使用必要的 GPU 和网络配置将其部署到 Cloud Run。

创建服务账号

为此应用创建一个专用服务账号,并仅向其授予所需的权限。

# 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"

网络配置

如需在下载大型模型时获得最佳性能,请使用直接 VPC 出站流量。这样一来,容器便可通过 Google 专用网络访问 Cloud Storage,从而绕过公共互联网和 NAT 网关。gcloud run deploy 命令中使用了以下标志:

  • --network:连接到 default VPC(确保此网络存在,并且在您的区域中有一个启用了专用 Google 访问通道的子网)。
  • --subnet:您所在区域中的特定子网(如果使用默认网络,通常为 default)。
  • --vpc-egress:设置为 all-traffic 可强制所有出站流量通过 VPC。

部署命令

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. 测试服务

部署完成后,您可以使用 Ollama API 与 Gemma 3 模型互动。

获取服务网址

检索已部署的 Cloud Run 服务的网址。

SERVICE_URL=$(gcloud run services describe $SERVICE_NAME --region $REGION --format 'value(status.url)')
echo "Service URL: $SERVICE_URL"

运行推理

使用 curl 向模型发送提示。您可以将 "stream": false 设置为在单个 JSON 对象中获取完整响应,并使用 jq 仅提取文本。

注意:如果您使用的是更大的模型(例如 gemma3:27b),则需要更改以下 JSON 中的模型名称。

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. 恭喜!

恭喜您完成此 Codelab!

建议您查看 Cloud Run 文档。

所学内容

  • 如何在 Cloud Run RTX 6000 Pro GPU 上部署 Gemma 模型
  • 如何在容器启动期间从 Cloud Storage 并发下载模型

9. 清理

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,您可以删除项目或删除各个资源。

方法 1:删除资源

删除 Cloud Run 服务

gcloud run services delete $SERVICE_NAME \
      --region $REGION \
      --quiet

删除服务账号

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

删除 Cloud Storage 存储分区

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

删除容器映像

此 build 在 Artifact Registry 中创建了一个容器映像。您可以找到相应映像名称并将其删除。

列出映像以查找确切名称(通常为 gcr.io/PROJECT_ID/SERVICE_NAME)

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

删除映像(将 IMAGE_NAME 替换为上述结果)

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

方法 2:删除项目

如需删除整个项目,请前往管理资源,选择您在第 2 步中创建的项目,然后选择“删除”。如果您删除项目,则需要在 Cloud SDK 中更改项目。您可以运行 gcloud projects list 查看所有可用项目的列表。