28 marzo, 2019

Acelerando el entrenamiento de modelos de Aprendizaje Automático en Google Kubernetes Engine

Sharing is caring!

Uno de los principales problemas a los que se enfrentan los desarrolladores de aplicaciones de Aprendizaje Automático  consiste en el tiempo que invierten en el entrenamiento de los modelos, debido al alto consumo de recursos de cómputo que se requiere. Para dar respuesta a esta necesidad, Google puso a disposición de todos los desarrolladores varias opciones disponibles en su nube, Google Cloud Platform, las cuales permiten acelerar el entrenamiento de los modelos, disminuyendo el tiempo de ejecución y por ende el consumo de recursos de cómputo, lo cual significa una disminución en el costo por uso de dichos recursos.

En este artículo comentaremos principalmente dos nuevas capacidades: el uso de GPU y de Cloud TPU en Google Kubernetes Engine.

Definiendo conceptos

Antes de comenzar, me gustaría explicar algunos conceptos para aquellas personas que no se encuentren relacionadas con los mismos.

En primer lugar, ¿qué es Kubernetes?

Kubernetes es una palabra griega que significa “timonel” o “piloto” y fue desarrollado por ingenieros de Google y liberado a toda la comunidad como un proyecto Open Source. Tal como aparece definido en su sitio web:

Kubernetes es un sistema de código abierto para automatizar la implementación, el escalado y la administración de aplicaciones en contenedores.

En segundo lugar, ¿qué es Google Kubernetes Engine?

Google Kubernetes Engine o GKE (abreviando) es un entorno administrado disponible sobre Google Cloud Platform para implementar aplicaciones en contenedores. Como se define en su sitio web:

GKE implementa, administra y escala aplicaciones en contenedores de Kubernetes con la tecnología de Google Cloud.

Dentro de las principales características que ofrece, podemos mencionar las siguientes:

  • Servicio completamente administrado: al ser un servicio administrado por los ingenieros de Google se garantiza que siempre se encuentre actualizado y disponible.
  • Compatibilidad con Docker: es compatible con el formato de contenedor de Docker.
  • Escalamiento automático: con una sencilla configuración, GKE aumenta y disminuye el número de nodos del clúster automáticamente según la utilización de recursos (CPU, memoria).
  • Recuperación automática: Si un nodo del clúster falla, automáticamente se lanza un proceso de recuperación para garantizar que tu aplicación siga dando servicio.
  • Registro y monitoreo: a partir de su integración con Stackdriver permite el registro y monitoreo de eventos para detectar fallas o simplemente para visualizar cómo se está comportando tu aplicación.
  • Administración de identidades y accesos: permite controlar el acceso al clúster utilizando las cuentas de Google de los usuarios con diferentes permisos.
  • Seguridad: cuenta con el respaldo del equipo de seguridad de Google, que tiene más de 750 expertos, y cumple con los estándares HIPAA y PCI DSS 3.1.
  • Portabilidad: al ser una tecnología de código abierto, resulta sencillo migrar las cargas de trabajo a otras plataformas que soportan Kubernetes, ya sea en la nube o on-premise.

En tercer lugar, ¿qué es una GPU?

Una GPU o Unidad de Procesamiento Gráfico es un coprocesador diseñado específicamente para realizar millones de operaciones en punto flotante por unidad de tiempo, para maximizar el rendimiento de las aplicaciones que requieren un uso intensivo de recursos de cómputo, aligerando de esta manera la carga de trabajo del CPU o Unidad Central de Procesamiento.

Inicialmente las GPUs fueron utilizadas en aplicaciones de procesamiento gráfico como videojuegos, renderización de modelos tridimensionales, entre otras. Sin embargo, debido al gran poder de cómputo que tienen estas unidades y la explosión que han tenido las aplicaciones de aprendizaje automático, las GPUs han comenzado a utilizarse para el entrenamiento de los modelos matemáticos que requieren muchas operaciones de cómputo.

La principal ventaja que presentan las GPUs antes las CPUs para acelerar estas aplicaciones se debe a la arquitectura intrínseca de cada una. MIentras que las CPUs actuales cuentan con unos pocos núcleos de procesamiento, las GPUs más avanzadas tienen miles de núcleos de procesamiento que fueron diseñados para resolver varias tareas al mismo tiempo.

Para más información referente a estas unidades de procesamiento gráfico le recomiendo revisar la documentación que aparece en el sitio de NVIDIA.

Por último, ¿qué es una TPU?

Una TPU o Unidad de Procesamiento de Tensor  es un chip diseñado por Google que permite acelerar las cargas de trabajo de Aprendizaje Automático mediante TensorFlow.

Cloud TPU es una TPU disponible en la nube de Google y está diseñada para ofrecer el máximo rendimiento y flexibilidad para ayudar a los investigadores, desarrolladores y empresas a crear clústeres de procesamiento.

Dentro de las principales ventajas que tiene el uso de las Cloud TPUs se pueden mencionar las siguientes:

  • Aceleran el rendimiento del cálculo de álgebra lineal, que se usa mucho en aplicaciones de aprendizaje automático.
  • Minimizan el tiempo requerido para alcanzar la precisión deseada cuando se entrenan modelos de redes neuronales, grandes y complejos. Los modelos que anteriormente llevaban semanas en entrenarse en otras plataformas de hardware pueden converger en pocas horas utilizando TPUs.


Dentro de la oferta de Cloud TPU de Google se pueden encontrar principalmente tres opciones:

Acelerando el entrenamiento con GPUs

Como primera opción para acelerar el entrenamiento de los modelos de aprendizaje automático, Google anunció una nueva funcionalidad que permite adicionar a un clúster de Kubernetes (GKE) un conjunto de unidades de procesamiento gráfico (GPU) con escalamiento automático.

Dentro de las GPUs soportadas se encuentran los modelos de NVIDIA: Tesla K80Tesla V100Tesla P100 y Tesla P4.

Para adicionar recursos de GPU a un clúster es muy sencillo, sigue los siguientes pasos:

1. Al crear el clúster selecciona la opción Personalizar en el tipo de máquina de un grupo de nodos como se muestra en la siguiente figura:

2. Selecciona el número y el tipo de GPU que requiere:

3. Una vez que tu clúster termine de crearse, solo requieres especificar cuales Pods van a hacer uso de las GPUs. Para esto es necesario incluir una pequeña configuración en la definición del servicio:

apiVersion: v1

kind: Pod

spec:

 containers:

 - name: mi-gpu-container

   resources:

     limits:

      nvidia.com/gpu: 2

Si requieres especificar autoescalamiento lo puedes hacer tanto desde la interfaz gráfica como desde la línea de comandos. Un ejemplo sencillo es el siguiente, donde se crea un grupo con 3 nodos, cada uno con 2 GPUs Tesla P100 y autoescalamiento desde 0 hasta 5 nodos.

gcloud container node-pools create p100 \

--accelerator type = nvidia-tesla-p100, count =2 \

--zone us-central1-c --cluster p100-cluster \

--num-nodes 3 --min-nodes 0 --max-nodes 5 --enable-autoscaling

Acelerando el entrenamiento con Cloud TPU

Como segunda opción, se encuentra disponible el uso de Cloud TPUs dentro de un clúster en Google Kubernetes Engine. Las principales ventajas que presenta esta opción son:

  • Al ser un servicio administrado (Cloud TPU), no se necesita administración por uno mismo, por tanto, la configuración y la administración son más sencillas.
  • Se puede acceder a estos recursos utilizando la API de Kubernetes lo cual permite escalar fácilmente a cientos de Pods y nodos.
  • Permite el escalamiento automático de los recursos de Cloud TPU lo que ayuda a optimizar el costo de utilización.
  • Usando la Job API de GKE junto con el mecanismo de punto de control de TensorFlow, los trabajos de entrenamiento volverán a ejecutarse automáticamente con la última lectura de estado del punto de control si se producen fallas en las instancias de VM o en los nodos Cloud TPU.

Para crear un clúster de GKE con soporte para Cloud TPU, sigue los siguientes pasos:

1. Al crear el clúster asegúrate de seleccionar una de las zonas disponibles, por ejemplo us-central1-b y que la versión del clúster sea la 1.10.4-gke.2 ó superior. Habilita VPC y Cloud TPU como se muestra en las siguientes figuras:

2. Una vez que tu clúster termine de crearse, solo requieres especificar cuales Pods o Jobs van a hacer uso de Cloud TPU. Para esto es necesario incluir una pequeña configuración en la definición del servicio: 

kind: Pod

spec:

 containers:

 - name: example-container

   resources:

     limits:

       cloud-tpus.google.com/v2: 8

Con el uso de esta tecnología se alcanza un rendimiento increíble. Un ejemplo claro es el mostrado por Yoshi Tamura (Product Manager, GKE) y Vishnu Kannan (Senior Software Engineer) en su plática “Accelerating Your Compute-Intensive Applications on Google Kubernetes Engine” durante el evento Google Next ´18 en julio pasado. En esta sesión, muestran como caso de estudio el entrenamiento de ResNet-50 (para el reconocimiento de imágenes)  utilizando dos opciones de TPU con los siguientes resultados:

CriterioSingle Cloud TPU / 8 coresCloud TPU v2 half-pod
Velocidad de procesamiento~ 3,250 imágenes / segundo77,392 imágenes / segundo
Precisión final93%93%
Tiempo de entrenamiento8.9 horas30 minutos

Conclusiones

El crecimiento exponencial que está teniendo el uso de la Inteligencia Artificial y el Aprendizaje Automático en la solución de problemas diarios, ha creado la necesidad de utilizar nuevas tecnologías que permitan a los desarrolladores y científicos de datos poder entrenar y probar nuevos modelos en tiempos relativamente pequeños. Como se comenta en este artículo, Google ha habilitado sobre su plataforma en la nube Google Cloud Platformdos nuevas tecnologías que permiten acelerar las tareas antes mencionadas: el uso de GPUs y el uso de Cloud TPUs en clústeres de Google Kubernetes Engine.

Algunas de las áreas que se ven beneficiadas con el uso de las GPUs o TPUs son: el reconocimiento de imágenes, el procesamiento de lenguaje natural, la codificación de videos y el procesamiento de imágenes, por solo mencionar algunos.

Sin más por decir: ¿Qué opinas tú? ¿Piensas que estas tecnologías tendrán un impacto positivo en tu labor diaria como científico de datos o como programador de modelos de Aprendizaje Automático? Envía tus comentarios por medio de nuestro contacto o a través de nuestras redes sociales, ya sea para contestar estas preguntas, profundizar en algún tema, aclarar dudas o comentar más acerca de este tema.

Bibliografía

“The AI ​​Computing Company.” NVIDIAwww.nvidia.com/en-us/about-nvidia/ai-computing/.

“Accelerating Your Compute-Intensive Applications on Google Kubernetes Engine (Cloud Next ’18).” YouTube, 25 July 2018, https://youtu.be/JU46HmzToek.

“Cloud TPUs – ML Accelerators for TensorFlow | Cloud TPU | Google Cloud. ” Google, Google, cloud.google.com/tpu/.

“High Performance Computing and Supercomputing | NVIDIA Tesla | NVIDIA. ” Leader in Artificial Intelligence Computing | NVIDIAla.nvidia.com/object/tesla-supercomputing-solutions-la.html.

“Production-Grade Container Orchestration.” Kuberneteskubernetes.io/.

“Setting up Cloud TPU on Kubernetes Engine | Cloud TPU | Google Cloud. ” Google, Google, cloud.google.com/tpu/docs/kubernetes-engine-setup.

“Stackdriver – Hybrid Monitoring | Stackdriver | Google Cloud. ” Google, Google, cloud.google.com/stackdriver/.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *