Práticas recomendadas para trabalhar com GPUs do Dataflow

Nesta página, descrevemos as práticas recomendadas para criar pipelines usando GPUs.

Para informações e exemplos sobre como ativar GPUs nos jobs do Dataflow, consulte Executar um pipeline com GPUs e Como processar imagens de satélite do Landsat com GPUs.

Pré-requisitos para usar GPUs no Dataflow

Considerações

Ao projetar seus ambientes produção e teste, considere os fatores a seguir.

Desenvolvimento local

O uso do Apache Beam com GPUs NVIDIA permite criar pipelines de processamento de dados em grande escala que lidam com pré-processamento e inferência. Ao usar GPUs para desenvolvimento local, considere as seguintes informações:

  • Muitas vezes, os fluxos de trabalho de processamento de dados usam bibliotecas adicionais que você precisa instalar no ambiente de inicialização e no ambiente de execução nos workers do Dataflow. Essa configuração adiciona etapas ao fluxo de trabalho de desenvolvimento para configurar requisitos do pipeline ou para usar contêineres personalizados no Dataflow. É vantajoso ter um ambiente de desenvolvimento local que simule o ambiente de produção da maneira mais semelhante possível.

  • Se o fluxo de trabalho atender aos dois critérios a seguir, não será necessário criar contêineres personalizados ou alterar o fluxo de trabalho de desenvolvimento para configurar os requisitos do pipeline:

    • Você está usando uma biblioteca que usa implicitamente GPUs NVIDIA.
    • O código não precisa de alterações para oferecer suporte à GPU.
  • Algumas bibliotecas não alternam de maneira transparente entre o uso da CPU e da GPU e, portanto, exigem versões específicas e caminhos de código diferentes. Para replicar o ciclo de vida do desenvolvimento de código de execução de código nesse cenário, mais etapas são necessárias.

  • Ao executar experimentos locais, replique o ambiente de worker do Dataflow o mais próximo possível. Dependendo da biblioteca, pode ser necessário uma máquina com GPU e as bibliotecas de GPU necessárias instaladas. Esse tipo de máquina pode não estar disponível no seu ambiente local. É possível emular o ambiente de execução do Dataflow usando um contêiner em execução em uma máquina virtual do Google Cloud equipada com GPU.

Especificações dos tipos de máquina

Para ver detalhes sobre a compatibilidade de tipos de máquina para cada modelo de GPU, consulte Plataformas de GPU. As GPUs compatíveis com os tipos de máquina N1 também são compatíveis com os tipos de máquina N1 personalizados.

O tipo e o número de GPUs definem as restrições de limite superior nas quantidades disponíveis de vCPU e memória que os workers podem ter. Para encontrar as restrições correspondentes, consulte Disponibilidade.

Especificar um número maior de CPUs ou de memória pode exigir que você especifique um número maior de GPUs.

Para mais detalhes, leia GPUs no Compute Engine.

Otimizar o uso de recursos

A maioria dos pipelines não é composta inteiramente de transformações que exigem uma GPU. Um pipeline típico tem um estágio de ingestão que usa uma das muitas fontes fornecidas pelo Apache Beam. Esse estágio é seguido por transformações de manipulação ou modelagem de dados, que alimentam uma transformação de GPU.

O ajuste direito usa dicas de recursos do Apache Beam para personalizar recursos do worker para pipelines em lote. Quando o ajuste correto está ativado, o Dataflow usa apenas GPUs para os estágios do pipeline que precisam delas. Consequentemente, esse recurso melhora a flexibilidade e a capacidade do pipeline, além de reduzir os custos.

Para mais informações, consulte Ajuste direito.

GPUs e paralelismo do worker

Para pipelines do Python que usam o fluxo de dados da Runner v2, o Dataflow inicia um processo do SDK do Apache Beam por núcleo de VM. Cada processo do SDK é executado no próprio contêiner do Docker e, por sua vez, gera muitas threads, cada uma processando os dados recebidos.

As GPUs usam várias arquiteturas de processo, e as GPUs nos workers do Dataflow são visíveis para todos os processos e threads.

Se você estiver executando vários processos do SDK em uma GPU compartilhada, melhore a eficiência e utilização da GPU ativando o NVIDIA Multi-Process Service (MPS). O MPS melhora o paralelismo de worker e a capacidade de processamento geral para pipelines de GPU, especialmente para cargas de trabalho com baixo uso de recursos da GPU. Para mais informações, consulte Melhorar o desempenho em uma GPU compartilhada usando o NVIDIA MPS.

Para evitar a alocação excessiva de memória da GPU, talvez seja necessário gerenciar o acesso à GPU. Se você estiver usando o TensorFlow, qualquer uma das sugestões a seguir poderá ajudar a evitar o excesso de memória da GPU:

  • Configure os workers do Dataflow para iniciar apenas um processo em Python conteinerizado, independentemente da contagem de vCPUs de worker. Para fazer essa configuração, ao iniciar o job, use as seguintes opções de pipeline:

    • --experiments=no_use_multiple_sdk_containers
    • --number_of_worker_harness_threads

    Para mais informações sobre quantas linhas de execução usar, consulte Reduzir o número de linhas de execução.

  • Ative o MPS.

Cargas de trabalho de inferência

Quando você estiver usando modelos de machine learning (ML) para fazer inferência local e remota, use a transformação RunInference (link em inglês) integrada do Apache Beam. A API RunInference é um PTransform otimizado para inferências de machine learning. O uso da transformação RunInference pode melhorar a eficiência ao usar modelos de ML nos pipelines.

Fluxo de trabalho

O fluxo de trabalho em dois estágios a seguir mostra como criar um pipeline usando GPUs. Esse fluxo cuida dos problemas relacionados a GPUs e não GPUs separadamente e encurta o ciclo de feedback.

  1. Criar um pipeline

    Crie um pipeline que possa ser executado no Dataflow Substitua as transformações que exigem GPUs pelas transformações que não usam GPUs, mas que são funcionalmente as mesmas:

    1. Crie todas as transformações que envolvem o uso da GPU, como a ingestão e manipulação de dados.

    2. Crie um stub para a transformação da GPU com uma simples passagem ou alteração de esquema.

  2. Testar localmente

    Teste a parte da GPU do código do pipeline no ambiente que imita o ambiente de execução de worker do Dataflow. As etapas a seguir descrevem um dos métodos para executar este teste:

    1. Crie uma imagem do Docker com todas as bibliotecas necessárias.

    2. Inicie o desenvolvimento do código da GPU.

    3. Inicie o ciclo de execução do código usando uma máquina virtual do Google Cloud com a imagem Docker. Para descartar incompatibilidades da biblioteca, execute o código da GPU em um processo local do Python separadamente do pipeline do Apache Beam. Em seguida, execute todo o pipeline no executor direto ou inicie o pipeline no Dataflow.

Usar uma VM com um sistema operacional otimizado para contêineres

Para um ambiente mínimo, use uma máquina virtual (VM) otimizada para contêineres. Para mais informações, consulte Criar uma VM com GPUs anexadas.

O fluxo geral é o seguinte:

  1. Crie uma VM.

  2. Conecte-se à VM e execute os seguintes comandos:

    sudo cos-extensions install gpu -- -version latest
    sudo mount --bind /var/lib/nvidia /var/lib/nvidia
    sudo mount -o remount,exec /var/lib/nvidia
    
  3. Confirme se as GPUs estão disponíveis:

    ./nvidia-smi
    
  4. Inicie um contêiner do Docker com drivers de GPU da VM ativada como volumes. Exemplo:

    sudo docker run --rm -it --entrypoint /bin/bash
    --volume /var/lib/nvidia/lib64:/usr/local/nvidia/lib64
    --volume /var/lib/nvidia/bin:/usr/local/nvidia/bin
    --privileged gcr.io/bigdatapivot/image_process_example:latest
    

Para ver um Dockerfile de amostra, consulte Criar uma imagem de contêiner personalizada. Adicione todas as dependências necessárias para o pipeline ao Dockerfile.

Para mais informações sobre como usar uma imagem Docker pré-configurada para uso da GPU, consulte Usar uma imagem existente configurada para uso da GPU.

Ferramentas para trabalhar com sistemas otimizados para contêineres

  • Para configurar a CLI do Docker para usar docker-credential-gcr como auxiliar de credencial para conjunto padrão de registros do Google Container (GCR), use:

    sudo docker-credential-gcr configure-docker
    

    Para mais informações sobre como configurar credenciais do Docker, consulte docker-credential-gcr.

  • Para copiar arquivos, como o código de pipeline, para ou de uma VM, use toolbox. Essa técnica é útil ao usar uma imagem personalizada de otimização total. Exemplo:

    toolbox /google-cloud-sdk/bin/gsutil cp gs://bucket/gpu/image_process/* /media/root/home/<userid>/opencv/
    

    Para saber mais, consulte Como depurar problemas de nós usando a caixa de ferramentas.

A seguir