Почему «Северсталь Диджитал» Создала Собственную Библиотеку Для Организации Кода В Машинном Обучении И К Чему Это Привело?

Привет! Меня зовут Кирилл Трибунский, я ведущий разработчик отдела архитектуры и разработки компании «Северсталь Диджитал».

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

Библиотека родилась, как обычно, на боли команд «Северсталь Диджитал» от решения подобных задач при запуске кода в производство.

Он позволяет разбить код на независимые блоки и вести однотипную разработку независимо от типа используемого транспорта.

Статья, как и сама «Типизированные блоки», будет интересна специалистам по данным, которые не хотят много кодировать.

А также для программистов, которые неравнодушны к необязательной статической типизации в Python, которую в полной мере используют Typed Blocks. Автор идеи и создатель библиотеки – Даниил Зубакин, за что ему огромное спасибо!

Почему «Северсталь Диджитал» создала собственную библиотеку для организации кода в машинном обучении и к чему это привело?



Как типичные модели CV побудили команду разработчиков создать библиотеку типизированных блоков

В ML-разработке «Северсталь Диджитал» можно выделить две большие среды: исследовательскую среду, в которой работают специалисты по обработке данных (DS), и среду разработки, где работают программисты.

В исследовательской среде DS проверяет гипотезы, эксперименты и прототипы.

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

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

Чтобы решить задачу приложения с помощью алгоритмов ML, DS сами пишут код: это может произойти на любом оборудовании компании — от рабочего ноутбука до мощного сервера с топовым графическим процессором.

Часто код не удается сразу передать в производство.

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

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

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

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

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

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

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

Рутина с обертками отнимала много времени и расстраивала жаждущих сложных задач коллег.

Триггером стал еще один проект компьютерного зрения.

Дело в том, что в нашем случае особенностью CV-моделей была однородность потока обработки данных.

У всех моделей был достаточно простой конвейер: есть входное изображение, инференция, возможно, постобработка — и все.

Именно здесь возникло непреодолимое желание автоматизировать рутину и было разработано простое решение для шаблонизации CV-моделей в виде фреймворка.

Хорошо, стоп.

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

В процессе создания команда разработчиков активно критиковала и предлагала идеи на случай, «когда это не сработает».

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

Постепенно минималистичный движок обзавелся несколькими разъемами и готовыми процессорами.

Таким образом, из CV-фреймворка выкристаллизовалась универсальная библиотека ML, которая теперь позволяет сократить затраты на изменение кода перед переносом его в производственную среду.



Почему мы не использовали готовые сервисы для ML-разработки?

Да, подобные проблемы решают DataSphere (Яндекс) и Акведук (Авито).

Мы не использовали облачную DataSphere, так как у нас своя инфраструктура.

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

Aqueduct фокусируется на использовании ресурсов, а не на опыте разработки.

Еще есть фреймворки типа Event Sourcing, но для начинающего DS это сложно, потому что приходится иметь дело с очень требовательным DSL. Нам нужна была простая, как впритык, недорогая альтернатива, не требующая погружения и использования специальных знаний.

Нам не удалось найти готовый инструмент, который был бы для нас оптимальным и мы решили его сделать.

Однако тенденция (читай как мы сделали MES , оптимизатор , платформа для управления VR-симуляциями ).



Функциональность и преимущества типизированных блоков

Минималистичная по своей сути библиотека Typed Blocks Python упрощает и унифицирует чтение, обработку и запись данных из разных источников.

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

Ядром библиотеки является обработчик, который выводит граф вычислений на основе аннотаций типов.

Это довольно просто и хорошо, что DS не нужно это понимать — нужно просто понять, какие данные должны быть представлены в программе и использовать готовые коннекторы к брокерам сообщений (Kafka, Redis Streams и потенциально любые другие).

или СУБД.



Почему «Северсталь Диджитал» создала собственную библиотеку для организации кода в машинном обучении и к чему это привело?

Общая идея организации любых вычислений с помощью typed-блоков Typed Blocks — это небольшая событийно-управляемая система, построенная на концепции CEP (Complex Event Processing, обработка сложных событий).

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

Именно такой подход позволил нам перейти от узкого функционала CV-моделей к универсальным расчетам, определяемым стандартными аннотациями.

Программа напоминает машину Тьюринга: вместо бесконечной ленты — постоянно обновляющаяся очередь событий; вместо таблицы состояний — описание в виде событий процессора, их входов и выходов.

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

Источником может быть что угодно — очередь сообщений, база данных, видеопоток, таймер.

В результате своей работы процессоры могут генерировать новые события.

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

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

Нет необходимости писать сам код привязки.

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



Почему «Северсталь Диджитал» создала собственную библиотеку для организации кода в машинном обучении и к чему это привело?

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

Это позволяет легко заменять или моделировать источники или изолировать определенные эффекты (например, запись на внешнюю систему).

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

Да, при желании можно написать всё в одном процессоре — будет как обычно.

Кроме того, абстрактный граф вычислений позволяет вам писать коннекторы в соответствии с вашими потребностями.

Используя граф, состоящий из отдельных блоков, Typed Blocks помогает вам структурировать код по мере его написания.

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



Как еще можно использовать библиотеку в машинном обучении?

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

Если специалисту по данным не нужны конкретные данные из внешних источников, он может просто поиграть с графиком.

Например, так наши DS создавали тестовые видеопотоки: брали mp4-файл, читали его с помощью FFmpeg, а затем подавали в модель машинного обучения для компьютерного зрения.

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

В реальной работе над несколькими продуктовыми решениями «Северстали» мы использовали библиотеку в проекте ML для управления парком воздушных компрессоров и в системе видеоконтроля полосы для распознавания дефектов готовой металлопродукции.

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

Преимущества библиотеки типизированных блоков :

  • абстрактный граф вычислений;
  • простота написания слабосвязанного кода;
  • единая работа как с потоковыми данными, так и с пакетами;
  • минимальный порог входа;
  • единообразие кодовой базы;
  • возможность быстрой передачи проекта в производство.



Какие проблемы «Северсталь Диджитал» помогла решить с помощью Typed Blocks?

Нашей главной проблемой был медленный запуск цифровых решений, основанных на анализе больших данных.

Этому способствовала дистанция между этапом исследования и пилотным этапом.

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

Typed Blocks позволяет быстро создавать и запускать проекты, связанные с обработкой данных, и даже смещать разработку продуктов «влево» — ближе к аналитику и данным, с которыми он знаком.

В проектах «Северстали» Typed Blocks упрощает и унифицирует чтение и запись данных из разных источников (Kafka, Redis Streams).

Используя граф, состоящий из отдельных блоков, Typed Blocks помогает вам структурировать код по мере его написания.

Новый блок может быть добавлен с минимальными изменениями в исходной структуре.

Отдельно стоит отметить, что инфраструктура моделей наших ML-проектов расположена в кластере K8s. Процессы CI/CD в Kubernetes организованы достаточно единообразно.

Исторические данные постоянно накапливаются и, несмотря на различия в «динамике», их структура аналогична потоковым данным, над которыми часто работают наши программисты и ДС.

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

Мы не будем утверждать, что так будет и в менее однородных средах.

Библиотека типизированных блоков позволяла:

  1. Сократите затраты на изменение кода перед его переносом в производственную среду.

    Это хорошо для прототипирования и проверки гипотез на реальной схеме.

  2. Сократите время выхода на рынок.

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

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

    С помощью Typed Blocks вы можете взять абсолютно любые исходные данные и быстро разрабатывать решения на основе их анализа в пилотные и продакшн.

  4. Пишите алгоритмы процессора параллельно для одной задачи, затем собирая их в необходимой последовательности.

    Имея существующие процессоры и добавляя новые, можно собрать приложение как конструктор.

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

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

    Более того, DS теперь глубже погружена в предметную область и лучше видит способы улучшения и усовершенствования продукта.

  6. В качестве бонуса у нас есть «отличный эквалайзер» в плане написания кода.

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

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

Будем рады, если вы попробуете с ней поработать и поделитесь своими впечатлениями.

Теги: #Машинное обучение #python #ИТ-инфраструктура #Большие данные #Управление продуктом #kafka #ml #наука о данных #opensourse #cv #producer #library #severstalitpeople #opc

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.