在 Cloud Run 工作中,使用 FFmpeg 透過 GPU 加速影片轉碼

本教學課程說明如何使用 Cloud Run 工作,轉碼低優先順序的離線影片。

目標

在本教學課程中,您將執行下列操作:

費用

在本文件中,您會使用下列 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. Install the Google Cloud CLI.

  3. 若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI

  4. 執行下列指令,初始化 gcloud CLI:

    gcloud init
  5. Create or select a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.
    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  6. Verify that billing is enabled for your Google Cloud project.

  7. Install the Google Cloud CLI.

  8. 若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI

  9. 執行下列指令,初始化 gcloud CLI:

    gcloud init
  10. Create or select a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.
    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  11. Verify that billing is enabled for your Google Cloud project.

  12. Enable the Cloud Run, Artifact Registry, and Cloud Build APIs:

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    gcloud services enable run.googleapis.com cloudbuild.googleapis.com artifactregistry.googleapis.com
  13. 將地區設為環境變數:
    export REGION=REGION
  14. 建立服務帳戶:
    gcloud iam service-accounts create video-encoding
  15. 在「配額和系統限制」頁面的 Cloud Run Admin API 下方,要求 Total Nvidia L4 GPU allocation without zonal redundancy, per project per region,完成本教學課程。或者,您也可以部署 Cloud Run 服務,系統會自動為區域授予 3 個 nvidia-l4 GPU 配額 (可用區備援機制關閉)。
  16. 必要的角色

    如要取得完成本教學課程所需的權限,請要求管理員在專案中授予您下列 IAM 角色:

    如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

    您或許也能透過自訂角色或其他預先定義的角色,取得必要權限。

    授予角色

    控制台

    1. 前往 Google Cloud 控制台的「IAM」頁面。

      前往 IAM
    2. 選取專案。
    3. 點按「 Grant access」(授予存取權)
    4. 在「New principals」(新增主體) 欄位中,輸入您的使用者 ID。這通常是部署 Cloud Run 服務時使用的電子郵件地址。

    5. 在「Select a role」(選取角色) 清單中,選取角色。
    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 服務時使用的電子郵件地址。
    • ROLE,並將角色新增至部署者帳戶。

    準備申請

    如要擷取要使用的程式碼範例:

    1. 將範例存放區複製到本機電腦中:

      git clone https://github.com/GoogleCloudPlatform/cloud-run-samples
      
    2. 變更為包含 Cloud Run 範例程式碼的目錄:

      cd cloud-run-samples/jobs-video-encoding
      

    建立 Cloud Storage 值區

    如要儲存待處理的影片,以及儲存編碼結果,請建立下列兩個 Cloud Storage bucket:

    1. 建立值區,以便在處理影片前儲存影片:

      gcloud storage buckets create gs://preprocessing-PROJECT_ID \
        --location LOCATION
      

      更改下列內容:

      • PROJECT_ID:您的專案 ID。
      • LOCATION:Cloud Storage 位置。
    2. 授予服務帳戶從這個 bucket 讀取的權限:

      gcloud storage buckets add-iam-policy-binding gs://preprocessing-PROJECT_ID \
        --member="serviceAccount:video-encoding@PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/storage.objectViewer"
      

      PROJECT_ID 替換為專案 ID。

    3. 建立值區,用於儲存處理後的轉碼影片:

      gcloud storage buckets create gs://transcoded-PROJECT_ID \
        --location LOCATION
      

      更改下列內容:

      • PROJECT_ID:您的專案 ID。
      • LOCATION:Cloud Storage 位置。
    4. 授予服務帳戶讀取及寫入這個 bucket 的權限:

      gcloud storage buckets add-iam-policy-binding gs://transcoded-PROJECT_ID \
        --member="serviceAccount:video-encoding@PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/storage.objectAdmin"
      

      PROJECT_ID 替換為專案 ID。

    部署 Cloud Run 工作

    使用範例存放區中的 Dockerfile 建立 Cloud Run 作業,並掛接您建立的 bucket

    1. 前往範例目錄:

      cd cloud-run-samples/jobs-video-encoding
      

    1. 如果預設 Cloud Run 登錄檔不存在,請建立 Artifact Registry:

      gcloud artifacts repositories create cloud-run-source-deploy \
        --repository-format=docker \
        --location LOCATION
      

      LOCATION 替換為登錄檔位置的名稱。

    2. 建構容器映像檔:

      gcloud builds submit \
        --tag LOCATION-docker.pkg.dev/PROJECT_ID/cloud-run-source-deploy/IMAGE_NAME \
        --machine-type E2-HIGHCPU-32
      

      更改下列內容:

      • PROJECT_ID:您的專案 ID。
      • LOCATION:登錄檔位置的名稱。
      • IMAGE_NAME:容器映像檔的名稱,例如:ffmpeg-image

      Cloud Run 會使用較大的機器類型,縮短建構時間。

    3. 部署工作:

      gcloud run jobs create video-encoding-job \
          --image LOCATION-docker.pkg.dev/PROJECT_ID/cloud-run-source-deploy/IMAGE_NAME \
          --region REGION \
          --memory 32Gi \
          --cpu 8 \
          --gpu 1 \
          --gpu-type nvidia-l4 \
          --no-gpu-zonal-redundancy \
          --max-retries 1 \
          --service-account video-encoding@PROJECT_ID.iam.gserviceaccount.com \
          --add-volume=name=input-volume,type=cloud-storage,bucket=preprocessing-PROJECT_ID,readonly=true \
          --add-volume-mount=volume=input-volume,mount-path=/inputs \
          --add-volume=name=output-volume,type=cloud-storage,bucket=transcoded-PROJECT_ID \
          --add-volume-mount=volume=output-volume,mount-path=/outputs
      

      更改下列內容:

      • PROJECT_ID:您的專案 ID。
      • REGION:區域名稱。注意:這必須是您有 GPU 配額的相同區域。
      • IMAGE_NAME:容器映像檔的名稱,例如 ffmpeg-image

      如果這是您第一次在這個專案中從來源部署,Cloud Run 會提示您建立預設的 Artifact Registry 存放區。

    執行工作

    如要執行這項工作,請按照下列步驟操作:

    1. 上傳要編碼的範例影片:

      gcloud storage cp gs://cloud-samples-data/video/cat.mp4 gs://preprocessing-PROJECT_ID
      
    2. 執行工作:

      gcloud run jobs execute video-encoding-job  \
          --region REGION \
          --wait \
          --args="cat.mp4,encoded_cat.mp4,-vcodec,h264_nvenc,-cq,21,-movflags,+faststart"
      

      entrypoint.sh 檔案需要輸入檔案、輸出檔案,以及要傳送至 FFmpeg 的任何引數。

    3. 查看 Cloud Run 記錄,確認影片已轉碼:

      gcloud run jobs logs read video-encoding-job --region REGION
      
    4. 下載轉碼後的影片:

      gcloud storage cp gs://transcoded-PROJECT_ID/encoded_cat.mp4 .
      

    清除所用資源

    為避免系統向您的 Google Cloud 帳戶收取額外費用,請刪除您透過本快速入門導覽課程部署的所有資源。

    刪除存放區

    Cloud Run 只會針對工作執行時間收費。不過,您可能仍須支付在 Artifact Registry 中儲存容器映像檔的費用。如要刪除 Artifact Registry 存放區,請按照 Artifact Registry 說明文件中的「刪除存放區」一節操作。

    刪除工作

    只有在執行工作時,Cloud Run 工作才會產生費用。 如要刪除 Cloud Run 工作,請按照下列步驟操作:

    控制台

    如要刪除工作:

    1. 前往 Google Cloud 控制台的 Cloud Run:

      前往 Cloud Run

    2. 在工作清單中找出要刪除的工作,然後按一下核取方塊來選取。

    3. 按一下「Delete」(刪除)。這會終止所有進行中的工作執行作業和所有執行中的容器執行個體。

    gcloud

    如要刪除 Job,請執行下列指令:

    gcloud run jobs delete JOB_NAME

    JOB_NAME 改為工作名稱。

    刪除測試專案

    刪除專案後,系統就會停止對該專案中的所有資源收取費用。 Google Cloud 如要釋出專案中的所有 Google Cloud 資源,請按照下列步驟操作:

      Delete a Google Cloud project:

      gcloud projects delete PROJECT_ID

    後續步驟