Prácticas recomendadas para trabajar con GPU de Dataflow

En esta página, se describen las prácticas recomendadas para compilar canalizaciones mediante GPU.

Para obtener información y ejemplos sobre cómo habilitar las GPU en tus trabajos de Dataflow, consulta Ejecuta una canalización con GPU y Procesa imágenes satelitales de Landsat con GPU.

Requisitos previos para usar GPU en Dataflow

Consideraciones

Cuando diseñes tus entornos de prueba y de producción, ten en cuenta los siguientes factores.

Desarrollo local

El uso de Apache Beam con GPU de NVIDIA te permite crear canalizaciones de tratamiento de datos a gran escala que manejan el procesamiento previo y la inferencia. Cuando uses GPU para el desarrollo local, ten en cuenta la siguiente información:

  • 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 en los trabajadores de Dataflow. Esta configuración agrega los pasos al flujo de trabajo de desarrollo para configurar requisitos de canalización o usar contenedores personalizados en Dataflow. Es conveniente tener un entorno de desarrollo local que imite de la manera más fiel posible el entorno de producción.

  • Si tu flujo de trabajo cumple con los siguientes criterios, no necesitas compilar contenedores personalizados ni cambiar tu flujo de trabajo de desarrollo para configurar los requisitos de canalización:

    • Usas una biblioteca que usa GPU de NVIDIA de forma implícita.
    • Tu código no requiere cambios para admitir GPU.
  • Algunas bibliotecas no cambian de manera transparente entre el uso de CPU y GPU, por lo que requieren compilaciones específicas e instrucciones de código diferentes. Se requieren pasos adicionales a fin de replicar el ciclo de vida del desarrollo de programación-ejecución-programación para esta situación.

  • Cuando ejecutes experimentos locales, replica el entorno del trabajador de Dataflow de la manera más fiel posible. Según la biblioteca, es posible que necesites una máquina 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 de ejecución de Dataflow mediante un contenedor que se ejecuta en una máquina virtual de Google Cloud equipada con GPU.

Especificaciones de tipos de máquinas

Si deseas obtener detalles sobre la compatibilidad de tipos de máquinas para cada modelo de GPU, consulta Plataformas de GPU. Las GPU compatibles con los tipos de máquinas N1 también admiten los tipos personalizados de máquinas N1.

El tipo y la cantidad de GPU definen las restricciones de límite superior para la cantidad de CPU virtuales y memoria disponibles que pueden tener los trabajadores. Para encontrar las restricciones correspondientes, consulta Disponibilidad.

Especificar una mayor cantidad de CPU o memoria puede requerir que especifiques una mayor cantidad de GPU.

Para obtener más detalles, lee GPU en Compute Engine.

Optimiza el uso de recursos

La mayoría de las canalizaciones no están compuestas únicamente por transformaciones que requieren una GPU. Una canalización típica tiene una etapa de transferencia que usa una de las muchas fuentes que proporciona Apache Beam. Esa etapa está seguida de manipulación de datos o formación de transformaciones, que luego se incorporan a una transformación de GPU.

El ajuste adecuado usa las sugerencias de recursos de Apache Beam a fin de personalizar los recursos de trabajador para tus canalizaciones por lotes. Cuando el ajuste adecuado está habilitado, Dataflow solo usa GPU para las etapas de la canalización que las necesitan. En consecuencia, esta característica mejora la flexibilidad y capacidad de la canalización, a la vez que reduce los costos.

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

GPU y paralelismo de trabajadores

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

Las GPU usan varias arquitecturas de procesos, y las GPU en los trabajadores de Dataflow están 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 mediante la habilitación del servicio de procesos múltiples (MPS) de NVIDIA. MPS mejora el paralelismo de trabajadores y la capacidad de procesamiento general de las canalizaciones de GPU, en especial para las cargas de trabajo con un uso bajo de recursos de GPU. Para obtener más información, consulta Mejora el rendimiento en una GPU compartida mediante NVIDIA MPS.

Por lo tanto, para evitar el exceso de suscripciones a la memoria de GPU, es posible que debas administrar el acceso a la GPU. Si usas TensorFlow, cualquiera de las siguientes sugerencias pueden ayudarte a evitar el exceso de suscripciones a la memoria de GPU:

  • Configura los trabajadores de Dataflow para que inicien solo un proceso en Python alojado en contenedores, sin importar el recuento de CPU virtuales de trabajador. Para realizar esta configuración cuando inicias tu trabajo, usa las siguientes opciones de 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 la cantidad de subprocesos.

  • Habilita MPS.

Cargas de trabajo de inferencia

Cuando usas modelos de aprendizaje automático (AA) para realizar inferencias locales y remotas, usa la transformación RunInference integrada de Apache Beam. La API de RunInference es un PTransform optimizado para las inferencias de aprendizaje automático. El uso de la transformación RunInference puede mejorar la eficiencia cuando usas modelos de AA en tus canalizaciones.

Flujo de trabajo

En el siguiente flujo de trabajo de dos etapas, se muestra cómo compilar una canalización con GPU. Este flujo se encarga de los problemas relacionados con las GPU y aquellos que no lo están por separado, y acorta el ciclo de reacción.

  1. Crea una canalización

    Crear una canalización que pueda ejecutarse en Dataflow. Reemplaza las transformaciones que requieren GPUs por las transformaciones que no usan GPU, pero funcionan de la misma manera.

    1. Crea todas las transformaciones que rodean el uso de GPU, como la manipulación y la transferencia de datos.

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

  2. Realiza pruebas locales

    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 siguientes pasos, se describe uno de los métodos para ejecutar esta prueba:

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

    2. Comienza a desarrollar el código de GPU.

    3. Comienza el ciclo de programación-ejecución-programación con una máquina virtual de Google Cloud con la imagen de Docker. Para descartar incompatibilidades de biblioteca, ejecuta el código de GPU en un proceso de Python local separado de una canalización de Apache Beam. Luego, ejecuta la canalización completa en el ejecutor directo o inicia la canalización en Dataflow.

Usa una VM que ejecute el sistema operativo optimizado para contenedores

Para un entorno mínimo, usa una máquina virtual (VM) optimizada para contenedores. Para obtener más información, consulta Crea una VM con GPU 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 las GPU estén disponibles:

    ./nvidia-smi
    
  4. Inicia un contenedor de Docker con controladores de GPU desde la VM activados 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 obtener un Dockerfile de muestra, consulta Compila una imagen de contenedor personalizada. Agrega al Dockerfile todas las dependencias que necesitas para tu canalización.

Si deseas obtener más información sobre el uso de una imagen de Docker preconfigurada para el uso de GPU, consulta Usa una imagen existente configurada para el uso de GPU.

Herramientas para trabajar con sistemas optimizados para contenedores

  • Si deseas configurar la CLI de Docker a fin de usar docker-credential-gcr como auxiliar de credenciales para el conjunto predeterminado de Google Container Registries (GCR), usa lo siguiente:

    sudo docker-credential-gcr configure-docker
    

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

  • Para copiar archivos, como el código de canalización, desde o hacia una VM, usa toolbox. Esta técnica es útil cuando se usa una imagen optimizada para contenedores. 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 Depura problemas de los nodos mediante la caja de herramientas.

¿Qué sigue?