Se você encontrar problemas ao executar o job do Dataflow com GPUs, siga estas etapas:
- Siga o fluxo de trabalho em Práticas recomendadas para trabalhar com GPUs do Dataflow para garantir que seu pipeline esteja configurado corretamente.
- Confirme se o job do Dataflow está usando GPUs. Consulte Verificar o job do Dataflow em "Executar um pipeline com GPUs".
- Depurar seu job com uma VM independente ou usando o Dataflow.
- Se o problema persistir, siga o restante das etapas da solução de problemas nesta página.
Depurar o job
Se possível, depurar o job com uma VM independente, porque a depuração com uma VM independente geralmente é mais rápida. No entanto, se as políticas organizacionais impedirem a depuração com uma VM independente, você pode depurar usando o Dataflow.
Depurar com uma VM independente
Enquanto você projeta e itera em uma imagem de contêiner que funciona para você, pode ser mais rápido reduzir o loop de feedback testando a imagem de contêiner em uma VM independente.
É possível depurar o contêiner personalizado em uma VM autônoma com GPUs. Basta criar uma VM do Compute Engine que executa GPUs no Container-Optimized OS, instalar drivers e iniciar o contêiner da seguinte maneira.
Crie uma instância de VM.
gcloud compute instances create INSTANCE_NAME \ --project "PROJECT" \ --image-family cos-stable \ --image-project=cos-cloud \ --zone=us-central1-f \ --accelerator type=nvidia-tesla-t4,count=1 \ --maintenance-policy TERMINATE \ --restart-on-failure \ --boot-disk-size=200G \ --scopes=cloud-platform
Use
ssh
para se conectar à VM.gcloud compute ssh INSTANCE_NAME --project "PROJECT"
Instale os drivers da GPU. Depois de se conectar à VM usando
ssh
, execute os seguintes comandos na VM:# Run these commands on the virtual machine cos-extensions install gpu sudo mount --bind /var/lib/nvidia /var/lib/nvidia sudo mount -o remount,exec /var/lib/nvidia /var/lib/nvidia/bin/nvidia-smi
Inicie seu contêiner personalizado.
Os contêineres do SDK do Apache Beam usam o ponto de entrada
/opt/apache/beam/boot
. Para fins de depuração, inicie o contêiner manualmente com um ponto de entrada diferente:docker-credential-gcr configure-docker 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 \ IMAGE
Substitua IMAGE pelo caminho do Artifact Registry da imagem do Docker.
Verifique se as bibliotecas de GPU instaladas no contêiner podem acessar os dispositivos da GPU.
Se você estiver usando o TensorFlow, poderá imprimir os dispositivos disponíveis no interpretador do Python com o seguinte:
>>> import tensorflow as tf >>> print(tf.config.list_physical_devices("GPU"))
Se você estiver usando o PyTorch, poderá inspecionar os dispositivos disponíveis no interpretador do Python com o seguinte:
>>> import torch >>> print(torch.cuda.is_available()) >>> print(torch.cuda.device_count()) >>> print(torch.cuda.get_device_name(0))
Para iterar no pipeline, inicie o pipeline no Direct Runner. Também é possível iniciar pipelines no Dataflow Runner a partir desse ambiente.
Fazer a depuração usando o Dataflow
Se restrições organizacionais impedirem a depuração em uma VM independente, use o Dataflow.
Simplifique seu pipeline para que ele detecte se as GPUs estão presentes e execute o pipeline no Dataflow. O exemplo a seguir demonstra como o código desse pipeline pode ser:
def check_if_gpus_present(element):
import torch
import tensorflow as tf
tensorflow_detects_gpus = tf.config.list_physical_devices("GPU")
torch_detects_gpus = torch.cuda.is_available()
if tensorflow_detects_gpus and torch_detects_gpus:
return element
if tensorflow_detects_gpus:
raise Exception('PyTorch failed to detect GPUs with your setup')
if torch_detects_gpus:
raise Exception('Tensorflow failed to detect GPUs with your setup')
raise Exception('Both Tensorflow and PyTorch failed to detect GPUs with your setup')
with beam.Pipeline() as p:
_ = (p | beam.Create([1,2,3]) # Create a PCollection of the prompts.
| beam.Map(check_if_gpus_present)
)
Se o pipeline for bem-sucedido, o código poderá acessar GPUs. Para identificar o código do problema, insira gradualmente exemplos maiores no código do pipeline, executando-o após cada mudança.
Se o pipeline não detectar GPUs, siga as etapas na seção Sem uso de GPU deste documento.
Os workers não são iniciados
Se o job estiver travado e os workers do Dataflow nunca começarem a processar dados, é provável que você tenha um problema relacionado ao uso de um contêiner personalizado com o Dataflow. Para mais detalhes, leia o guia de solução de problemas de contêineres personalizados.
Se você é usuário de Python, verifique se as seguintes condições são atendidas:
- A versão secundária do interpretador do Python
na imagem do contêiner é a mesma que você usa ao iniciar o
pipeline. Se houver incompatibilidade, talvez você veja erros como
SystemError: unknown opcode
com um stack trace que envolveapache_beam/internal/pickler.py
. - Se você estiver usando o SDK 2.29.0 ou anterior do Apache Beam,
pip
precisará estar acessível na imagem em/usr/local/bin/pip
.
Recomendamos que você reduza as personalizações a um mínimo de trabalho na primeira vez que usar uma imagem personalizada. Use as imagens de contêiner personalizadas de amostra fornecidas nos exemplos desta página. Verifique se é possível executar um pipeline simples do Dataflow com essa imagem de contêiner sem solicitar GPUs. Em seguida, itere a solução.
Verifique se os workers têm espaço em disco suficiente para fazer o download da imagem de contêiner. Ajuste o tamanho do disco, se necessário. Imagens grandes levam mais tempo para fazer o download, o que aumenta o tempo de inicialização do worker.
O job falha imediatamente na inicialização
Se você encontrar os erros
ZONE_RESOURCE_POOL_EXHAUSTED
ou ZONE_RESOURCE_POOL_EXHAUSTED_WITH_DETAILS
, siga estas etapas:
Não especifique a zona do worker para que o Dataflow selecione a zona ideal para você.
Inicie o pipeline em uma zona diferente ou com um tipo de acelerador diferente.
O job falha no ambiente de execução
Se o job falhar em tempo de execução, exclua os erros de memória insuficiente na máquina worker e na GPU. Os erros de OOM da GPU podem se manifestar como erros cudaErrorMemoryAllocation out of memory
nos registros do worker. Se você estiver usando o TensorFlow, verifique se usa apenas um processo do TensorFlow para acessar um dispositivo de GPU.
Para mais informações, leia GPUs e paralelismo de worker.
Nenhum uso da GPU
Se o job não estiver usando GPUs, siga as etapas na seção Depurar seu job deste documento para verificar se as GPUs estão disponíveis com sua imagem do Docker.
Se as GPUs estiverem disponíveis, mas não forem usadas, o problema provavelmente está no código do pipeline. Para depurar o código do pipeline, comece com um pipeline simples que use GPUs e, em seguida, adicione o código gradualmente, testando o pipeline a cada nova adição. Para mais informações, consulte a seção Depurar no Dataflow deste documento.
Se o pipeline não detectar GPUs, verifique o seguinte:
- As bibliotecas NVIDIA instaladas na imagem do contêiner correspondem aos requisitos do código do usuário do pipeline e das bibliotecas que ele usa.
- As bibliotecas NVIDIA instaladas em imagens de contêiner podem ser acessadas como bibliotecas compartilhadas.
Se os dispositivos não estiverem disponíveis, é possível que você esteja usando uma configuração de software incompatível. Para verificar a configuração da imagem, execute um pipeline simples que apenas verifique se as GPUs estão disponíveis e acessíveis para os workers.
Resolver problemas do TensorFlow
Se o PyTorch detectar GPUs no pipeline, mas o TensorFlow não, siga estas etapas de solução de problemas:
- Verifique se você tem uma combinação compatível do TensorFlow, da versão do cuDNN e do CUDA Toolkit. Para mais informações, consulte Configurações de build testadas na documentação do TensorFlow.
- Se possível, faça upgrade para as versões mais recentes do TensorFlow e do CUDA.
- Analise os problemas conhecidos do TensorFlow e do CUDA para verificar se um deles está causando problemas no pipeline. Por exemplo, o seguinte problema conhecido pode impedir que o TensorFlow detecte GPUs: O TF 2.17.0 RC0 falha ao trabalhar com GPUs.
A seguir
- Primeiros passos: como executar GPUs no Container-Optimized OS.
- Caixa de ferramentas do Container-Optimized OS.
- Escopos de acesso à conta de serviço.