# ML infrastructure V2
Компоненты: model-service, data lake, data lake collector, feature API
## Feature API
GET https://features.rociapi.com/credit-risk/avg_borrow_amount/0x001491b82646d06a6f82e7c1ce4444fa9bdf530c -> 0.123, возвращает значение фич для адреса
- Умеет принимать на вход пачки адресов
- Умеет принимать на вход диапазон по времени from..to
- Разбито по фичам, каждая фича это отдельный модуль, со своими тестами и так далее
- aggregator.py и WEModel.py будут частью этого API
- В нём сидит бизнес логика обработки данных из data lake
- DS team будет запускать его, генерить тренировочные данные
- должен быть быстрый, чтобы генерить 20.000 записей для перетренировки за часы, а не за дни
- Если мы уже на лайве отдаём ответ по фичам для адреса за ~5 секунд, то 20000 адресов это 27 часов в один поток, ну и типа час если в 30 потоков
## Data lake, SQL
- Это по сути наш кэш внешних источников с максимально общей структурой, его должно быть легко перезаполнить.
- Речь примерно о 30GB за год, то есть 100GB если брать с 2020 года. Если я правильно понимаю Сашин анализ, то для BigQeury 12 USD в месяц (1200 за 50TB), надо посчитать для PostgresSQL
- Кто угодно может туда ходить за аналитикой
## Сборщик данных
Data-collector, набор скриптов-пайпалайнов, набирающих данные в data lake
- Периодически дёргает все наши графы-койнгеко, сырые данные оттуда сливаются в самом общем формате в data lake.
- При дозаполнении на новых данных в лейке запускается smoke тест на их консистентность TBD
- Эта часть должна быть настолько же надёжна, насколько внешние источники данных.
- Версионирование этих данных и соответствие версий feature API -- открытый вопрос, субграфы меняются, меняются их схемы, эту тему надо обдумать
## Model service
Сервис, который умеет отдавать модель, то есть по некому инпуту отдавать результат модели. Никакого кода для трансформации данных не содержит, пользуется только feature API
- Endpoint per model version, e.g. model-service/v7/0x12345 -> 4 или model-service/v8/0x12345
- Новая модель релизится на лайв вместе со старой
- После тестов UW переключает эндпойнт со старой модели на новую
Такая архитектура позволит пофазовую миграцию на новую архитектуру. Для каждой фичи в старый ball of mud постепенно будем добавлять вызов feature API. Параллельно будем наполнять data lake данными, нужными для той или иной фичи.
В дальнейшем добавление новых источников данных для фичи или новых фич будет выглядеть так:
- Исследование кандидатов API, создание схемы данных (data-collector)
- Заполнение data lake
- Добавление нового эндпойнта в feature API (для новых фич)
- Тестирование эндпойнта для тренировки модели и на лайве
- Выкатывание на лайв новой версии модели
- Тестирование на лайве всей связки
- Переключение на новую версию в конфигурации UW