Transcodage vidéo accéléré par GPU avec FFmpeg sur les jobs Cloud Run

Ce tutoriel explique comment transcoder des vidéos hors connexion de faible priorité à l'aide de tâches Cloud Run.

Objectifs

Dans ce tutoriel, vous allez effectuer les opérations suivantes :

Coûts

Dans ce document, vous utilisez les composants facturables de Google Cloudsuivants :

Vous pouvez obtenir une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût.

Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai sans frais.

Avant de commencer

  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 vous utilisez un fournisseur d'identité (IdP) externe, vous devez d'abord vous connecter à la gcloud CLI avec votre identité fédérée.

  4. Pour initialiser la gcloud CLI, exécutez la commande suivante :

    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 vous utilisez un fournisseur d'identité (IdP) externe, vous devez d'abord vous connecter à la gcloud CLI avec votre identité fédérée.

  9. Pour initialiser la gcloud CLI, exécutez la commande suivante :

    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. Définissez votre région en tant que variable d'environnement :
    export REGION=REGION
  14. Créez un compte de service :
    gcloud iam service-accounts create video-encoding
  15. Demandez Total Nvidia L4 GPU allocation without zonal redundancy, per project per region sous l'API Cloud Run Admin sur la page Quotas et limites du système pour terminer ce tutoriel. Vous pouvez également déployer un service Cloud Run pour recevoir automatiquement un quota de trois GPU nvidia-l4 (redondance zonale désactivée) pour une région.
  16. Rôles requis

    Pour obtenir les autorisations nécessaires pour suivre le tutoriel, demandez à votre administrateur de vous accorder les rôles IAM suivants sur votre projet :

    Pour en savoir plus sur l'attribution de rôles, consultez la page Gérer l'accès aux projets, aux dossiers et aux organisations.

    Vous pouvez également obtenir les autorisations requises via des rôles personnalisés ou d'autres rôles prédéfinis.

    Attribuer les rôles

    Console

    1. Dans la console Google Cloud , accédez à la page IAM.

      Accéder à IAM
    2. Sélectionnez le projet.
    3. Cliquez sur  Accorder l'accès.
    4. Dans le champ Nouveaux comptes principaux, saisissez votre identifiant utilisateur. Il s'agit généralement de l'adresse e-mail utilisée pour déployer le service Cloud Run.

    5. Dans la liste Sélectionner un rôle, sélectionnez un rôle.
    6. Pour attribuer des rôles supplémentaires, cliquez sur Ajouter un autre rôle et ajoutez tous les rôles supplémentaires.
    7. Cliquez sur Enregistrer.

    gcloud

    Pour attribuer les rôles IAM requis à votre compte dans votre projet :

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

    Remplacez :

    • PROJECT_NUMBER par le numéro de votre projet Google Cloud .
    • PROJECT_ID par l'ID de votre projet Google Cloud .
    • PRINCIPAL par le compte pour lequel vous ajoutez la liaison. Il s'agit généralement de l'adresse e-mail utilisée pour déployer le service Cloud Run.
    • ROLE par le rôle que vous ajoutez au compte du déployeur.

    Préparer votre demande

    Pour récupérer l’exemple de code à utiliser, procédez comme suit :

    1. Clonez le dépôt de l'exemple sur votre ordinateur local :

      git clone https://github.com/GoogleCloudPlatform/cloud-run-samples
      
    2. Accédez au répertoire contenant l'exemple de code Cloud Run :

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

    Créer des buckets Cloud Storage

    Pour stocker les vidéos à traiter et enregistrer les résultats de l'encodage, créez les deux buckets Cloud Storage suivants :

    1. Créez un bucket pour stocker les vidéos avant le traitement :

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

      Remplacez les éléments suivants :

      • PROJECT_ID : ID de votre projet.
      • LOCATION : emplacement Cloud Storage.
    2. Accordez au compte de service l'accès en lecture à ce bucket :

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

      Remplacez PROJECT_ID par l'ID du projet.

    3. Créez un bucket pour stocker les vidéos transcodées après traitement :

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

      Remplacez les éléments suivants :

      • PROJECT_ID : ID de votre projet.
      • LOCATION : emplacement Cloud Storage.
    4. Accordez au compte de service l'autorisation de lire et d'écrire dans ce bucket :

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

      Remplacez PROJECT_ID par l'ID du projet.

    Déployer un job Cloud Run

    Créez un job Cloud Run à l'aide du fichier Dockerfile dans l'exemple de dépôt et en montant les buckets que vous avez créés :

    1. Accédez à l'exemple de répertoire :

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

    1. Créez un Artifact Registry si le registre Cloud Run par défaut n'existe pas encore :

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

      Remplacez LOCATION par le nom de l'emplacement du registre.

    2. Créez l'image du conteneur :

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

      Remplacez les éléments suivants :

      • PROJECT_ID : ID de votre projet.
      • LOCATION : nom de l'emplacement du registre.
      • IMAGE_NAME : nom de l'image de conteneur, par exemple ffmpeg-image.

      Cloud Run utilise un type de machine plus grand pour réduire le temps de compilation.

    3. Déployez le job :

      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
      

      Remplacez les éléments suivants :

      • PROJECT_ID : ID de votre projet.
      • REGION : nom de la région. Remarque : Il doit s'agir de la même région pour laquelle vous disposez d'un quota de GPU.
      • IMAGE_NAME : nom de l'image de conteneur, par exemple ffmpeg-image.

      Si c'est la première fois que vous déployez à partir d'une source dans ce projet, Cloud Run vous invite à créer un dépôt Artifact Registry par défaut.

    Exécuter le job

    Pour exécuter le job, procédez comme suit :

    1. Importez un exemple de vidéo à encoder :

      gcloud storage cp gs://cloud-samples-data/video/cat.mp4 gs://preprocessing-PROJECT_ID
      
    2. Exécutez la tâche :

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

      Le fichier entrypoint.sh nécessite un fichier d'entrée, un fichier de sortie et tous les arguments à envoyer à FFmpeg.

    3. Consultez les journaux Cloud Run pour vous assurer que la vidéo a été transcodée :

      gcloud run jobs logs read video-encoding-job --region REGION
      
    4. Téléchargez la vidéo transcodée :

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

    Effectuer un nettoyage

    Pour éviter que des frais supplémentaires ne soient facturés sur votre compte Google Cloud , supprimez toutes les ressources que vous avez déployées avec ce guide de démarrage rapide.

    Supprimer votre dépôt

    Cloud Run ne facture que la durée d'exécution de votre job. Toutefois, il se peut que des frais vous soient facturés pour le stockage de l'image de conteneur dans Artifact Registry. Pour supprimer des dépôts Artifact Registry, suivez les étapes décrites dans Supprimer des dépôts de la documentation Artifact Registry.

    Supprimer votre job

    Les jobs Cloud Run n'entraînent des coûts que lorsqu'une tâche de job est en cours d'exécution. Pour supprimer votre job Cloud Run, procédez comme suit :

    Console

    Pour supprimer une tâche, procédez comme suit :

    1. Dans la console Google Cloud , accédez à Cloud Run :

      Accédez à Cloud Run

    2. Recherchez le job que vous souhaitez supprimer dans la liste des jobs, puis cliquez sur la case à cocher correspondante pour le sélectionner.

    3. Cliquez sur Supprimer. Toutes les exécutions de jobs en cours et toutes les instances de conteneur en cours d'exécution sont alors arrêtées.

    gcloud

    Pour supprimer un job, exécutez la commande suivante :

    gcloud run jobs delete JOB_NAME

    Remplacez JOB_NAME par le nom de la tâche.

    Supprimer votre projet de test

    La suppression de votre projet Google Cloud arrête la facturation de toutes les ressources de ce projet. Pour libérer toutes les ressources Google Cloud de votre projet, procédez comme suit :

      Delete a Google Cloud project:

      gcloud projects delete PROJECT_ID

    Étapes suivantes