Transcodifica video accelerata dalla GPU con FFmpeg nei job Cloud Run

Questo tutorial descrive come transcodificare video offline a bassa priorità utilizzando i job Cloud Run.

Obiettivi

In questo tutorial imparerai a:

Costi

In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi.

I nuovi utenti di Google Cloud potrebbero avere diritto a una prova gratuita.

Prima di iniziare

  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. Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.

  4. Per inizializzare gcloud CLI, esegui questo 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. Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.

  9. Per inizializzare gcloud CLI, esegui questo 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. Imposta la regione come variabile di ambiente:
    export REGION=REGION
  14. Crea un service account:
    gcloud iam service-accounts create video-encoding
  15. Richiedi Total Nvidia L4 GPU allocation without zonal redundancy, per project per region, in API Cloud Run Admin nella pagina Quote e limiti di sistema per completare questo tutorial. In alternativa, puoi eseguire il deployment di un servizio Cloud Run per ricevere automaticamente una concessione di 3 quote GPU nvidia-l4 (ridondanza a livello di zona disattivata) per una regione.
  16. Ruoli obbligatori

    Per ottenere le autorizzazioni necessarie per completare il tutorial, chiedi all'amministratore di concederti i seguenti ruoli IAM nel progetto:

    Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

    Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.

    Concedi i ruoli

    Console

    1. Nella console Google Cloud , vai alla pagina IAM.

      Vai a IAM
    2. Seleziona il progetto.
    3. Fai clic su Concedi l'accesso.
    4. Nel campo Nuove entità, inserisci il tuo identificatore dell'utente. In genere si tratta dell'indirizzo email utilizzato per il deployment del servizio Cloud Run.

    5. Nell'elenco Seleziona un ruolo, seleziona un ruolo.
    6. Per concedere altri ruoli, fai clic su Aggiungi un altro ruolo e aggiungi ogni ruolo successivo.
    7. Fai clic su Salva.

    gcloud

    Per concedere i ruoli IAM richiesti al tuo account nel tuo progetto:

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

    Sostituisci:

    • PROJECT_NUMBER con il numero del tuo progetto Google Cloud .
    • PROJECT_ID con l'ID progetto Google Cloud .
    • PRINCIPAL con l'account per il quale stai aggiungendo l'associazione. In genere si tratta dell'indirizzo email utilizzato per eseguire il deployment del servizio Cloud Run.
    • ROLE con il ruolo che stai aggiungendo all'account deployer.

    Preparare la richiesta

    Per recuperare l'esempio di codice da utilizzare:

    1. Clona il repository di esempio sulla tua macchina locale:

      git clone https://github.com/GoogleCloudPlatform/cloud-run-samples
      
    2. Passa alla directory che contiene il codice campione di Cloud Run:

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

    Creazione di bucket di Cloud Storage

    Per archiviare i video da elaborare e salvare i risultati della codifica, crea i seguenti due bucket Cloud Storage:

    1. Crea un bucket per archiviare i video prima dell'elaborazione:

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

      Sostituisci quanto segue:

      • PROJECT_ID: il tuo ID progetto.
      • LOCATION: la posizione di Cloud Storage.
    2. Concedi al account di servizio l'accesso in lettura a questo 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"
      

      Sostituisci PROJECT_ID con l'ID progetto.

    3. Crea un bucket per archiviare i video transcodificati dopo l'elaborazione:

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

      Sostituisci quanto segue:

      • PROJECT_ID: il tuo ID progetto.
      • LOCATION: la posizione di Cloud Storage.
    4. Concedi all'account di servizio l'accesso in lettura e scrittura a questo 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"
      

      Sostituisci PROJECT_ID con l'ID progetto.

    Esegui il deployment di un job Cloud Run

    Crea un job Cloud Run utilizzando il Dockerfile nel repository di esempio e montando i bucket che hai creato:

    1. Passa alla directory di esempio:

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

    1. Crea un Artifact Registry se il registro Cloud Run predefinito non esiste già:

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

      Sostituisci LOCATION con il nome della posizione del registro.

    2. Crea l'immagine container:

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

      Sostituisci quanto segue:

      • PROJECT_ID: il tuo ID progetto.
      • LOCATION:il nome della posizione del registro.
      • IMAGE_NAME: il nome dell'immagine container, ad esempio ffmpeg-image.

      Cloud Run utilizza un tipo di macchina più grande per ridurre il tempo di compilazione.

    3. Esegui il deployment del 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
      

      Sostituisci quanto segue:

      • PROJECT_ID: il tuo ID progetto.
      • REGION: il nome della regione Nota: deve essere la stessa regione per cui hai una quota di GPU.
      • IMAGE_NAME: il nome dell'immagine container, ad esempio ffmpeg-image.

      Se è la prima volta che esegui il deployment dal codice sorgente in questo progetto, Cloud Run ti chiede di creare un repository Artifact Registry predefinito.

    Esegui il job

    Per eseguire il job:

    1. Carica un video di esempio da codificare:

      gcloud storage cp gs://cloud-samples-data/video/cat.mp4 gs://preprocessing-PROJECT_ID
      
    2. Esegui il job:

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

      Il file entrypoint.sh richiede un file di input, un file di output e tutti gli argomenti da inviare a FFmpeg.

    3. Esamina i log di Cloud Run per assicurarti che il video sia stato transcodificato:

      gcloud run jobs logs read video-encoding-job --region REGION
      
    4. Scarica il video transcodificato:

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

    Esegui la pulizia

    Per evitare costi aggiuntivi al tuo account Google Cloud , elimina tutte le risorse che hai eseguito il deployment con questa guida rapida.

    Eliminare il repository

    Cloud Run addebita solo il tempo di esecuzione del job. Tuttavia, potresti comunque pagare l'archiviazione dell'immagine container in Artifact Registry. Per eliminare i repository Artifact Registry, segui i passaggi descritti in Eliminare i repository nella documentazione di Artifact Registry.

    Eliminare il job

    I job Cloud Run comportano costi solo quando viene eseguita un'attività del job. Per eliminare il job Cloud Run, segui uno di questi passaggi:

    Console

    Per eliminare un job:

    1. Nella console Google Cloud , vai a Cloud Run:

      Vai a Cloud Run

    2. Individua il job che vuoi eliminare nell'elenco dei job e fai clic sulla relativa casella di controllo per selezionarlo.

    3. Fai clic su Elimina. Vengono terminate tutte le esecuzioni dei job in corso e tutte le istanze dei container in esecuzione.

    gcloud

    Per eliminare un job, esegui questo comando:

    gcloud run jobs delete JOB_NAME

    Sostituisci JOB_NAME con il nome del job.

    Eliminare il progetto di test

    L'eliminazione del progetto Google Cloud interrompe la fatturazione per tutte le risorse al suo interno. Per rilasciare tutte le Google Cloud risorse nel tuo progetto:

      Delete a Google Cloud project:

      gcloud projects delete PROJECT_ID

    Passaggi successivi