Кирилл Маврешко

Добро пожаловать, {{ visitor.username }}, на мою страничку

О себе

Примерно 18 лет разрабатываю ПО. В основном, работал над проектами, перемалывающими большие объёмы данных, зачастую в реальном времени.

Люблю создавать умное ПО. В частности, в последнем проекте приходилось собирать много текста из сети и извлекать из них сложно структурированную информацию с помощью нейросетей.

Много лет работал удалённо, в штате или по контрактам. А потому научился быть дисциплинированным, ибо от результата зависела и оплата. Ценю интересность проектов гораздо выше денег.

  • Языки программирования:
    • Rust — Работал c Tokio, Actix-web, Yew, Sea-ORM в рамках Mealmind.
    • C++ — Использовал Boost (в основном). Делал различные инструменты обработки и анализа больших объемов данных (рекламный трафик), некоторые с привязкой к Python.
    • Python — Веб-бэкенды (много Django) и инструменты обработки данных, публичные API для клиентов. Широко использовал asyncio для связывания многочисленных сервисов.
    • C - нагруженный распределенный код с использованием ZeroMQ (см. опыт)).
    • JavaScript / TypeScript - В основном, разрабатывал различные панели управления продуктами и формирования отчётов, используя Angular.
    • в далёком прошлом работал над проектами на C#, Java, Perl, PHP. Также знаком с Haskell и Lisp.
  • Английский: CEFR уровень C1 (Продвинутый). Работал в международных командах.
  • Машинное обучение: Глубоко понимаю современные архитектуры и фреймворки нейронных сетей (Tensorflow + Keras, PyTorch), принципы их работы и обучения. Особенно для NLP. Есть опыт написания своих DL-фреймворков и кодинга для GPU с использованием OpenCL.
  • Базы данных: PostgreSQL, CassandraDB, иногда MongoDB и MySQL.
  • Проектирование ПО: Проходил путь от сырых идей до создания целей, историй пользователей и рабочих прототипов. Люблю автоматизированное тестирование (без фанатизма и без слепой гонки за покрытием). Всегда пытаюсь облегчить жизнь всем, кто будет работать с моим кодом после меня.
  • OS: Linux пользователь с 2000 года (в настоящее время Debian/Ubuntu).
  • DevOps: Неплохо владею Ansible, Docker, Kubernetes (делал baremetal кластер), конфигурировал Jenkins, CI + Docker registry на GitLab CE.
  • Web stack: Знаю достаточно HTML + CSS для создания простых прототипов и сотрудничества с более специализированными участниками команды.
  • Организационный: Работал удаленно в течение многих лет, часть из них как фрилансер. Это научило меня быть ответственным и самоорганизованным.
  • Электроника (хобби): Разрабатывал встраиваемые IoT (и не только) системы на Rust/C++ на базе микроконтроллеров ARM (STM32) и Espressif (ESP8266, ESP32), с общением через MQTT и HTTP и выводом на экран.

Опыт работы

Software Developer

Mealmind свой проект

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

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

Mealmind стал для меня испытательным полигоном, способом догнать новые IT-технологии во множестве областей, включая:

  • Я улучшил свой Rust, который использовал для обработки данных (tokio, SeaORM), а также для backend и frontend. В итоге заменил многие части, написанные на JavaScript и Python, на Yew и Actix.

  • Много занимался Deep Learning (нейронные сети) в целом. Имел возможность поработать с различными архитектурами нейронных сетей, реализуя все своими руками, с нуля:

    • Различные RNN (LSTM, GRU, и подобные).
    • CNN, например WaveNet (в применении к временным рядам), вариационные автоэнкодеры для обработки изображений.
    • Transformers для обработки естественного языка, такие как GPT, BERT, и их производные,включая давно привлекающие внимание разновидности, такие как Reformer и Nyströmformer.
    • Глубоко погрузился в Reinforcement Learning и self-supervised learning.

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

  • Я привык читать, разбирать и воспроизводить сложные научные работы (например, в области Reinforcement Learning и NLP, теории оптимизации).

  • Освоил вычисления на GPU с OpenCL, включая написание собственных ML-ядер.

  • Получил опыт развертывания с помощью контейнеров, их управления и оркестровки, используя Docker, Kubernetes и Ansible.

  • Хотя я не новичок в мониторинге, на этот раз мне пришлось создавать его самостоятельно, используя Eclipse Mosquitto, Grafana и Telegraf.

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

Технологии: Python, Rust, Tensorflow, PyTorch, OpenCL, Kubernetes, Ansible
July 2018 - February 2023

Senior Software Developer

IPONWEB BIDSWITCH

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

Изначально я присоединился к команде как веб-разработчик фронтенда и бэкенда, используя Django и Angular.

За время работы в компании я помог запустить несколько внутренних проектов, которые впоследствии переросли в новые продукты или их части: в частности, пользовательский интерфейс BidSwitch, сбор статистики и формирование финансовой отчетности для клиентов, прогнозирование рекламного трафика, автоматической проверки объявлений, некоторые API для клиентов.

Последние годы работы в компании я провел, в основном, сосредоточившись на высоконагруженных бэкенд-проектах, занятых как обработкой и анализом больших объемов данных с торговых площадок, так и взаимодействием с другими сервисами. За это время я использовал C++ и Python, имел большой опыт работы с PostgreSQL и нереляционными кластерами Cassandra и MongoDB, а также со многими критическими частями современной ИТ-инфраструктуры, включая автоматический мониторинг, тестирование, сбор сообщений об ошибках через Sentry, непрерывную интеграцию и доставку, сборку Debian-пакетов.

Технологии: Python, C++, CassandraDB, PostgreSQL, MongoDB, Django, Angular, Jenkins, Sentry, Mercurial
April 2012 - February 2017

Senior Software Developer (фрилансер)

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

Технологии: Python, Django, JavaScript, PostgreSQL
May 2011 - November 2011

Smart Links специализируется на показе рекламных объявлений в текстах сайтов-партнёров. Я отвечал за

  1. Проектирование и внедрение высокопроизводительной и горизонтально масштабируемой морфологической системы для русского и украинского языков. Из-за гибкости этих языков, наивное сопоставление и поиск слов становится невозможным. Морфологическая система опирается на сложное дерево языковых правил и словарей для преобразования слов в их инфинитивные формы в реальном времени.
  2. Разработку и реализацию распределенного анализатора HTML-контента для рекламной системы, а также привязки к Python для некоторых ее частей.

Система была написана на языке C и полагалась на ZeroMQ для обеспечения связности компонентов при масштабировании. Она была способна обрабатывать сотни документов (HTML-страниц) в секунду на русском или украинском языках на обычном домашнем компьютере, нормализовать тексты и определять ключевые части текстов, на которые можно нацелить рекламу.

Технологии: C, ZeroMQ, привязка к Python
December 2010 - June 2011

Senior Software Developer (фрилансер)

Artela.ru (startup)

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

Здесь я впервые применил в коммерческом проекте познания, почерпнутые из книги Алана Купера "Об интерфейсе" и других подобных отечественных и зарубежных изданий. Получил практику написания пользовательских историй и проектирования цельной структуры пользовательского интерфейса.

В процессе реализации, интегрировал магазин с несколькими системами онлайн-платежей: Webmoney, Яндекс.Деньги и Paypal.

Технологии: Python, Django, JavaScript, PostgreSQL
February 2010 - November 2010

Senior Software Developer (контрактор)

Новостное агенство Gzt.ru

Архитектура и разработка новостного портала - как бэкенда, так и, частично, фронтенда (сильно кастомизированная административная панель Django).

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

Технологии: Python, Django, JavaScript, MySQL, PostgreSQL, Nginx, HTML, CSS, SVN
February 2009 - September 2009

Software Developer со-основатель

Domik63.ru Информационный портал по недвижимости Самарской области

Разрабатывал серверную и клиентскую часть портала:

  • поиск недвижимости по заданным критериям, с подпиской на обновления
  • размещение и оплату онлайн-объявлений
  • форум по вопросам недвижимости
  • полнотекстовый поиск на сайте
  • инструмент, позволяющий агенствам недвижимости любого размера публиковать и обновлять свои базы жилья через простые Excel-таблицы.
Технологии: Python, Django, PostgreSQL, JavaScript
October 2007 - January 2009

Senior Software Developer

Интер-М, веб-студия

Бэкенд-разработчик на текущие проекты.

Технологии: Python, Django, PostgreSQL, Linux, Mercurial
May 2007 - August 2007

Senior Software Developer

Unkom, веб-студия

Пришёл как Perl-разработчик после университета, позднее мигрировал на PHP.

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

Какое-то время участвовал в разработке CRM на Java.

Технологии: Perl, PHP, .NET, Java, MySQL with PostgreSQL
February 2005 - April 2007

Формальное образование и сертификаты

Вообще курсов и книг было много, но здесь упомяну только то, что могу подтвердить документами/сертификатами.

Deep Learning (Глубокое машинное обучение)

  • Нейронные сети и глубокое обучение
  • Совершенствование глубоких нейросетей: подстройка гиперпараметров, регуляризация и оптимизация
  • Структурирование проектов по машинному обучению
  • Свёрточные нейросети
  • Последовательные модели
Август 2017 - Апрель 2018

Самарский Государственный Аэрокосмический Университет (СГАУ)

Прикладная математика и информатика

4-летний диплом о неоконченном высшем образовании

Релевантные курсы

  • Теория вероятностей и математическая статистика
  • Теория случайных процессов
  • Линейная алгебра и матричные вычисления
  • Теория информации
  • Алгоритмы и структуры данных
  • Математический анализ
  • Методы оптимизации
  • Дифференциальные уравнения
  • Дискретная математика
  • Численные методы
  • Базы данных и экспертные системы
  • Теория управления
  • Параллельные вычисления
Сентябрь 2000 - Фервраль 2005

Атырауская школа-лицей № 17 (Казахстан)

Математика и физика (специализация старших классов)

 

Сентябрь 1997 - Май 2000

Мои проекты

Порой, в ходе работы, у меня появлялись кусочки кода, которые могли бы быть полезны кому-то ещё. Я старался делиться таковыми на своём 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

Интересы

Помимо программирования, я люблю бегать, кататься на велосипеде, моделировать во FreeCAD и печатать свои творения на самодельном 3D-принтере.

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

Ещё я очень люблю растения и выращивать чего-нибудь интересное на своём участке.