Transcodificación de vídeo acelerada por GPU con FFmpeg en trabajos de Cloud Run

En este tutorial se describe cómo transcodificar vídeos sin conexión de baja prioridad mediante trabajos de Cloud Run.

Objetivos

En este tutorial, harás lo siguiente:

Costes

En este documento, se utilizan los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costes basada en el uso previsto, utiliza la calculadora de precios.

Los usuarios nuevos pueden disfrutar de una prueba gratuita. Google Cloud

Antes de empezar

  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. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

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

    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. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

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

    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. Define tu región como variable de entorno:
    export REGION=REGION
  14. Crea una cuenta de servicio:
    gcloud iam service-accounts create video-encoding
  15. Solicita Total Nvidia L4 GPU allocation without zonal redundancy, per project per region en la página Cuotas y límites del sistema de la API Admin de Cloud Run para completar este tutorial. También puedes desplegar un servicio de Cloud Run para recibir automáticamente una asignación de cuota de 3 GPUs nvidia-l4 (redundancia zonal desactivada) en una región.
  16. Roles obligatorios

    Para obtener los permisos que necesitas para completar el tutorial, pide a tu administrador que te conceda los siguientes roles de gestión de identidades y accesos en tu proyecto:

    Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar acceso a proyectos, carpetas y organizaciones.

    También puedes conseguir los permisos necesarios a través de roles personalizados u otros roles predefinidos.

    Conceder los roles

    Consola

    1. En la consola de Google Cloud , ve a la página Gestión de identidades y accesos.

      Ir a Gestión de identidades y accesos
    2. Selecciona el proyecto.
    3. Haz clic en Conceder acceso.
    4. En el campo Nuevos principales, introduce tu identificador de usuario. Normalmente, es la dirección de correo electrónico que se usa para desplegar el servicio Cloud Run.

    5. En la lista Selecciona un rol, elige un rol.
    6. Para conceder más roles, haz clic en Añadir otro rol y añade cada rol adicional.
    7. Haz clic en Guardar.

    gcloud

    Para conceder los roles de gestión de identidades y accesos necesarios a tu cuenta en tu proyecto, sigue estos pasos:

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

    Sustituye:

    • PROJECT_NUMBER con el número de tu proyecto. Google Cloud
    • PROJECT_ID por el ID de tu proyecto. Google Cloud
    • PRINCIPAL con la cuenta a la que quieres añadir la vinculación. Normalmente, es la dirección de correo electrónico que se usa para desplegar el servicio Cloud Run.
    • ROLE con el rol que vas a añadir a la cuenta del implementador.

    Preparar la solicitud

    Para obtener el código de muestra que vas a usar, sigue estos pasos:

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

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

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

    Crear segmentos de Cloud Storage

    Para almacenar los vídeos que se van a procesar y guardar los resultados de la codificación, crea los dos segmentos de Cloud Storage siguientes:

    1. Crea un segmento para almacenar los vídeos antes de procesarlos:

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

      Haz los cambios siguientes:

      • PROJECT_ID: tu ID de proyecto.
      • LOCATION: la ubicación de Cloud Storage.
    2. Concede a la cuenta de servicio acceso de lectura a este segmento:

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

      Sustituye PROJECT_ID por el ID del proyecto.

    3. Crea un segmento para almacenar los vídeos transcodificados después del procesamiento:

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

      Haz los cambios siguientes:

      • PROJECT_ID: tu ID de proyecto.
      • LOCATION: la ubicación de Cloud Storage.
    4. Concede a la cuenta de servicio acceso de lectura y escritura a este segmento:

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

      Sustituye PROJECT_ID por el ID del proyecto.

    Desplegar un trabajo de Cloud Run

    Crea un trabajo de Cloud Run con el Dockerfile del repositorio de ejemplo y monta los segmentos que has creado:

    1. Accede al directorio de muestra:

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

    1. Crea un registro de 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
      

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

    2. Crea 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
      

      Haz los cambios siguientes:

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

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

    3. Despliega 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.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
      

      Haz los cambios siguientes:

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

      Si es la primera vez que implementas desde una fuente en este proyecto, Cloud Run te pedirá que crees un repositorio de Artifact Registry predeterminado.

    Ejecutar la tarea

    Para ejecutar el trabajo, siga estos pasos:

    1. Sube un vídeo 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 los argumentos que se enviarán a FFmpeg.

    3. Revisa los registros de Cloud Run para asegurarte de que el vídeo se ha transcodificado:

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

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

    Limpieza

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

    Eliminar un repositorio

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

    Eliminar un trabajo

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

    Consola

    Para eliminar un trabajo, sigue estos pasos:

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

      Ir a Cloud Run

    2. Busca el trabajo que quieras eliminar en la lista de trabajos y haz clic en la casilla para seleccionarlo.

    3. Haz clic en Eliminar. De esta forma, se finalizan todas las ejecuciones de trabajos en curso y todas las instancias de contenedor en ejecución.

    gcloud

    Para eliminar un trabajo, ejecuta el siguiente comando:

    gcloud run jobs delete JOB_NAME

    Sustituye JOB_NAME por el nombre del trabajo.

    Eliminar un proyecto de prueba

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

      Delete a Google Cloud project:

      gcloud projects delete PROJECT_ID

    Siguientes pasos