Cloud Run ジョブでの FFmpeg を使用した GPU アクセラレーションによる動画のコード変換

このチュートリアルでは、Cloud Run ジョブを使用して低優先度のオフライン動画をトランスコードする方法について説明します。

目標

このチュートリアルでは、次のことを行います。

費用

このドキュメントでは、課金対象である次の Google Cloudコンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。

新規の 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. 外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して 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. 外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して 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. [アクセスを許可] をクリックします。
    4. [新しいプリンシパル] フィールドに、ユーザー ID を入力します。これは通常、Cloud Run サービスのデプロイに使用されるメールアドレスです。

    5. [ロールを選択] リストでロールを選択します。
    6. 追加のロールを付与するには、[ 別のロールを追加] をクリックして各ロールを追加します。
    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 バケットを作成する

    処理する動画を保存し、エンコードの結果を保存するには、次の 2 つの Cloud Storage バケットを作成します。

    1. 処理前に動画を保存するバケットを作成します。

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

      次のように置き換えます。

      • PROJECT_ID: プロジェクト ID。
      • LOCATION: Cloud Storage のロケーション。
    2. このバケットから読み取るアクセス権をサービス アカウントに付与します。

      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. このバケットに対して読み書きを行う権限をサービス アカウントに付与します。

      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 ジョブを作成し、作成したバケットをマウントします。

    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. [削除] をクリックします。これにより、進行中のすべてのジョブ実行と実行中のすべてのコンテナ インスタンスが終了します。

    gcloud

    ジョブを削除するには、次のコマンドを実行します。

    gcloud run jobs delete JOB_NAME

    JOB_NAME は、ジョブ名に置き換えます。

    テスト プロジェクトを削除する

    Google Cloud プロジェクトを削除すると、そのプロジェクト内のすべてのリソースに対する課金が停止します。プロジェクト内のすべての Google Cloud リソースを解放する手順は次のとおりです。

      Delete a Google Cloud project:

      gcloud projects delete PROJECT_ID

    次のステップ