Soluciona problemas relacionados con tu trabajo de GPU de Dataflow

Si tienes problemas para ejecutar tu trabajo de Dataflow con GPU, sigue estos pasos:

  1. Sigue el flujo de trabajo en Prácticas recomendadas para trabajar con GPU de Dataflow y asegúrate de que la canalización esté configurada de forma correcta.
  2. Confirma que tu trabajo de Dataflow use GPU. Consulta Verifica tu trabajo de Dataflow en “Ejecuta una canalización con GPU”.
  3. Depura tu trabajo con una VM independiente o con Dataflow.
  4. Si el problema persiste, sigue el resto de los pasos para solucionar el problema de esta página.

Cómo depurar tu trabajo

Si es posible, depura tu trabajo con una VM independiente, ya que suele ser más rápido. Sin embargo, si las políticas de la organización te impiden depurar con una VM independiente, puedes depurar con Dataflow.

Depura con una VM independiente

Mientras diseñas e iteras en una imagen de contenedor que funciona para ti, puede ser más rápido reducir el ciclo de reacción si pruebas tu imagen de contenedor en una VM independiente.

Puedes depurar tu contenedor personalizado en una VM independiente con GPU si creas una VM de Compute Engine que ejecute GPU en Container-Optimized OS, la instalación de controladores y el inicio de tu contenedor.

  1. Cree una instancia 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. Usa ssh para conectarte a la VM:

    gcloud compute ssh INSTANCE_NAME --project "PROJECT"
    
  3. Instala los controladores de GPU. Después de conectarte a la VM mediante ssh, ejecuta los siguientes comandos en la 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. Inicia tu contenedor personalizado.

    Los contenedores del SDK de Apache Beam usan el punto de entrada /opt/apache/beam/boot. Para fines de depuración, puedes iniciar tu contenedor de forma manual con un punto 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
    

    Reemplaza IMAGE con la ruta de acceso de Artifact Registry para tu imagen de Docker.

  5. Luego, verifica que las bibliotecas de GPU instaladas en tu contenedor puedan acceder a los dispositivos de GPU.

    Si usas TensorFlow, puedes imprimir dispositivos disponibles en el intérprete de Python con lo siguiente:

    >>> import tensorflow as tf
    >>> print(tf.config.list_physical_devices("GPU"))
    

    Si usas PyTorch, puedes inspeccionar los dispositivos disponibles en el intérprete de Python con lo siguiente:

    >>> import torch
    >>> print(torch.cuda.is_available())
    >>> print(torch.cuda.device_count())
    >>> print(torch.cuda.get_device_name(0))
    

Para iterar en la canalización, puedes iniciarla en Direct Runner. También puedes iniciar canalizaciones en Dataflow Runner desde este entorno.

Depura con Dataflow

Si las restricciones de la organización te impiden depurar en una VM independiente, puedes hacerlo con Dataflow.

Simplifica tu canalización para que solo detecte si hay GPUs presentes y, luego, ejecútala en Dataflow. En el siguiente ejemplo, se muestra cómo podría verse el código de esta canalización:

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)
  )

Si tu canalización se ejecuta correctamente, tu código podrá acceder a las GPUs. Para identificar el código problemático, inserta gradualmente ejemplos cada vez más grandes en el código de tu canalización y ejecuta la canalización después de cada cambio.

Si tu canalización no detecta las GPUs, sigue los pasos que se indican en la sección No se usa la GPU de este documento.

Los trabajadores no inician

Si tu trabajo está atascado y los trabajadores de Dataflow nunca comienzan a procesar datos, es probable que tengas un problema relacionado con el uso de un contenedor personalizado con Dataflow. Para obtener más detalles, consulta la guía de solución de problemas de contenedores personalizados.

Si eres usuario de Python, verifica que se cumplan las siguientes condiciones:

  • La versión secundaria de intérprete de Python en tu imagen de contenedor es la misma versión que usas cuando inicias tu canalización. Si no hay coincidencia, es posible que veas errores como SystemError: unknown opcode con un seguimiento de pila que involucra apache_beam/internal/pickler.py.
  • Si usas el SDK 2.29.0 de Apache Beam o una versión anterior, se debe poder acceder a pip en la imagen en /usr/local/bin/pip.

Te recomendamos que reduzcas las personalizaciones a una configuración funcional mínima la primera vez que uses una imagen personalizada. Usa las imágenes de contenedor personalizadas de muestra que se proporcionan en los ejemplos de esta página. Asegúrate de que puedas ejecutar una canalización de Dataflow sencilla con esta imagen de contenedor sin solicitar GPUs. Luego, itera en la solución.

Verifica que los trabajadores tengan suficiente espacio en el disco para descargar la imagen del contenedor. Ajusta el tamaño del disco si es necesario. Las imágenes grandes tardan más en descargarse, lo que aumenta el tiempo de inicio de los trabajadores.

El trabajo falla inmediatamente en el inicio

Si encuentras los errores ZONE_RESOURCE_POOL_EXHAUSTED o ZONE_RESOURCE_POOL_EXHAUSTED_WITH_DETAILS, puedes seguir estos pasos:

  • No especifiques la zona del trabajador para que Dataflow seleccione la zona óptima.

  • Inicia la canalización en una zona diferente o con un tipo de acelerador diferente.

  • Configura un modelo de aprovisionamiento, como inicio flexible. Para obtener más información, consulta Cómo configurar un modelo de aprovisionamiento.

El trabajo falla en el entorno de ejecución

Si el trabajo falla en el entorno de ejecución, revisa los errores de memoria insuficiente (OOM) en la máquina de trabajador y en la GPU. Los errores de OOM de GPU pueden manifestarse como errores cudaErrorMemoryAllocation out of memory en los registros de trabajador. Si usas TensorFlow, verifica que uses solo un proceso de TensorFlow para acceder a un dispositivo de GPU. Para obtener más información, consulta Paralelismo de trabajadores y GPU.

No hay uso de GPU

Si parece que tu trabajo no usa GPUs, sigue los pasos de la sección Depura tu trabajo de este documento para verificar si las GPUs están disponibles con tu imagen de Docker.

Si las GPUs están disponibles, pero no se usan, es probable que el problema esté en el código de la canalización. Para depurar el código de la canalización, comienza con una canalización sencilla que use GPUs correctamente y, luego, agrega código a la canalización de forma gradual, probándola con cada nueva incorporación. Para obtener más información, consulta la sección Depuración en Dataflow de este documento.

Si tu canalización no detecta las GPUs, verifica lo siguiente:

  • Las bibliotecas de NVIDIA instaladas en la imagen del contenedor coinciden con los requisitos del código de usuario de la canalización y las bibliotecas que usa.
  • Se puede acceder a las bibliotecas de NVIDIA en imágenes de contenedor como bibliotecas compartidas.

Si los dispositivos no están disponibles, puede que estés usando una configuración de software incompatible. Para verificar la configuración de la imagen, ejecuta una canalización sencilla que solo verifique que las GPUs estén disponibles y que los trabajadores puedan acceder a ellas.

Soluciona problemas de TensorFlow

Si PyTorch detecta GPUs en tu canalización, pero TensorFlow no, prueba con los siguientes pasos para solucionar problemas:

  • Verifica que tengas una combinación compatible de TensorFlow, la versión de cuDNN y la versión de CUDA Toolkit. Para obtener más información, consulta Configuraciones de compilación probadas en la documentación de TensorFlow.
  • Si es posible, actualiza a las versiones más recientes compatibles de TensorFlow y CUDA.
  • Revisa los problemas conocidos de TensorFlow y CUDA para verificar si alguno de ellos está causando problemas en tu canalización. Por ejemplo, el siguiente problema conocido podría impedir que TensorFlow detecte las GPUs: TF 2.17.0 RC0 Fails to work with GPUs.

¿Qué sigue?