在 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. 如果您使用的是外部身份提供方 (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 (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 (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. 新的主账号字段中,输入您的用户标识符。这通常是用于部署 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 存储桶

    如需存储待处理的视频并保存编码结果,请创建以下两个 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

    后续步骤