LINUX.ORG.RU

nevermind-neu библиотека машинного обучения

 , , ,


1

4

Доброго времени суток, публикую свою разработку, а именно библиотеку машинного обучения nevermind-neu. Идея изначально появилась из желания хорошо понять как работают нейронные сети и изучить rust, а для того чтобы понять, лично мне нужно написать самому. Далее вся эта разработка затянула меня и вышло в то что вышло. Кратко опишу текущие возможности библиотеки:

  • Слои: полносвязный, пока что 1 :(
  • Функции потерь: Эвклидова потеря, Кросс-энтропия(softmax loss).
  • Функции активации: relu, sigmoid, tanh, leaky_relu
  • Стандартные оптимизаторы: Adam, RMSProp, AdaGrad, AdaDelta
  • Асинхронная паралельная подготовка батчей
  • Датасет лоадеры: CSV, Protobuf
  • Сериализация состояния модели нейронной сети: protobuf (позже numpy добавлю)
  • Сериализация конфигурации модели нейронной сети: yaml
  • Поддержка OpenCL вычислений, используя ocl crate
  • Так называемая утилита tool (нужно что-то придумать с названием), который позволяет обучать модели(с нескучным cli интерфейсом), тестировать их, создавать конфигурации моделей в cli режиме.

В качестве библиотеки матричной математики на CPU используется ndarray, который использует matrixmultiply , который под капотом использует simd ядра для умножения матриц. Для OpenCL написал собственные ядра. Я сравнивал свою библиотеку на mnist датасете с достаточно популярной dfdx и она конечно же оказалась быстрее процентов на 60%. Знаю, что она не так много использует Rc-RefCell, но думаю, что основная «загвоздка» производительности не в этом. С другими либами на расте не сравнивал, поскольку отсутствовал example с mnist и др. датасетами. В ближайшее время буду делать паралельное оптимизирование параметров и искать некоторый консенсус когда использовать параллельные итераторы, а когда нет, поскольку производительность сильно падает при их использовании на маленьких слоях(< 64 нейронов).

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

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

Гитхаб репа

MNIST example



Последнее исправление: xionovermazes (всего исправлений: 1)

Ответ на: комментарий от annulen

Достаточно стандартно: вычисляю градиент_x для каждого выходного нейрона и на следующем слое обратного распротрания умножаю транспонированную матрицу весов на градиент_x. Ну и так до первого, входного, слоя. По сути : https://en.wikipedia.org/wiki/Chain_rule.

Параллелизм дифференциирования на ЦПУ происходит thread per batch. Параллелизм на OpenCL - thread per neuron. Аппроксимизаций(Hessian techniques) никаких не используется хотя изучал и думал, что keras например их использует ( поскольку первое время очень сильно обгонял меня (и до сих) по производительности, но оказалось, что keras очень хорошо написан ну и JIT офк).

xionovermazes
() автор топика
Ответ на: комментарий от MKuznetsov

Rust - достаточно низкоуровневый язык, который гибко позволяет настроить управление памятью, т.е. например избежать лишнего неявного копирования памяти и дает свободу оптимизировать разные операции, механизмы. Также язык предоставляет набор библиотек ndarray(матрицы), ocl(opencl), tui-rs(терминальный интерфейс), которые ускоряют процесс разработки. Библиотеки уже окрепшие скажем так, не первый год существует. Ocl правда всего лишь биндинги, но тоже достаточно стабильно.

Безусловно какой-нибудь высокоуровневый питоновый keras в разы удобнее в практичном использовании(но бекенд keras-а написан на С).

Не хочу сказать, что какой-нибудь golang не позволит с той же степенью быстродействия реализовать функционал библиотеки, но тут как с вопросом «почему на гитаре, а не на пианино. ну так вышло» - так и тут в один момент чем-то зацепил язык вот и решил на нем разработать.

xionovermazes
() автор топика
Ответ на: комментарий от xionovermazes

рекламу Rust слышал неоднократно, (можно было не копи-пастить) (шутка, что он тот самый-самый знаем)

практическая цель какая ? NN ведь для чего-то пишут, ради достижения целей. не мышь в вакууме

в какое приложение Rust (или иное) будете вставлять и в каких задачах/отраслях предполагается использование. Почему именно Rust ?

MKuznetsov ★★★★★
()
Последнее исправление: MKuznetsov (всего исправлений: 1)
Ответ на: комментарий от MKuznetsov

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

Пока что дальнейшее развитие вижу в том, чтобы имплементировать различные идеи из paper-сов, например : https://arxiv.org/pdf/1806.01768.pdf. А также очень возбуждает наблюдать за Q-learning наблюдать в играх, так что следующее практическое приложение после шахмат будет наверное, какая нибудь самодельная воксельная МОБА, в которую нейросеть обучается играть. Процесс обучения реализую через отдельный асинхронный приклад с TCP-сокетом и tokio(или др. аналогичную либу), т.е. игра посылает batch, а нейронка ей возвращает вычисленное действие скажем так.

Also, буду поддерживать OpenCL поскольку ML-либ на расте с использованием этой технологии пока что мало(одну нашел на github). (OpenCL конечно слабее в общем плане чем CUDA, но его приемущество на мой взгляд в том, что он поддерживает не только NVIDIA)

xionovermazes
() автор топика
Последнее исправление: xionovermazes (всего исправлений: 2)
Ответ на: комментарий от xionovermazes

например избежать лишнего неявного копирования памяти

Например,

дает свободу оптимизировать разные операции, механизмы

и обнаруживать, что без уговоров разработчиков другого оптимизирующего кодогенератора (LLVM) некоторые трюки в расте просто не работают.

gag ★★★★★
()
Ответ на: комментарий от gag

На счёт первого пункта сам автор говорит о том, что данный недостаток представляет в среднем малый процент инструкций от общего в программе.

На счёт второго не до конца понял: имеется в виду, что при использовании move семантики выполняется лишняя операция, которую нельзя опустить из-за статического анализатора?

На счёт третьего - грустно, но переживем.

Все мы не идеальны, как и раст, который имеет недостатки.

xionovermazes
() автор топика
Ответ на: комментарий от xionovermazes

Безусловно какой-нибудь высокоуровневый питоновый keras в разы удобнее в практичном использовании(но бекенд keras-а написан на С).

На чём у него написан бэк в современных условиях не так уж важно, т.к. все сколько-нибудь серьёзные сети сейчас работают на GPU (или ещё более специализированном железе). Можно хоть на баше писать, главное, чтобы хороший код для CUDA сгенерился.

annulen ★★★★★
()
Ответ на: комментарий от xionovermazes

Жаль только за три десятка лет так и не удалось понять, в чём же именно.

Про нейронные сети нам в универе рассказывали. Было в меру интересно. Но вот применять знания на практике всё как-то не получается. Конкуренция невероятная. Везде требуют 10+ (ладно, 5+) лет опыта.

BattleCoder ★★★★★
()
Ответ на: комментарий от BattleCoder

По основной работе разработчика я не особо применяю машинное обучение.

Практику по нейронкам сам придумываю исключительно потомучто качают они меня. Вот увидел как нейронка в гонки учится играть или MIDI-дорожки генерит - хочется понять и самому сделать.

Разработаете и обучете сами несколько таких сетей и уже на работу возьмут, ну или на собеседовании будет, что рассказать.

xionovermazes
() автор топика