AI технологии в последнее время на вершине хайпа, вы и сами знаете. В особенности популярные большие языковые модели, но и компьютерное зрение не остается в стороне. Эти и другие области ML объединяет то, что большинство библиотек для машинного обучения написано на Python. Безусловно, этот факт приносит как свои преимущества, так и недостатки. Сначала взглянем на преимущества
А из недостатков первое что приходит на ум это всем известная скорость вычислений.
Меня зовут Вадим, я работаю Data Scientist в компании RAFT.
И сегодня мы с вами заглянем в новенький фреймворк для AI Mojo, который по описанию производителей сочетает в себе удобство использования и производительность, а также включает в себя возможность работы над моделями искусственного
интеллекта. Погнали!
Что это такое?
Mojo - специализированный язык программирования, ориентированный на разработку в сфере AI. Он был представлен 2 мая 2023 года компанией Modular. В этом проекте участвуют большое количество гуру специалистов AI, главные из них:
Крис Лэттнер - со основатель и директор Modular, в прошлом - один из ключевых разработчиков языка Swift, компилятора Clang, а также технологий LLVM и MLIR. Также работал в Google, Tesla и Apple.
Тим Дэвис - со основатель и руководитель продукта, внёс большой вклад в инфраструктуру искусственного интеллекта Google в Google Brain и Core Systems.
По заявлениям авторов, Mojo сочетает в себе удобство использования Python с производительностью C, открывая беспрецедентную программируемость аппаратного обеспечения и расширяемость моделей ИИ.
На данный момент Mojo поддерживается на Ubuntu Linux и macOS, но вскоре обещают добавить поддержку и на Windows. Более подробно с требованиями вы можете ознакомиться на официальном сайте Mojo.
Ниже я собрал для вас наиболее интересные примеры, написанные с использованием языка Mojo.
Примеры проектов на Mojo
Инференс Llama2 на Mojo - проект, в котором автор переписал инференс Llama2 с Python на Mojo, при этом производительность повысилась аж в 250 раз. Ниже можно увидеть средний показатель token per seconds.
Фреймворк для ML - проект, который написан с использованием библиотеки Infermo (также написана на чистом Mojo) и представляет необходимый функционал для обучения своих моделей. В ней присутствуют различные слои, функции активаций, прямой и обратные проходы сети и другое.
HTTP-фреймворк Lightbug- это та самая база необходимая для разработки веб-сервисов, работы с маршрутизацией и HTML-страницами. Фреймворк использует преимущества Mojo ,такие как статическая типизация и буст производительности.
Простая реализация Stable Diffusion на Mojo - проект, который реализует маленькую версию Stable Diffusuion. Как утверждает автор, проект на 100% реализован на Mojo: каждый компонент модели был реализован с нуля, от целых чисел до матричных умножений и сверток, существующих в PyTorch.
Основное преимущество в том, что генерация занимает гораздо меньше времени, чем стандартный SD, написанный на Python. Текущее решение является супербазовым из-за этого результаты генераций получаются достаточно сырыми. Вы можете оценить их ниже.
Симуляция квантовых вычислений - проект, который предоставляет простой и понятный интерфейс для моделирования операций в квантовой системе с использованием параллельных вычислений.
Кроме Mojo интерес представляют другие новые языки, такие как Quill и Cirq , которы также набирают обороты в области квантовых вычислений, упрощая реализацию квантовых схем и моделирования.
А что всё-таки нового?
Давайте посмотрим что же все-таки принципиально нового внутри Mojo, и какие механизмы под капотом позволяют так сильно разгонять вычислительные процессы.
Производительность. Mojo использует MLIR (Multi-Level Intermediate Representation), позволяя разработчикам использовать преимущества векторизации, многопоточности и аппаратного обеспечения.
Высокая производительность, которая превосходит Python аж в 68000 раз.
Производительность измерена на алгоритме построения множества Мандельброта
2)Расширяемость. С помощью Mojo можно расширять свои модели с помощью предобработки и постобработки, также вы можете заменять какие-либо операции пользовательскими, переписав необходимый функционал.
3)Интеграция Mojo с Python. Есть возможность писать код на Python и интегрировать его с Mojo, также можно использовать базовые библиотеки, такие как Numpy и Matplotlib. Не требуется подключение CUDA и C++.
4) Open Source Mojo. С недавних пор этот проект является открытым и находится под лицензией Apache 2.0. О том как можно внести свой вклад, можно почитать тут.
Теперь давайте погрузимся немного в синтаксис языка и узнаем, чем он может нас удивить.
Немного о синтаксисе языка
Давайте немного окунемся в особенности синтаксиса языка.
Mojo поддерживает только несколько типов данных: Int, Float, String, Bool, Uint. Также некоторые вещи Mojo перенял из Python: комментарии, циклы, условия.
Переменные в Mojo делятся на:
1) изменяемые с помощью ключевого слова var
2) неизменяемые с помощью ключевого слова let
3) выражения именованных параметров, задаются с помощью ключевого слова alias
Функции могут быть определены:
1) fn - обеспечивает проверку типов и безопаснее для поведения памяти (Rust style);
2) def - не допускает объявления типов и имеет динамическое поведение (Python стиль).
Интеграция с Python
Вы можете использовать, как стандартные библиотеки Python, так и ваши локальные модули для разработки различных приложений с Mojo. Об этом можно почитать здесь.
Существую некоторые ограничения совместимости Mojo с Python на момент выхода статьи:
импортировать и использовать модули, написанные на Mojo в Python не представляется возможным;
нельзя импортировать отдельные компоненты (классы, функции) из определенного пакета. Необходимо импортировать весь модуль Python, а затем получить доступ к компонентам через имя модуля;
пока нет поддержки кода верхнего уровня, поэтому вызов должен находиться внутри другого метода.
В Mojo исключения имеют очень ограниченное использование из соображений производительности
Примечание:
Mojo загружает интерпретатор Python и его модули во время выполнения, поэтому, где бы вы ни запускали программу Mojo, она должна иметь доступ к совместимому Python интерпретатору и находить любые импортированные модули Python.
Заключение
В этой статья я описал только верхушку айсберга Mojo. Если следить за новостями проекта, то можно заметить, что он постоянно развивается, каждую неделю появляются новые статьи и проекты.
А что думаете насчёт него вы, заменит ли он Python и ближайшем будущем или нет?
P.S. авторы языка решили покреативить и сделали так, что файлы языка можно хранить в 2-х вариантах: *.mojo и * .?
Пишите в комментариях!
Полезные ссылки
[1] Официальный сайт Mojo: Modular: Accelerating the Pace of AI
[2] Официальная документация Mojo: Modular Docs
[3] Хороший репозиторий для изучения Mojo: rd4com/mojo-learning: ? Learn some mojo ! (github.com)
[4] Хороший репозиторий с различными проектами Mojo: mojicians/awesome-mojo: A curated list of awesome Mojo ? frameworks, libraries, software and resources (github.com)
[5] Раннее демо Mojo: Product Launch 2023 Keynote (youtube.com)
[6] Playground Mojo: Modular Docs
[7] Статья о том, как измеряли производительность Mojo на алгоритме построения множества Мандельброта: Modular: Mojo? - A journey to 68,000x speedup over Python - Part 3
[8] Хороший туториал об основах Mojo: Mojo Programming Language – Full Course for Beginners - YouTube
Jury_78
Ладно Питон, но почему C++ медленней?
Aizz
Судя по всему, за счет мультитрединга и принципов работы с массивами. Незначительно, впрочем. Нагуглил статейку, там графики есть. Насколько можно доверять сайту и автору - не знаю.
https://engiware.com/benchmark/llama2-ports-extensive-benchmarks-mac-m1-max.html
Jury_78
А у автора то отличие в 10 раз получается.
ArtInt
Не совсем понял почему в 10 раз? Если вы про Go vs Mojo/C, то да. Я сам был удивлен что Go очень плох в сугубо вычислительных задачах.
Jury_78
Я что то не то увидел?
ArtInt
Как я полагаю это бенчмарк на алгоритме Mandelbrot причём на CPU Intel Xeon у которого 88 vCPU. Сам не проверял, но думаю что вполне может быть правдой, по причинам описанным в комантах -- меньший оверхед за счёт LLVM/MLIR трансляции, который обеспечивает улучшенную компиляцию под конкретные процессоры. MLIR имеет контекст более высокого уровня поэтому по словам создателей Mojo - это помогает с оптимизацией.
kuza2000
Тоже не понял, как C++ может быть медленнее. Параллелизм и в C++ есть. Да та же numba в питоне может циклы параллелить по ядрам процессора.
ArtInt
Паралелизм паралелизму рознь. Многое зависит от оптимизатора. Проблема с современными C++ компиляторами в том что им приходится поддерживать 100500 различных платформ и архитектур, из за этого код под конкретную архитектуру может оказаться суб-оптимальным. А также с другой стороны general оптимизация компилятором проигрывает более правильно организованному коду высокого уровня. Т.е. грубо говоря если программист явно пишет какой цикл нужно векторизовать и какие нужно использовать параметры для SIMD операций -- код оказывается эфективнее чем оптимизатор будет делать предположения в жадном режиме.
ArtInt
А супер оптимизированные вычислительные библиотеки такие как BLAS -- оказываются что супер раздуты там сотни тысяч строк кода, поддерживать это хозяйство да еще и под разные архитектуры тот еще челендж