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 fazer o seguinte:

Custos

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

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, 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 Cloud, crie uma conta para avaliar o desempenho de nossos produtos em situações reais. Clientes novos também recebem US$ 300 em créditos para executar, testar e implantar cargas de trabalho.
  2. Instale a CLI do Google Cloud.

  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. Crie ou selecione um Google Cloud projeto.

    Funções necessárias para selecionar ou criar um projeto

    • Selecionar um projeto: não é necessário um papel específico do IAM para selecionar um projeto. Você pode escolher qualquer projeto em que tenha recebido um papel.
    • Criar um projeto: para criar um projeto, é necessário 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 Google Cloud que você está criando.

    • Selecione o projeto 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 gcloud CLI com sua identidade federada.

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

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

    Funções necessárias para selecionar ou criar um projeto

    • Selecionar um projeto: não é necessário um papel específico do IAM para selecionar um projeto. Você pode escolher qualquer projeto em que tenha recebido um papel.
    • Criar um projeto: para criar um projeto, é necessário 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 Google Cloud que você está criando.

    • Selecione o projeto 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:

    Funções necessárias para ativar APIs

    Para ativar as APIs, é necessário ter o papel do IAM de administrador do Service Usage (roles/serviceusage.serviceUsageAdmin), que contém a permissão serviceusage.services.enable. Saiba como conceder papéis.

    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.

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 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 o ID do seu projeto Google Cloud .
  • 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á sendo executada. 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 nele. Para liberar todos os recursos Google Cloud no seu projeto, siga estas etapas:

    Excluir um projeto do Google Cloud :

    gcloud projects delete PROJECT_ID

A seguir