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, use 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. Faça login na sua conta do Google Cloud . Se você começou a usar o Google Cloudagora, crie uma conta para avaliar o desempenho dos nossos produtos em situações reais. Clientes novos também recebem US $300 em créditos para executar, testar e implantar cargas de trabalho sem custos financeiros.
  2. Instale a CLI do Google Cloud.

  3. Ao usar um provedor de identidade (IdP) externo, primeiro faça login na CLI gcloud com sua identidade federada.

  4. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  5. Crie ou selecione um projeto do Google Cloud .

    Papéis necessários para selecionar ou criar um projeto

    • Selecionar um projeto: não é necessário ter um papel específico do IAM para selecionar um projeto. É possível selecionar qualquer projeto em que você tenha um papel.
    • Criar um projeto: para criar um projeto, é preciso ter o papel de Criador de projetos (roles/resourcemanager.projectCreator), que contém a permissão resourcemanager.projects.create. Saiba como conceder papéis.
    • Crie um projeto do Google Cloud :

      gcloud projects create PROJECT_ID

      Substitua PROJECT_ID por um nome para o projeto do Google Cloud que você está criando.

    • Selecione o projeto do Google Cloud que você criou:

      gcloud config set project PROJECT_ID

      Substitua PROJECT_ID pelo nome do projeto do Google Cloud .

  6. Verifique se o faturamento está ativado para o projeto do Google Cloud .

  7. Instale a CLI do Google Cloud.

  8. Ao usar um provedor de identidade (IdP) externo, primeiro faça login na CLI gcloud com sua identidade federada.

  9. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  10. Crie ou selecione um projeto do Google Cloud .

    Papéis necessários para selecionar ou criar um projeto

    • Selecionar um projeto: não é necessário ter um papel específico do IAM para selecionar um projeto. É possível selecionar qualquer projeto em que você tenha um papel.
    • Criar um projeto: para criar um projeto, é preciso ter o papel de Criador de projetos (roles/resourcemanager.projectCreator), que contém a permissão resourcemanager.projects.create. Saiba como conceder papéis.
    • Crie um projeto do Google Cloud :

      gcloud projects create PROJECT_ID

      Substitua PROJECT_ID por um nome para o projeto do Google Cloud que você está criando.

    • Selecione o projeto do Google Cloud que você criou:

      gcloud config set project PROJECT_ID

      Substitua PROJECT_ID pelo nome do projeto do Google Cloud .

  11. Verifique se o faturamento está ativado para o projeto do Google Cloud .

  12. Ative as APIs Cloud Run, Artifact Registry e Cloud Build, se ainda não estiverem ativadas:

    Funções necessárias para ativar APIs

    Para ativar APIs, você precisa da permissão serviceusage.services.enable. Se você criou o projeto, provavelmente já tem essa permissão pelo papel de proprietário (roles/owner). Caso contrário, é possível conseguir essa permissão pelo papel de administrador do Service Usage (roles/serviceusage.serviceUsageAdmin). Saiba como conceder papéis.

    gcloud services enable run.googleapis.com cloudbuild.googleapis.com artifactregistry.googleapis.com
  13. Defina a 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. Por padrão, os novos projetos recebem automaticamente uma cota de 3 GPUs na implantação inicial. Se você precisar de mais cota, solicite a cota 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.

Funções exigidas

Para conseguir as permissões necessárias para concluir o tutorial, peça ao administrador para conceder a você os seguintes papéis do IAM no seu 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 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 extra.
  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 pelo ID do projeto do Google Cloud .
  • PRINCIPAL pela 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 pelo papel que você está adicionando à conta de implantador.

Preparar o aplicativo

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 para ler o 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 pelo ID do 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 para ler e gravar nesse 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 pelo ID do projeto.

Implantar um job do Cloud Run

Crie um job do Cloud Run usando o Dockerfile no repositório de amostra 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: 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 a partir da origem neste projeto, o Cloud Run vai solicitar que você crie 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 requer um arquivo de entrada, um arquivo de saída e todos os argumentos a serem enviados ao FFmpeg.

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

    gcloud run jobs logs read video-encoding-job --region REGION
    
  4. Faça o download do 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 só cobra pelo tempo de execução do job. No entanto, é possível que você ainda receba 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 sua vaga

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 console do Google Cloud , 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 do Google Cloud interrompe o faturamento de todos os recursos nele. Para liberar todos os recursos do Google Cloud no seu projeto, siga estas etapas:

    Excluir um projeto do Google Cloud :

    gcloud projects delete PROJECT_ID

A seguir