Статьи

Проекты, которые делают Blazing Fast Ruby реальностью

Скорость дизайн на белом фоне, векторные иллюстрации.

Ruby все еще не очень популярен в сообществах ученых и специалистов по искусственному интеллекту. Однако, это может скоро измениться, поскольку на горизонте появятся два крупных проекта, которые могут дать Ruby поддержку в 2016 году.

OMR

Проект OMR — это инициатива с открытым исходным кодом (вскоре) по разработке повторно используемых и потребляемых компонентов из виртуальной машины IBM J9. Эти компоненты будут использоваться для любой желаемой языковой среды выполнения, включая Ruby. Надеюсь, что это снизит барьер входа для реализации языков.

Вот некоторые вещи, которые проект планирует привнести:

  1. JIT-компилятор
  2. Сборщик мусора корпоративного уровня
  3. Метод профилировщик

Прямо сейчас ускорения скромны — в диапазоне 1x — 3x. Тем не менее, IBM делает упор на совместимость, а не производительность, чтобы облегчить принятие. Они утверждают, что уже могут запускать Rails.

IBM опубликовала предварительный обзор технологии их реализации OMR Ruby на GitHub.

Рубин + трюфель + Грааль

Хотя OMR выглядит очень многообещающе, настоящей звездой может стать экспериментальный бэкэнд JRuby, над которым работает Oracle Labs. Он реализует Ruby с инфраструктурой Truffle AST и виртуальной машиной Graal JIT. Заявленный прирост производительности уже феноменален — до 30-кратного МРТ в несинтетических тестах. Результаты этого проекта могут заставить нас переосмыслить то, что возможно с динамическими языками, и он может открыть Ruby для мира научных вычислений и искусственного интеллекта.

Помимо производительности, другой целью Truffle + Graal является высокая совместимость между реализованными языками. К ним в настоящее время относятся R, JavaScript и, конечно же, Ruby. Это облегчит использовать лучшую библиотеку для работы, а не соглашаться на то, что доступно на основном языке.

Что касается зрелости, по словам Криса Ситона, проект в настоящее время «передает 93% спецификаций языка RubySpace и 90% спецификаций базовой библиотеки» .

Трюфель

Truffle — это среда Java для написания самооптимизирующихся интерпретаторов AST (абстрактного синтаксического дерева). AST — это структуры данных, которые содержат древовидное представление исходного кода, созданного синтаксическим анализатором. Обычно с интерпретаторами AST используется для генерации байт-кода, который выполняется на виртуальной машине. Однако вместо этого Truffle использует узлы AST для непосредственного управления передачей Graal машинного кода.

При реализации языка с использованием этого нового подхода мы в основном имеем дело со «слоем» трюфелей. Вот почему вы можете увидеть ссылки на «трюфельные языки».

Грааль

Graal — это новая реализация JIT-компилятора в JVM OpenJDK. Graal написан на Java, поэтому он предоставляет Java API для работающей программы. Это позволяет языку напрямую управлять компилятором и таким образом переходить от AST -> машинного кода без шага генерации байт-кода.

Вызовы методов

Одна из причин, по которой Ruby + Truffle такой быстрый, заключается в том, что он удаляет вызовы методов для общих операций. В Ruby практически все — это вызов метода, включая 1+11.+(1)foo=1foo.=(1) Эти вызовы также связаны с выделением объектов.

Ruby + Truffle покончил с этими вызовами и распределением методов, добавив вместо этого операции внутри, что позволяет бэкэнду работать намного быстрее. Конечным результатом является то, что Ruby + Truffle создает ручной машинный код, который выглядит так, как будто он был создан вручную мастером демосцены . Этот процесс известен как анализ частичного побега .

Агрессивное кеширование

Вы, наверное, слышали о «кэше методов» Руби и о том, как он часто аннулируется. Поиск метода Ruby обычно включает в себя 2 уровня кэширования:

  1. Глобальный кэш метода — связывает указатель функции с комбинацией класса и имени метода.
  2. Встроенный кеш — кэширует указатель функции на сайте вызова, чтобы избежать попадания в глобальный кеш.

Ruby + Truffle добавляет новый уровень кеширования:

  1. Кэш аргументов — обобщенный встроенный кеш, содержащий аргументы.

Оптимизированные структуры данных

Когда вы создаете массив, подобный [1,2,3]массив указателей VALUE . Это означает, что каждый элемент массива не обязательно должен быть одного типа, но он должен быть упакован и распакован, что занимает много времени.

Бэкэнд Ruby + Truffle достаточно умен, чтобы распознавать, когда он может хранить коллекции в распакованном виде. Это делается через систему специализаций . Он даже имеет специализации для пустых коллекций, которые вообще не выделяют хранилище.

Впервые может стать возможным выполнять интенсивную математику в Ruby, не завися от расширений Си. Однако ожидается, что пользователи расширений C также увидят значительное увеличение скорости.

GPU Backends

Несколько графических процессоров формировались в хранилище Graal.

  • PTX (параллельное выполнение потоков) — включает вычисления общего назначения на оборудовании CUDA (nvidia)
  • HSAIL (промежуточный уровень гетерогенной архитектуры системы) — решение AMD для интеграции процессоров и графических процессоров

Если они повзрослеют, это может создать среду, в которой практически любой язык может использоваться для продвинутых задач машинного обучения — и со скоростью, очень близкой к родной.

Пробовать

В настоящее время у JRuby есть экспериментальный трюфель / Graal, доступный на GitHub . Вот несколько инструкций о том, как загрузить его с помощью популярных менеджеров версий Ruby:

rbenv

 $ rbenv install jruby-master+graal-dev
$ rbenv shell jruby-master+graal-dev
$ ruby -X+T -e 'puts Truffle.graal?'
true

РВМ

 $ rvm mount -r http://lafo.ssw.uni-linz.ac.at/graalvm/jruby-dist-master+graal-macosx-x86_64-bin.tar.gz -n jruby-dev-graal
$ rvm use jruby-dev-graal
$ ruby -X+T -e 'puts Truffle.graal?'
true

При использовании бэкэнда Graal вы должны получить что-то вроде:

 $ ruby --version
jruby 9.0.5.0-SNAPSHOT (2.2.3) 2015-12-22 36276d3 OpenJDK 64-Bit Server VM25.40-b25-internal-graal-0.7 on 1.8.0-internal-b128 +jit [darwin-x86_64]

Имейте в виду, что это релизы для разработчиков. Я столкнулся с некоторыми проблемами при установке в первый раз, когда попробовал маршрут RVM, но он сработал несколько дней спустя.

Если вы решили выполнить некоторые тесты, имейте в виду, что вам все равно придется иметь дело со временем загрузки и прогревом JVM. До сих пор кажется, что сложно получить результаты, о которых заявляет команда проекта. С включенным Truffle ( -X+T

Если вы можете получить 30x + усиление для любого кода, пожалуйста, сообщите нам об этом в комментариях. Примечание: чтобы помочь справиться с проблемой разминки, разработчики используют benchmark-ips

Вывод

Эти проекты влияют не только на Ruby. Любой реализованный язык увидит преимущество в скорости, обеспечиваемое этими подходами. У них еще есть пути, но они прогрессируют неплохо, поэтому есть вероятность, что мы увидим их в общем использовании где-то в этом году.

Ресурсы