目標
本指南說明如何在 Cloud Run GPU 上,透過 Gemma 3 和 Ollama 執行 LLM 推論作業,並達成下列目標:
如要瞭解如何使用預先建構的容器,在 Cloud Run 上部署 Gemma 3 開放模型,請參閱「在 Cloud Run 上執行 Gemma 3 模型」。
費用
在本文件中,您會使用 Google Cloud的下列計費元件:
如要根據預測用量估算費用,請使用 Pricing Calculator。
事前準備
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Run, and Cloud Storage APIs.
- 安裝並初始化 gcloud CLI。
- 在「配額和系統限制」頁面中,要求 Cloud Run Admin API 的
Total Nvidia L4 GPU allocation, per project per region
配額,即可完成本教學課程。 -
Artifact Registry 管理員 (
roles/artifactregistry.admin
) -
Cloud Build 編輯器 (
roles/cloudbuild.builds.editor
) -
Cloud Run Admin (
roles/run.admin
) -
專案 IAM 管理員 (
roles/resourcemanager.projectIamAdmin
) -
服務帳戶使用者 (
roles/iam.serviceAccountUser
) -
服務用量消費者 (
roles/serviceusage.serviceUsageConsumer
) -
儲存空間管理員 (
roles/storage.admin
) -
前往 Google Cloud 控制台的「IAM」IAM頁面。
前往 IAM - 選取專案。
- 按一下「授予存取權」 。
-
在「New principals」(新增主體) 欄位中輸入使用者 ID。這通常是部署 Cloud Run 服務時使用的 Google 帳戶電子郵件地址。
- 在「Select a role」(選取角色) 清單中,選取角色。
- 如要授予其他角色,請按一下 「新增其他角色」,然後新增每個其他角色。
- 按一下 [儲存]。
- 將 PROJECT_NUMBER 改成您的 Google Cloud 專案編號。
- 將 PROJECT_ID 改成您的專案 ID。 Google Cloud
- PRINCIPAL,並為該帳戶新增繫結。這通常是部署 Cloud Run 服務時使用的 Google 帳戶電子郵件地址。
- ROLE,並將角色新增至部署者帳戶。
必要的角色
如要取得完成本教學課程所需的權限,請要求管理員為您授予專案的下列 IAM 角色:
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
授予角色
控制台
gcloud
如要在專案中授予帳戶必要的 IAM 角色,請按照下列步驟操作:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=PRINCIPAL \ --role=ROLE
取代:
設定 gcloud
如要為 Cloud Run 服務設定 Google Cloud CLI:
設定您的預設專案:
gcloud config set project PROJECT_ID
按一下 圖示,將變數 PROJECT_ID 替換為您為本教學課程建立的專案名稱。這樣可確保這個頁面上參照 PROJECT_ID 的所有房源資訊,都已填入正確的值。
將 Google Cloud CLI 設為使用
europe-west1
區域,執行 Cloud Run 指令。gcloud config set run/region europe-west1
使用 Docker 建立包含 Ollama 和 Gemma 的容器映像檔
為 Ollama 服務建立目錄,並將工作目錄變更為這個新目錄:
mkdir ollama-backend cd ollama-backend
使用以下內容建立
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:
啟動 Proxy,並在系統提示安裝
cloud-run-proxy
元件時選擇Y
:gcloud run services proxy ollama-gemma --port=9090
在另一個終端機分頁中傳送要求,讓 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 資源: