Resolver problemas do job da GPU do Dataflow

Se você encontrar problemas ao executar o job do Dataflow com GPUs, siga estas etapas:

  1. Siga o fluxo de trabalho em Práticas recomendadas para trabalhar com GPUs do Dataflow para garantir que seu pipeline esteja configurado corretamente.
  2. Confirme se o job do Dataflow está usando GPUs. Consulte Verificar o job do Dataflow em "Executar um pipeline com GPUs".
  3. Depure com uma VM independente.
  4. Se o problema persistir, siga o restante das etapas da solução de problemas nesta página.

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.

  1. 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
    
  2. Use ssh para se conectar à VM.

    gcloud compute ssh INSTANCE_NAME --project "PROJECT"
    
  3. 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
    
  4. 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.

  5. 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.

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 em um stack trace que envolve apache_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 pipeline for executado com sucesso, mas as GPUs não forem usadas, verifique se:

  • 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. Por exemplo, se você estiver usando o TensorFlow, verifique se tem uma combinação compatível (em inglês) com as versões do TensorFlow, do cuDNN e do CUDA Toolkit.

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.

A seguir