Der Schöpfer von LLVM entwickelt eine neue Programmiersprache Mojo

Chris Lattner, Gründer und Hauptarchitekt von LLVM sowie Schöpfer der Programmiersprache Swift, und Tim Davis, ehemaliger Leiter der AI-Projekte von Google wie Tensorflow und JAX, haben die neue Programmiersprache Mojo vorgestellt, die die Benutzerfreundlichkeit für Forschungsentwicklungen und schnelles Prototyping mit der Eignung zur Erstellung leistungsstarker Endprodukte kombiniert. Dies wird durch die Verwendung der vertrauten Syntax der Programmiersprache Python erreicht, während die zweite Eigenschaft durch die Möglichkeit der Kompilierung in Maschinencode, sichere Speicherverwaltungsmechanismen und den Einsatz von Mitteln zur Hardwarebeschleunigung von Berechnungen ermöglicht wird.

Das Projekt konzentriert sich auf Anwendungen im Bereich des maschinellen Lernens, wird jedoch als allgemeine Programmiersprache präsentiert, die die Möglichkeiten von Python mit Systemprogrammierungsmitteln erweitert und für ein breites Spektrum von Aufgaben geeignet ist. Zum Beispiel ist die Sprache für Bereiche wie Hochleistungsrechnen, Datenverarbeitung und -umwandlung anwendbar. Eine interessante Eigenschaft von Mojo ist die Möglichkeit, das Emoji-Symbol „🔥“ als Erweiterung für Code-Dateien anzugeben (zum Beispiel „helloworld.🔥“), neben der textuellen Erweiterung „.mojo“.

Derzeit befindet sich die Sprache in der intensiven Entwicklungsphase, und es steht nur eine Online-Schnittstelle zum Testen zur Verfügung. Separat veröffentlichte Builds für den Betrieb auf lokalen Systemen werden später bekannt gegeben, nachdem Feedback zur Funktionsweise der interaktiven Webumgebung eingeholt wurde. Der Quellcode des Compilers, JIT und anderer mit dem Projekt verbundener Arbeiten soll nach Abschluss der Entwurfsphase der internen Architektur eröffnet werden (das Modell zur Entwicklung eines funktionsfähigen Prototyps hinter verschlossenen Türen ähnelt der frühen Entwicklungsphase von LLVM, Clang und Swift). Da die Syntax von Mojo auf Python basiert und das Typsystem nahe an C/C++ liegt, wird in Zukunft ein Werkzeugkasten entwickelt, um die Übertragung bestehender Projekte, die in C/C++ und Python geschrieben sind, auf Mojo zu erleichtern und hybride Projekte zu entwickeln, die Code in Python und Mojo kombinieren.

Das Projekt ist darauf ausgelegt, die vorhandenen Hardware-Ressourcen heterogener Systeme für Berechnungen zu nutzen. Beispielsweise können zur Ausführung von Anwendungen in der Mojo-Sprache und zur Parallelisierung der Berechnungen GPUs, spezialisierte Beschleuniger für maschinelles Lernen und SIMD (Single Instruction, Multiple Data) -Prozessoranweisungen verwendet werden. Als Grund für die Entwicklung einer eigenen Teilmenge der Programmiersprache Python wird die Ausrichtung auf Kompilierung, die Integration von Funktionen der Systemprogrammierung und die Anwendung einer grundlegend anderen internen Architektur genannt, die die Ausführung von Code auf GPUs und verschiedenen Hardware-Beschleunigern ermöglicht. Dabei beabsichtigen die Entwickler von Mojo, soweit möglich, die Kompatibilität mit CPython zu wahren.

Mojo kann sowohl im Interpretationsmodus mit JIT (Just-In-Time) als auch für die Kompilierung in ausführbare Dateien (AOT, Ahead-of-Time) verwendet werden. Der Compiler ist mit modernen Technologien zur automatischen Optimierung, Caching und verteilten Kompilierung ausgestattet. Der Quellcode in der Mojo-Sprache wird in einen niedrigen Zwischenkode MLIR (Multi-Level Intermediate Representation) umgewandelt, der vom LLVM-Projekt entwickelt wird und zusätzliche Optimierungsmöglichkeiten für die Verarbeitung von Datenflussgraphen bietet. Der Compiler ermöglicht die Verwendung verschiedener Backends zur Generierung von Maschinencode, die MLIR unterstützen.

Die Nutzung zusätzlicher Hardwaremechanismen zur Beschleunigung von Berechnungen ermöglicht eine Leistungssteigerung, die bei intensiven Berechnungen die Anwendungen in C/C++ übertrifft. Beispielsweise war bei Tests einer Anwendung zur Erzeugung einer Mandelbrot-Menge das kompilierte Mojo-Programm in der Cloud AWS (r7iz.metal-16xl) 6-mal schneller als die Implementierung in C++ (0,03 Sek. gegenüber 0,20 Sek.) und 35.000-mal schneller als die Anwendung in Python mit dem Standard-CPython 3.10.9 (0,03 Sek. gegenüber 1027 Sek.) sowie 1500-mal schneller bei Verwendung von PYPY (0,03 Sek. gegenüber 46,1 Sek.).

Bei der Bewertung der Leistung im Bereich der Lösung von Aufgaben im maschinellen Lernen erwies sich der AI-Stack Modular Inference Engine, der in der Sprache Mojo geschrieben wurde, im Vergleich zu einer Lösung auf Basis der TensorFlow-Bibliothek auf einem Intel-Prozessor als dreimal schneller bei der Verarbeitung von Sprachmodellen, als sechsmal schneller bei der Ausführung des Empfehlungsmodells und als 2,1-mal schneller bei der Arbeit mit Modellen zur Verarbeitung visueller Informationen. Bei der Verwendung von AMD-Prozessoren betrug der Gewinn bei der Nutzung von Mojo 3,2, 5 und 2,2 Mal, und bei der Verwendung von ARM-Prozessoren lag er bei 5,3, 7,5 und 1,7 Mal. Die auf PyTorch basierende Lösung lag 1,4, 1,1 und 1,5 Mal hinter Mojo auf Intel-CPUs, 2,1, 1,2 und 1,5 Mal auf AMD-CPUs und 4, 4,3 und 1,3 Mal auf ARM-CPUs zurück.

Der Schöpfer von LLVM entwickelt eine neue Programmiersprache Mojo

Die Sprache unterstützt statische Typisierung und Mittel für eine sichere niedrigstufige Arbeit mit Speicher, die an die Möglichkeiten der Sprache Rust erinnern, wie die Verfolgung der Lebensdauer von Referenzen und die Überprüfung der Borrowing-Variablen (borrow checker). Neben den Mitteln für eine sichere Arbeit mit Zeigern stehen auch Möglichkeiten für niedrigstufige Arbeiten zur Verfügung, zum Beispiel ist der direkte Zugriff auf den Speicher im unsicheren Modus mit dem Typ Pointer möglich, die Ausführung von spezifischen SIMD-Befehlen oder der Zugriff auf Hardwareerweiterungen wie TensorCores und AMX.

Der Schöpfer von LLVM entwickelt eine neue Programmiersprache Mojo

Zur Vereinfachung der Trennung von klassischem und optimiertem Python-Code für Funktionen mit einer expliziten Typdefinition für alle Variablen wird vorgeschlagen, ein separates Schlüsselwort „fn“ anstelle von „def“ zu verwenden. Ähnlich kann für Klassen, falls eine statische Datenverpackung im Speicher während der Kompilierung erforderlich ist (wie in C), anstelle von „class“ der Typ „struct“ verwendet werden. Ein einfacher Import von Modulen in C/C++-Sprachen ist ebenfalls möglich; zum Beispiel kann für den Import der Funktion cos aus der Math-Bibliothek angegeben werden: „from „math.h“ import cos“.

Quelle: opennet.ru

60GB SSD 8Gb DDR4