Desarrolla con GPU

En esta página, se describe un ejemplo de un flujo de trabajo de desarrollador para compilar canalizaciones con GPU.

Para obtener más información sobre el uso de GPU con Dataflow, consulta la compatibilidad de Dataflow con las GPU. Para obtener información y ejemplos sobre cómo habilitar las GPU en tus trabajos de Dataflow, consulta Usa GPU y Procesa imágenes satelitales de Landsat con GPU.

El uso de Apache Beam con GPU de NVIDIA te permite crear canalizaciones de procesamiento 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. Recomendamos un entorno de desarrollo local que imite de la manera más fiel posible el entorno de producción.

  • Si usas una biblioteca que usa de forma implícita GPUs de NVIDIA y tu código no requiere cambios para admitir GPUs, no necesitas cambiar tu flujo de trabajo de desarrollo a fin de configurar los requisitos de canalización ni para compilar personalizados. contenedores.

  • Algunas bibliotecas no cambian de manera transparente entre el uso de CPU y GPU, por lo que requieren compilaciones específicas y rutas 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 ejecutas experimentos locales, es útil replicar 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.

  • Es poco probable que tenga una canalización compuesta por completo de 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.

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 sencillo.

  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:

    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
    
  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:

    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. Asegúrate de agregar 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 útiles 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:

    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?