如何在 Cloud Run 工作上執行批次推論

1. 簡介

總覽

在本程式碼研究室中,您將使用 Cloud Run 工作,透過 Meta 的 Llama 3.2-1b LLMvLLM 執行批次推論,並由 Cloud Run Jobs GPU 提供支援。您將使用 Cloud Run 磁碟區掛接,直接將結果寫入 Cloud Storage。

課程內容

  • 如何使用 Cloud Run Jobs GPU 執行批次推論
  • 如何使用 Cloud Run 磁碟區掛接將資料寫入 Cloud Storage

2. 事前準備

啟用 API

開始使用本程式碼研究室前,請先執行下列指令,啟用下列 API:

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

GPU 配額

申請提高支援區域的配額。配額為 nvidia_l4_gpu_allocation_no_zonal_redundancy,位於 Cloud Run Admin API 下方。

注意:如果您使用新專案,啟用 API 後,配額可能需要幾分鐘才會顯示在這個頁面。

Hugging Face

本程式碼研究室會使用 Hugging Face 託管的模型。如要取得這個模型,請申請具備「讀取」權限的 Hugging Face 使用者存取權杖。您稍後會以 YOUR_HF_TOKEN 參照這個位址。

您也必須同意使用條款才能使用模型:https://huggingface.co/meta-llama/Llama-3.2-1B

3. 設定和需求

本節包含下列資源的設定說明:

  • IAM 服務帳戶和相關聯的 IAM 權限。
  • Secret Manager 密鑰,用於儲存 Hugging Face 權杖。
  • 用於儲存推論結果的 Cloud Storage bucket。

如要設定必要資源,請按照下列步驟操作:

  1. 為本程式碼研究室設定環境變數:
    export PROJECT_ID=<your_project_id>
    export REGION=<your_region>
    export HF_TOKEN=<YOUR_HF_TOKEN>
    
    export SERVICE_ACCOUNT=inference-service-account
    export SERVICE_ACCOUNT_EMAIL=${SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com
    export SECRET_ID=hugging-face-token
    export BUCKET_NAME=inference-codelab-${PROJECT_ID}
    
  2. 執行下列指令來建立服務帳戶:
    gcloud iam service-accounts create ${SERVICE_ACCOUNT} \
      --display-name="Service account for batch inference codelab"
    
  3. 使用 Secret Manager 儲存 Hugging Face 存取權杖:
    gcloud secrets create $SECRET_ID \
          --replication-policy="automatic"
    
    printf $HF_TOKEN | gcloud secrets versions add $SECRET_ID --data-file=-
    
  4. 將 Secret Manager 密鑰存取者角色授予服務帳戶:
    gcloud secrets add-iam-policy-binding $SECRET_ID \
      --member serviceAccount:$SERVICE_ACCOUNT_EMAIL \
      --role='roles/secretmanager.secretAccessor'
    
  5. 建立 bucket 來代管微調後的模型:
    gcloud storage buckets create -l us-central1 gs://${BUCKET_NAME}
    
  6. 授予服務帳戶 bucket 的存取權:
    gcloud storage buckets add-iam-policy-binding gs://$BUCKET_NAME \
      --member=serviceAccount:$SERVICE_ACCOUNT_EMAIL \
      --role=roles/storage.objectAdmin
    
  7. 建立 Artifact Registry 存放區來儲存容器映像檔。如果您先前已在專案中使用 Cloud Run 來源部署,請略過這個步驟。
    gcloud artifacts repositories create cloud-run-source-deploy \
        --repository-format=docker \
        --location=$REGION \
        --project=$PROJECT_ID
    

4. 建立 Cloud Run 工作

在本節中,您將建立執行下列操作的程式碼:

  • 從 Hugging Face 匯入 Llama 模型
  • 對模型執行批次推論。這項工作會使用單一 L4 GPU 執行此程序。
  • 將結果寫入本機磁碟。這會透過磁碟區掛接寫入 Cloud Storage。

如要建立 Cloud Run 工作和 Dockerfile,請按照下列步驟操作:

  1. 建立目錄來存放微調工作程式碼:
    mkdir codelab-inference-job
    cd codelab-inference-job
    
  2. 建立名為 main.py 的檔案
    # SPDX-License-Identifier: Apache-2.0
    from vllm import LLM, SamplingParams
    
    # Sample prompts.
    prompts = [
        "Cloud Run is",
        "The future of AI is",
        "The capital of Germany is",
        "python as a programming language is",
    ]
    # Create a sampling params object.
    sampling_params = SamplingParams(temperature=0.8, top_p=0.95)
    
    # Create an LLM.
    llm = LLM(model="meta-llama/Llama-3.2-1B")
    # Generate texts from the prompts. The output is a list of RequestOutput objects
    # that contain the prompt, generated text, and other information.
    outputs = llm.generate(prompts, sampling_params)
    
    # Save the outputs to disk
    with open("/results/output.txt", "w") as f:
        for output in outputs:
            prompt = output.prompt
            generated_text = output.outputs[0].text
            f.write(f"Prompt: {prompt!r}, Generated text: {generated_text!r}\n")
    
    print(f"Wrote {len(outputs)} to disk.")
    
  3. 建立 Dockerfile
    FROM python:3.12
    ADD main.py .
    RUN python -m pip install --upgrade pip setuptools
    RUN pip install vllm
    CMD ["python", "./main.py"]
    

5. 部署及執行工作

在這個步驟中,您將使用 Cloud Run 來源部署建立 Cloud Run 工作,然後執行該工作。這個步驟也包含 Cloud Run 磁碟區掛接標記,可儲存結果。

  1. 建立 Cloud Run 工作:
    gcloud run jobs deploy inference-job \
      --region $REGION \
      --source . \
      --gpu=1 \
      --set-secrets HF_TOKEN=${SECRET_ID}:latest \
      --add-volume name=results,type=cloud-storage,bucket=${BUCKET_NAME} \
      --add-volume-mount volume=results,mount-path=/results \
      --service-account $SERVICE_ACCOUNT_EMAIL
    
    這個指令會從來源建構映像檔,並部署工作。這項作業需要一段時間才能完成。
  2. 執行工作:
    gcloud run jobs execute inference-job --region $REGION --async
    
    這項工作需要幾分鐘才能完成。您可以透過最後一個指令輸出內容中提供的連結,查看狀態。

確認成功

如要確認工作是否成功執行,請查看工作記錄,如上一個指令的輸出內容所示。

在 Cloud Storage bucket 中查看結果:

在控制台中:

  1. 前往 Cloud Storage
  2. 選取以 inference-codelab 開頭的 bucket。
  3. 選取「output.txt」。
  4. 按一下「已驗證網址」,即可在瀏覽器中查看內容。

檔案內容應為四個提示及其輸出內容。

6. 恭喜!

恭喜您完成本程式碼研究室!

建議參閱 Cloud Run 說明文件。

涵蓋內容

  • 如何使用 Cloud Run Jobs GPU 執行批次推論
  • 如何使用 Cloud Run 磁碟區掛接將資料寫入 Cloud Storage

7. 清除所用資源

如要刪除 Cloud Run 工作,請前往 Cloud Run Cloud 控制台 (https://console.cloud.google.com/run) 並刪除 inference-job 工作。

如要刪除整個專案,請前往「管理資源」,選取您在步驟 2 中建立的專案,然後選擇「刪除」。刪除專案後,您必須在 Cloud SDK 中變更專案。如要查看所有可用專案的清單,請執行 gcloud projects list