Гибридные нейронные сети с 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 чтобы не пропустить самое интересное!
Понравилась статья - поделись ей!