透過 Gemma 3 和 Ollama 在 Cloud Run GPU 上執行大型語言模型推論


目標

本指南說明如何在 Cloud Run GPU 上,透過 Gemma 3 和 Ollama 執行 LLM 推論作業,並達成下列目標:

  • 在啟用 GPU 的 Cloud Run 服務上,部署 OllamaGemma 3 模型。
  • 將提示傳送至私人端點上的 Ollama 服務。

如要瞭解如何使用預先建構的容器,在 Cloud Run 上部署 Gemma 3 開放模型,請參閱「在 Cloud Run 上執行 Gemma 3 模型」。

費用

在本文件中,您會使用 Google Cloud的下列計費元件:

如要根據預測用量估算費用,請使用 Pricing Calculator 初次使用 Google Cloud 的使用者可能符合免費試用資格。

事前準備

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Enable the Artifact Registry, Cloud Build, Cloud Run, and Cloud Storage APIs.

    Enable the APIs

  7. 安裝並初始化 gcloud CLI
  8. 在「配額和系統限制」頁面中,要求 Cloud Run Admin API 的 Total Nvidia L4 GPU allocation, per project per region 配額,即可完成本教學課程。
  9. 必要的角色

    如要取得完成本教學課程所需的權限,請要求管理員為您授予專案的下列 IAM 角色:

    如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

    您或許還可透過自訂角色或其他預先定義的角色取得必要權限。

    授予角色

    控制台

    1. 前往 Google Cloud 控制台的「IAM」IAM頁面。

      前往 IAM
    2. 選取專案。
    3. 按一下「授予存取權」
    4. 在「New principals」(新增主體) 欄位中輸入使用者 ID。這通常是部署 Cloud Run 服務時使用的 Google 帳戶電子郵件地址。

    5. 在「Select a role」(選取角色) 清單中,選取角色。
    6. 如要授予其他角色,請按一下 「新增其他角色」,然後新增每個其他角色。
    7. 按一下 [儲存]

    gcloud

    如要在專案中授予帳戶必要的 IAM 角色,請按照下列步驟操作:

         gcloud projects add-iam-policy-binding PROJECT_ID \
             --member=PRINCIPAL \
             --role=ROLE
         

    取代:

    • PROJECT_NUMBER 改成您的 Google Cloud 專案編號。
    • PROJECT_ID 改成您的專案 ID。 Google Cloud
    • PRINCIPAL,並為該帳戶新增繫結。這通常是部署 Cloud Run 服務時使用的 Google 帳戶電子郵件地址。
    • ROLE,並將角色新增至部署者帳戶。

設定 gcloud

如要為 Cloud Run 服務設定 Google Cloud CLI:

  1. 設定您的預設專案:

    gcloud config set project PROJECT_ID

    按一下 圖示,將變數 PROJECT_ID 替換為您為本教學課程建立的專案名稱。這樣可確保這個頁面上參照 PROJECT_ID 的所有房源資訊,都已填入正確的值。

  2. 將 Google Cloud CLI 設為使用 europe-west1 區域,執行 Cloud Run 指令。

    gcloud config set run/region europe-west1

使用 Docker 建立包含 Ollama 和 Gemma 的容器映像檔

  1. 為 Ollama 服務建立目錄,並將工作目錄變更為這個新目錄:

    mkdir ollama-backend
    cd ollama-backend
  2. 使用以下內容建立 Dockerfile 檔案:

    FROM ollama/ollama:latest
    
    # Listen on all interfaces, port 8080
    ENV OLLAMA_HOST 0.0.0.0:8080
    
    # 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
    
    # Store the model weights in the container image
    ENV MODEL gemma3:4b
    RUN ollama serve & sleep 5 && ollama pull $MODEL
    
    # Start Ollama
    ENTRYPOINT ["ollama", "serve"]
    

將模型權重儲存在容器映像檔中,加快執行個體啟動速度

Google 建議直接在容器映像檔中儲存 Gemma 3 (4B) 和大小類似模型的模型權重

模型權重是定義大型語言模型行為的數值參數。 Ollama 必須在容器例項啟動期間完整讀取這些檔案,並將權重載入 GPU 記憶體 (VRAM),才能開始處理推論要求。

在 Cloud Run 中,快速啟動容器執行個體對於縮短要求延遲時間非常重要。如果容器執行個體的啟動時間較長,服務從零個執行個體擴充至一個執行個體所需的時間就會較長,且在流量尖峰期間,服務需要更多時間才能擴充。

為確保快速啟動,請將模型檔案儲存在容器映像檔本身。這比在啟動期間從遠端位置下載檔案更快且更可靠。Cloud Run 的內部容器映像檔儲存空間經過最佳化,可處理流量尖峰,因此在執行個體啟動時,能夠快速設定容器的檔案系統。

請注意,Gemma 3 (4B) 的模型權重會占用 8 GB 的儲存空間。較大的模型會有較大的模型權重檔案,可能不適合儲存在容器映像檔中。如需相關取捨考量的總覽,請參閱「最佳做法:在 Cloud Run 中使用 GPU 進行 AI 推論」。

建構及部署 Cloud Run 服務

建構服務並部署至 Cloud Run:

gcloud run deploy ollama-gemma \
  --source . \
  --concurrency 4 \
  --cpu 8 \
  --set-env-vars OLLAMA_NUM_PARALLEL=4 \
  --gpu 1 \
  --gpu-type nvidia-l4 \
  --max-instances 1 \
  --memory 32Gi \
  --no-allow-unauthenticated \
  --no-cpu-throttling \
  --no-gpu-zonal-redundancy \
  --timeout=600

請注意這個指令中的下列重要標記:

  • --concurrency 4 會設為與環境變數 OLLAMA_NUM_PARALLEL 的值相符。
  • --gpu 1 會為服務中的每個 Cloud Run 執行個體指派 1 個 NVIDIA L4 GPU。--gpu-type nvidia-l4
  • --max-instances 1 指定要擴充的執行個體數量上限。必須等於或低於專案的 NVIDIA L4 GPU (Total Nvidia L4 GPU allocation, per project per region) 配額。
  • --no-allow-unauthenticated 限制對服務的未經驗證存取權。 不公開服務可讓您依靠 Cloud Run 的內建身分與存取權管理 (IAM) 驗證,進行服務間的通訊。請參閱「使用 IAM 管理存取權」。
  • 啟用 GPU 時必須提供 --no-cpu-throttling
  • --no-gpu-zonal-redundancy 根據可用區容錯移轉需求和可用配額,設定可用區備援選項。詳情請參閱 GPU 區域備援機制選項

設定並行數以獲得最佳效能

本節提供建議並行設定的背景資訊。為達到最佳要求延遲時間,請確保 --concurrency 設定等於 Ollama 的 OLLAMA_NUM_PARALLEL 環境變數。

  • OLLAMA_NUM_PARALLEL 決定每個模型可用的要求配額數量,以便同時處理推論要求。
  • --concurrency 決定 Cloud Run 同時傳送給 Ollama 執行個體的要求數量。

如果 --concurrency 超過 OLLAMA_NUM_PARALLEL,Cloud Run 傳送至 Ollama 模型的要求數量,可能會超過可用的要求時段。這會導致 Ollama 內的要求排隊,進而增加排隊要求的延遲時間。此外,由於佇列中的要求不會觸發 Cloud Run 擴充及啟動新執行個體,因此自動調度資源的回應速度也會變慢。

Ollama 也支援從單一 GPU 提供多個模型。如要完全避免 Ollama 例項上的要求排隊,您仍應將 --concurrency 設為與 OLLAMA_NUM_PARALLEL 相符。

請注意,增加 OLLAMA_NUM_PARALLEL 也會導致平行要求耗費更長時間。

最佳化使用率

如要達到最佳 GPU 使用率,請增加 --concurrency,但不要超過 OLLAMA_NUM_PARALLEL 值的兩倍。雖然這會導致 Ollama 中的要求排隊,但有助於提高使用率:Ollama 執行個體可以立即處理佇列中的要求,而佇列有助於吸收流量尖峰。

使用 curl 測試已部署的 Ollama 服務

Ollama 服務部署完成後,您就可以傳送要求。不過,如果您直接傳送要求,Cloud Run 會以 HTTP 401 Unauthorized 回應。這是刻意設計,因為 LLM 推論 API 適用於其他服務呼叫,例如前端應用程式。如要進一步瞭解 Cloud Run 的服務間驗證,請參閱「服務間驗證」。

如要將要求傳送至 Ollama 服務,請在要求中加入含有有效 OIDC 權杖的標頭,例如使用 Cloud Run 開發人員 Proxy

  1. 啟動 Proxy,並在系統提示安裝 cloud-run-proxy 元件時選擇 Y

    gcloud run services proxy ollama-gemma --port=9090
  2. 在另一個終端機分頁中傳送要求,讓 Proxy 保持執行狀態。請注意,Proxy 會在 localhost:9090 上執行:

    curl http://localhost:9090/api/generate -d '{
      "model": "gemma3:4b",
      "prompt": "Why is the sky blue?"
    }'

    這個指令應會提供類似以下的串流輸出內容:

    {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.641492408Z","response":"That","done":false}
    {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.687529153Z","response":"'","done":false}
    {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.753284927Z","response":"s","done":false}
    {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.812957381Z","response":" a","done":false}
    {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.889102649Z","response":" fantastic","done":false}
    {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.925748116Z","response":",","done":false}
    {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.958391572Z","response":" decept","done":false}
    {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.971035028Z","response":"ively","done":false}
    {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.989678484Z","response":" tricky","done":false}
    {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.999321940Z","response":" question","done":false}
    ...
    

清除所用資源

刪除在本教學課程中建立的下列 Google Cloud 資源:

後續步驟