Aperçu général de l'architecture du service d'évaluation de l'apparence basé sur des réseaux neuronaux

Aperçu général de l'architecture du service d'évaluation de l'apparence basé sur des réseaux neuronaux

Introduction

Bonjour !

Dans cet article, je vais partager mon expérience dans la construction d'une architecture microservices pour un projet utilisant des réseaux neuronaux.

Nous aborderons les exigences de l'architecture, examinerons divers diagrammes structurels, détaillerons chacun des composants de l'architecture achevée, et évaluerons les métriques techniques de la solution.

Bonne lecture !

Quelques mots sur la tĂąche et sa solution

L'idée principale est d'évaluer l'attrait d'une personne sur la base d'une photo sur une échelle de dix points.

Dans cet article, nous allons nous éloigner de la description des réseaux neuronaux utilisés ainsi que du processus de préparation des données et d'apprentissage. Cependant, dans l'une de nos prochaines publications, nous reviendrons certainement sur l'analyse du pipeline d'évaluation à un niveau approfondi.

Nous allons maintenant parcourir le pipeline d'évaluation à un niveau supérieur, en mettant l'accent sur l'interaction des microservices dans le contexte de l'architecture générale du projet. 

Lors du travail sur le pipeline d'évaluation de l'attrait, la tùche a été décomposée en les éléments suivants :

  1. Détection des visages sur la photo
  2. Évaluation de chacun des visages
  3. Rendu du résultat

Le premier est rĂ©solu par une MTCNN. Pour le second, un rĂ©seau neuronal convolutif a Ă©tĂ© entraĂźnĂ© sur PyTorch, avec comme backbone ResNet34 – en Ă©quilibrant « qualitĂ© / vitesse d'infĂ©rence sur CPU »

Aperçu général de l'architecture du service d'évaluation de l'apparence basé sur des réseaux neuronaux

Diagramme fonctionnel du pipeline d'évaluation

Analyse des exigences de l'architecture du projet

Dans le cycle de vie ML du projet, les étapes de travail sur l'architecture et l'automatisation du déploiement du modÚle sont souvent les plus coûteuses en temps et en ressources.

Aperçu général de l'architecture du service d'évaluation de l'apparence basé sur des réseaux neuronaux

Cycle de vie d'un projet ML

Ce projet n'est pas une exception – il a Ă©tĂ© dĂ©cidĂ© d'enrouler le pipeline d'Ă©valuation dans un service en ligne, pour cela il a Ă©tĂ© nĂ©cessaire de plonger dans l'architecture. Les exigences de base suivantes ont Ă©tĂ© formulĂ©es :

  1. Un stockage central de logs – tous les services doivent Ă©crire leurs logs au mĂȘme endroit, pour qu'ils soient faciles Ă  analyser
  2. PossibilitĂ© de mise Ă  l'Ă©chelle horizontale du service d'Ă©valuation – comme le goulet d'Ă©tranglement le plus probable
  3. Une quantitĂ© Ă©gale de ressources processeur doit ĂȘtre allouĂ©e Ă  l'Ă©valuation de chaque image – pour Ă©viter les Ă©carts dans la distribution du temps d'infĂ©rence
  4. Déploiement rapide (ou redeploiement) à la fois de services spécifiques et de l'ensemble de la pile
  5. Possibilité, si nécessaire, d'utiliser des objets communs dans différents services

Architecture

AprÚs une analyse des exigences, il est devenu évident que l'architecture microservices s'intÚgre presque parfaitement.

Pour Ă©viter des maux de tĂȘte inutiles, le Telegram API a Ă©tĂ© choisi comme front-end.

Pour commencer, examinons le diagramme structurel de l'architecture prĂȘte, puis nous passerons Ă  la description de chacun des composants et formaliserons le processus de traitement rĂ©ussi de l'image.

Aperçu général de l'architecture du service d'évaluation de l'apparence basé sur des réseaux neuronaux

Diagramme structurel de l'architecture prĂȘte

Parlons plus en détail de chacun des composants du diagramme, en précisant leur responsabilité unique dans le processus d'évaluation de l'image.

Microservice «attrai-telegram-bot»

Ce microservice encapsule toutes les interactions avec le Telegram API. On peut identifier 2 scénarios principaux - traitement de l'image de l'utilisateur et traitement du résultat du pipeline d'évaluation. Examinons les deux scénarios de maniÚre générale.

Lors de la réception d'un message utilisateur avec une image :

  1. Une filtration est effectuée, composée des vérifications suivantes :
    • PrĂ©sence d'une taille d'image optimale
    • Nombre d'images de l'utilisateur dĂ©jĂ  en attente
  2. Lors du passage de la filtration initiale, l'image est enregistrée dans un volume docker
  3. Une tùche est produite dans la file d'attente "to_estimate", dans laquelle figure notamment le chemin vers l'image située dans notre volume
  4. Si les étapes ci-dessus sont réussies, l'utilisateur recevra un message avec le temps approximatif de traitement de l'image, calculé sur la base du nombre de tùches dans la file d'attente. En cas d'erreur, l'utilisateur sera clairement informé par un message indiquant ce qui a pu mal se passer.

De plus, ce microservice, en tant que worker celery, écoute la file d'attente "after_estimate", qui est destinée aux tùches ayant passé le pipeline d'évaluation.

À la rĂ©ception d'une nouvelle tĂąche de "after_estimate" :

  1. Si l'image a été traitée avec succÚs, nous envoyons le résultat à l'utilisateur, sinon nous le notifions de l'erreur
  2. Nous supprimons l'image qui est le résultat du pipeline d'évaluation

Microservice d'évaluation «attrai-estimator»

Ce microservice est un worker celery et encapsule tout ce qui est lié au pipeline d'évaluation de l'image. L'algorithme de fonctionnement est unique - analysons-le.

À la rĂ©ception d'une nouvelle tĂąche de "to_estimate" :

  1. Nous faisons passer l'image à travers le pipeline d'évaluation :
    1. Nous chargeons l'image en mémoire
    2. Nous ajustons l'image Ă  la taille requise
    3. Nous détectons tous les visages (MTCNN)
    4. Nous évaluons tous les visages (en regroupant les visages détectés dans la section précédente et en les inférant avec ResNet34)
    5. Nous rendons l'image finale
      1. Nous dessinons les bounding boxes
      2. Nous dessinons les évaluations
  2. Nous supprimons l'image utilisateur (d'origine)
  3. Nous sauvegardons la sortie du pipeline d'évaluation
  4. Nous plaçons la tùche dans la file d'attente «after_estimate», écoutée par le microservice «attrai-telegram-bot» mentionné précédemment

Graylog (+ mongoDB + Elasticsearch)

Graylog — est une solution pour la gestion centralisĂ©e des logs. Dans ce projet, il a Ă©tĂ© utilisĂ© selon sa fonction principale.

Le choix s'est porté sur lui plutÎt que sur le traditionnel ELK stack, en raison de la facilité d'utilisation avec Python. Tout ce que vous devez faire pour le logging dans Graylog est d'ajouter GELFTCPHandler du package graypy aux autres gestionnaires de logs racine de notre microservice Python.

En tant que personne ayant prĂ©cĂ©demment travaillĂ© uniquement avec le stack ELK, j'ai dans l'ensemble eu une expĂ©rience positive de travail avec Graylog. La seule chose qui dĂ©route – l'avantage fonctionnel de Kibana sur l'interface web de Graylog.

RabbitMQ

RabbitMQ — est un courtier de messages basĂ© sur le protocole AMQP.

Dans ce projet, il a été utilisé comme le courtier le plus stable et éprouvé par le temps pour Celery et fonctionnait en mode durable.

Redis

Redis — est une base de donnĂ©es NoSQL qui fonctionne avec des structures de donnĂ©es de type «clĂ© – valeur»

Il arrive parfois qu'il soit nécessaire d'utiliser des objets communs dans différents microservices Python, implémentant certaines structures de données.

Par exemple, dans Redis, on stocke une hashmap de type «telegram_user_id => nombre de tĂąches actives dans la file d'attente», ce qui permet de limiter le nombre de requĂȘtes d'un utilisateur Ă  une certaine valeur et, ce faisant, d'Ă©viter les attaques par dĂ©ni de service.

Nous formalisons le processus de traitement réussi de l'image

  1. L'utilisateur envoie une image au bot Telegram
  2. «attrai-telegram-bot» reçoit le message de l'API Telegram et l'analyse
  3. La tùche avec l'image est ajoutée à la file d'attente asynchrone «to_estimate»
  4. L'utilisateur reçoit un message avec le temps estimé pour l'évaluation
  5. «attrai-estimator» prend la tùche de la file d'attente «to_estimate», la fait passer par le pipeline d'évaluation et produit la tùche dans la file d'attente «after_estimate»
  6. «attrai-telegram-bot», qui écoute la file d'attente «after_estimate», envoie le résultat à l'utilisateur

DevOps

Enfin, aprĂšs avoir examinĂ© l'architecture, nous pouvons passer Ă  une autre partie tout aussi intĂ©ressante — DevOps

Mais cela signifie-t-il que vous pouvez utiliser le mĂȘme fichier docker-compose dans

 

Aperçu général de l'architecture du service d'évaluation de l'apparence basé sur des réseaux neuronaux

Mais cela signifie-t-il que vous pouvez utiliser le mĂȘme fichier docker-compose dans  — un systĂšme de clustering dont les fonctionnalitĂ©s sont intĂ©grĂ©es dans Docker Engine et accessibles par dĂ©faut.

Avec l'« essaim », toutes les nƓuds de notre cluster peuvent ĂȘtre rĂ©parties en 2 types – worker et manager. Sur les machines du premier type, des groupes de conteneurs (stacks) sont dĂ©ployĂ©s, les machines du second type s'occupent du scaling, de l'Ă©quilibrage et d'autres fonctionnalitĂ©s intĂ©ressantes. Les managers sont par dĂ©faut aussi des workers.

Aperçu général de l'architecture du service d'évaluation de l'apparence basé sur des réseaux neuronaux

Un cluster avec un leader manager et trois workers

La taille minimale possible du cluster est de 1 nƓud, la seule machine jouera simultanĂ©ment le rĂŽle de leader manager et de worker. En fonction de la taille du projet et des exigences minimales en matiĂšre de rĂ©silience, il a Ă©tĂ© dĂ©cidĂ© d'adopter cette approche.

Pour anticiper, je dirai qu'à partir de la premiÚre livraison en production, qui a eu lieu à la mi-juin, il n'y a eu aucun problÚme lié à cette organisation du cluster (mais cela ne signifie pas qu'une telle organisation soit en aucune façon admissible dans des projets de taille moyenne à grande soumis à des exigences de résilience).

Docker Stack

En mode « essaim », le déploiement des stacks (ensembles de services Docker) est géré par docker stack

Il prend en charge les configurations docker-compose, permettant d'utiliser des paramÚtres de déploiement supplémentaires.  

Par exemple, grĂące Ă  ces paramĂštres, les ressources de chaque instance du microservice d'estimation ont Ă©tĂ© limitĂ©es (nous allouons N cƓurs pour N instances, et dans le microservice, nous limitons le nombre de cƓurs utilisĂ©s par PyTorch Ă  un seul)

attrai_estimator:
  image: 'erqups/attrai_estimator:1.2'
  deploy:
    replicas: 4
    resources:
      limits:
        cpus: '4'
    restart_policy:
      condition: on-failure
      


Il est important de noter que Redis, RabbitMQ et Graylog sont des services stateful et qu'il n'est pas aussi simple de les scaler que l'« attrai-estimator ».

Pour anticiper la question – pourquoi pas Kubernetes ?

Il semble que l'utilisation de Kubernetes dans des projets de petite et moyenne taille soit un surcoĂ»t, toute la fonctionnalitĂ© nĂ©cessaire peut ĂȘtre obtenue avec Docker Swarm, qui est assez convivial en tant qu'orchestrateur de conteneurs et qui a Ă©galement un faible seuil d'entrĂ©e.

Infrastructure

Tout cela a été déployé sur un VDS avec les caractéristiques suivantes :

  • CPU: 4 cƓurs IntelÂź XeonÂź Gold 5120 CPU @ 2.20GHz
  • RAM: 8 Go
  • SSD: 160 Go

AprĂšs des tests de charge locaux, il semblait qu'avec une forte afflux d'utilisateurs, cette machine serait juste Ă  la limite.

Cependant, juste aprĂšs le dĂ©ploiement, j'ai postĂ© un lien vers l'une des images les plus populaires dans les pays de la CEI (oui, celle-lĂ ), ce qui a suscitĂ© l'intĂ©rĂȘt des gens et, en quelques heures, le service a traitĂ© avec succĂšs des dizaines de milliers d'images. Pendant ce temps, aux moments les plus critiques, les ressources CPU et RAM n'Ă©taient mĂȘme pas utilisĂ©es Ă  moitiĂ©.

Aperçu général de l'architecture du service d'évaluation de l'apparence basé sur des réseaux neuronaux
Aperçu général de l'architecture du service d'évaluation de l'apparence basé sur des réseaux neuronaux

Encore un peu de graphismes

Nombre d'utilisateurs uniques et demandes d'évaluation depuis le déploiement, selon les jours

Aperçu général de l'architecture du service d'évaluation de l'apparence basé sur des réseaux neuronaux

Distribution du temps d'inférence du pipeline d'évaluation

Aperçu général de l'architecture du service d'évaluation de l'apparence basé sur des réseaux neuronaux

Conclusions

En rĂ©sumĂ©, je peux dire que l'architecture et l'approche d'orchestration des conteneurs ont pleinement portĂ© leurs fruits : mĂȘme aux moments de pointe, il n'y a pas eu de pannes ni de ralentissements dans le temps de traitement. 

Je pense que les projets de petite et moyenne taille qui utilisent l'inférence en temps réel des réseaux neuronaux sur CPU peuvent adopter avec succÚs les pratiques décrites dans cet article.

Je tiens à ajouter qu'à l'origine, l'article était plus long, mais afin de ne pas poster un long texte, j'ai décidé d'omettre certains points dans cet article - nous y reviendrons dans les prochaines publications.

Vous pouvez essayer le bot sur Telegram - @AttraiBot, il fonctionnera au moins jusqu'à la fin de l'automne 2020. Je rappelle - aucune donnée utilisateur n'est stockée - ni les images originales, ni les résultats du pipeline d'évaluation - tout est effacé aprÚs traitement.

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster