Мы рады сообщить, что открыли наш фреймворк Piper для всех разработчиков на гитхабе. Несмотря на то, что мы не закончили некоторые важные аспекты ядра, решили не ждать, а сразу поделиться, и теснее пообщаться о нашей разработке. В конце концов, мы изначально задумали, чтобы продукт был опенсорсным и все могли его использовать, решая свои задачи. Приветствуем любую обратную связь и помощь в доработке!✌️В этой статье расскажем о фреймворке Piper, его целях, конкурентах, о том, что есть в текущей версии и что планируем добавить в ближайшее время. Начнем с предыстории…

Piper готовится к битве с Hugginface
Piper готовится к битве с Hugginface

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

Но сначала о ML решениях конкурентов:


1) Jupyter – де-факто основная экспериментальная среда большинства data-scientistов. Безусловно ускоряет написание экспериментального кода, однако писать все модули и переносить далее в прод нужно руками часто нескольких разных разработчиков.

2) Azure ML / Amazon SageMaker / Google Cloud – Облачные платформы действительно позволяют собрать целую систему из готовых модулей и относительно быстро запустить в работу. Из минусов: большая стоимость, привязка к определенному клауду, а также малая кастомизация под специфические нужды бизнеса. Для крупного бизнеса это самый логичный вариант – строить ML-инфраструктуру в облаке.

3) DataRoot / Baseten – Предлагают интересный, но небольшой набор готовых модулей. Однако в Baeten вся интеграция подразумевается в kubernetes кластер. Это не всегда удобно и необходимо для Proof-of-Concept. Piper – также предоставляет open-source фреймворк, в котором можно будет собрать по-настоящему кастомизированный пайплайн из множества модулей. В основном такие компании либо не предоставляют open-source фреймворк, либо дают очень урезанный набор модулей для экспериментов, что ограничивает свободу, функциональность и применимость данных платформ.

4) Apache Airflow / Luigi – Это весьма популярные инструменты сборки ML-пайплайнов. Airflow можно подключить к kubernetes кластеру или собирать задачи через простой PythonOperator. Минус, что на этом их функционал в целом ограничен, то есть ML-модулей из коробки они не предоставляют. Таким образом все наработки все равно придется оборачивать в шедулер и это не всегда тривиальная задача.

5) Mlflow / DVC и пр. – Также на рынке много хороших проектов для трекинга экспериментов, сервинга и хранения моделей машинного обучения. Но они все чисто утилитарные и не помогают напрямую в задаче ускорения построения MVP-проекта машинного обучения. Мы планируем добавить интеграции в Piper с самыми популярными фреймворками для нужд ML-специалистов.

6) Hugginface - Платформа, где можно скачать и опубликовать нейросеть и пайплайн к ней на любой вкус. Вероятно главный наш конкурент по духу. У них мощное комьюнити, SOTA модели появляются через неделю после выхода статей, а также добавляют разные возможности деплоев. Однако их фокус именно на самих моделях. У нас больше упор на отдельные домены вроде распознавания лиц, а также разные варианты деплоя, а также no-code платформе для сборки сложных систем.

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

Вот мы и собрали как дополнительный инструмент – Piper – python фреймворк, позволяющий собрать полноценную ML-систему из набора готовых или кастомных модулей и развернуть систему в нужной среде.

Мы хотели, чтобы Piper умел делать:

  • Легко собирал новое MVP или PoC  из готовых модулей

  • Добавлял собственные модули для уникальных задач компании

  • Разворачивал систему в нужную инфраструктуру

Основной идеей нашего Piper стала модульность:


В ядре фреймворка столпом является класс модуля для решения небольшой задачи или иначе Executor. Из таких блоков разработчик сможет собирать ML-пайплайн. Сейчас это выглядит как в примере ниже: 


class MyExecutor(FastAPIExecutor):
def run(self, my_image_path: str):
cv2.imread

return result

Далее экзекьютор можно использовать подобно pytorch.nn.Module, то есть как некий Сallable

result = MyExecutor()(“image.png”)

В данный момент нужно унаследовать готовый экзекьютор для конкретной задачи, например у нас есть HTTPExecutor и FastAPIExecutor, который могут обернуть ваш код в микросервис. Это логика далее будет базовой для некоего общего Executor. Свои базовые экзекьюторы можно писать унаследовав BaseExecutor.

Простыми словам - вы можете написать некий ml код и внутри своего класса экзекьютора и затем его развернуть, например, внутри микросервиса на FastAPI.

Для этого экзекьютор запускается в неком Enviroment, в данном случае в Docker контейнере.

with envs.Docker():
result = MyExecutor()(“image.png”)

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

Но если вы хотите протестировать или запусть MyExecutor локально, то можно просто выбрать локальный энв (по сути это тот python, где вы работаете в данный момент).

with envs.CurrnetEnv():
result = MyExecutor()(“image.png”)

Но, это конечно не все – мы планируем добавить поддержку следующих вариантов деплоя пайплайна:

  • Python virtual env для локальной сборки

  • Docker / Docker-compose в виде микросервисов

  • Kubernetes

  • Как DAG в Airflow

  • Основные клауды (Google, AWS, Azure)


Смысл Piper в том, чтобы Data-Scientist или любой разработчик мог собрать из готовых модулей пайплайн. Это может выглядеть как на примере ниже:

with envs.Docker():
document = PDF()(“1.pdf”) 
image =PDFToImage()(document)
result = MyEexcutor()(image)

Где модули PDF, PDFToImage разработчик берет уже готовые из фреймворка, а затем обрабатывает своим кастомным MyExecutor.

На данный момент у нас нет модулей для PDF, но у нас добавлены FaceRecognition, TesseractOCR, Milvus для эмбедингов лиц или текстов. Но мы расширяем функциональность Piper параллельно с разработкой ядра. В планах разработка обработчиков основных файлов, а также покрыть основные домены вроде классификации изображений или Named Entity Recognition, а также различные новые домены вроде мультимодальных моделей CLIP или генерации картинок со Stable Diffusion.

Еще раз о целях Piper:

Цель нашего фреймворка в ускорении ml разработки. Представим себе, что компания или стартап решает создать новую ml систему, это может быть Face Recognition или рекомендательная система.

Рассмотрим два возможных пути решения (покупку готового решения опустим, так как тяжело сравнивать):

  1. Силами собственной команды собрать in-house решение с нуля.

  2. Использовать Piper и собрать решение из готовых модулей.

При решение с Piper сборка производится на 90% за счет уже подготовленных модулей из библиотеки фреймворка, это помогает сократить затраты на поиск актуального решения и написания кода с нуля. Однако добавляется шаг сборки всей цепочки в пайплайн, чтения документации модулей. Но этот этап по нашему опыту получается значительно быстрее, так как в большинстве случаев DS-специалистам не нужно читать много статей по теме или искать рабочее решение в open-source. Нужно лишь найти подходящие модули в Piper, добавить нужную конфигурацию и собрать все в единый пайплайн. Возможно для уникальных кейсов придется дописать кастомную логику или на начальном этапе и в редких случаях дописать свои модули, но мы для этого делаем максимально удобный флоу кастомизации. То есть даже для уникальных задач прототипирование с Piper будет быстрее обычного in-house решения.

Вторым важным фактором ускорения разработки является возможность развернуть систему минимальными усилиями с помощью нескольких команд Piper. Можно указать необходимый вид инфраструктуры и запустить деплой системы. Это дает ускорения процессов в команде разработчиков. Так как в обычных in-house процессах data-scientist передает код (зачастую не самый понятный) разработчикам и девопсам для развертывания или встраивает в прод самостоятельно с помощью некой не самой удобный для этого системы вроде Airflow. То есть тратится много времени на взаимодействие разработчиков, менеджеров и обертывания кода модели в прод сервисы. На этом этапе зачастую могут возникнуть ошибки вида “потеряли” какую-то фичу, разработчик не понял принцип работы модели и неправильно настроил ее в сервисе, или оптимизировал предпроцессинг по-своему, что тоже повлияло на точность результатов в проде. Поэтому в таком подходе время еще уходит и на тестирование модели в проде, а также исправление ошибок интеграции. С Piper шансы таких ошибок минимальны, так как фреймворк предоставляет протестированную автоматическую обертку в микросервисы или другую инфраструктуру.

Ниже приведена наша данные сроков небольшой ML задачи во внутренних проектах:

Этапы

in-house

Piper

Изучение задачи и данных аналитиком, подготовка среды

10 дней

5 дней

Написание подготовки данных и обучение модели в Jupyter

21 день

-

Сбор пайплайна из модулей Piper и обучение моделей в Piper

-

5 дней

Перенос кода в прод

14 дней

3 дня

Устранение багов и оптимизации

10 дней

2 дня

Тестирование результатов решения

3 дня

3 дня

Итого

~2 месяца

18 дней

Подводя итог

Мы открыли доступ к open-source фреймворку Piper. Его преимущества и задачи:

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

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

Сейчас уже можно посмотреть как устроено ядро и первые модули. Мы активно ищем контрибьюторов и развиваем комьюинити. Нам требуются сильные разработчики Python для ядра, ML-разработчики для написания экзекьюторов любого домена в области машинного обучения, а также тестировщики и JS разработчики для no-code платформы.

Как контрибьютить?

Добавляйтесь в наш чат https://t.me/pipertool, также можете писать там или здесь на Хабре, если интересно поучаствовать в разработке.

Мы отвечаем и выбираем наиболее нужный на данный момент модуль, допустим Face Recognition, интеграция DVC или Stable Diffusion. Потом все стандартно присылаете PR, командой ядра смотрим и мержим, если все концептуально устраивает.

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

Также есть задачи на само ядро, там больше работы с Docker, инфраструктурные задачи, алгоритмы работы Piper на Python. Там процесс чуть более сложный, поэтому на эти задачи нужно общаться более детально. 

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

Комментарии (29)


  1. bazden
    22.12.2022 20:22
    +2

    Буду Вам очень признателен, если расставите отступы к примерах кода :)


    1. skleg Автор
      22.12.2022 21:02

      У меня они были, но странным образом исчезли :(


      1. MentalBlood
        23.12.2022 10:35
        +1

        Можно так (Fenced Code Block):


        class MyExecutor(FastAPIExecutor):
            def run(self, my_image_path: str):
                cv2.imread
                …
                return result


        1. skleg Автор
          23.12.2022 12:12

          Спасибо ????


  1. TimID
    22.12.2022 20:27
    +3

    Ну когда же "мир науки" повернется к простым трудягам-разработчиком лицом и перестанет клепать научноориентированные инструменты?
    Может стоит уже подумать о тех людях, кому нужно внедрять нейросетевые технологии в свои продукты, которые написаны не на Python'е? Тем более если мы собираемся "догнать и перегнать" весь мир...


    1. Ales_Nim
      22.12.2022 21:34
      +5

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


      1. skleg Автор
        22.12.2022 21:35

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


  1. whoisking
    22.12.2022 20:35

    Много вопросов к статье и коду ... https://github.com/TatraDev/pipertool/blob/main/piper/services/ocr_data.jpg


    1. skleg Автор
      22.12.2022 21:02
      -1

      Спасибо, убрал


      1. whoisking
        22.12.2022 21:49
        +2

        Вопросов меньше не становится) https://github.com/TatraDev/pipertool/blob/main/main.py

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


        1. skleg Автор
          22.12.2022 21:54

          Действительно неконструктивно звучит без конкретного код ревью )
          Тяжело читать мысли, я видел этот main файл
          Заголовок же свое дело сделал,
          Я верю в успех нашей концепции в Piper.
          C радостью ждем Ваш ревью или PR


          1. Ktator
            23.12.2022 00:50
            +1

            Зачем вам такая куча закомментированного кода?
            Добавьте pylint, что ли...

            Это то, что можно сказать за пару минут обзора кода.


            1. skleg Автор
              23.12.2022 02:21

              Этот файл еще не растащили в тесты, пережиток прошлого, когда перенесём его вообще не будет. Я придерживаюсь подхода, при котором сначала важный функционал, потом рефакторинг. Линтер конечно добавим когда-то, документацию понятную и пр. Без этих вещей мало кто будет пользоваться конечно. Но также никто не будет пользоваться, если не будет пользы и смысла, пока на нем концентрируемся


              1. skleg Автор
                23.12.2022 09:05
                -1

                И у кого пригорело от этих файлов - приходите контрибьютить. У нас весело - кодогенерации, кишки питона, рефакторинг видимо еще теперь !


    1. maeris
      22.12.2022 21:35
      +4

      1. skleg Автор
        22.12.2022 21:45
        +2

        Рандомный файлик из интернетов, нужен был реальный документ.
        Мы уже поменяли на тестовый другой, в папке tests/ocr


  1. ratatosk
    22.12.2022 22:28
    +3

    Pied Piper?


    1. skleg Автор
      22.12.2022 22:33
      +1

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


  1. connected201
    23.12.2022 00:45
    +1

    В заголовке чувствуется хейт к западу.


    1. skleg Автор
      23.12.2022 02:24

      Нет никакого хейта, так получилось, что наш проект из России, где по сути мало подобных конкурентов, просто это хороший вызов, быть на уровне таких крутых проектов ????????


  1. AASelivanov
    23.12.2022 02:31
    +9

    Ой, Моська...
    У меня такой вопрос: а ???? знает, что происходит,что его теснят? Просто картинка в начале выглядит ну очень уж претенциозно.

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

    Фактически одна мысль повторяется: piper – фреймворк на python, который позволяет из блоков собрать ml-решение и задеплоить его, при этом интегрируя с разными инструментами. Так? Если да, то здорово было бы увидеть реальный пример, как разработчик нас проведёт за ручку по процессу создания какого-нибудь небольшого пайплайна.

    Часто по тексту встречается "на данный момент нет, но планируем добавить". Хотелось бы видеть больший акцент на том, что есть.
    > На данный момент...у нас добавлены FaceRecognition, TesseractOCR, Milvus. ..
    Можно ли ознакомиться с полным списком? И что используется для Face Recognition?

    > Цель нашего фреймворка в ускорении ml разработки
    Тогда нужна методика оценки этой скорости.
    > При решение с Piper сборка производится на 90% за счет уже подготовленных модулей из библиотеки фреймворка
    А если модуля нет?
    А если тип данных отличается от изначального в модуле?
    А если блок даёт низкую эффективность? Предусмотрен подбор гиперпараметров, иной AutoML?
    Как вообще этот подход соотносится с no silver bullet theorem?

    Генез оценок времени in-house непонятен.
    Почему изучение задачи и подготовка среды в piper займёт в два раза меньше времени?
    Почему в piper отсутсьвует этап подготовки данных – он сам чистит, преобразует во входной формат, отбирает фичи и кодирует?

    Почему перенос кода в прод оценён именно такими значениями?

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

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


    1. skleg Автор
      23.12.2022 08:59

      Да, лаим на Слона, сомневаюсь что ребята в курсе, вы не оттуда?) мы начали в этом году они лет 7 назад ????

      Реальные примеры покажем в туториалах, обещаю.

      Методика довольно субъективная, я кроме как - дать двум разработчикам н раз делать с Piper таску и без него - не вижу способа. И это тоже не очень точно звучит. Мне кажется не хватит у нас разработчиков и ресурсов набрать достоверную оценку прям.

      Если нет модуля - вы добавляете свой. В этом основа фреймворка. Да, действительно, данные в наших проектах еще раз не готовили, так как уже были модули с полностью такой же обработкой данных по аналогии. Так что, тут, вы правы это время никуда не денется и это решительно невозможно как-то автоматически делать полностью. Это уже какой-то сильный ИИ нужен. Но Piper позволит взять сразу взять pandas/spark модуль и тут же заняться подготовкой данных не запариваясь об установке настройке, причем можете даже разными версиями пользоваться в разных участках кода, если нужно или разной конфигурацией Спарк. Тут выигрыш во времени мизерный, но по опыту знаю, что если что-то сработало в ноутбуках вообще не факт, что оно просто соберется в простом микросервисе. Так что выигрыш после это наш больший фокус.

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

      Спасибо за интересные вопросы ???????? пишите еще


      1. george3
        23.12.2022 20:58

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


  1. evoq
    23.12.2022 07:14

    Планируется по смыслу что-то похожее на урезанную версию Dataiku как понял?


    1. skleg Автор
      23.12.2022 09:11

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

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


      1. evoq
        23.12.2022 14:18
        +1

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


  1. joc
    23.12.2022 15:50
    +2

    Очень круто то, что вы делаете свой фреймфорк, значить есть вижен и планы на ML. Вопрос, я так понимаю, наиболее близкий фреймфорк к Piper это Hugginface? Ok, допустим, у Hugginface на их страничке сразу есть NLP примеры - вопрос, есть ли примеры на Piper, который можно развернуть в пару кликов?


    1. skleg Автор
      23.12.2022 15:53

      Пока что можно взять сделать свой экзекьютор просто по аналогии с TestMessageAdder, тогда он развернется как FastApi сервис внутри докера

      https://github.com/TatraDev/pipertool/blob/main/tests/base_test.py


  1. rasperepodvipodvert
    24.12.2022 11:42
    +2

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

    Вот если бы вы сказали, что мы собрали все известные опенсурс решения, докрутили чуть чуть воркфлоу и им можно теперь вот так пользоваться, просто кладёте это сюда, это сюда, запускаете docker compose up и у вас все работает. Хотите в облака, вот вам терраформ, хотите в к8s нате это... Мне кажется это было бы действительно вкладом, а так взять без разбирательств и написать свой инструмент и потом ходить по граблям тех кто начал 7 лет назад, и догонять их в этом, много ума не надо...