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."
- Depure o 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, depure o job com uma VM independente, porque depurar com uma VM independente geralmente é mais rápido. No entanto, se as políticas organizacionais impedirem a depuração com uma VM independente, você poderá 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-platformUse
sshpara 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-smiInicie 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 -include-artifact-registry 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 \ IMAGESubstitua 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.
Depurar usando o Dataflow
Se as restrições organizacionais impedirem a depuração em uma VM independente, você poderá depurar usando o Dataflow.
Simplifique o pipeline para que ele apenas detecte se as GPUs estão presentes e, em seguida, 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 as GPUs. Para identificar o código do problema, insira gradualmente exemplos cada vez maiores no código do pipeline, executando o pipeline após cada mudança.
Se o pipeline não detectar GPUs, siga as etapas na seção Nenhum uso da 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 uma incompatibilidade, você poderá receber erros como
SystemError: unknown opcodecom um stack trace envolvendoapache_beam/internal/pickler.py. - Se você estiver usando o SDK 2.29.0 ou anterior do Apache Beam,
pipprecisará 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
ZONE_RESOURCE_POOL_EXHAUSTED
ou ZONE_RESOURCE_POOL_EXHAUSTED_WITH_DETAILS erros, 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.
Configure um modelo de provisionamento, como o início flexível. Para mais informações, leia Configurar um modelo de provisionamento.
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 o job deste documento para verificar se as GPUs estão disponíveis com a imagem Docker.
Se as GPUs estiverem disponíveis, mas não forem usadas, o problema provavelmente estará no código do pipeline. Para depurar o código do pipeline, comece com um pipeline simples que use GPUs e adicione gradualmente o código ao pipeline, testando-o 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 (em inglês) com as versões do TensorFlow, 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 compatíveis do TensorFlow e do CUDA.
- Analise os problemas conhecidos do TensorFlow e do CUDA para verificar se um problema conhecido está causando problemas no pipeline. Por exemplo, o problema conhecido a seguir pode impedir que o TensorFlow detecte GPUs: 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.