在 Cloud Run 作业中使用 FFmpeg 进行 GPU 加速的视频转码

本教程介绍了如何使用 Cloud Run 作业转码低优先级的离线视频。

目标

在本教程中,您将执行以下操作:

费用

在本文档中,您将使用 Google Cloud的以下收费组件:

如需根据您的预计使用量来估算费用,请使用价格计算器

新 Google Cloud 用户可能有资格申请免费试用

准备工作

  1. Install the Google Cloud CLI.

  2. 配置 gcloud CLI 以使用您的联合身份。

    如需了解详情,请参阅使用联合身份登录 gcloud CLI

  3. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  4. 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.

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

  6. 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
  7. 将区域设置为环境变量:
    export REGION=REGION
  8. 创建服务账号:
    gcloud iam service-accounts create video-encoding
  9. 如需完成本教程,请前往配额和系统限额页面并进入 Cloud Run Admin API 下方以请求 Total Nvidia L4 GPU allocation without zonal redundancy, per project per region。或者,您也可以部署 Cloud Run 服务,以便自动获授予某个区域的 3 个 nvidia-l4 GPU 配额(不启用可用区级冗余)。
  10. 所需的角色

    如需获得完成本教程所需的权限,请让您的管理员为您授予项目的以下 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." \
        --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." \
        --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. \
          --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

    后续步骤