Влизане
Привет!
В тази статия ще споделя моя опит в изграждането на архитектура на микросервизи за проект, използващ невронни мрежи.
Нека да поговорим за изискванията към архитектурата, да разгледаме различни структурни диаграми, да анализираме всеки от компонентите на завършената архитектура и също да оценим техническите показатели на решението.
Насладете се на четенето
Няколко думи за проблема и неговото решение
Основната идея е да се оцени привлекателността на човек по десетобална скала въз основа на снимка.
В тази статия ще се отдалечим от описанието както на използваните невронни мрежи, така и на процеса на подготовка и обучение на данни. Въпреки това, в една от следващите публикации определено ще се върнем към анализирането на конвейера за оценка на задълбочено ниво.
Сега ще преминем през тръбопровода за оценка на най-високо ниво и ще се фокусираме върху взаимодействието на микроуслугите в контекста на цялостната архитектура на проекта.
При работата по тръбопровода за оценка на привлекателността задачата беше разложена на следните компоненти:
- Избиране на лица в снимки
- Рейтинг на всеки човек
- Изобразете резултата
Първият се решава от силите на предварително обучени
Функционална схема на тръбопровода за оценка
Анализ на изискванията към архитектурата на проекта
В жизнения цикъл
Жизнен цикъл на ML проект
Този проект не е изключение - беше взето решение да се обвие тръбопроводът за оценка в онлайн услуга, което изискваше да се потопим в архитектурата. Бяха идентифицирани следните основни изисквания:
- Унифицирано съхранение на журнали – всички услуги трябва да пишат журнали на едно място, те трябва да са удобни за анализ
- Възможност за хоризонтално мащабиране на услугата за оценка - като най-вероятната пречка
- Същото количество процесорни ресурси трябва да бъде разпределено за оценка на всяко изображение, за да се избегнат отклонения в разпределението на времето за извод
- Бързо (пре)разгръщане както на конкретни услуги, така и на стека като цяло
- Възможността, ако е необходимо, да се използват общи обекти в различни услуги
архитектура
След анализ на изискванията стана очевидно, че архитектурата на микросервизите пасва почти идеално.
За да се отървем от ненужните главоболия, за интерфейс беше избран Telegram API.
Първо, нека да разгледаме структурната диаграма на готовата архитектура, след това да преминем към описание на всеки от компонентите и също да формализираме процеса на успешна обработка на изображения.
Структурна схема на готовата архитектура
Нека поговорим по-подробно за всеки от компонентите на диаграмата, като ги обозначим като Единична отговорност в процеса на оценка на изображението.
Микроуслуга „attrai-telegram-bot“
Тази микроуслуга капсулира всички взаимодействия с API на Telegram. Има 2 основни сценария: работа с персонализирано изображение и работа с резултата от конвейера за оценка. Нека да разгледаме двата сценария в общи линии.
При получаване на персонализирано съобщение с изображение:
- Извършва се филтриране, състоящо се от следните проверки:
- Наличие на оптимален размер на изображението
- Брой потребителски изображения, които вече са в опашката
- При преминаване на първоначалното филтриране изображението се записва в обема на докера
- Създава се задача в опашката „to_estimate“, която включва, наред с други неща, пътя до изображението, намиращо се в нашия том
- Ако горните стъпки са изпълнени успешно, потребителят ще получи съобщение с приблизителното време за обработка на изображението, което се изчислява въз основа на броя задачи в опашката. Ако възникне грешка, потребителят ще бъде изрично уведомен чрез изпращане на съобщение с информация какво може да се е объркало.
Също така, тази микроуслуга, подобно на celery worker, слуша опашката „after_estimate“, която е предназначена за задачи, които са преминали през конвейера за оценка.
При получаване на нова задача от „after_estimate“:
- Ако изображението е обработено успешно, изпращаме резултата на потребителя, ако не, уведомяваме за грешка.
- Премахване на изображението, което е резултат от конвейера за оценка
Микроуслуга за оценка „attrai-estimator“
Тази микроуслуга е celery worker и капсулира всичко, свързано с тръбопровода за оценка на изображението. Тук има само един работещ алгоритъм – нека го анализираме.
При получаване на нова задача от „to_estimate“:
- Нека прекараме изображението през конвейера за оценка:
- Зареждане на изображението в паметта
- Довеждаме изображението до необходимия размер
- Намиране на всички лица (MTCNN)
- Ние оценяваме всички лица (увиваме лицата, открити в последната стъпка, в партида и правим изводи ResNet34)
- Изобразете крайното изображение
- Нека начертаем ограничителните полета
- Теглене на оценките
- Изтриване на персонализирано (оригинално) изображение
- Запазване на изхода от конвейера за оценка
- Поставяме задачата в опашката „after_estimate“, която се слуша от микроуслугата „attrai-telegram-bot“, обсъдена по-горе.
Graylog (+ mongoDB + Elasticsearch)
Изборът падна върху него, а не върху обичайния
Като човек, който преди това е работил само със стека ELK, имах като цяло положителен опит, докато работех с Graylog. Единственото нещо, което е депресиращо, е превъзходството на функциите на Kibana над уеб интерфейса на Graylog.
RabbitMQ
В този проект беше използван като
Redis
Понякога има нужда да се използват общи обекти, които имплементират определени структури от данни в различни микроуслуги на Python.
Например, Redis съхранява hashmap под формата „telegram_user_id => брой активни задачи в опашката“, което ви позволява да ограничите броя на заявките от един потребител до определена стойност и по този начин да предотвратите DoS атаки.
Нека формализираме процеса на успешна обработка на изображения
- Потребителят изпраща изображение на бота на Telegram
- "attrai-telegram-bot" получава съобщение от API на Telegram и го анализира
- Задачата с изображението се добавя към асинхронната опашка „to_estimate“
- Потребителят получава съобщение с планираното време за оценка
- „attrai-estimator“ взема задача от опашката „to_estimate“, пуска оценките през тръбопровода и произвежда задачата в опашката „after_estimate“
- "attrai-telegram-bot" слуша опашката "after_estimate", изпраща резултата на потребителя
DevOps
Накрая, след преглед на архитектурата, можете да преминете към също толкова интересната част - DevOps
Докер рояк
С помощта на „рояк“ всички възли в нашия клъстер могат да бъдат разделени на 2 типа – работник и мениджър. На машини от първия тип се разполагат групи от контейнери (стекове), машини от втори тип са отговорни за мащабиране, балансиране и
Клъстер с един водещ мениджър и трима работници
Минималният възможен размер на клъстера е 1 възел; една машина ще действа едновременно като водещ мениджър и работник. Въз основа на размера на проекта и минималните изисквания за отказоустойчивост беше решено да се използва този подход.
Гледайки напред, ще кажа, че от първата производствена доставка, която беше в средата на юни, не е имало проблеми, свързани с тази клъстерна организация (но това не означава, че такава организация е по някакъв начин приемлива във всяко средно-голямо проекти, които са предмет на изисквания за устойчивост на грешки).
Докер стек
В режим на рояк той отговаря за разполагането на стекове (набори от докер услуги)
Той поддържа конфигурации за съставяне на докери, което ви позволява допълнително да използвате параметри за разгръщане.
Например, използвайки тези параметри, ресурсите за всеки от екземплярите на микроуслугата за оценка бяха ограничени (ние разпределяме N ядра за N инстанции, в самата микроуслуга ограничаваме броя на ядрата, използвани от PyTorch до едно)
attrai_estimator:
image: 'erqups/attrai_estimator:1.2'
deploy:
replicas: 4
resources:
limits:
cpus: '4'
restart_policy:
condition: on-failure
…
Важно е да се отбележи, че Redis, RabbitMQ и Graylog са услуги със състояние и те не могат да бъдат мащабирани толкова лесно, колкото „attrai-estimator“
Предвещавайки въпроса - защо не Kubernetes?
Изглежда, че използването на Kubernetes в малки и средни проекти е излишно; цялата необходима функционалност може да бъде получена от Docker Swarm, което е доста удобно за оркестратор на контейнери и също така има ниска бариера за влизане.
Инфраструктура
Всичко това беше разгърнато на VDS със следните характеристики:
- CPU: 4-ядрен процесор Intel® Xeon® Gold 5120 @ 2.20 GHz
- RAM: 8 GB
- SSD: 160GB
След тестване на локално натоварване изглеждаше, че при сериозен наплив от потребители тази машина ще бъде достатъчна.
Но веднага след внедряването публикувах връзка към един от най-популярните имиджбордове в ОНД (да, същият), след което хората се заинтересуваха и след няколко часа услугата успешно обработи десетки хиляди изображения. В същото време в пиковите моменти ресурсите на CPU и RAM не бяха използвани дори наполовина.
Още малко графики
Брой уникални потребители и заявки за оценка от внедряването, в зависимост от деня
Разпределение на времето за извод за конвейер за оценка
Данни
Обобщавайки, мога да кажа, че архитектурата и подходът към оркестрацията на контейнерите се оправдаха напълно - дори в пиковите моменти нямаше капки или провисване на времето за обработка.
Мисля, че малки и средни проекти, които използват изводи в реално време на невронни мрежи на процесора в своя процес, могат успешно да възприемат практиките, описани в тази статия.
Ще добавя, че първоначално статията беше по-дълга, но за да не публикувам дълго четене, реших да пропусна някои точки в тази статия - ще се върнем към тях в бъдещи публикации.
Можете да бутнете бота в Telegram - @AttraiBot, той ще работи поне до края на есента на 2020 г. Нека ви напомня, че не се съхраняват потребителски данни - нито оригиналните изображения, нито резултатите от конвейера за оценка - всичко се унищожава след обработка.
Източник: www.habr.com