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
- Para usar las GPU con tu trabajo de Dataflow, debes usar Runner v2.
- Dataflow ejecuta el código de usuario en las VMs de trabajador dentro de un contenedor de Docker.
Estas VMs de trabajador ejecutan Container-Optimized OS.
Para que los trabajos de Dataflow usen GPUs, necesitas los siguientes requisitos previos:
- Los controladores de GPU se instalan en las VMs de trabajador y son accesibles para el contenedor de Docker. Para obtener más información, consulta Instala controladores de GPU.
- Las bibliotecas de GPU que requiere tu canalización, como las bibliotecas de NVIDIA CUDA-X o el kit de herramientas de CUDA de NVIDIA, se instalan en la imagen del contenedor personalizada. Para obtener más información, consulta Configura tu imagen de contenedor.
- Debido a que los contenedores de GPU suelen ser grandes, para evitar quedarte sin espacio en el disco, aumenta el tamaño de disco de arranque predeterminado a 50 gigabytes o más.
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.
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.
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.
Crea todas las transformaciones que rodean el uso de GPU, como la manipulación y la transferencia de datos.
Crea un stub para la transformación de GPU con un cambio de esquema o traspaso.
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:
Crea una imagen de Docker con todas las bibliotecas necesarias.
Comienza a desarrollar el código de GPU.
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:
Crea una VM.
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
Confirma que las GPU estén disponibles:
./nvidia-smi
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?
- Obtén más información sobre la compatibilidad con Dataflow con GPU.
- Obtén más información sobre cómo ejecutar una canalización mediante GPUs.
- Trabaja con el procesamiento de imágenes satelitales de Landsat con GPU.