Transcodificação de vídeo acelerada pela GPU com FFmpeg em tarefas do Cloud Run

Este tutorial descreve como transcodificar vídeos offline de baixa prioridade usando tarefas do Cloud Run.

Objetivos

Neste tutorial, vai fazer o seguinte:

Custos

Neste documento, usa os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custos com base na sua utilização prevista, use a calculadora de preços.

Os novos Google Cloud utilizadores podem ser elegíveis para uma avaliação gratuita.

Antes de começar

  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 estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro de iniciar sessão na CLI gcloud com a sua identidade federada.

  4. Para inicializar a CLI gcloud, execute o seguinte 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 estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro de iniciar sessão na CLI gcloud com a sua identidade federada.

  9. Para inicializar a CLI gcloud, execute o seguinte 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. Defina a sua região como uma variável de ambiente:
    export REGION=REGION
  14. Crie uma conta de serviço:
    gcloud iam service-accounts create video-encoding
  15. Peça Total Nvidia L4 GPU allocation without zonal redundancy, per project per region, em API Cloud Run Admin na página Quotas e limites do sistema para concluir este tutorial. Em alternativa, pode implementar um serviço do Cloud Run para receber automaticamente uma concessão de 3 quotas de GPU nvidia-l4 (redundância zonal desativada) para uma região.
  16. Funções necessárias

    Para receber as autorizações de que precisa para concluir o tutorial, peça ao seu administrador para lhe conceder as seguintes funções da IAM no seu projeto:

    Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.

    Também pode conseguir as autorizações necessárias através de funções personalizadas ou outras funções predefinidas.

    Conceda as funções

    Consola

    1. Na Google Cloud consola, aceda à página IAM.

      Aceda ao IAM
    2. Selecione o projeto.
    3. Clique em Conceder acesso.
    4. No campo Novos responsáveis, introduza o identificador do utilizador. Normalmente, este é o endereço de email usado para implementar o serviço do Cloud Run.

    5. Na lista Selecionar uma função, selecione uma função.
    6. Para conceder funções adicionais, clique em Adicionar outra função e adicione cada função adicional.
    7. Clique em Guardar.

    gcloud

    Para conceder as funções de IAM necessárias à sua conta no seu projeto:

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

    Substituir:

    • PROJECT_NUMBER com o número do seu Google Cloud projeto.
    • PROJECT_ID com o ID do seu Google Cloud projeto.
    • PRINCIPAL com a conta à qual está a adicionar a associação. Normalmente, este é o endereço de email que é usado para implementar o serviço do Cloud Run.
    • ROLE com a função que está a adicionar à conta do implementador.

    Prepare a sua candidatura

    Para obter o exemplo de código para utilização:

    1. Clone o repositório de exemplo para a sua máquina local:

      git clone https://github.com/GoogleCloudPlatform/cloud-run-samples
      
    2. Altere para o diretório que contém o código de exemplo do Cloud Run:

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

    Crie contentores do Cloud Storage

    Para armazenar os vídeos para processamento e guardar os resultados da codificação, crie os seguintes dois contentores do Cloud Storage:

    1. Crie um contentor para armazenar vídeos antes do processamento:

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

      Substitua o seguinte:

      • PROJECT_ID: o ID do projeto.
      • LOCATION: a localização do Cloud Storage.
    2. Conceda à conta de serviço acesso de leitura a este contentor:

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

      Substitua PROJECT_ID pelo ID do seu projeto.

    3. Crie um contentor para armazenar vídeos transcodificados após o processamento:

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

      Substitua o seguinte:

      • PROJECT_ID: o ID do projeto.
      • LOCATION: a localização do Cloud Storage.
    4. Conceda à conta de serviço acesso de leitura e escrita a este contentor:

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

      Substitua PROJECT_ID pelo ID do seu projeto.

    Implemente uma tarefa do Cloud Run

    Crie uma tarefa do Cloud Run usando o Dockerfile no repositório de exemplo e montando os contentores que criou:

    1. Navegue para o diretório de exemplo:

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

    1. Crie um Artifact Registry se o registo do Cloud Run predefinido ainda não existir:

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

      Substitua LOCATION pelo nome da localização do registo.

    2. Crie a imagem de contentor:

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

      Substitua o seguinte:

      • PROJECT_ID: o ID do projeto.
      • LOCATION:nome da localização do registo.
      • IMAGE_NAME: nome da imagem do contentor, por exemplo: ffmpeg-image.

      O Cloud Run usa um tipo de máquina maior para reduzir o tempo de compilação.

    3. Implemente o trabalho:

      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
      

      Substitua o seguinte:

      • PROJECT_ID: o ID do projeto.
      • REGION: o nome da região. Nota: tem de ser a mesma região para a qual tem quota de GPU.
      • IMAGE_NAME: nome da imagem do contentor, por exemplo, ffmpeg-image.

      Se esta for a primeira vez que implementa a partir da origem neste projeto, o Cloud Run pede-lhe que crie um repositório do Artifact Registry predefinido.

    Execute a tarefa

    Para executar a tarefa, siga estes passos:

    1. Carregue um vídeo de exemplo para codificar:

      gcloud storage cp gs://cloud-samples-data/video/cat.mp4 gs://preprocessing-PROJECT_ID
      
    2. Execute a tarefa:

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

      O ficheiro entrypoint.sh requer um ficheiro de entrada, um ficheiro de saída e quaisquer argumentos a enviar para o FFmpeg.

    3. Reveja os registos do Cloud Run para se certificar de que o vídeo foi transcodificado:

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

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

    Limpar

    Para evitar custos adicionais na sua conta Google Cloud , elimine todos os recursos implementados com este início rápido.

    Elimine o seu repositório

    O Cloud Run só cobra pelo tempo de execução da sua tarefa. No entanto, ainda pode ser cobrado pelo armazenamento da imagem do contentor no Artifact Registry. Para eliminar repositórios do Artifact Registry, siga os passos em Eliminar repositórios na documentação do Artifact Registry.

    Elimine a sua tarefa

    As tarefas do Cloud Run só incorrem em custos quando uma tarefa está a ser executada. Para eliminar a tarefa do Cloud Run, siga um destes passos:

    Consola

    Para eliminar uma tarefa:

    1. Na Google Cloud consola, aceda ao Cloud Run:

      Aceda ao Cloud Run

    2. Localize a tarefa que quer eliminar na lista de tarefas e clique na caixa de verificação para a selecionar.

    3. Clique em Eliminar. Esta ação termina todas as execuções de tarefas em curso e todas as instâncias de contentores em execução.

    gcloud

    Para eliminar uma tarefa, execute o seguinte comando:

    gcloud run jobs delete JOB_NAME

    Substitua JOB_NAME pelo nome da tarefa.

    Elimine o projeto de teste

    A eliminação do seu projeto Google Cloud interrompe a faturação de todos os recursos nesse projeto. Para libertar todos os Google Cloud recursos no seu projeto, siga estes passos:

      Delete a Google Cloud project:

      gcloud projects delete PROJECT_ID

    O que se segue?