Гибридные нейронные сети с GPU ускорением в JavaScript

Согласно отчету Octoverse 2017, JavaScript является самым популярным языком на Github. Измеренный по количеству пул реквестов и уровеню активности JavaScript сопоставим с Python, Java и Go.

JavaScript завоевал Интернет и вторгся на сервер, мобильные телефоны, настольные и другие платформы.

Между тем, использование GPU ускорения значительно расширилось за рамки компьютерной графики и теперь является неотъемлемой частью машинного обучения.

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

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

Обзор

Все проекты, перечисленные ниже, активно поддерживаются, имеют тысячи звезд на Github и распространяются через NPM или CDN.

Все они реализуют GPU ускорение в браузере через WebGL с фолбеком к CPU, если нет подходящей видеокарты.

Библиотеки, предназначенные для запуска существующих моделей (особенно тех, которые прошли обучение с использованием фреймворков Python), не включены в этот обзор.

В итоге в список вошли четыре проекта.

Хотя набор функций deeplearn.js ориентирован на нейронные сети, его можно охарактеризовать как универсальную систему машинного обучения. Propel - это библиотека для научных вычислений, которая предлагает автоматическую дифференциацию. Gpu.js обеспечивает удобный способ запуска функций JavaScript на GPU. Brain.js является продолжением более старой библиотеки нейронных сетей и использует gpu.js для аппаратного ускорения.

Я намерен сохранить эту статью и развернуть ее в репозиторий Github. Пожалуйста, дайте мне знать, если вы встретите похожие новости.

Deeplearn.js

Deeplearn.js является самым популярным проектом среди четырех и описывается как «аппаратно ускоренная JavaScript библиотека для машинного интеллекта». Он поддерживается командой Google Brain и сообществом из более чем 50 участников. Двумя основными авторами являются Daniel Smilkov и Nikhil Thorat.

Определение сверточного слоя в deeplearn.js:

Deeplearn.js, написанный в TypeScript и смоделированный после Tensorflow, поддерживает растущее подмножество функций, предоставляемых в главном проекте Google Brain с открытым исходным кодом. API в основном состоит из трех частей.

Первая часть охватывает функции, используемые для создания, инициализации и преобразования тензоров, массивные структуры, которые хранят данные.

Следующая часть API предоставляет операции, выполняемые на тензорах, что включает в себя основные математические операции, сокращение, нормировку и свертку. Поддержка рекуррентных нейронных сетей является рудиментарной на данный момент, но включает в себя сетевые ячейки с долгой краткосрочной памятью.

Третья часть связана с модельным обучением. Включены все популярные оптимизаторы, от стохастического градиентного спуска до Adam. С другой стороны, потеря пекерестной энтропий является единственной функцией потерь, упомянутой в ссылке.

Остальная часть API используется для настройки среды и управления ресурсами.

Экспериментальное GPU ускорение в node.js может быть достигнуто с помощью headless-gl (см. issues № 49 ).

На веб-сайте проекта есть несколько запоминающихся демок. К ним относятся выступления рекуррентной нейронной сети с фортепиано, визуальный интерфейс для создания моделей и приложение для веб-камеры на основе SqueezeNet (классификатор изображений с относительно небольшим числом параметров).

Propel

Propel описывается как «дифференцируемое программирование для JavaScript». Работа двух главных авторов, Ryan Dahl и Bert Belder, дополняется одиннадцатью участниками.

Первичная нейронная сеть с тремя уровнями, подготовленная с помощью Propel в наборе данных MNIST:

В основе этого проекта лежит автоматическая дифференциация (AD), что освобождает нас от необходимости вручную определять производные. Для заданной функции f(x), определенной с поддерживаемыми тензорными операциями, функцию градиента можно получить с помощью grad. Случай с несколькими переменными покрывается multigrad.

Вне AD, не совсем ясно, куда идет проект. Хотя «numpy-like инфраструктура» упоминается на веб-сайте как цель, API находится в «тяжелой разработке» и включает в себя функции, связанные с нейронными сетями и компьютерным зрением. Используя функцию загрузки, содержимое файлов npy можно распарсить и использовать в качестве тензоров.

В среде браузера Propel делает возможным использование WebGL в deeplearn.js. Для GPU ускорения в Node проект использует TensorFlow C API.

gpu.js

Хотя большая часть моего опыта связана с CUDA, а не с WebGL, я могу подтвердить трудоемкий характер GPU программирования. Поэтому я был приятно удивлен, когда наткнулся на gpu.js. Имея около 5700 звезд на Github, проект сопоставим с deeplearn.js с точки зрения его популярности и имеет 18 участников. Несколько человек со временем внесли существенный вклад. Главный автор - Robert Plummer.

Матричное умножение с помощью gpu.js: эквивалент Hello World в программировании на GPU:

Ядром в текущем контексте является функция, выполняемая на графическом процессоре, а не на CPU. С gpu.js ядра могут быть записаны в подмножестве JavaScript. Затем код компилируется и запускается на графическом процессоре. Поддержка Node.JS через OpenCL была добавлена несколько недель назад.

В качестве входных и выходных данных используются числа и массивы чисел до трех измерений используются . Помимо основных математических операций, gpu.js поддерживает локальные переменные, циклы и операторы if / else.

Чтобы включить повторное использование кода и сделать возможным модульные конструкции, можно зарегистрировать пользовательские функции,которые затем могут вызываться из кода ядра.

Внутри JavaScript'ового определения ядра, объект this предоставляет идентификаторы потоков и содержит значения, которые являются постоянными внутри реального ядра, но динамически снаружи.

Проект специализируется на ускоренных функциях JavaScript и не пытается обеспечить инфраструктуру нейронной сети. Для этого мы можем обратиться к библиотеке, которая зависит от gpu.js.

Brain.js

Brain.js является преемником harthur/brain, репозитория с историей, относящейся к древним временам 2010 года.

В общей сложности около 30 человек внесли свой вклад в эти два репозитория.

Поддержка нейронных сетей с GPU ускорением основана на gpu.js и, возможно, является самой важной разработкой в новейшей истории проекта.

В дополнение к сетям прямого распространения Brain.js включает в себя реализации трех важных типов рекуррентных нейронных сетей: классические сети Элмана, сети с долгой краткосрочной памятью и более поздние сети с управляемыми рекуррентными блоками.

Демо, включенные в репозиторий, находятся на ранней стадии. На домашней странице показаны настройки цветового контраста нейронной сети. В исходном коде могут быть найдены две другие демки, одна из которых включает обнаружение символов, нарисованных с помощью ASCII.

Появление ускоренных библиотек JavaScript для машинного обучения имеет несколько интересных последствий.

Онлайн-курсы могут интегрировать упражнения, связанные с машинным обучением или GPU вычислениями, непосредственно в веб-приложение. Студенты не обязательно должны создавать отдельные среды разработки в разных операционных системах и версиях программного обеспечения.

Можно более просто развернуть множество демок на основе нейронных сетей, которые больше не требуют API-интерфейса на стороне сервера.

Разработчики JavaScript, заинтересованные в компьютерном обучении, могут в полной мере использовать свои специализированные навыки и тратить меньше времени на интеграционные проблемы.

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

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

Тем не менее, я приветствую прогресс, достигнутый за последние двенадцать месяцев. Год назад не было ни deeplearn.js, ни Propel. Уровни активности в репозитории gpu.js были относительно низкими, а Brain.js не поддерживал ускорение GPU.

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

Оригинал статьи - GPU-accelerated Neural Networks in JavaScript

Присоединяйтесь к нашим каналам FrontEndDev и Web Stack в Telegram чтобы не пропустить самое интересное!

Понравилась статья - поделись ей!