MindSpore de Huawei: ¿nueva competencia de TensorFlow y PyTorch?

Huawei anuncia que su middleware MindSpore para Deep Learning, del estilo de TensorFlow y PyTorch, pasa a ser de código abierto. Descubre en este post sus características más relevantes.

Huawei acaba de anunciar que su framework MindSpore para el desarrollo de aplicaciones de inteligencia artificial pasa a ser de código abierto y está disponible en GiHub y Gitee . Se trata de otro framework Deep Learning para el entrenamiento de modelos de redes neuronales del estilo de TensorFlow y PyTorch pensado para ser usado desde el Edge hasta el Cloud  y dando soporte tanto a GPUs como obviamente a los procesadores Ascend de Huawei.

Fue en Agosto del año pasado cuando Huawei anunciaba el lanzamiento oficial de su procesador Ascend que presentó por primera vez MindSpore, afirmando entonces que «la combinación de Ascend 910 y MindSpore permite aproximadamente ir dos veces más rápido en el entrenamiento de una ResNet50 que usando TensorFlow en aceleradores habituales«.

Es cierto que hay muchos frameworks que han ido saliendo durante estos últimos años y quizás MindSpore no pase de ser uno más del montón que ni por asomo pueda competir algún día con TensorFlow (Google)  y PyTorch (Facebook). Pero cuando leí la noticia hace unos días sobre que MindSpore pasaba a ser open source me recorrió por todo el cuerpo la misma sensación de excitación que la que tube en Noviembre del 2015 cuando leí sobre TensorFlow por primera vez. Igual que entonces, no sabría decir el qué, pero algo me dice que MindSpore puede llegar a ser el tercero en discordia.

Y por ello este fin de semana de Pascua  en que todos estamos igual, #YoMeQuedoEnCasa, me he puesto a mirar un poco más en profundidad lo que hay ahora mismo sobre este framework. En realidad la documentación técnica disponible es aun muy escasa, desorganizada y con muchos errores de todo tipo, pero esto no ha impedido que pueda hacerme una idea de lo que proponen. A continuación comparto con todas y todos vosotros mis primeros hallazgos.

Arquitectura del sistema

Su página web nos describe que el framework MindSpore está estructurado en tres capas: Frontend Expression, Graph Engine, and Backend Runtime. En la siguiente figura se muestra un esquema visual:

MindSpore architecture

La primera capa de MindSpore ofrece una API Python para los programadores. Dado que la lingua franca en nuestra comunidad es de facto Python, no podía ser de otra manera si MindSporee quiere competir con PyTorch y TensorFlow. Con esta API se permite a los  programadores  manejar los modelos (entrenamiento, inferencia,…) y procesar los datos. Esta primera capa también incluye soporte para una representación intermedia del código (MindSpore IR) con la que se basarán muchas de las optimizaciones que se pueden realizar a nivel de paralelización y diferenciación automática (GHLO), tema clave en este tipo de middleware si quiere hacerse un hueco.

Por debajo se encuentra la capa Graph Engine que ofrece las funcionalidades necesarias para crear y realizar la diferenciación automática del grafo de ejecución.  Puedo leer que con MindSpore han optado por un modelo de diferenciación automática diferente de PyTorch (que crea un grafo de ejecución dinámico) o TensorFlow (aunque inicialmente había adoptado la opción de crear un grafo de ejecución estático más eficiente, actualmente ofrece también la opción de un grafo de ejecución dinámico y permitiendo la versión de grafo estático mediante @tf.function de su API de bajo nivel).  La opción de MindSpore consiste en la conversión del código original en el formato de código intermedio (MindSpore IR) de manera que le permite sacar ventaja de los dos modelos (más detalle en apartado Automatic Diferenciation en la web de MindSpore). No he entrado en el código del GiHub ni he podido evaluar nada, pero parece que tiene sentido la aproximación que proponen.

La última capa la conforman todas las librerías y runtimes necesarios para dar soporte a las diferentes arquitecturas hardware donde se procesará el código. No he encontrado información de esta capa  en la web (y no he ido al GitHub a mirar el código), pero entiendo que será un backend muy próximo al de los otros frameworks, quizás con peculiaridades de Huawei, con  librerías como HCCL  (Huawei Collective Communication Library) equivalentes a las NCCL de NVIDIA (NVIDIA Collective Communication Library).

Instalación de MindSpore y mi primera red neuronal

Como pasa a menudo, cuando aparece un nuevo framework la información en el apartado installation es muy escasa, sin los códigos binarios para todas las plataformas, y hay que cruzar los dedos esperando que en la sección Issues del GitHub/Gitee aparezca la solución para poder acabar instalando el software. En mi caso, en un MacBook Pro (Intel Core i7), he podido instalar el docker que ofrecen en su Docker Hub siguiendo las indicaciones de esta página web de issues en Gitee.

Con este docker, y un poco de tiempo, he podido programar mi primera red neuronal.  Concretamente una LeNet para clasificar dígitos MNIST basándome  en un ejemplo de código que ofrece el tutorial de MindSpore. En un siguiente post presentaré con más detalle este código para mostrar que en realidad la API de MindSpore toma prestado  mucha sintaxis de la API de PyTorch y de la API de Keras de TensorFlow.  Por tanto, resulta fácil iniciarse con esta nueva API para cualquiera que esté activo en la programación de redes neuronales .

Soporte a la visualización del proceso de entrenamiento

Según el tutorial de MindSpore, aunque no me ha sido posible instalar y usar, disponen de MindInsight para generar visualizaciones que recuerdan en cierta manera a TensorBoard de TensorFlow. Vean algunas de las capturas de pantalla que muestran en su página web:

Según el manual actualmente MindSpore usa el mecanismo de Callback (que recuerda a como se hace con Keras) para grabar (en un fichero de log) durante el proceso de entrenamiento todos aquellos parámetros e hiperparámetros del modelo que queramos, así como también el grafo de computación cuando la compilación de la red neuronal al código intermedio ha finalizado.

Paralelismo

Al instalar una versión de MindSpore con una sola CPU (mediante un docker), no he podido entrar a probar la paralelización que realiza y la información sobre este tema en su página web por el momento es escasa.

De momento puedo mencionar que en su tutorial hablan de dos modos de paralelización (DATA_PARALLEL y AUTO_PARALLEL) y presentan un ejemplo de código que entrena una ResNet-50 con el dataset CIFAR para un procesador Ascend 910 (que no lo he podido comprobar).  Me imagino que el DATA_PARALLEL  se refiere a la estrategia habitualmente conocida como data parallelism,  que consiste en dividir los datos de entrenamiento en varios subconjuntos, y cada uno de  ellos es ejecutado en una misma réplica del modelo pero en diferentes unidades de proceso.

Creo haber entendido que en la capa Graph Engine se ofrece soporte a la paralelización de los códigos y en concreto al modo de paralelismo AUTO_PARALLEL , que optimiza automáticamente la paralelización  mediante la combinación de la estrategia de paralelización  data parallelism  (comentada anteriormente) con la estrategia model parallelism, en la que se divide el modelo en diferentes partes y cada parte se ejecuta en paralelo en diferentes unidades de procesado. Este modo automático selecciona  la estrategia de paralelización que mejores prestaciones presente, según se puede leer en el apartado Automatic Parallel de la web de MindSpore (aunque no detallan cómo se realiza la evaluación y la decisión).

Tendremos que esperar para darles tiempo al equipo técnico a ir ampliando la documentación, pero está claro que aquí es donde deben y pueden competir con TensorFlow y PyTorch,  sacando rendimientos significativamente superiores usando los procesadores de Huawei.

Roadmap previsto y cómo contribuir

Es evidente que hay mucho trabajo por hacer y de momento han ordenado las ideas que tienen en mente para el próximo año en un extenso roadmap compartido en esta página, pero que irán ajustando según el feedback de los usuarios. De momento podemos encontrar estas líneas principales:

  1. Soportar más modelos ( modelos clásicos pendientes, GAN, RNN, Transformers, modelos de Reinforcement Learning, probabilistic programming, AutoML, etc.).
  2. Ampliar la API y las librerías para mejorar la usabilidad y la experiencia de programación (más operadores, más optimizadores, más funciones de pérdida, etc.)
  3. Soporte integral para el procesador Huawei Ascend y optimizando su rendimiento (optimizar la compilación, mejora del uso de los recursos, etc.)
  4. Evolución del stack de software (la figura que les muestro al principio) y realizar optimizaciones del grafo computacional (mejorar la representación intermedia IR, añadir más oportunidades de optimización, etc.).
  5. Soportar más lenguajes de programación (no solo Python).
  6. Mejorar el entrenamiento distribuido con optimizaciones  del scheduling automático, distribución de los datos, etc.
  7. Mejorar la herramienta MindInsight para facilitar al programador «debugar» y el mejorar el tunning de hiperparámetros durante el proceso de entrenamiento.
  8. Avanzar en ofrecer funcionalidades del entorno de inferencia en los dispositivos que se encuentran en el Edge (seguridad, soportar modelos de otros frameworks a través del estandard ONNX, etc.)

En la página de Community se puede ver que MindSpore cuenta con partners más allá de Huawei, como la University of Edinburgh, Peking University, Imperial Collage London o la startup Milvus. Dicen que seguirán un modelo de gobernanza abierto y invitan a toda la comunidad a contribuir tanto en el código como en la documentación.  

Conclusión

Después de un primer vistazo rápido, parecen acertadas decisiones de diseño e implementación (del paralelismo y la diferenciación automática por ejemplo) que pueden añadir oportunidades para permitir mejoras y optimizaciones que consigan un mejor rendimiento que los frameworks a los que quiere batir. Pero queda por delante una ingente cantidad de trabajo para atrapar a PyTorch y TensorFlow, y sobretodo, crear una comunidad alrededor, ¡nada fácil!. Pero ya sabemos que con el soporte de una de las grandes empresas del sector como es Huawei, todo es posible, ¿o era evidente hace tres años, cuando salió la primera versión de PyTorch (Facebook), que este podría en estos momentos empezar a pisar los talones  de TensorFlow (Google)?

Espero que este post les haya sido de utilidad, como mínimo a mi me ha resultado muy interesante escribirlo. Nos vemos en un siguiente post que les contaré cómo he programado mi primera red neuronal en MindSpore. Una experiencia entretenida dado que nos encontramos en #YoMeQuedoEnCasa.

[versión en inglés en Medium]

Huawei’s MindSpore: A new competitor for TensorFlow and PyTorch?