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, ya sea 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 la depuración con una VM independiente suele ser más rápida. Sin embargo, si las políticas de la organización preventen que realices la depuración 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.

Cómo depurar con Dataflow

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

Simplifica tu canalización para que solo detecte si hay GPUs 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 realiza correctamente, tu código podrá acceder a las GPUs. Para identificar el código del problema, inserta gradualmente ejemplos progresivamente más grandes en el código de tu canalización y ejecútala después de cada cambio.

Si tu canalización no detecta las GPUs, sigue los pasos que se indican en la sección Sin uso de 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.

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 que se indican en la sección Cómo depurar 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é relacionado con el código de la canalización. Para depurar el código de la canalización, comienza con una canalización sencilla que use correctamente las GPUs y, luego, agrega código a la canalización de forma gradual y pruébala con cada adición nueva. Para obtener más información, consulta la sección Cómo depurar 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 directa 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 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 no funciona con GPUs.

¿Qué sigue?