Мои проекты

Мои проекты

Порой, в ходе работы, у меня появлялись кусочки кода, которые могли бы быть полезны кому-то ещё. Я старался делиться таковыми на своём GitHub, где постепенно накопилось некоторое их количество.

 

Калькулятор оптимальной смеси удобрений по методу Митлайдера

Онлайн инструмент

Я очень люблю садоводство и овощеводство. И стараюсь это делать "по науке". После нескольких месяцев изучения того, как правильно выращивать растения, я создал калькулятор, который использует математическую оптимизацию (самописный симплекс-метод), чтобы убедиться, что моя смесь удобрений всегда соответствует рекомендациям экспертов и содержит все необходимое для хорошего роста роста растений и получения хорошего и полезного урожая.

Всё это написано на Rust, используя клиентский веб-фреймворк Yew, компилируется в WebAssembly и работает в любом современном браузере.

Калькулятор специально заточен для быстрого составления еженедельных подкормочных смесей для выращивания по методу доктора Джекоба Миттлайдера. используя только доступные в продаже удобрения.

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

Технологии: Rust, Yew, WebAssembly, симплекс-метод ⇨ см. на GitHub

Rustextile

Парсер языка разметки Textile, написанный на Rust

Хотя Markdown стал де-факто стандартом разметки в комментариях и некоторых блогах, он довольно ограничен в выразительности, особенно когда речь идет о создании насыщенных онлайн-публикаций. "Пиши HTML", - говорит Markdown, а это не всегда приемлемо.

Textile, напротив, был создан с учетом особенностей CMS и сложных публикаций. Например, он позволяет создавать нестандартные блоки контента без необходимости прибегать к HTML. Лично я довольно часто использовал Textile в своей практике, и, когда возникла необходимость, я портировал парсер PHP-Textile на Rust.

Порт не красив и не идиоматичен Rust'у, поскольку я умышленно старался сохранить оригинальную структуру PHP-кода, чтобы упростить перенос новых функций в будущем (Textile продолжает улучшаться). Но, свою работу порт выполняет :)

Технологии: Rust ⇨ см. на GitHub

Trade-archivist

Хранение и доступ к истории торгов на различных криптобиржах

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

Поэтому я написал инструмент, который

  1. Собирает в реальном времени журналы всех торговых событий с набора криптовалютных бирж и сохраняет их в двоичном формате, дополнительно сжатом в серию Bzip-архивов. События от бирж поступают через WebSocket-соединения с их API.
  2. Действует как сервер, предоставляющий двоичный API для ретрансляции торговых событий по мере их возникновения, а также для запроса произвольных фрагментов торговой истории (вплоть до настоящего момента). Это удобно для бэктестинга, обучения различных алгоритмов ML или потоковой передачи тех же журналов реального времени с бирж во время реально работы (в этом случае сервер выступает в качестве прокси с единым API для всех бирж).

Богатым я не стал, но понял, что WaveNet хорош не только работы с человеческой речью :)

Технологии: Rust, Tokio ⇨ см. на GitHub

Keras-transformer

Библиотека (универсальных) нейросетей-Трансформеров для Keras

Я положил глаз на Transformer сразу после выхода оригинальной публикации "Attention is All you need" в 2017ом, и сразу влюбился в идею.

Мой Keras-transformer - это библиотека, реализующая базовый конструктор для построения (универсальных) моделей-Трансформеров с помощью Keras. Она позволяет гибко собирать многоступенчатые модели. Это не "подключи, загрузи веса и используй", а скорее исследовательский инструмент, в котором мне хотелось собрать лучшие идеи и поделиться собственной, хорошо аннотированной реализацией. Судя по большой волне положительных откликов, у меня получилось.

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

Все части модели (такие как само-внимание, функция активации, нормализация слоев) доступны как слои Keras, так что при необходимости, вы можете построить свою версию Transformer, перекомпоновав их как-то иначе, или вовсе заменив.

Для тех, кто не в курсе, (Универсальный) Трансформер - это архитектура глубокого обучения, описанная, пожалуй, в одной из самых впечатляющих DL-статей 2017 и 2018 годов: Attention is All you need и "Universal Transformers" команды Google Brain.

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

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

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

Именно Трансформер лежит в основе потрясающих успехов ChatGPT и подобных ИИ моделей последних лет.

Технологии: Python, Tensorflow, Keras ⇨ см. на GitHub

KERL

Обучение с подкреплением (Reinforcement Learning) для Keras

KERL - это моя коллекция различных алгоритмов Reinforcement Learning и связанных с ними техник, реализованных исключительно с помощью Keras.

Цель проекта - создать реализацию современных алгоритмов RL, а также платформу для разработки и тестирования новых алгоритмов, сохраняя при этом простоту и переносимость кода благодаря Keras и его возможности использовать различные бэкенды (код писался до того, как Keras стал частью Tensorflow). Это делает KERL очень похожим на OpenAI Baselines, только с упором на Keras.

Что попало в KERL:

Все алгоритмы поддерживают адаптивную нормализацию подкреплений Pop-Art, описанную в работе DeepMind "Learning values across many orders of magnitude". Это значительно упрощает обучение, часто позволяя просто бросить алгоритм в задачу и получить достойный результат.

С помощью KERL можно быстро обучить различных агентов играть в игры Atari просто по картинке, а затем погрузиться в детали реализации. Вот пример такого агента, обученного с помощью KERL (видео на youtube): A2C-Агент, играющий в Ms. Pacman

Ограничения: В настоящее время KERL не поддерживает задачи непрерывного управления и пока что тестировался только на различных играх Atari, поддерживаемых The Arcade Learning Environment через OpenAI Gym.

Технологии: Python, Tensorflow, Keras ⇨ см. на GitHub

Avalanche

OpenCL фрейморк глубокого обучения с бэкендом для Keras

Avalanche - это простой фреймворк для глубокого обучения, вроде Tensorflow или PyTorch, написанный с нуля на C++ и Python. В отличие от большинства существующих инструментов, он основан на OpenCL, открытом вычислительном стандарте. Это позволяет Avalanche работать практически на любом GPU, включая GPU от Intel и AMD, даже на довольно старых моделях.

Проект был создан как попытка лучше понять, как работают современные фреймворки глубокого обучения (а построены они на одинаковых принципах), и попрактиковаться в программировании GPU. Avalanche основан на модели вычислительного графа. Он поддерживает автоматическое дифференцирование, широковещательные операции (broadcasting), автоматическое управление памятью, при необходимости может использовать несколько GPU.

Фреймворк также работает как бэкенд для Keras, поэтому если вы знаете Keras, вы можете начать использовать Avalanche без необходимости изучать что-либо о нем.

Технологии: C++, Python ⇨ см. на GitHub

CartGP

Библиотека для картезианского генетического программирования на C++ и Python

Я всегда был большим фанатом генетических алгоритмов. Среди них, Картезианское Генетическое Программирование (в разных формах) много лет остаётся моим самым любимым, за его изящность, эффективность, и подобие во многом реальному поведению биологических геномов.

CartGP - это очень простая и минималистичная библиотека C++/Python, реализующая картезианское генетическое программирование (CGP). В настоящее время библиотека поддерживает классическую форму CGP, когда узлы расположены в виде сетки и не допускаются рекуррентные связи.

Этот Jupyter-блокнот содержит демонстрацию использования библиотеки из Python.

Технологии: C++, Python ⇨ см. на GitHub