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


目標

本指南說明如何在 Cloud Run GPU 上使用 Gemma 3 和 Ollama 執行大型語言模型推論作業,並包含以下目標:

  • 在支援 GPU 的 Cloud Run 服務上,部署採用 Gemma 3 模型的 Ollama
  • 透過私人端點向 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」頁面
    2. 選取專案。
    3. 按一下 「授予存取權」
    4. 在「New principals」(新增主體) 欄位中輸入使用者 ID。這個電子郵件地址通常是用來部署 Cloud Run 服務的 Google 帳戶電子郵件地址。

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

    gcloud

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

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

    取代:

    • PROJECT_NUMBER 換成您的 Google Cloud 專案編號。
    • PROJECT_ID 改成您的 Google Cloud 專案 ID。
    • 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) 和同等大小模型的模型權重

模型權重是定義 LLM 行為的數值參數。在容器執行個體啟動期間,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 搭配 --gpu-type nvidia-l4 會為服務中的每個 Cloud Run 執行個體指派 1 個 NVIDIA L4 GPU。
  • --max-instances 1 指定要擴充的執行個體數量上限。必須等於或低於專案的 NVIDIA L4 GPU (Total Nvidia L4 GPU allocation, per project per region) 配額。
  • --no-allow-unauthenticated 會限制未經驗證的服務存取權。不公開服務可讓您依靠 Cloud Run 內建的 Identity and Access Management (IAM) 驗證機制,進行服務對服務的通訊。請參閱「使用 IAM 管理存取權」。
  • 必須啟用 --no-cpu-throttling 才能啟用 GPU。
  • --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 資源:

後續步驟