El creador de LLVM desarrolla el nuevo lenguaje de programación Mojo

Chris Lattner, fundador y arquitecto jefe de LLVM y creador del lenguaje de programación Swift, y Tim Davis, exjefe de proyectos de IA de Google como Tensorflow y JAX, presentaron un nuevo lenguaje de programación Mojo que combina la facilidad de uso para I+D y la creación rápida de prototipos con idoneidad para productos finales de alto rendimiento. El primero se logra mediante el uso de la sintaxis familiar del lenguaje Python, y el segundo se debe a la capacidad de compilar en código de máquina, mecanismos para la gestión segura de la memoria y el uso de herramientas para la aceleración de cálculos por hardware.

El proyecto se centra en el uso para el desarrollo de aprendizaje automático, pero se presenta como un lenguaje de propósito general que amplía las capacidades del lenguaje Python con la programación de sistemas y es adecuado para una amplia gama de tareas. Por ejemplo, el lenguaje es aplicable a áreas como la informática de alto rendimiento, el procesamiento y la transformación de datos. Una característica interesante de Mojo es la capacidad de especificar el símbolo emoji "🔥" como extensión para archivos de código (por ejemplo, "holamundo.🔥"), además de la extensión de texto ".mojo".

Actualmente, el lenguaje está bajo un desarrollo intensivo y solo se ofrece la interfaz en línea para pruebas. Se promete publicar ensamblajes separados para ejecutar en sistemas locales más adelante, después de recibir comentarios sobre el trabajo del entorno web interactivo. Está previsto que el código fuente del compilador, JIT y otros desarrollos relacionados con el proyecto se abran después de que se complete el diseño de la arquitectura interna (el modelo de desarrollo de un prototipo funcional a puertas cerradas se asemeja a la etapa inicial de desarrollo de LLVM, Clang y Swift). Dado que la sintaxis de Mojo se basa en Python y el sistema de tipos está cerca de C/C++, hay planes en el futuro para desarrollar un conjunto de herramientas para facilitar la traducción de proyectos existentes escritos en C/C++ y Python a Mojo, así como para desarrollar proyectos híbridos que combinan código Python y Mojo.

El proyecto está diseñado para involucrar los recursos de hardware de los sistemas heterogéneos disponibles en el sistema en los cálculos. Por ejemplo, se pueden usar GPU, aceleradores de aprendizaje automático especializados e instrucciones de procesamiento de vectores (SIMD) para ejecutar aplicaciones Mojo y paralelizar cálculos. La razón para desarrollar un subconjunto separado del lenguaje Python, en lugar de unirse al trabajo de optimización del CPython existente, se cita como un enfoque de compilación, integración de las capacidades de programación del sistema y el uso de una arquitectura interna fundamentalmente diferente que permite que el código sea ejecutado en GPU y varios aceleradores de hardware. Al mismo tiempo, los desarrolladores de Mojo tienen la intención de adherirse a la compatibilidad con CPython tanto como sea posible.

Mojo se puede usar tanto en el modo de interpretación JIT como para la compilación en archivos ejecutables (AOT, antes de tiempo). El compilador tiene tecnologías modernas incorporadas para la optimización automática, el almacenamiento en caché y la compilación distribuida. Los textos fuente en el lenguaje Mojo se convierten en código intermedio de bajo nivel MLIR (Multi-Level Intermediate Representation), desarrollado por el proyecto LLVM y que proporciona características adicionales para optimizar el procesamiento de un gráfico de flujo de datos. El compilador le permite usar varios backends que admiten MLIR para generar código de máquina.

El uso de mecanismos de hardware adicionales para acelerar los cálculos permite alcanzar un rendimiento que, con cálculos intensivos, supera a las aplicaciones C/C++. Por ejemplo, al probar una aplicación para generar un conjunto de Mandelbrot, la aplicación compilada de Mojo, cuando se ejecutaba en la nube de AWS (r7iz.metal-16xl), era 6 veces más rápida que la implementación de C++ (0.03 seg. vs. 0.20 seg. .), así como 35 mil veces más rápido que una aplicación de Python usando CPython 3.10.9 estándar (0.03 segundos frente a 1027 segundos) y 1500 veces más rápido usando PYPY (0.03 segundos frente a 46.1 segundos).

Al evaluar el desempeño en el área de resolución de problemas de aprendizaje automático, la pila Modular Inference Engine AI escrita en el lenguaje Mojo, en comparación con una solución basada en la biblioteca TensorFlow, resultó ser 3 veces más rápida en un sistema con Intel. procesador al procesar un modelo de lenguaje, 6.4 veces más rápido al ejecutar el modelo de generación de recomendaciones y 2.1 veces más rápido al trabajar con modelos para el procesamiento de información visual. Al usar procesadores AMD, la ganancia al usar Mojo fue de 3.2, 5 y 2.2 veces, y al usar procesadores ARM, 5.3, 7.5 y 1.7 veces, respectivamente. La solución basada en PyTorch quedó rezagada con respecto a Mojo en 1.4, 1.1 y 1.5 veces en la CPU Intel, 2.1, 1.2 y 1.5 veces en la CPU AMD y 4, 4.3 y 1.3 veces en la CPU ARM.

El creador de LLVM desarrolla el nuevo lenguaje de programación Mojo

El lenguaje admite la escritura estática y funciones seguras de memoria de bajo nivel que recuerdan a las funciones de Rust, como el seguimiento de la vida útil de referencia y el verificador de préstamo variable (verificador de préstamo). Además de los medios para una operación segura con punteros, el lenguaje también proporciona características para el trabajo de bajo nivel, por ejemplo, es posible acceder directamente a la memoria en modo inseguro usando el tipo de puntero, llamar a instrucciones SIMD individuales o acceder a extensiones de hardware como como TensorCores y AMX.

El creador de LLVM desarrolla el nuevo lenguaje de programación Mojo

Para simplificar la separación del código Python clásico y optimizado para funciones con definiciones de tipo explícitas para todas las variables, se propone usar una palabra clave separada "fn" en lugar de "def". De manera similar para las clases, si necesita empaquetar datos de forma estática en la memoria en tiempo de compilación (como en C), en lugar de "clase", puede usar el tipo "estructura". También es posible simplemente importar módulos en lenguajes C / C ++, por ejemplo, para importar la función cos de la biblioteca matemática, puede especificar "desde "math.h" import cos".

Fuente: opennet.ru

Añadir un comentario