Prácticas recomendadas para trabajar con GPUs de Dataflow

En esta página se describen las prácticas recomendadas para crear canalizaciones con GPUs.

Para obtener información y ejemplos sobre cómo habilitar las GPUs en tus trabajos de Dataflow, consulta los artículos Ejecutar una canalización con GPUs y Procesar imágenes de satélite Landsat con GPUs.

Requisitos previos para usar GPUs en Dataflow

Cuestiones importantes

Al diseñar los entornos de prueba y de producción, ten en cuenta los siguientes factores.

Desarrollo local

Usar Apache Beam con GPUs de NVIDIA te permite crear flujos de procesamiento de datos a gran escala que gestionan el preprocesamiento y la inferencia. Si usas GPUs para el desarrollo local, ten en cuenta lo siguiente:

  • A menudo, los flujos de trabajo de procesamiento de datos usan bibliotecas adicionales que debes instalar en el entorno de lanzamiento y en el entorno de ejecución de los trabajadores de Dataflow. Esta configuración añade pasos al flujo de trabajo de desarrollo para configurar los requisitos de la canalización o para usar contenedores personalizados en Dataflow. Es recomendable tener un entorno de desarrollo local que se parezca lo más posible al entorno de producción.

  • Si tu flujo de trabajo cumple los dos criterios siguientes, no tienes que crear contenedores personalizados ni cambiar tu flujo de trabajo de desarrollo para configurar los requisitos de la canalización:

    • Estás usando una biblioteca que usa GPUs NVIDIA de forma implícita.
    • No es necesario modificar el código para que sea compatible con la GPU.
  • Algunas bibliotecas no cambian de forma transparente entre el uso de la CPU y la GPU, por lo que requieren compilaciones específicas y diferentes rutas de código. Para replicar el ciclo de vida de desarrollo de código-ejecución de código en este caso, se necesitan pasos adicionales.

  • Cuando ejecutes experimentos locales, replica el entorno del trabajador de Dataflow lo más fielmente posible. En función de la biblioteca, es posible que necesites un equipo con una GPU y las bibliotecas de GPU necesarias instaladas. Es posible que este tipo de máquina no esté disponible en tu entorno local. Puedes emular el entorno del runner de Dataflow mediante un contenedor que se ejecute en una máquina virtual de Google Cloud Platform equipada con una GPU.

Especificaciones de los tipos de máquinas

Para obtener información sobre la compatibilidad de los tipos de máquina con cada modelo de GPU, consulta Plataformas de GPU. Las GPUs compatibles con los tipos de máquinas N1 también son compatibles con los tipos de máquinas N1 personalizadas.

El tipo y el número de GPUs definen las restricciones de límite superior en las cantidades disponibles de vCPU y memoria que pueden tener los trabajadores. Para ver las restricciones correspondientes, consulta la sección Disponibilidad.

Si especificas un número mayor de CPUs o de memoria, es posible que tengas que especificar un número mayor de GPUs.

Para obtener más información, consulta el artículo sobre las GPUs en Compute Engine.

Optimizar el uso de los recursos

La mayoría de las canalizaciones no se componen únicamente de transformaciones que requieren una GPU. Un flujo de procesamiento típico tiene una fase de ingestión que usa una de las muchas fuentes proporcionadas por Apache Beam. A esta fase le siguen las transformaciones de manipulación o de modelado de datos, que se introducen en una transformación de GPU.

El ajuste adecuado usa sugerencias de recursos de Apache Beam para personalizar los recursos de los trabajadores de tus flujos de procesamiento por lotes. Cuando el ajuste adecuado está habilitado, Dataflow solo usa GPUs en las fases de la canalización que las necesitan. Por lo tanto, esta función mejora la flexibilidad y las capacidades de las canalizaciones, además de reducir los costes.

Para obtener más información, consulta Ajuste correcto.

GPUs y paralelismo de los trabajadores

En las canalizaciones de Python que usan la arquitectura Dataflow Runner v2, Dataflow inicia un proceso del SDK de Apache Beam por cada núcleo de VM. Cada proceso del SDK se ejecuta en su propio contenedor Docker y, a su vez, genera muchos subprocesos, cada uno de los cuales procesa los datos entrantes.

Las GPUs usan una arquitectura de varios procesos y las GPUs de los trabajadores de Dataflow son visibles para todos los procesos y subprocesos.

Si ejecutas varios procesos del SDK en una GPU compartida, puedes mejorar la eficiencia y el uso de la GPU habilitando el servicio multiproceso (MPS) de NVIDIA. MPS mejora el paralelismo de los trabajadores y el rendimiento general de las canalizaciones de GPU, especialmente en cargas de trabajo con un uso bajo de recursos de GPU. Para obtener más información, consulta Mejorar el rendimiento de una GPU compartida con NVIDIA MPS.

Para evitar la sobreasignación de memoria de la GPU, puede que tengas que gestionar el acceso a la GPU. Si usas TensorFlow, cualquiera de las siguientes sugerencias puede ayudarte a evitar la sobreasignación de memoria de la GPU:

  • Configura los trabajadores de Dataflow para que inicien solo un proceso de Python en contenedores, independientemente del número de vCPUs del trabajador. Para hacer esta configuración, cuando inicies el trabajo, usa las siguientes opciones de la canalización:

    • --experiments=no_use_multiple_sdk_containers
    • --number_of_worker_harness_threads

    Para obtener más información sobre cuántos subprocesos usar, consulta Reduce el número de subprocesos.

  • Habilita MPS.

Cargas de trabajo de inferencia

Cuando uses modelos de aprendizaje automático para realizar inferencias locales y remotas, usa la transformación RunInference integrada de Apache Beam. La API RunInference es una PTransform optimizada para las inferencias de aprendizaje automático. Usar la transformación RunInference puede mejorar la eficiencia cuando usas modelos de aprendizaje automático en tus pipelines.

Flujo de trabajo

El siguiente flujo de trabajo de dos fases muestra cómo crear una canalización con GPUs. Este flujo se encarga de los problemas relacionados con la GPU y los que no lo están por separado, y acorta el bucle de comentarios.

  1. Crear un flujo de procesamiento

    Crea un flujo de procesamiento que se pueda ejecutar en Dataflow. Sustituye las transformaciones que requieren GPUs por las que no las usan, pero que son funcionalmente iguales:

    1. Crea todas las transformaciones relacionadas con el uso de la GPU, como la ingestión y la manipulación de datos.

    2. Crea un stub para la transformación de GPU con un cambio de transferencia o de esquema.

  2. Probar localmente

    Prueba la parte de la GPU del código de la canalización en el entorno que imita el entorno de ejecución del trabajador de Dataflow. En los pasos que se indican a continuación se describe uno de los métodos para realizar esta prueba:

    1. Crea una imagen Docker con todas las bibliotecas necesarias.

    2. Empieza a desarrollar el código de la GPU.

    3. Empieza el ciclo de ejecución de código con una máquina virtual de Google Cloud Platform con la imagen de Docker. Para descartar incompatibilidades de bibliotecas, ejecuta el código de la GPU en un proceso de Python local por separado de una canalización de Apache Beam. A continuación, ejecuta todo el flujo de procesamiento en el ejecutor directo o lánzalo en Dataflow.

Usar una VM que ejecute un sistema operativo optimizado para contenedores

Para un entorno mínimo, usa una máquina virtual optimizada para contenedores. Para obtener más información, consulta Crear una VM con GPUs conectadas.

El flujo general es el siguiente:

  1. Crea una VM.

  2. Conéctate a la VM y ejecuta los siguientes comandos:

    sudo cos-extensions install gpu -- -version latest
    sudo mount --bind /var/lib/nvidia /var/lib/nvidia
    sudo mount -o remount,exec /var/lib/nvidia
    
  3. Confirma que hay GPUs disponibles:

    ./nvidia-smi
    
  4. Inicia un contenedor Docker con controladores de GPU desde la VM montada como volúmenes. Por ejemplo:

    sudo 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 gcr.io/bigdatapivot/image_process_example:latest
    

Para ver un Dockerfile de ejemplo, consulta Compilar una imagen de contenedor personalizada. Añade al archivo Dockerfile todas las dependencias que necesites para tu flujo de trabajo.

Para obtener más información sobre cómo usar una imagen de Docker preconfigurada para usar la GPU, consulta Usar una imagen ya configurada para usar la GPU.

Herramientas para trabajar con sistemas optimizados para contenedores

  • Para configurar la CLI de Docker para que use docker-credential-gcr como asistente de credenciales del conjunto predeterminado de Google Container Registries (GCR), usa lo siguiente:

    sudo docker-credential-gcr configure-docker
    

    Para obtener más información sobre cómo configurar las credenciales de Docker, consulta docker-credential-gcr.

  • Para copiar archivos, como código de una canalización, a una VM o desde ella, usa toolbox. Esta técnica es útil cuando se usa una imagen optimizada personalizada. Por ejemplo:

    toolbox /google-cloud-sdk/bin/gsutil cp gs://bucket/gpu/image_process/* /media/root/home/<userid>/opencv/
    

    Para obtener más información, consulta Depurar problemas de nodos con la caja de herramientas.

Siguientes pasos