在 Cloud Run 上透過 vLLM 提供 Gemma 3

1. 簡介

大型語言模型 (LLM) 正在改變我們建構智慧型應用程式的方式。但要讓這些強大的模型準備好在現實世界中使用,可能很棘手。這類模型需要大量運算能力,尤其是顯示卡 (GPU),以及能同時處理多項要求的智慧方式。此外,您希望降低成本,並確保應用程式順暢運作,不會發生延遲。

本程式碼研究室將說明如何解決這些難題!我們會使用兩項重要工具:

  1. vLLM:可將其視為 LLM 的超快速引擎。這項功能可大幅提升模型執行效率,一次處理更多要求,並減少記憶體用量。
  2. Google Cloud Run:這是 Google 的無伺服器平台。這項服務非常適合部署應用程式,因為它會為您處理所有資源調度作業,從零位使用者到數千位使用者,再回到零位使用者,都能輕鬆應付。最重要的是,Cloud Run 現在支援 GPU,這是託管 LLM 的必要條件!

結合使用 vLLM 和 Cloud Run,就能以強大、彈性且符合成本效益的方式,提供 LLM 服務。在本指南中,您將部署開放模型,並以標準網頁 API 的形式提供。

學習內容:

  • 如何選擇適當的模型大小和變體來放送廣告。
  • 如何設定 vLLM,以提供與 OpenAI 相容的 API 端點。
  • 如何使用 Docker 將 vLLM 伺服器容器化。
  • 如何將容器映像檔推送到 Google Artifact Registry。
  • 如何將容器部署至 Cloud Run,並啟用 GPU 加速功能。
  • 如何測試已部署的模型。

事前準備

  • 用來存取 Google Cloud 控制台的瀏覽器,例如 Chrome
  • 穩定的網路連線
  • 啟用計費功能的 Google Cloud 專案
  • Hugging Face 存取權杖 (如果還沒有,請在這裡建立)
  • 對 Python、Docker 和指令列介面有基本的瞭解
  • 好奇心和學習意願

2. 事前準備

設定 Google Cloud 專案

本程式碼研究室需要具備有效帳單帳戶的 Google Cloud 專案。

  • 講師主導的課程:如果您在教室中,講師會提供必要的專案和帳單資訊。按照老師的指示完成設定。
  • 獨立學習者:如果您是獨立學習者,請設定新專案並啟用試用帳單帳戶。如要開始使用,請按照下列步驟操作。
  • 按下 Ctrl + Shift + N 鍵或 Cmd + Shift + N 鍵,開啟無痕視窗
  • 從無痕視窗前往兌換入口網站
  • 使用個人 Gmail 帳戶登入,取得試用帳單帳戶
  • 按照這份簡報中的操作說明完成設定

設定 Cloud Shell

接著設定 Cloud Shell,這是 Google Cloud 控制台內建的實用指令列介面。

啟動 Cloud Shell

Google Cloud 控制台的右上角,你會看到類似終端機的圖示 (>_)。點選該圖示即可啟用 Cloud Shell。

8e234ad9973e49d4.png

授權存取

如果系統提示您授權,請按一下「授權」,授予 Cloud Shell 與 Google Cloud 專案互動的必要權限。

d5e271ec814f5769.png

驗證專案 ID

查看終端機中的 Project ID。如下圖所示,這段文字會以黃色顯示。確認這是您建立專案時記錄的 ID。

b0cc3fe9f0868217.png

如果終端機中正確反映 Project ID,請繼續進行「啟用必要的 API」步驟。

正確的專案 ID (如有需要)

如果 Project ID 錯誤或未完整顯示,請使用這個指令修正。請務必先將 your-project-id 文字替換為正確的 Project ID,再執行指令。

gcloud config set project your-project-id

啟用必要的 API

如要使用 Cloud Run 等 Google Cloud 服務,請先為專案啟用對應的 API。在 Cloud Shell 中執行下列指令,啟用本 Codelab 的必要服務:

gcloud services enable run.googleapis.com
gcloud services enable cloudbuild.googleapis.com
gcloud services enable secretmanager.googleapis.com
gcloud services enable artifactregistry.googleapis.com

3. 選擇合適的機型

您可以在 Hugging Face HubKaggle 等網站上找到許多開放原始碼模型。如要在 Google Cloud Run 等服務上使用其中一個模型,您需要選擇符合現有資源 (即 NVIDIA L4 GPU) 的模型。

除了大小之外,請務必考量模型實際能執行的工作。模型各不相同,各有優缺點。舉例來說,有些模型可以處理不同類型的輸入內容 (例如圖片和文字,也就是多模態功能),有些模型則可一次記憶及處理更多資訊 (也就是具有較大的脈絡視窗)。通常,較大型的模型會具備更進階的功能,例如函式呼叫思考

此外,也請務必確認服務工具 (本例中為 vLLM) 是否支援所需模型。如要查看 vLLM 支援的所有模型,請按這裡

現在,讓我們來瞭解 Gemma 3,這是 Google 最新推出的開放式大型語言模型 (LLM) 系列。Gemma 3 共有四種不同規模,複雜程度以參數衡量:10 億、40 億、120 億和 270 億。

每種尺寸都有兩大類型:

  • 基礎 (預先訓練) 版本:這是從大量資料中學習的基礎模型。
  • 經過指令微調的版本:這個版本經過進一步微調,可更瞭解及遵循特定指令或命令。

較大的模型 (40 億、120 億和 270 億個參數) 屬於多模態,可解讀及處理圖片和文字。不過,最小的 10 億參數變體只專注於文字。

在本程式碼研究室中,我們將使用 10 億個變體的 Gemma 3:gemma-3-1b-it。使用較小的模型也有助於瞭解如何運用有限資源,這對於降低成本及確保應用程式在雲端順暢運作至關重要。

4. 環境變數和密鑰

建立環境檔案

繼續操作前,建議您將本程式碼研究室中使用的所有設定集中管理。如要開始使用,請開啟終端機並按照下列步驟操作:

  1. 為這個專案建立新資料夾
  2. 前往新建立的資料夾。
  3. 在這個資料夾中建立空白的 .env 檔案 (這個檔案稍後會保存環境變數)

執行這些步驟的指令如下:

mkdir vllm-gemma3
cd vllm-gemma3
touch .env

接著,複製下列變數,並貼到剛才建立的 .env 檔案中。請記得將預留位置值 (your_project_idyour_region) 替換為您的專案資訊。例如 (PROJECT_ID=unique-ai-projectREGION=us-central1)

PROJECT_ID=your_project_id
REGION=your_region

MODEL_PROVIDER=google
MODEL_VARIANT=gemma-3-1b-it
MODEL_NAME=${MODEL_PROVIDER}/${MODEL_VARIANT}

AR_REPO_NAME=vllm-gemma3-repo
SERVICE_NAME=${MODEL_VARIANT}-service
IMAGE_NAME=${REGION}-docker.pkg.dev/${PROJECT_ID}/${AR_REPO_NAME}/${SERVICE_NAME}

SERVICE_ACC_NAME=${SERVICE_NAME}-sa
SERVICE_ACC_EMAIL=${SERVICE_ACC_NAME}@${PROJECT_ID}.iam.gserviceaccount.com

編輯並儲存 .env 檔案後,請輸入下列指令,將這些環境變數載入終端機工作階段:

source .env

您可以回應其中一個變數,測試變數是否已成功載入。例如:

echo $SERVICE_NAME

如果取得的值與您在 .env 檔案中指派的值相同,表示變數已成功載入。

在 Secret Manager 中儲存密鑰

對於任何私密資料 (包括存取代碼、憑證和密碼),建議使用密碼管理工具。

Gemma 3 模型設有使用限制,因此您必須先詳閱並接受條款及細則,才能使用。前往 Hugging Face Hub 上的 Gamma3 模型資訊卡,並確認條款及細則。

取得 Hugging Face 存取權杖後,請前往 Secret Manager 頁面,然後按照這些操作說明建立密鑰

  • 前往 Google Cloud 控制台
  • 從左上方的下拉式選單列選取專案
  • 在搜尋列中搜尋「Secret Manager」,然後點選顯示的該選項

在 Secret Manager 頁面中:

  • 按一下「+Create Secret」(+建立密鑰) 按鈕,
  • 填寫下列資訊:
  • 名稱:HF_TOKEN
  • 密鑰值:<your_hf_access_token>
  • 完成後,按一下「建立密鑰」按鈕。

您現在應該已在 Google Cloud Secret Manager 中,將 Hugging Face 存取權杖設為密鑰。

您可以在終端機中執行下列指令,從 Secret Manager 擷取密鑰,測試是否能存取密鑰:

gcloud secrets versions access latest --secret=HF_TOKEN

終端機視窗中應該會顯示擷取到的存取權杖。

5. 建立服務帳戶

為提升安全性,並在正式環境中有效管理存取權,服務應在專屬服務帳戶下運作,且僅限於特定工作所需的權限。

執行下列指令來建立服務帳戶:

gcloud iam service-accounts create $SERVICE_ACC_NAME --display-name='Cloud Run vLLM Model Serving SA'

下列指令會附加必要權限

gcloud secrets add-iam-policy-binding HF_TOKEN \
  --member="serviceAccount:${SERVICE_ACC_EMAIL}" \
  --role="roles/secretmanager.secretAccessor"

6. 在 Artifact Registry 建立映像檔

這個步驟包括建立 Docker 映像檔,其中包含模型權重和預先安裝的 vLLM。

1. 在 Artifact Registry 建立 Docker 存放區

我們將在 Artifact Registry 中建立 Docker 存放區,用於推送建構的映像檔。在終端機中執行下列指令:

gcloud artifacts repositories create ${AR_REPO_NAME} \
  --repository-format docker \
  --location ${REGION}

2. 儲存模型

根據 GPU 最佳做法文件,您可以將 ML 模型儲存在容器映像檔中,或從 Cloud Storage 載入模型時進行最佳化。當然,每種做法都有優缺點。如要進一步瞭解這些項目,請參閱說明文件。為求簡單,我們只會在容器映像檔中儲存模型。

3. 建立 Docker 檔案

建立名為 Dockerfile 的檔案,並將下列內容複製到檔案中:

FROM vllm/vllm-openai:v0.9.0

ARG MODEL_NAME
ARG HF_TOKEN

ENV HF_HOME=/model-cache
ENV MODEL_NAME=${MODEL_NAME}

# Use the HF_TOKEN argument to log in and download the model
RUN huggingface-cli login --token ${HF_TOKEN} && \
    huggingface-cli download ${MODEL_NAME}

ENV HF_HUB_OFFLINE=1

EXPOSE 8080

ENTRYPOINT python3 -m vllm.entrypoints.openai.api_server \
    --port ${PORT:-8080} \
    --model ${MODEL_NAME} \
    --gpu-memory-utilization 0.90 \
    ${MAX_MODEL_LEN:+--max-model-len "$MAX_MODEL_LEN"}

4. 建立 cloudbuild.yaml 檔案

接著,在同一個目錄中建立名為 cloudbuild.yaml 的檔案。這個檔案定義 Cloud Build 要執行的步驟。複製下列內容並貼到 cloudbuild.yaml:

steps:
- name: 'gcr.io/cloud-builders/docker'
  entrypoint: 'bash'
  args:
  - '-c'
  - |
    docker build \
      --build-arg MODEL_NAME=${_MODEL_NAME} \
      --build-arg HF_TOKEN=$$HF_TOKEN_SECRET \
      -t ${_IMAGE_NAME} .
  secretEnv: ['HF_TOKEN_SECRET']

images:
- '${_IMAGE_NAME}'

availableSecrets:
  secretManager:
  - versionName: projects/${PROJECT_ID}/secrets/HF_TOKEN/versions/latest
    env: 'HF_TOKEN_SECRET'

5. 將建構提交至 Cloud Build

複製下列程式碼,並在終端機中執行:

gcloud builds submit . \
    --config=cloudbuild.yaml \
    --region=${REGION} \
    --substitutions=_MODEL_NAME=${MODEL_NAME},_IMAGE_NAME=${IMAGE_NAME}

這項指令會上傳程式碼 (Dockerfilecloudbuild.yaml)、將殼層變數做為替代項目傳遞 (_MODEL_NAME_IMAGE_NAME),並啟動建構作業。

Cloud Build 現在會執行 cloudbuild.yaml 中定義的步驟。您可以在終端機中追蹤記錄,也可以點選 Cloud 控制台中的建構詳細資料連結。完成後,容器映像檔就會出現在 Artifact Registry 存放區中,隨時可供部署。

7. 測試服務

在終端機中執行下列指令來建立 Proxy,以便在 localhost 中存取服務:

gcloud run services proxy ${SERVICE_NAME} --region ${REGION}

在新終端機視窗中,在終端機執行這個 curl 指令,測試連線

curl -X POST http://localhost:8080/v1/completions \
-H "Authorization: Bearer $(gcloud auth print-identity-token)" \
-H "Content-Type: application/json" \
-d '{
  "model": "google/gemma-3-1b-it",
  "prompt": "Cloud Run is a ",
  "max_tokens": 128,
  "temperature": 0.90
}'

如果看到類似下方的輸出內容:

{"id":"cmpl-e96d05d2893d42939c1780d44233defa","object":"text_completion","created":1746870778,"model":"google/gemma-3-1b-it","choices":[{"index":0,"text":"100% managed Kubernetes service. It's a great option for many use cases.\n\nHere's a breakdown of key features and considerations:\n\n* **Managed Kubernetes:**  This means Google handles the underlying infrastructure, including scaling, patching, and maintenance.  You don't need to worry about managing Kubernetes clusters.\n* **Serverless:**  You only pay for the compute time your application actually uses.  No charges when your code isn't running.\n* **Scalability:**  Cloud Run automatically scales your application based on demand. You can easily scale up or down to handle fluctuating traffic.\n*","logprobs":null,"finish_reason":"length","stop_reason":null,"prompt_logprobs":null}],"usage":{"prompt_tokens":6,"total_tokens":134,"completion_tokens":128,"prompt_tokens_details":null}}

8. 結語

恭喜!您已成功完成本程式碼研究室。您已學會如何:

  • 為目標部署作業選擇適當的模型大小。
  • 設定 vLLM,提供與 OpenAI 相容的 API。
  • 使用 Docker 安全地將 vLLM 伺服器和模型權重容器化。
  • 將容器映像檔推送至 Google Artifact Registry。
  • 將 GPU 加速服務部署至 Cloud Run。
  • 測試已部署的已驗證模型。

歡迎探索部署其他精彩模型 (例如 Llama、Mistral 或 Qwen),繼續學習之旅!

9. 清除

為避免日後產生費用,請務必刪除您建立的資源。執行下列指令來清除專案。

1. 刪除 Cloud Run 服務:

gcloud run services delete ${SERVICE_NAME} --region=${REGION} --quiet

2. 刪除 Artifact Registry 存放區:

gcloud artifacts repositories delete ${AR_REPO_NAME} --location=${REGION} --quiet

3. 刪除服務帳戶:

gcloud iam service-accounts delete ${SERVICE_ACC_EMAIL} --quiet

4. 從 Secret Manager 刪除密鑰:

gcloud secrets delete HF_TOKEN --quiet