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

1. 簡介

總覽

在本程式碼研究室中,您將使用 Cloud Run 作業,搭配 Meta 的 Llama 3.2-1b LLMvLLM (由 Cloud Run 作業 GPU 提供動力) 執行批次推論。您將使用 Cloud Run 掛載的磁碟機積體,直接將結果寫入 Cloud Storage。

課程內容

  • 如何使用 Cloud Run 作業 GPU 進行批次推論
  • 如何使用 Cloud Run 掛接的磁碟映像檔寫入 Cloud Storage

2. 事前準備

啟用 API

開始使用本程式碼研究室前,請先執行以下 API 啟用作業:

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

GPU 配額

申請提高支援地區的配額。在 Cloud Run Admin API 下,配額為 nvidia_l4_gpu_allocation_no_zonal_redundancy

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

Hugging Face

本程式碼研究室使用 Hugging Face 託管的模型。如要取得這個模型,請使用「Read」權限要求 Hugging Face 使用者存取權杖。您稍後會以 YOUR_HF_TOKEN 的形式參照這個值區。

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

3. 設定和需求

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

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

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

  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. 建立值區來代管微調後的模型:
    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 beta 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 值區中查看結果:

在控制台中:

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

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

6. 恭喜!

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

建議您參閱 Cloud Run 說明文件。

涵蓋內容

  • 如何使用 Cloud Run 作業 GPU 進行批次推論
  • 如何使用 Cloud Run 掛接的磁碟映像檔寫入 Cloud Storage

7. 清理

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

如要刪除整個專案,請前往「Manage Resources」,選取您在步驟 2 中建立的專案,然後選擇「Delete」(刪除)。如果您刪除專案,就必須在 Cloud SDK 中變更專案。您可以執行 gcloud projects list 來查看所有可用專案的清單。