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.

Рисунок 1 - Крис Лэттнер (слева) и Тим Дэвис (справа)
Рисунок 1 - Крис Лэттнер (слева) и Тим Дэвис (справа)

По заявлениям авторов, Mojo сочетает в себе удобство использования Python с производительностью C, открывая беспрецедентную программируемость аппаратного обеспечения и расширяемость моделей ИИ.

На данный момент Mojo поддерживается на Ubuntu Linux и macOS, но вскоре обещают добавить поддержку и на Windows. Более подробно с требованиями вы можете ознакомиться на официальном сайте Mojo.

Ниже я собрал для вас наиболее интересные примеры, написанные с использованием языка Mojo.

Примеры проектов на Mojo

  1. Инференс Llama2 на Mojo  - проект, в котором автор переписал инференс Llama2 с Python на Mojo, при этом производительность повысилась аж в 250 раз. Ниже можно увидеть средний показатель token per seconds.

Рисунок 2 - график Avg. token per second
Рисунок 2 - график Avg. token per second
  1. Фреймворк для ML  - проект, который написан с использованием библиотеки Infermo (также написана на чистом Mojo) и представляет необходимый функционал для обучения своих моделей. В ней присутствуют различные слои, функции активаций, прямой и обратные проходы сети и другое. 

  2. HTTP-фреймворк Lightbug- это та самая база необходимая для разработки веб-сервисов, работы с  маршрутизацией и  HTML-страницами. Фреймворк использует преимущества Mojo ,такие как  статическая типизация и буст производительности.

  3. Простая реализация Stable Diffusion на Mojo - проект, который реализует маленькую версию Stable Diffusuion. Как утверждает автор, проект на 100% реализован на Mojo: каждый компонент модели был реализован с нуля, от целых чисел до матричных умножений и сверток, существующих в PyTorch. 

Основное преимущество в том, что генерация занимает гораздо меньше времени, чем стандартный SD, написанный на Python. Текущее решение является супербазовым из-за этого результаты генераций получаются достаточно сырыми. Вы можете оценить их ниже.

Рисунок 3 - примеры генерации изображений SD на Mojo
Рисунок 3 - примеры генерации изображений SD на Mojo
  1. Симуляция квантовых вычислений  - проект, который предоставляет простой и понятный интерфейс для моделирования операций в квантовой системе с использованием параллельных вычислений.
    Кроме Mojo интерес представляют другие новые языки, такие как Quill и Cirq , которы также набирают обороты в области квантовых вычислений, упрощая реализацию квантовых схем и моделирования.   

А что всё-таки нового?

Давайте посмотрим что же все-таки принципиально нового внутри Mojo, и какие механизмы под капотом позволяют так сильно разгонять вычислительные процессы.

  1. Производительность. Mojo использует MLIR (Multi-Level Intermediate Representation), позволяя разработчикам использовать преимущества векторизации, многопоточности и аппаратного обеспечения.

Рисунок 4 - выполнение процессов на Python и Mojo
Рисунок 4 - выполнение процессов на Python и Mojo

Высокая производительность, которая превосходит Python аж в 68000 раз.

Производительность измерена на алгоритме построения множества Мандельброта

Рисунок 5- сравнение производительности на Python и Mojo
Рисунок 5- сравнение производительности на Python и Mojo

     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: комментарии, циклы, условия.

1) изменяемые с помощью ключевого слова var

2) неизменяемые с помощью ключевого слова let

3) выражения именованных параметров, задаются с помощью ключевого слова alias

1) fn - обеспечивает проверку типов и безопаснее для поведения памяти (Rust style);

2) def -  не допускает объявления типов и имеет динамическое поведение (Python стиль).

Интеграция с Python

Вы можете использовать, как  стандартные библиотеки Python, так и ваши локальные модули для разработки различных приложений с Mojo. Об этом можно почитать здесь.

Существую некоторые ограничения совместимости Mojo с Python на момент выхода статьи:

  1. импортировать и использовать модули, написанные на Mojo в Python не представляется возможным;

  2. нельзя импортировать отдельные компоненты (классы, функции) из определенного пакета. Необходимо импортировать весь модуль Python, а затем получить доступ к компонентам через имя модуля;

  3. пока нет поддержки кода верхнего уровня, поэтому вызов должен находиться внутри другого метода.

  4. В 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

Комментарии (65)


  1. Jury_78
    18.04.2024 14:04
    +10

    Ладно Питон, но почему C++ медленней?


    1. Aizz
      18.04.2024 14:04

      Судя по всему, за счет мультитрединга и принципов работы с массивами. Незначительно, впрочем. Нагуглил статейку, там графики есть. Насколько можно доверять сайту и автору - не знаю.
      https://engiware.com/benchmark/llama2-ports-extensive-benchmarks-mac-m1-max.html


      1. Jury_78
        18.04.2024 14:04

        Незначительно, впрочем.

        А у автора то отличие в 10 раз получается.


        1. ArtInt
          18.04.2024 14:04

          Не совсем понял почему в 10 раз? Если вы про Go vs Mojo/C, то да. Я сам был удивлен что Go очень плох в сугубо вычислительных задачах.


          1. Jury_78
            18.04.2024 14:04

            Я что то не то увидел?


            1. ArtInt
              18.04.2024 14:04

              Как я полагаю это бенчмарк на алгоритме Mandelbrot причём на CPU Intel Xeon у которого 88 vCPU. Сам не проверял, но думаю что вполне может быть правдой, по причинам описанным в комантах -- меньший оверхед за счёт LLVM/MLIR трансляции, который обеспечивает улучшенную компиляцию под конкретные процессоры. MLIR имеет контекст более высокого уровня поэтому по словам создателей Mojo - это помогает с оптимизацией.


      1. kuza2000
        18.04.2024 14:04
        +12

        Тоже не понял, как C++ может быть медленнее. Параллелизм и в C++ есть. Да та же numba в питоне может циклы параллелить по ядрам процессора.


        1. ArtInt
          18.04.2024 14:04

          Паралелизм паралелизму рознь. Многое зависит от оптимизатора. Проблема с современными C++ компиляторами в том что им приходится поддерживать 100500 различных платформ и архитектур, из за этого код под конкретную архитектуру может оказаться суб-оптимальным. А также с другой стороны general оптимизация компилятором проигрывает более правильно организованному коду высокого уровня. Т.е. грубо говоря если программист явно пишет какой цикл нужно векторизовать и какие нужно использовать параметры для SIMD операций -- код оказывается эфективнее чем оптимизатор будет делать предположения в жадном режиме.


        1. ArtInt
          18.04.2024 14:04

          А супер оптимизированные вычислительные библиотеки такие как BLAS -- оказываются что супер раздуты там сотни тысяч строк кода, поддерживать это хозяйство да еще и под разные архитектуры тот еще челендж