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

Neste tutorial, descrevemos como transcodificar vídeos off-line de baixa prioridade usando jobs do Cloud Run.

Objetivos

Neste tutorial, você vai:

Custos

Neste documento, você vai usar os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custo baseada na sua projeção de uso, utilize a calculadora de preços.

Novos usuários do Google Cloud podem estar qualificados para um teste sem custo financeiro.

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. Ao usar um provedor de identidade (IdP) externo, primeiro faça login na gcloud CLI com sua identidade federada.

  4. Para inicializar a gcloud CLI, 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. Ao usar um provedor de identidade (IdP) externo, primeiro faça login na gcloud CLI com sua identidade federada.

  9. Para inicializar a gcloud CLI, 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 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. Solicite Total Nvidia L4 GPU allocation without zonal redundancy, per project per region na API Cloud Run Admin na página Cotas e limites do sistema para concluir este tutorial. Como alternativa, é possível implantar um serviço do Cloud Run para receber automaticamente uma concessão de cota de três GPUs nvidia-l4 (redundância zonal desativada) para uma região.
  16. Funções exigidas

    Para conseguir as permissões necessárias a fim de concluir o tutorial, peça ao administrador para conceder a você os seguintes papéis do IAM no projeto:

    Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.

    Também é possível conseguir as permissões necessárias por meio de papéis personalizados ou de outros papéis predefinidos.

    Conceder os papéis

    Console

    1. No console do Google Cloud , acesse a página IAM.

      Acessar o IAM
    2. Selecione o projeto.
    3. Clique em Conceder acesso.
    4. No campo Novos principais, digite seu identificador de usuário. Normalmente, esse é o endereço de e-mail usado para implantar o serviço do Cloud Run.

    5. Na lista Selecionar papel, escolha um.
    6. Para conceder outros papéis, clique em Adicionar outro papel e adicione cada papel adicional.
    7. Clique em Salvar.

    gcloud

    Para conceder os papéis do IAM necessários à sua conta no projeto:

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

    Substitua:

    • PROJECT_NUMBER pelo número do projeto do Google Cloud .
    • PROJECT_ID com seu Google Cloud ID do projeto.
    • PRINCIPAL com a conta a que você está adicionando a vinculação. Normalmente, esse é o endereço de e-mail usado para implantar o serviço do Cloud Run.
    • ROLE com o papel que você está adicionando à conta do implantador.

    Prepare sua inscrição

    Para recuperar o exemplo de código para uso, siga estas etapas:

    1. Clone o repositório de amostra na sua máquina local:

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

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

    Criar buckets do Cloud Storage

    Para armazenar os vídeos para processamento e salvar os resultados da codificação, crie os dois buckets do Cloud Storage a seguir:

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

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

      Substitua:

      • PROJECT_ID: o ID do projeto.
      • LOCATION: o local do Cloud Storage.
    2. Conceda à conta de serviço acesso de leitura a esse 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"
      

      Substitua PROJECT_ID pela ID do seu projeto.

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

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

      Substitua:

      • PROJECT_ID: o ID do projeto.
      • LOCATION: o local do Cloud Storage.
    4. Conceda à conta de serviço acesso de leitura e gravação a esse 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"
      

      Substitua PROJECT_ID pela ID do seu projeto.

    Implantar um job do Cloud Run

    Crie um job do Cloud Run usando o Dockerfile no repositório de exemplo e montando os buckets que você criou:

    1. Navegue até o diretório de amostra:

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

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

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

      Substitua LOCATION pelo nome do local do registro.

    2. Crie a imagem do contêiner:

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

      Substitua:

      • PROJECT_ID: o ID do projeto.
      • LOCATION:nome do local do registro.
      • IMAGE_NAME: nome da imagem do contêiner. Por exemplo, ffmpeg-image.

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

    3. Implante o 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
      

      Substitua:

      • PROJECT_ID: o ID do projeto.
      • REGION: o nome da região. Observação: essa precisa ser a mesma região em que você tem cota de GPU.
      • IMAGE_NAME: nome da imagem do contêiner, por exemplo, ffmpeg-image.

      Se esta for a primeira vez que você implanta de uma origem neste projeto, o Cloud Run vai pedir para você criar um repositório padrão do Artifact Registry.

    Execute o job

    Para executar o job, siga estas etapas:

    1. Faça upload de um vídeo de exemplo para codificar:

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

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

      O arquivo entrypoint.sh exige um arquivo de entrada, um arquivo de saída e argumentos para enviar ao FFmpeg.

    3. Analise os registros do Cloud Run para garantir que o vídeo foi transcodificado:

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

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

    Limpar

    Para evitar cobranças extras na sua conta do Google Cloud , exclua todos os recursos implantados com este guia de início rápido.

    Excluir o repositório

    O Cloud Run cobra apenas pelo tempo de execução do job. No entanto, ainda é possível receber cobranças pelo armazenamento da imagem do contêiner no Artifact Registry. Para excluir repositórios do Artifact Registry, siga as etapas em Excluir repositórios na documentação do Artifact Registry.

    Excluir seu job

    Os jobs do Cloud Run só geram custos quando uma tarefa de job está em execução. Para excluir o job do Cloud Run, siga uma destas etapas:

    Console

    Para excluir um job, siga estas etapas:

    1. No Google Cloud console, acesse o Cloud Run:

      Acessar o Cloud Run

    2. Localize o job que você quer excluir na lista de jobs e clique na caixa de seleção para marcá-lo.

    3. Clique em Excluir. Isso encerra todas as execuções de jobs em andamento e todas as instâncias de contêiner em execução.

    gcloud

    Para excluir um job, execute o seguinte comando:

    gcloud run jobs delete JOB_NAME

    Substitua JOB_NAME pelo nome do job.

    Excluir o projeto de teste

    A exclusão do projeto Google Cloud interrompe o faturamento de todos os recursos dele. Para liberar todos os recursos Google Cloud no seu projeto, siga estas etapas:

      Delete a Google Cloud project:

      gcloud projects delete PROJECT_ID

    A seguir