SPL – мультиязычный вычислительный граф и локальный FaaS на вашем ноутбуке. faas.. faas. machinelearning.. faas. machinelearning. python.

Хочу рассказать вам про пет-проект, над которой мы сейчас работаем с товарищем.  Основная идея заключается в создании мультиязычного вычислительного графа с возможностью быстрого развертывания собственной мини-FaaS (Function as a Service) платформы прямо на локальной машине. То есть возможность совмещать наработки из разных источников (на самом деле не только их, а еще и различные сторонние утилиты) посредством локального фреймворка и сервера. Сейчас мы называем этот проект SPL (Smart Pipe Lime).

SPL – мультиязычный вычислительный граф и локальный FaaS на вашем ноутбуке - 1

Как появилась идея?

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

Привычные средства вроде Airflow, Dagster и Prefect показались, во-первых, слишком громоздкими для некоторых простых сценариев, во-вторых, они плохо подходили для «быстрого прототипирования», а также часть массива данных нуждалась в отдельной обработке с помощью более низкоуровневых средств, чем классический Pyton (использовался C++). Так и возникла идея создания пет-проекта, который поможет безболезненно совместить до этого несовместимое, а также шарить свои наработки в рамках команды. Нам необходимо было решить следующие задачи:

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

  • Организовать запуск графов как локально, так и удалённо (шаринг наработок внутри команды).

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

Некоторые детали реализации

Вычислительный граф — это связный направленный граф, состоящий из узлов (функций или утилит) и связей между ними (входные и выходные данные). Суть простая: узел принимает входные параметры, выполняет конкретную задачу и передает результат дальше.

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

  • Узел (node) — функция с входными и выходными портами.

  • Порт — именованный аргумент (входной порт) или возвращаемое значение (выходной порт).

  • Артефакт — результат выполнения узла (конкретного порта), который кэшируется и передается дальше.

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

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

Для возможности управления самим графом: добавление/удаление узлов, фиксация результатов и частичное выполнение, решили сделать механику по аналогии с PyTorch, где модель строится путем последовательного добавления слоёв в nn.Sequential(). В SPL также собирается граф, добавляя узлы-функции в простом и понятном формате:

# Пример создания простого графа
from spl import Graph, step

graph = Graph()

graph.add(step(load_data))
graph.add(step(process_data, params={'method': 'mean'}))
graph.add(step(train_model, params={'epochs': 10}))
graph.add(step(save_results))

Запускать граф или отдельные его узлы тоже очень просто:

# Запустить весь граф
graph.run()

# Запустить граф с третьего шага
graph.run(from_step=2)

# Запустить конкретный шаг
graph.run(step=process_data)

Важный момент — можно легко зафиксировать среду выполнения (версии Python и библиотек):

# Фиксация среды одной командой
graph.freeze_environment()

Карманный FaaS

Одна из самых крутых идей SPL на наш взгляд — это возможность быстро развернуть собственный мини-FaaS прямо на рабочей машине. Если есть выход в интернет, ваши функции и графы моментально становятся доступными другим пользователям.

Сейчас серверная часть SPL поддерживает следующий функционал:

  • HTTP API для запуска функций удалённо.

  • Возможность импортировать и экспортировать графы в JSON.

  • Координацию выполнения задач и распределенное кэширование результатов.

  • Простой веб-интерфейс для просмотра и редактирования графов.

Возможные сценарии применения SPL

  • Локальная разработка: собираете графы и функции, переиспользуя их в разных проектах без лишнего копирования кода.

  • Промышленное использование: разделение бизнес-логики и инфраструктуры с лёгким zero-downtime обновлением.

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

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

Зачем пишу этот пост?

Нам очень интересно узнать ваше мнение:

  • Сталкивались ли вы с подобными задачами?

  • Был бы полезен такой инструмент именно вам?

  • Какие фичи могли бы пригодиться в подобном проекте?

Будем рады обсудить с вами идею в комментариях!

Автор: YastrebovKS

Источник

Рейтинг@Mail.ru
Rambler's Top100