Как мы смогли автоматически масштабировать конвейер оптического распознавания символов, чтобы конвертировать тысячи PDF-документов в текст в день, используя управляемую событиями архитектуру микросервисов на базе Docker и Kubernetes

В недавнем проекте нас пригласили создать конвейер, который может преобразовывать документы PDF в текст. Входящие документы PDF обычно имеют размер 100 страниц и могут содержать как машинописный, так и рукописный текст. Эти PDF-документы были загружены пользователями в SFTP. Обычно в час выдается 30–40 документов, но в пиковые периоды - до 100. Поскольку их бизнес рос, клиент выразил потребность в OCR до тысячи документов в день. Затем эти документы были переданы в конвейер НЛП для дальнейшего анализа.

Давайте сделаем доказательство концепции - наши выводы

Время на преобразование 100-страничного документа - 10 минут.

Процесс Python, выполняющий OCR, потреблял около 6 ГБ ОЗУ и 4 ЦП.

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

Окончательная реализация

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

  • Документ загружен в формате PDF - обрабатывается с помощью AWS Transfer for SFTP
  • Запускать уведомление о событии S3 при загрузке нового PDF-документа - запускать лямбда-функцию
  • Лямбда-функция добавляет событие OCR в Kinesis Streams
  • Запущен микросервис OCR - конвертирует PDF в текст с помощью библиотеки Tesseract (по одному на страницу). Текстовый вывод сохранен как документ JSON в MongoDB
  • Добавить событие НЛП в Kinesis Streams
  • Микросервис NLP считывает JSON из MongoDB. Окончательные результаты NLP сохранены обратно в MongoDB

Стек технологий

Прием данных - сервис AWS SFTP

Микросервисы - образы Docker, хранящиеся в реестре Amazon Elastic Container Registry (ECR).

Управление контейнерами - Amazon Elastic Kubernetes Service (Amazon EKS) через узлы EC2

Бессерверная вычислительная система для контейнеров - AWS Fargate

Предоставление инфраструктуры - Terraform

Обмен сообщениями - Amazon Kinesis Streams

Сетевая архитектура

Кластерное автомасштабирование

Автомасштабирование кластера было достигнуто с помощью комбинации горизонтального и вертикального масштабирования, как показано ниже:

Вертикальное масштабирование - контейнеры

Основываясь на наших расчетах, мы смогли поддерживать 25 работающих контейнеров на данном узле EC2. Мы запустили микросервис OCR с 3 контейнерами реплик (minReplicas = 3) и установили Максимум на 25 (maxReplicas = 25). Мы также устанавливаем targetAverageUtilization = 15, что означает, что если загрузка ЦП контейнера превышает 15%, т. Е. Контейнер выполняет обработку документа, то разверните новый контейнер до максимума 25 на данном узле EKS.

Горизонтальное масштабирование - узлы EKS

Если текущий узел ELS заполнен, т. Е. 25 одновременно работающих контейнеров, тогда EKS автоматически предоставляет новый узел EKS. После этого вертикальное масштабирование берет на себя новый узел и раскручивает новые контейнеры.

Таким образом, инфраструктура способна поддерживать сотни процессов OCR и NLP. После удовлетворения пикового спроса начинается период ожидания. По истечении периода ожидания вновь развернутые узлы и контейнеры EKS масштабируются, чтобы обеспечить оптимальное распределение ресурсов.

Я надеюсь, что эта статья помогла вам начать изучение DevOps. Подобные темы рассматриваются в рамках курса DevOps, предлагаемого Datafence Cloud Academy.