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 senza costi.

Prima di iniziare

  1. Accedi al tuo account Google Cloud . Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti senza costi per l'esecuzione, il test e il deployment dei workload.
  2. Installa 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. Crea o seleziona un Google Cloud progetto.

    Ruoli richiesti per selezionare o creare un progetto

    • Seleziona un progetto: la selezione di un progetto non richiede un ruolo IAM specifico. Puoi selezionare qualsiasi progetto per il quale ti è stato concesso un ruolo.
    • Crea un progetto: per creare un progetto, devi disporre del ruolo Autore progetto (roles/resourcemanager.projectCreator), che contiene l'autorizzazione resourcemanager.projects.create. Scopri come concedere i ruoli.
    • Creare un progetto Google Cloud :

      gcloud projects create PROJECT_ID

      Sostituisci PROJECT_ID con un nome per il progetto Google Cloud che stai creando.

    • Seleziona il progetto Google Cloud che hai creato:

      gcloud config set project PROJECT_ID

      Sostituisci PROJECT_ID con il nome del progetto Google Cloud .

  6. Verifica che la fatturazione sia abilitata per il tuo progetto Google Cloud .

  7. Installa 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. Crea o seleziona un Google Cloud progetto.

    Ruoli richiesti per selezionare o creare un progetto

    • Seleziona un progetto: la selezione di un progetto non richiede un ruolo IAM specifico. Puoi selezionare qualsiasi progetto per il quale ti è stato concesso un ruolo.
    • Crea un progetto: per creare un progetto, devi disporre del ruolo Autore progetto (roles/resourcemanager.projectCreator), che contiene l'autorizzazione resourcemanager.projects.create. Scopri come concedere i ruoli.
    • Creare un progetto Google Cloud :

      gcloud projects create PROJECT_ID

      Sostituisci PROJECT_ID con un nome per il progetto Google Cloud che stai creando.

    • Seleziona il progetto Google Cloud che hai creato:

      gcloud config set project PROJECT_ID

      Sostituisci PROJECT_ID con il nome del progetto Google Cloud .

  11. Verifica che la fatturazione sia abilitata per il tuo progetto Google Cloud .

  12. Abilita le API Cloud Run, Artifact Registry e Cloud Build:

    Ruoli richiesti per abilitare le API

    Per abilitare le API, devi disporre del ruolo IAM Amministratore utilizzo dei servizi (roles/serviceusage.serviceUsageAdmin), che include l'autorizzazione serviceusage.services.enable. Scopri come concedere i ruoli.

    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.

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 aggiuntivo.
  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 terminati tutti i job in esecuzione e tutte le istanze di 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 progetto:

    Elimina un progetto Google Cloud :

    gcloud projects delete PROJECT_ID

Passaggi successivi