На связи команда ML-инженеров из Департамента продвинутой аналитики Альфа-Банка (Лазаричева Екатерина, Дмитрий Гончаров, Николай Рябков, Илья Мясников и Асадян Гевонд), а также наши замечательные коллеги из «Глоубайт» (Альфия Харламова, Ростислав Изимов, Александр Малиновский и Анастасия Кулакова). Сегодня мы расскажем вам о нашем способе достижения дзена в процессе приручения онлайн-каскадов.

Немного о задаче
Конкуренция на рынке заставляет банки создавать уникальные продукты. Модели, которые применяются для оценки клиентов, тоже усложняются. Причём усложнение моделей может заключаться как в применении новых методов машинного обучения, так и во внедрении многомодульной технологии оценки клиента, когда анализируются различные аспекты, которые не зависят напрямую друг от друга, но в совокупности могут рассказать о клиенте многое. Каждое направление анализа может кардинально отличаться от другого, поэтому создаются отдельные независимые модули, которые в конечном итоге нужно связать друг с другом.
Сложные модели требуют большей производительности от систем, в которые они внедряются. Также возникает потребность в управлении очередью вызова модулей. Результаты оценки одних модулей могут использоваться в качестве входных параметров для других модулей, соответственно, требуется не только настроить очерёдность их вызова, но и настроить потоки данных между модулями. При этом особенность применения многомодульных моделей состоит в том, что каждый модуль может работать независимо и выдавать свой результат по запросу.

Как же не соскуфиться в многопоточности задач на разработку и внедрение, протестировать корректность работы, внедрить многомодульную модель и не сойти с ума?
Ответ на вопрос лежит на поверхности: разделяй и властвуй. Можно разделить модель на отдельные модули, распределить задачи по разработке этих модулей между дата-сайентистами, а потом соединить их с помощью отдельного сервиса, который будет отвечать за список используемых модулей и порядок вызова модулей.
Именно для успешного применения описанной выше стратегии внедрения моделей совместно с коллегами из «Глоубайт» мы реализовали пайплайн для внедрения каскадных онлайн-моделей.
Что такое каскад
Каскадная модель (каскад) — совокупность ML-модулей, которые запускаются параллельно или последовательно и выдают единый результат. При этом каждый из ML-модулей реализован в виде независимой модели. Каскад можно представить в виде дерева, листья которого представляют собой ML-модули, а ветви — уровни вложенности этих модулей.
Схематично логика работы каскадной модели проиллюстрирована на рисунке ниже.

Как можно заметить по рисунку, каскадная модель позволяет оценивать клиента одновременно с помощью нескольких независимых моделей, а затем получить итоговый результат на основе полученных ранее оценок.
Разработанный пайплайн предназначен для конфигурации и запуска каскадов онлайн-ML-моделей любого уровня вложенности.
Каскад имеет уникальное название в системе (name), тип (chain/group) и ноды, которые являются контейнерами для нижестоящих сущностей в иерархии. Сущностями могут быть как отдельные модули, так и группы или последовательности модулей. Каждая нода содержит сущность, которая представляет собой модуль, группу или последовательность модулей.
Если тип каскада chain, то это значит, что все сущности в нём будут запускаться последовательно, а если group — параллельно. При этом внутри нод можно также произвольно создавать группы и последовательности. Иерархическая структура каскада допускает свободную конфигурацию сущностей разных типов в рамках нод одного уровня. То есть на одном уровне могут быть запущены параллельно сущности типа group, chain или module.
Иерархия каскада
Самый нижний объект в иерархии — всегда модуль.
Модули могут запускаться последовательно или параллельно на одном или нескольких уровнях вложенности, образуя каскад расчета. Например, при создании каскада как последовательности запуска групп каскадов:
-
В ноды первого уровня вложенности (chain) передается список сущностей типа group: [group_1, group_2].
-
В ноды каждой группы второго уровня передается список сущностей типа module: [groupmodule_1, group_1.module_2], [group_2.module_3].
-
В сущности-модули передается словарь с мета-информацией о вызываемых модулях. Модули формируют третий уровень вложенности.
Таким образом, сначала в цепочке запустятся параллельно module_1, module_2, а затем, после их завершения, запустятся module_3 и module_4. На рисунке ниже представлена схема каскада.

Пользователь в рамах каждой ноды может произвольно настроить:
-
Список параметров модуля.
-
Список источников данных во входящем JSON: ключи, по которым каскад понимает, что данные относятся к конкретному модулю.
-
Словарь, передающий информацию о модулях, результат которых может быть переиспользован в ноде.
-
Правило валидации данных для входящего JSON в запросе с данными по клиенту.
-
Правило валидации результатов модулей в ответе модели.
Инфраструктура использования
Технически использование такой функциональности возможно благодаря наличию в нашем Банке продвинутой MLOps-платформы — Системы исполнения моделей. В совокупности с Системой разработки моделей пайплайн позволяет осуществлять разработку и бесшовное внедрение моделей машинного обучения любого уровня сложности.
-
В Системе разработки моделей производится конфигурация каскадной онлайн-модели и запускается сборка образа модели для сохранения в Artifactory через компоненту Cascade-developer реализованного пайплайна.
-
Техническая настройка каскада не требует больших трудозатрат. Всё, что требуется, — использовать кастомизированную функцию из разработанной библиотеки и прописать обращение к нужным модулям, указав последовательность их запуска. Внутри каскада пользователь может настроить обращение к модулю по названию. При этом функционал пайплайна автоматически произведёт запрос по необходимому адресу внутри системы и преобразует название в ссылку на модель (API).
-
В Системе исполнения моделей производится скачивание сохранённого образа каскадной онлайн-модели и производится установка модели в Kubernetes. Работа и вызов каскада осуществляются через компоненту Cascade API реализованного пайплайна.
-
Бизнес-метрики работы каскада и модулей логируются в S3 Minio через настройку Vector, откуда могут быть скачаны для дальнейшего анализа.
Разработанное решение использует небольшое количество требуемых инфраструктурных компонент. Архитектурно схему работы пайплайна можно представить следующим образом:
-
Metastore (Kubernetes CRD): хранение каталога каскадов.
-
API (FastAPI): управления API.
-
CI/CD (Jenkins): сборка и деплой отдельного каскада.
-
Git: хранение кода каждого отдельного каскада.
-
Repository (Artifactory): хранение python packages, docker images.
-
Kubernetes: среда для разворота каскадов.
-
Message Broker (Redis): брокер сообщений для работы Celery.
-
Pipeline Service. Состоит из двух компонент: Celery Worker — каждый worker запускается в отдельной очереди (один воркер на каскад); API (FastAPI) — отдельный API для работы с конкретным Pipeline.
-
S3: хранилище артефактов работы Pipeline.
-
Keycloak: сервис для аутентификации и авторизации.
-
UI: интерфейс для работы с платформой с помощью Python SDK.
-
Active Directory: протокол LDAP.
Архитектура пайплайна для внедрения каскадных-онлайн моделей на рисунке ниже.

Как настроить каскад пользователю
Пользователь авторизуется под своей учётной записью, проходит аутентификацию, и затем настраивает каскадную онлайн-модель. Настройка производится через Python-SDK — кастомную библиотеку, которая позволяет в режиме диалогового окна производить конфигурацию модулей.
После конфигурации каскадная модель представляет собой JSON, который содержит в себе параметры модулей и правила их запуска. Этот JSON далее используется при каждом запуске каскада в виде словаря, с помощью которого производится оркестрация запросов к каждому модулю.
В качестве базы данных, в которую записываются данные от модулей и задания к каскаду по запуску следующих модулей, используется Redis. Для запуска запроса к каждому модулю используются Celery worker и Fast API. В качестве хранилища логов отработки используется S3.
С точки зрения алгоритма внедрения, процесс можно описать следующими шагами:
-
Дата-инженер подготавливает данные для модели в промышленных системах, например, в Feature Store.
-
Дата-сайентист обучает модули каскада на подготовленных данных и разрабатывает код на применение этих модулей.
-
ML-инженер проводит код-ревью разработанных модулей и разворачивает модули в Системе исполнения моделей.
-
Дата-сайентист создаёт конфигурационный JSON каскада. В нём указаны: модули, из которых состоит каскад, источники данных для модулей, логика их последовательного или параллельного применения. Отмечу, что конфигурационный JSON формируется автоматически с помощью кастомной библиотеки на Python. Дата-сайентисту требуется указать лишь его параметры.
-
Дата-сайентист запускает пайплайн по сборке каскадной модели, после чего система автоматически формирует образ каскадной модели в Artifactory и создаёт репозиторий с кодом каскада в Git.
-
ML-инженер проводит код-ревью каскадной модели и разворачивает каскад в Системе исполнения моделей.
-
Тестировщики проводят код-ревью каскадной модели и модулей, из которых она состоит.
-
Модель по итогам прохождения тестирования выводится в пром.
Чем решение лучше других
На банковском рынке для внедрения многомодульных моделей часто используются три ИТ-системы: конвейер заявок, система принятия решений и система, в которой исполняются модели. Чтобы внедрить модель, требуется связать все эти системы и продумать логику оркестрации модулей большой модели и формирования конечного результата расчёта.
Естественно, что при внедрении и сопровождении моделей в эти системы требуется вносить изменения в каждую из них, настраивать множество точек интеграции, тратить ресурсы на увеличение мощностей и тестирование каждой системы.
Наше решение позволяет бизнес-заказчикам придумывать любые риск-стратегии на основе разработанных дата-сайентистами ML-моделей. При этом не требуется тратить огромные ресурсы на независимое внедрение каждого модуля. Дата-сайентисты, в свою очередь, получают инструмент, который позволяет производить более расширенную оценку клиента и использовать большее количество различных фич по разным направлениям.
В качестве примера использования разработанного пайплайна хотелось бы привести бизнес-кейс по разработке каскадной онлайн-модели скоринга клиентов среднего бизнеса. Раньше это было коробочное решение, теперь оно разделено на микросервисы и состоит из отдельных независимых модулей. С помощью данного пайплайна мы смогли внедрить модель для скоринга корпоративных клиентов среднего бизнеса в промышленную эксплуатацию за 12 дней с момента завершения обучения. Обращаю внимание, что это срок с учётом всех необходимых видов тестирования (нагрузочное, функциональное и интеграционное). Не менее радостным является тот факт, что процесс включал в себя внедрение не одной конфигурации моделей, а 11 каскадных моделей для различных риск-стратегий.
Заключение
Создание пайплайна каскадных онлайн-моделей позволило развернуть различные комбинации вышеперечисленных модулей в виде отдельных микросервисов. Раньше требовалась настройка вызова каждого модуля и порядка модулей на стороне системы, инициирующей расчёт. Теперь система, инициирующая расчёт, может вызывать одну необходимую ей каскадную модель (комбинацию модулей) и получать результаты, просто передавая в запросе название каскада.
Также в процессе внедрения модели достаточно один раз внедрить модули, из которых состоит каскад, и дальше создавать каскады из работающих модулей. Большим плюсом, безусловно, является то, что для доработки одного модуля не требуется внедрять всю модель заново. Достаточно только внести изменения в нужный модуль, а каскад начнёт использовать доработанный модуль автоматически.
Таким образом, использование каскадных моделей позволяет любому джуну создавать комбинации применения сложных модулей и не думать о том, что можно сломать всю модель каким-то мелким косяком.
С момента возникновения идеи до момента внедрения пайплайна прошло три месяца, и в этой статье мы делимся идеей успеха и готовы помочь с настройкой подобных решений.
До новых встреч!
В канале Alfa Advanced Analytics пишем о реализованных проектах, делимся интересными статьями, рассказываем о команде Центра продвинутой аналитики, рассказываем о вакансиях — присоединяйтесь.
Автор: Gevond