Transcodificación de video acelerada por GPU con FFmpeg en trabajos de Cloud Run

En este instructivo, se describe cómo transcodificar videos sin conexión de baja prioridad con trabajos de Cloud Run.

Objetivos

En este instructivo, harás lo siguiente:

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios.

Es posible que los usuarios nuevos de Google Cloud cumplan con los requisitos para acceder a una prueba gratuita.

Antes de comenzar

  1. Instala Google Cloud CLI.

  2. Configura gcloud CLI para usar tu identidad federada.

    Para obtener más información, consulta Accede a gcloud CLI con tu identidad federada.

  3. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  4. Crea o selecciona un proyecto de Google Cloud .

    Roles necesarios para seleccionar o crear un proyecto

    • Seleccionar un proyecto: Para seleccionar un proyecto, no se requiere un rol de IAM específico. Puedes seleccionar cualquier proyecto en el que se te haya otorgado un rol.
    • Crea un proyecto: Para crear un proyecto, necesitas el rol de creador de proyectos (roles/resourcemanager.projectCreator), que contiene el permiso resourcemanager.projects.create. Obtén más información para otorgar roles.
    • Crea un proyecto de Google Cloud :

      gcloud projects create PROJECT_ID

      Reemplaza PROJECT_ID por un nombre para el proyecto de Google Cloud que estás creando.

    • Selecciona el proyecto de Google Cloud que creaste:

      gcloud config set project PROJECT_ID

      Reemplaza PROJECT_ID por el nombre de tu proyecto de Google Cloud .

  5. Verifica que la facturación esté habilitada para tu proyecto de Google Cloud .

  6. Habilita las APIs de Cloud Run, Artifact Registry y Cloud Build, si aún no están habilitadas:

    Roles necesarios para habilitar las APIs

    Para habilitar las APIs, necesitas el permiso serviceusage.services.enable. Si creaste el proyecto, es probable que ya tengas este permiso a través del rol de propietario (roles/owner). De lo contrario, puedes obtenerlo a través del rol de administrador de Service Usage (roles/serviceusage.serviceUsageAdmin). Obtén más información para otorgar roles.

    gcloud services enable run.googleapis.com cloudbuild.googleapis.com artifactregistry.googleapis.com
  7. Configura tu región como una variable de entorno:
    export REGION=REGION
  8. Crea una cuenta de servicio:
    gcloud iam service-accounts create video-encoding
  9. De forma predeterminada, a los proyectos nuevos se les otorga automáticamente una cuota de 3 GPU en la implementación inicial. Si necesitas una cuota adicional, solicita una cuota de Total Nvidia L4 GPU allocation without zonal redundancy, per project per region en la API de Cloud Run Admin en la página Cuotas y límites del sistema.

Roles obligatorios

Si quieres obtener los permisos que necesitas para completar el instructivo, pídele a tu administrador que te otorgue los siguientes roles de IAM en tu proyecto:

Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

También puedes obtener los permisos necesarios mediante roles personalizados o cualquier otro rol predefinido.

Otorga los roles

Console

  1. En la consola de Google Cloud , dirígete a la página IAM.

    Ir a IAM
  2. Selecciona el proyecto.
  3. Haz clic en Otorgar acceso.
  4. En el campo Principales nuevas, ingresa tu identificador de usuario. Por lo general, esta es la dirección de correo electrónico que se usa para implementar el servicio de Cloud Run.

  5. En la lista Seleccionar un rol, elige uno.
  6. Para otorgar roles adicionales, haz clic en Agregar otro rol y agrega uno más.
  7. Haz clic en Guardar.

gcloud

Para otorgar los roles de IAM necesarios a tu cuenta en tu proyecto, sigue estos pasos:

     gcloud projects add-iam-policy-binding PROJECT_ID \
         --member=PRINCIPAL \
         --role=ROLE
     

Reemplaza lo siguiente:

  • PROJECT_NUMBER por el número de tu proyecto de Google Cloud .
  • PROJECT_ID por el ID del proyecto de Google Cloud .
  • PRINCIPAL por la cuenta a la que agregas la vinculación. Por lo general, esta es la dirección de correo electrónico que se usa para implementar el servicio de Cloud Run.
  • ROLE por el rol que agregarás a la cuenta de implementación.

Prepara tu aplicación

A fin de recuperar la muestra de código para su uso, haz lo siguiente:

  1. Clona el repositorio de muestra en tu máquina local:

    git clone https://github.com/GoogleCloudPlatform/cloud-run-samples
    
  2. Ve al directorio que contiene el código de muestra de Cloud Run:

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

Crea buckets de Cloud Storage

Para almacenar los videos que se procesarán y guardar los resultados de la codificación, crea los siguientes dos buckets de Cloud Storage:

  1. Crea un bucket para almacenar videos antes de procesarlos:

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

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID del proyecto.
    • LOCATION: Es la ubicación de Cloud Storage.
  2. Otorga a la cuenta de servicio acceso para leer desde este bucket:

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

    Reemplaza PROJECT_ID con el ID del proyecto.

  3. Crea un bucket para almacenar los videos transcodificados después del procesamiento:

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

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID del proyecto.
    • LOCATION: Es la ubicación de Cloud Storage.
  4. Otorga a la cuenta de servicio acceso para leer y escribir en este bucket:

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

    Reemplaza PROJECT_ID con el ID del proyecto.

Implementa un trabajo de Cloud Run

Crea un trabajo de Cloud Run con el Dockerfile en el repositorio de muestra y activando los buckets que creaste:

  1. Navega al directorio de muestra:

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

  1. Crea un Artifact Registry si el registro predeterminado de Cloud Run aún no existe:

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

    Reemplaza LOCATION por el nombre de la ubicación del registro.

  2. Compila la imagen del contenedor:

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

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID del proyecto.
    • LOCATION:Es el nombre de la ubicación del registro.
    • IMAGE_NAME: Es el nombre de la imagen de contenedor, por ejemplo: ffmpeg-image.

    Cloud Run usa un tipo de máquina más grande para reducir el tiempo de compilación.

  3. Implementa el trabajo:

    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
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID del proyecto.
    • REGION: Es el nombre de la región. Nota: Esta debe ser la misma región para la que tienes cuota de GPU.
    • IMAGE_NAME: Es el nombre de la imagen de contenedor, por ejemplo, ffmpeg-image.

    Si es la primera vez que implementas desde el código fuente en este proyecto, Cloud Run te solicitará que crees un repositorio predeterminado de Artifact Registry.

Ejecuta el trabajo

Para ejecutar el trabajo, sigue estos pasos:

  1. Sube un video de ejemplo para codificarlo:

    gcloud storage cp gs://cloud-samples-data/video/cat.mp4 gs://preprocessing-PROJECT_ID
    
  2. Ejecuta el trabajo:

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

    El archivo entrypoint.sh requiere un archivo de entrada, un archivo de salida y cualquier argumento que se envíe a FFmpeg.

  3. Revisa los registros de Cloud Run para asegurarte de que el video se haya transcodificado:

    gcloud run jobs logs read video-encoding-job --region REGION
    
  4. Descarga el video transcodificado:

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

Realiza una limpieza

Para evitar que se apliquen cargos adicionales a tu cuenta de Google Cloud , borra todos los recursos que implementaste con esta guía de inicio rápido.

Borra tu repositorio

Cloud Run solo cobra por el tiempo que se ejecuta tu trabajo. Sin embargo, es posible que se te cobre por el almacenamiento de la imagen de contenedor en Artifact Registry. Para borrar repositorios de Artifact Registry, sigue los pasos que se indican en Borra repositorios en la documentación de Artifact Registry.

Borra tu trabajo

Los trabajos de Cloud Run solo generan costos cuando se ejecuta una tarea de trabajo. Para borrar tu trabajo de Cloud Run, sigue uno de estos pasos:

Console

Para borrar un trabajo, sigue estos pasos:

  1. En la consola Google Cloud , ve a Cloud Run:

    Ir a Cloud Run

  2. Busca el trabajo que deseas borrar en la lista de trabajos y haz clic en su casilla de verificación para seleccionarlo.

  3. Haz clic en Borrar. Esto finaliza todas las ejecuciones de trabajos en curso y todas las instancias de contenedor en ejecución.

gcloud

Para borrar un trabajo, ejecuta el siguiente comando:

gcloud run jobs delete JOB_NAME

Reemplaza JOB_NAME por el nombre del trabajo.

Borra tu proyecto de prueba

Si borras tu proyecto de Google Cloud , se detendrá la facturación de todos los recursos que contenga. Para liberar todos los recursos de Google Cloud en tu proyecto, sigue estos pasos:

    Borra un proyecto de Google Cloud :

    gcloud projects delete PROJECT_ID

¿Qué sigue?