Solucionar problemas de una tarea de GPU de Dataflow

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

  1. Sigue el flujo de trabajo que se describe en el artículo Prácticas recomendadas para trabajar con GPUs de Dataflow para asegurarte de que tu canalización esté configurada correctamente.
  2. Confirma que tu trabajo de Dataflow está usando GPUs. Consulta la sección Verificar el trabajo de Dataflow en "Ejecutar una canalización con GPUs".
  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 solucionarlo que se indican en esta página.

Depurar un trabajo

Si es posible, depura el 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 máquina virtual independiente, puedes depurar con Dataflow.

Depurar con una VM independiente

Mientras diseñas y repites una imagen de contenedor que te funcione, puede ser más rápido reducir el bucle de comentarios probando la imagen de contenedor en una VM independiente.

Para depurar tu contenedor personalizado en una VM independiente con GPUs, puedes crear una VM de Compute Engine que ejecute GPUs en Container-Optimized OS, instalar los controladores e iniciar el contenedor de la siguiente manera.

  1. Crea 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 la GPU. Después de conectarte a la máquina virtual mediante ssh, ejecuta los siguientes comandos en la máquina virtual:

    # 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 depurar, puedes iniciar el contenedor manualmente 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
    

    Sustituye IMAGE por la ruta de Artifact Registry de tu imagen Docker.

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

    Si usas TensorFlow, puedes imprimir los 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 tu flujo de procesamiento, puedes lanzarlo en Direct Runner. También puedes lanzar flujos de trabajo en el ejecutor de Dataflow desde este entorno.

Depurar con Dataflow

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

Simplifica tu flujo de procesamiento para que solo detecte si hay GPUs y, a continuación, ejecútalo en Dataflow. En el siguiente ejemplo se muestra cómo podría ser 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 flujo de procesamiento se completa 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 canal y ejecuta el canal después de cada cambio.

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

Los trabajadores no empiezan

Si tu trabajo se queda bloqueado y los trabajadores de Dataflow no empiezan a procesar datos, es probable que tengas un problema relacionado con el uso de un contenedor personalizado con Dataflow. Para obtener más información, consulta la guía para solucionar problemas con los contenedores personalizados.

Si usas Python, comprueba que se cumplen las siguientes condiciones:

  • La versión secundaria del intérprete de Python de la imagen de tu contenedor es la misma que usas al iniciar tu canalización. Si no coinciden, es posible que veas errores como SystemError: unknown opcode con un seguimiento de pila que incluya apache_beam/internal/pickler.py.
  • Si usas el SDK de Apache Beam 2.29.0 o una versión anterior, pip debe estar accesible en la imagen de /usr/local/bin/pip.

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

Verifica que los trabajadores tengan suficiente espacio en disco para descargar la imagen de tu 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 al iniciarse

Si se produce el error ZONE_RESOURCE_POOL_EXHAUSTED o el error ZONE_RESOURCE_POOL_EXHAUSTED_WITH_DETAILS, puedes seguir estos pasos:

  • No especifiques la zona de los trabajadores para que Dataflow seleccione la zona óptima.

  • Inicia la canalización en otra zona o con otro tipo de acelerador.

La tarea falla en el tiempo de ejecución

Si el trabajo falla durante el tiempo de ejecución, comprueba si hay errores de falta de memoria (OOM) en la máquina de trabajo y en la GPU. Los errores de falta de memoria de la GPU pueden manifestarse como errores cudaErrorMemoryAllocation out of memory en los registros de los trabajadores. Si usas TensorFlow, comprueba que solo utilizas un proceso de TensorFlow para acceder a un dispositivo de GPU. Para obtener más información, consulta GPUs y paralelismo de los trabajadores.

Sin uso de GPU

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

Si hay GPUs 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, empieza con una canalización sencilla que use GPUs correctamente y, a continuación, añade código a la canalización de forma gradual. Prueba la canalización con cada nueva adición. Para obtener más información, consulta la sección Depurar en Dataflow de este documento.

Si tu canal no detecta GPUs, verifica lo siguiente:

  • Las bibliotecas de NVIDIA instaladas en la imagen del contenedor cumplen los requisitos del código de usuario de la canalización y las bibliotecas que utiliza.
  • Las bibliotecas de NVIDIA instaladas en imágenes de contenedor son accesibles como bibliotecas compartidas.

Si los dispositivos no están disponibles, es posible 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 compruebe que las GPUs estén disponibles y que los trabajadores puedan acceder a ellas.

Solucionar problemas de TensorFlow

Si PyTorch detecta GPUs en tu canalización, pero TensorFlow no, prueba a seguir estos pasos para solucionar el problema:

  • 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 las configuraciones de compilación probadas en la documentación de TensorFlow.
  • Si es posible, actualiza a las últimas versiones compatibles de TensorFlow y CUDA.
  • Consulta 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 GPUs: TF 2.17.0 RC0 no funciona con GPUs.

Siguientes pasos