Esta página descreve as práticas recomendadas para criar pipelines com GPUs.
Para ver informações e exemplos sobre como ativar GPUs nas suas tarefas do Dataflow, consulte os artigos Executar um pipeline com GPUs e Processar imagens de satélite Landsat com GPUs.
Pré-requisitos para usar GPUs no Dataflow
- Para usar GPUs com a sua tarefa do Dataflow, tem de usar o Runner v2.
- O Dataflow executa o código do utilizador em VMs de trabalho dentro de um contentor Docker.
Estas VMs de trabalho executam o SO otimizado para contentores.
Para que as tarefas do Dataflow usem GPUs, precisa dos seguintes pré-requisitos:
- Os controladores de GPU estão instalados nas VMs de trabalho e acessíveis ao contentor do Docker. Para mais informações, consulte o artigo Instale controladores de GPU.
- As bibliotecas de GPU necessárias para o seu pipeline, como as bibliotecas NVIDIA CUDA-X ou o NVIDIA CUDA Toolkit, estão instaladas na imagem do contentor personalizado. Para mais informações, consulte o artigo Configure a imagem do contentor.
- Uma vez que os contentores de GPU são normalmente grandes, para evitar ficar sem espaço em disco, aumente o tamanho do disco de arranque predefinido para 50 gigabytes ou mais.
Considerações
Ao criar os ambientes de teste e de produção, considere os seguintes fatores.
Desenvolvimento local
A utilização do Apache Beam com GPUs NVIDIA permite-lhe criar pipelines de processamento de dados em grande escala que processam a pré-processamento e a inferência. Quando usa GPUs para desenvolvimento local, considere as seguintes informações:
Muitas vezes, os fluxos de trabalho de processamento de dados usam bibliotecas adicionais que tem de instalar no ambiente de lançamento e no ambiente de execução nos trabalhadores do Dataflow. Esta configuração adiciona passos ao fluxo de trabalho de desenvolvimento para configurar requisitos de pipeline ou para usar contentores personalizados no Dataflow. É vantajoso ter um ambiente de desenvolvimento local que imite o ambiente de produção o mais fielmente possível.
Se o seu fluxo de trabalho cumprir ambos os seguintes critérios, não precisa de criar contentores personalizados nem alterar o fluxo de trabalho de desenvolvimento para configurar os requisitos do pipeline:
- Está a usar uma biblioteca que usa implicitamente GPUs NVIDIA.
- O seu código não requer alterações para suportar a GPU.
Algumas bibliotecas não alternam de forma transparente entre a utilização da CPU e da GPU e, por isso, requerem compilações específicas e caminhos de código diferentes. Para replicar o ciclo de vida de desenvolvimento de código de execução de código para este cenário, são necessários passos adicionais.
Quando executar experiências locais, replique o ambiente do worker do Dataflow o mais fielmente possível. Consoante a biblioteca, pode precisar de um computador com uma GPU e as bibliotecas de GPU necessárias instaladas. Este tipo de máquina pode não estar disponível no seu ambiente local. Pode emular o ambiente do executor do Dataflow usando um contentor executado numa máquina virtual da Google Cloud Platform equipada com uma GPU.
Especificações dos tipos de máquinas
Para ver detalhes sobre o suporte de tipos de máquinas para cada modelo de GPU, consulte o artigo Plataformas de GPU. As GPUs suportadas com tipos de máquinas N1 também suportam os tipos de máquinas N1 personalizados.
O tipo e o número de GPUs definem as restrições do limite superior nas quantidades disponíveis de vCPU e memória que os trabalhadores podem ter. Para encontrar as restrições correspondentes, consulte Disponibilidade.
A especificação de um número mais elevado de CPUs ou memória pode exigir que especifique um número mais elevado de GPUs.
Para mais detalhes, leia o artigo GPUs no Compute Engine.
Otimize a utilização de recursos
A maioria dos pipelines não é composta inteiramente por transformações que requerem uma GPU. Um pipeline típico tem uma fase de carregamento que usa uma das muitas fontes fornecidas pelo Apache Beam. Essa fase é seguida da manipulação de dados ou de transformações de modelagem, que são depois introduzidas numa transformação de GPU.
O ajuste adequado usa sugestões de recursos do Apache Beam para personalizar os recursos dos trabalhadores para os seus pipelines em lote. Quando o ajuste correto está ativado, o Dataflow só usa GPUs para as fases do pipeline que as precisam. Consequentemente, esta funcionalidade melhora a flexibilidade e a capacidade do pipeline, ao mesmo tempo que reduz potencialmente os custos.
Para mais informações, consulte o artigo Encaixe correto.
GPUs e paralelismo de trabalhadores
Para pipelines Python que usam a arquitetura do Dataflow Runner v2, o Dataflow inicia um processo do SDK do Apache Beam por núcleo de VM. Cada processo do SDK é executado no seu próprio contentor Docker e, por sua vez, gera vários threads, cada um dos quais processa os dados recebidos.
As GPUs usam uma arquitetura de vários processos e as GPUs nos trabalhadores do Dataflow são visíveis para todos os processos e threads.
Se estiver a executar vários processos do SDK numa GPU partilhada, pode melhorar a eficiência e a utilização da GPU ativando o serviço multiprocessos (MPS) da NVIDIA. O MPS melhora o paralelismo dos trabalhadores e o débito geral para pipelines de GPU, especialmente para cargas de trabalho com baixa utilização de recursos da GPU. Para mais informações, consulte o artigo Melhore o desempenho numa GPU partilhada através do NVIDIA MPS.
Para evitar a sobreinscrição da memória da GPU, pode ter de gerir o acesso à GPU. Se estiver a usar o TensorFlow, qualquer uma das seguintes sugestões pode ajudar a evitar a subscrição excessiva de memória da GPU:
Configure os trabalhadores do Dataflow para iniciarem apenas um processo Python contentorizado, independentemente da quantidade de vCPUs do trabalhador. Para fazer esta configuração, quando iniciar a tarefa, use as seguintes opções de pipeline:
--experiments=no_use_multiple_sdk_containers
--number_of_worker_harness_threads
Para mais informações sobre quantos threads usar, consulte a secção Reduza o número de threads.
Cargas de trabalho de inferência
Quando usa modelos de aprendizagem automática para fazer inferência local e remota, use a transformação RunInference
do Apache Beam integrado.
A API RunInference
é uma API PTransform
otimizada para inferências de aprendizagem automática. A transformação RunInference
pode melhorar a eficiência quando usa modelos de ML nos seus pipelines.
Fluxo de trabalho
O fluxo de trabalho de duas fases seguinte mostra como criar um pipeline com GPUs. Este fluxo trata os problemas relacionados com a GPU e não relacionados com a GPU separadamente e encurta o ciclo de feedback.
Crie um pipeline
Crie um pipeline que possa ser executado no Dataflow. Substitua as transformações que requerem GPUs pelas transformações que não usam GPUs, mas que são funcionalmente iguais:
Crie todas as transformações que envolvem a utilização da GPU, como a introdução e a manipulação de dados.
Crie um stub para a transformação de GPU com uma alteração de esquema ou de passagem.
Teste localmente
Teste a parte da GPU do código do pipeline no ambiente que imita o ambiente de execução do worker do Dataflow. Os passos seguintes descrevem um dos métodos para executar este teste:
Crie uma imagem Docker com todas as bibliotecas necessárias.
Comece a programação do código da GPU.
Comece o ciclo de execução de código com uma máquina virtual da Google Cloud Platform com a imagem do Docker. Para excluir incompatibilidades de bibliotecas, execute o código da GPU num processo Python local separadamente de um pipeline do Apache Beam. Em seguida, execute o pipeline completo no DirectRunner ou inicie o pipeline no Dataflow.
Use uma VM que execute um sistema operativo otimizado para contentores
Para um ambiente mínimo, use uma máquina virtual (VM) otimizada para contentores. Para mais informações, consulte o artigo Crie uma VM com GPUs anexadas.
O fluxo geral é o seguinte:
Crie uma VM.
Ligue-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 contentor Docker com controladores de GPU a partir da VM montada 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 exemplo de Dockerfile, consulte o artigo Crie uma imagem de contentor personalizada. Adicione todas as dependências necessárias para o seu pipeline ao Dockerfile.
Para mais informações sobre a utilização de uma imagem do Docker pré-configurada para utilização da GPU, consulte Utilize uma imagem existente configurada para utilização da GPU.
Ferramentas para trabalhar com sistemas otimizados para contentores
Para configurar a CLI do Docker para usar
docker-credential-gcr
como um auxiliar de credenciais para o conjunto predefinido de registos de contentores Google (GCR), use:sudo docker-credential-gcr configure-docker
Para mais informações sobre como configurar as credenciais do Docker, consulte o artigo docker-credential-gcr.
Para copiar ficheiros, como código de pipeline, para ou a partir de uma VM, use
toolbox
. Esta técnica é útil quando usa uma imagem otimizada personalizada. Por exemplo:toolbox /google-cloud-sdk/bin/gsutil cp gs://bucket/gpu/image_process/* /media/root/home/<userid>/opencv/
Para mais informações, consulte o artigo Resolva problemas de nós com a caixa de ferramentas.
O que se segue?
- Saiba mais sobre o suporte do Dataflow para GPUs.
- Saiba como executar um pipeline usando GPUs.
- Trabalhe com o artigo Processar imagens de satélite Landsat com GPUs.