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
- Para usar GPUs com o job do Dataflow, use o Runner v2.
- O Dataflow executa o código do usuário nas VMs do worker dentro de um contêiner do Docker.
Essas VMs de worker executam o Container-Optimized OS.
Para que os jobs do Dataflow usem GPUs, você precisa dos seguintes pré-requisitos:
- Os drivers de GPU são instalados em VMs do worker e acessíveis ao contêiner do Docker. Para mais informações, consulte Instalar drivers de GPU.
- As bibliotecas de GPU necessárias para o pipeline, como as bibliotecas do NVIDIA CUDA-X ou o kit de ferramentas do NVIDIA CUDA, são instaladas na imagem de contêiner personalizada. Para mais informações, consulte Configurar a imagem de contêiner.
- Como os contêineres de GPU geralmente são grandes, aumente o tamanho padrão do disco de inicialização para 50 gigabytes ou mais para evitar a falta de espaço em disco.
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.
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.
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:
Crie todas as transformações que envolvem o uso da GPU, como a ingestão e manipulação de dados.
Crie um stub para a transformação da GPU com uma simples passagem ou alteração de esquema.
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:
Crie uma imagem do Docker com todas as bibliotecas necessárias.
Inicie o desenvolvimento do código da GPU.
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:
Crie uma VM.
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
Confirme se as GPUs estão disponíveis:
./nvidia-smi
Inicie um contêiner do Docker com drivers de GPU da VM ativada como volumes. Por 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. Por 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
- Saiba mais sobre o suporte do Dataflow para GPUs.
- Saiba mais sobre como executar um pipeline usando GPUs.
- Trabalhe com o processamento de imagens de satélite do Landsat com GPUs.