{"id":89110,"date":"2020-07-18T19:42:10","date_gmt":"2020-07-18T17:42:10","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/obshhij-obzor-arhitektury-servisa-dlya-oczenki-vneshnosti-na-osnove-nejronnyh-setej"},"modified":"2020-07-18T19:42:10","modified_gmt":"2020-07-18T17:42:10","slug":"obshhij-obzor-arhitektury-servisa-dlya-oczenki-vneshnosti-na-osnove-nejronnyh-setej","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/obshhij-obzor-arhitektury-servisa-dlya-oczenki-vneshnosti-na-osnove-nejronnyh-setej","title":{"rendered":"Aper\u00e7u g\u00e9n\u00e9ral de l'architecture du service d'\u00e9valuation de l'apparence bas\u00e9 sur des r\u00e9seaux neuronaux","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Aper\u00e7u g\u00e9n\u00e9ral de l&#039;architecture du service d&#039;\u00e9valuation de l&#039;apparence bas\u00e9 sur des r\u00e9seaux neuronaux\" src=\"\/wp-content\/uploads\/2020\/07\/f624e995fbee3496f1f7890b98106df4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Introduction<\/h2>\n<p><\/p>\n<p>Bonjour !<\/p>\n<p><\/p>\n<p>Dans cet article, je vais partager mon exp\u00e9rience dans la construction d'une architecture microservices pour un projet utilisant des r\u00e9seaux neuronaux.<\/p>\n<p><\/p>\n<p>Nous aborderons les exigences de l'architecture, examinerons divers diagrammes structurels, d\u00e9taillerons chacun des composants de l'architecture achev\u00e9e, et \u00e9valuerons les m\u00e9triques techniques de la solution.<\/p>\n<p><\/p>\n<p>Bonne lecture !<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Quelques mots sur la t\u00e2che et sa solution<\/h2>\n<p><\/p>\n<p>L'id\u00e9e principale est d'\u00e9valuer l'attrait d'une personne sur la base d'une photo sur une \u00e9chelle de dix points.<\/p>\n<p><\/p>\n<p>Dans cet article, nous allons nous \u00e9loigner de la description des r\u00e9seaux neuronaux utilis\u00e9s ainsi que du processus de pr\u00e9paration des donn\u00e9es et d'apprentissage. Cependant, dans l'une de nos prochaines publications, nous reviendrons certainement sur l'analyse du pipeline d'\u00e9valuation \u00e0 un niveau approfondi.<\/p>\n<p><\/p>\n<p>Nous allons maintenant parcourir le pipeline d'\u00e9valuation \u00e0 un niveau sup\u00e9rieur, en mettant l'accent sur l'interaction des microservices dans le contexte de l'architecture g\u00e9n\u00e9rale du projet.\u00a0<\/p>\n<p><\/p>\n<p>Lors du travail sur le pipeline d'\u00e9valuation de l'attrait, la t\u00e2che a \u00e9t\u00e9 d\u00e9compos\u00e9e en les \u00e9l\u00e9ments suivants :<\/p>\n<p><\/p>\n<ol>\n<li>D\u00e9tection des visages sur la photo<\/li>\n<li>\u00c9valuation de chacun des visages<\/li>\n<li>Rendu du r\u00e9sultat<\/li>\n<\/ol>\n<p><\/p>\n<p>Le premier est r\u00e9solu par une <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1604.02878\">MTCNN<\/a><\/noindex>. Pour le second, un r\u00e9seau neuronal convolutif a \u00e9t\u00e9 entra\u00een\u00e9 sur PyTorch, avec comme backbone <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1512.03385\">ResNet34<\/a><\/noindex> \u2013 en \u00e9quilibrant \u00ab qualit\u00e9 \/ vitesse d'inf\u00e9rence sur CPU \u00bb<\/p>\n<p>\n<img decoding=\"async\" alt=\"Aper\u00e7u g\u00e9n\u00e9ral de l&#039;architecture du service d&#039;\u00e9valuation de l&#039;apparence bas\u00e9 sur des r\u00e9seaux neuronaux\" src=\"\/wp-content\/uploads\/2020\/07\/181cc89a2cf5295bdcd4b838216f96d6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Diagramme fonctionnel du pipeline d'\u00e9valuation<\/i><\/p>\n<p><\/p>\n<h2>Analyse des exigences de l'architecture du projet<\/h2>\n<p><\/p>\n<p>Dans le cycle de vie <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Machine_learning\">ML<\/a><\/noindex> du projet, les \u00e9tapes de travail sur l'architecture et l'automatisation du d\u00e9ploiement du mod\u00e8le sont souvent les plus co\u00fbteuses en temps et en ressources.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Aper\u00e7u g\u00e9n\u00e9ral de l&#039;architecture du service d&#039;\u00e9valuation de l&#039;apparence bas\u00e9 sur des r\u00e9seaux neuronaux\" src=\"\/wp-content\/uploads\/2020\/07\/4949f217d31c863176122ed87b43a88c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Cycle de vie d'un projet ML<\/i><\/p>\n<p><\/p>\n<p>Ce projet n'est pas une exception \u2013 il a \u00e9t\u00e9 d\u00e9cid\u00e9 d'enrouler le pipeline d'\u00e9valuation dans un service en ligne, pour cela il a \u00e9t\u00e9 n\u00e9cessaire de plonger dans l'architecture. Les exigences de base suivantes ont \u00e9t\u00e9 formul\u00e9es :<\/p>\n<p><\/p>\n<ol>\n<li>Un stockage central de logs \u2013 tous les services doivent \u00e9crire leurs logs au m\u00eame endroit, pour qu'ils soient faciles \u00e0 analyser<\/li>\n<li>Possibilit\u00e9 de mise \u00e0 l'\u00e9chelle horizontale du service d'\u00e9valuation \u2013 comme le goulet d'\u00e9tranglement le plus probable<\/li>\n<li>Une quantit\u00e9 \u00e9gale de ressources processeur doit \u00eatre allou\u00e9e \u00e0 l'\u00e9valuation de chaque image \u2013 pour \u00e9viter les \u00e9carts dans la distribution du temps d'inf\u00e9rence<\/li>\n<li>D\u00e9ploiement rapide (ou redeploiement) \u00e0 la fois de services sp\u00e9cifiques et de l'ensemble de la pile<\/li>\n<li>Possibilit\u00e9, si n\u00e9cessaire, d'utiliser des objets communs dans diff\u00e9rents services<\/li>\n<\/ol>\n<p><\/p>\n<h2>Architecture<\/h2>\n<p><\/p>\n<p>Apr\u00e8s une analyse des exigences, il est devenu \u00e9vident que l'architecture microservices s'int\u00e8gre presque parfaitement.<\/p>\n<p><\/p>\n<p>Pour \u00e9viter des maux de t\u00eate inutiles, le Telegram API a \u00e9t\u00e9 choisi comme front-end.<\/p>\n<p><\/p>\n<p>Pour commencer, examinons le diagramme structurel de l'architecture pr\u00eate, puis nous passerons \u00e0 la description de chacun des composants et formaliserons le processus de traitement r\u00e9ussi de l'image.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Aper\u00e7u g\u00e9n\u00e9ral de l&#039;architecture du service d&#039;\u00e9valuation de l&#039;apparence bas\u00e9 sur des r\u00e9seaux neuronaux\" src=\"\/wp-content\/uploads\/2020\/07\/163ec019341e9d71a1e0854c6026bd01.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Diagramme structurel de l'architecture pr\u00eate<\/i><\/p>\n<p><\/p>\n<p>Parlons plus en d\u00e9tail de chacun des composants du diagramme, en pr\u00e9cisant leur responsabilit\u00e9 unique dans le processus d'\u00e9valuation de l'image.<\/p>\n<p><\/p>\n<h3>Microservice \u00abattrai-telegram-bot\u00bb<\/h3>\n<p><\/p>\n<p>Ce microservice encapsule toutes les interactions avec le Telegram API. On peut identifier 2 sc\u00e9narios principaux - traitement de l'image de l'utilisateur et traitement du r\u00e9sultat du pipeline d'\u00e9valuation. Examinons les deux sc\u00e9narios de mani\u00e8re g\u00e9n\u00e9rale.<\/p>\n<p><\/p>\n<p>Lors de la r\u00e9ception d'un message utilisateur avec une image :<\/p>\n<p><\/p>\n<ol>\n<li>Une filtration est effectu\u00e9e, compos\u00e9e des v\u00e9rifications suivantes :\n<ul>\n<li>Pr\u00e9sence d'une taille d'image optimale<\/li>\n<li>Nombre d'images de l'utilisateur d\u00e9j\u00e0 en attente<\/li>\n<\/ul>\n<\/li>\n<li>Lors du passage de la filtration initiale, l'image est enregistr\u00e9e dans un volume docker<\/li>\n<li>Une t\u00e2che est produite dans la file d'attente \"to_estimate\", dans laquelle figure notamment le chemin vers l'image situ\u00e9e dans notre volume<\/li>\n<li>Si les \u00e9tapes ci-dessus sont r\u00e9ussies, l'utilisateur recevra un message avec le temps approximatif de traitement de l'image, calcul\u00e9 sur la base du nombre de t\u00e2ches dans la file d'attente. En cas d'erreur, l'utilisateur sera clairement inform\u00e9 par un message indiquant ce qui a pu mal se passer. <\/li>\n<\/ol>\n<p><\/p>\n<p>De plus, ce microservice, en tant que worker celery, \u00e9coute la file d'attente \"after_estimate\", qui est destin\u00e9e aux t\u00e2ches ayant pass\u00e9 le pipeline d'\u00e9valuation.<\/p>\n<p><\/p>\n<p>\u00c0 la r\u00e9ception d'une nouvelle t\u00e2che de \"after_estimate\" :<\/p>\n<p><\/p>\n<ol>\n<li>Si l'image a \u00e9t\u00e9 trait\u00e9e avec succ\u00e8s, nous envoyons le r\u00e9sultat \u00e0 l'utilisateur, sinon nous le notifions de l'erreur<\/li>\n<li>Nous supprimons l'image qui est le r\u00e9sultat du pipeline d'\u00e9valuation<\/li>\n<\/ol>\n<p><\/p>\n<h3>Microservice d'\u00e9valuation \u00abattrai-estimator\u00bb<\/h3>\n<p><\/p>\n<p>Ce microservice est un worker celery et encapsule tout ce qui est li\u00e9 au pipeline d'\u00e9valuation de l'image. L'algorithme de fonctionnement est unique - analysons-le.<\/p>\n<p><\/p>\n<p>\u00c0 la r\u00e9ception d'une nouvelle t\u00e2che de \"to_estimate\" :<\/p>\n<p><\/p>\n<ol>\n<li>Nous faisons passer l'image \u00e0 travers le pipeline d'\u00e9valuation :\n<ol>\n<li>Nous chargeons l'image en m\u00e9moire<\/li>\n<li>Nous ajustons l'image \u00e0 la taille requise<\/li>\n<li>Nous d\u00e9tectons tous les visages (MTCNN)<\/li>\n<li>Nous \u00e9valuons tous les visages (en regroupant les visages d\u00e9tect\u00e9s dans la section pr\u00e9c\u00e9dente et en les inf\u00e9rant avec ResNet34)<\/li>\n<li>Nous rendons l'image finale\n<ol>\n<li>Nous dessinons les bounding boxes<\/li>\n<li>Nous dessinons les \u00e9valuations<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<\/li>\n<li>Nous supprimons l'image utilisateur (d'origine)<\/li>\n<li>Nous sauvegardons la sortie du pipeline d'\u00e9valuation<\/li>\n<li>Nous pla\u00e7ons la t\u00e2che dans la file d'attente \u00abafter_estimate\u00bb, \u00e9cout\u00e9e par le microservice \u00abattrai-telegram-bot\u00bb mentionn\u00e9 pr\u00e9c\u00e9demment<\/li>\n<\/ol>\n<p><\/p>\n<h3>Graylog (+ mongoDB + Elasticsearch)<\/h3>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.graylog.org\/\">Graylog<\/a><\/noindex> \u2014 est une solution pour la gestion centralis\u00e9e des logs. Dans ce projet, il a \u00e9t\u00e9 utilis\u00e9 selon sa fonction principale.<\/p>\n<p><\/p>\n<p>Le choix s'est port\u00e9 sur lui plut\u00f4t que sur le traditionnel <noindex><a rel=\"nofollow\" href=\"https:\/\/www.elastic.co\/what-is\/elk-stack\">ELK<\/a><\/noindex> stack, en raison de la facilit\u00e9 d'utilisation avec Python. Tout ce que vous devez faire pour le logging dans Graylog est d'ajouter GELFTCPHandler du package <noindex><a rel=\"nofollow\" href=\"https:\/\/pypi.org\/project\/graypy\/\">graypy<\/a><\/noindex> aux autres gestionnaires de logs racine de notre microservice Python.<\/p>\n<p><\/p>\n<p>En tant que personne ayant pr\u00e9c\u00e9demment travaill\u00e9 uniquement avec le stack ELK, j'ai dans l'ensemble eu une exp\u00e9rience positive de travail avec Graylog. La seule chose qui d\u00e9route \u2013 l'avantage fonctionnel de Kibana sur l'interface web de Graylog.<\/p>\n<p><\/p>\n<h3>RabbitMQ<\/h3>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.rabbitmq.com\/\">RabbitMQ<\/a><\/noindex> \u2014 est un courtier de messages bas\u00e9 sur le protocole AMQP.<\/p>\n<p><\/p>\n<p>Dans ce projet, il a \u00e9t\u00e9 utilis\u00e9 comme <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.celeryproject.org\/en\/latest\/getting-started\/brokers\/#broker-overview\">le courtier le plus stable et \u00e9prouv\u00e9 par le temps<\/a><\/noindex> pour Celery et fonctionnait en mode durable.<\/p>\n<p><\/p>\n<h3>Redis<\/h3>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/redis.io\/\">Redis<\/a><\/noindex> \u2014 est une base de donn\u00e9es NoSQL qui fonctionne avec des structures de donn\u00e9es de type \u00abcl\u00e9 \u2013 valeur\u00bb<\/p>\n<p><\/p>\n<p>Il arrive parfois qu'il soit n\u00e9cessaire d'utiliser des objets communs dans diff\u00e9rents microservices Python, impl\u00e9mentant certaines structures de donn\u00e9es.<\/p>\n<p><\/p>\n<p>Par exemple, dans Redis, on stocke une hashmap de type \u00abtelegram_user_id =&gt; nombre de t\u00e2ches actives dans la file d'attente\u00bb, ce qui permet de limiter le nombre de requ\u00eates d'un utilisateur \u00e0 une certaine valeur et, ce faisant, d'\u00e9viter les attaques par d\u00e9ni de service.<\/p>\n<p><\/p>\n<h3>Nous formalisons le processus de traitement r\u00e9ussi de l'image<\/h3>\n<p><\/p>\n<ol>\n<li>L'utilisateur envoie une image au bot Telegram<\/li>\n<li>\u00abattrai-telegram-bot\u00bb re\u00e7oit le message de l'API Telegram et l'analyse<\/li>\n<li>La t\u00e2che avec l'image est ajout\u00e9e \u00e0 la file d'attente asynchrone \u00abto_estimate\u00bb<\/li>\n<li>L'utilisateur re\u00e7oit un message avec le temps estim\u00e9 pour l'\u00e9valuation<\/li>\n<li>\u00abattrai-estimator\u00bb prend la t\u00e2che de la file d'attente \u00abto_estimate\u00bb, la fait passer par le pipeline d'\u00e9valuation et produit la t\u00e2che dans la file d'attente \u00abafter_estimate\u00bb<\/li>\n<li>\u00abattrai-telegram-bot\u00bb, qui \u00e9coute la file d'attente \u00abafter_estimate\u00bb, envoie le r\u00e9sultat \u00e0 l'utilisateur<\/li>\n<\/ol>\n<p><\/p>\n<h2>DevOps<\/h2>\n<p><\/p>\n<p>Enfin, apr\u00e8s avoir examin\u00e9 l'architecture, nous pouvons passer \u00e0 une autre partie tout aussi int\u00e9ressante \u2014 DevOps<\/p>\n<p><\/p>\n<h3>Mais cela signifie-t-il que vous pouvez utiliser le m\u00eame fichier docker-compose dans<\/h3>\n<p><\/p>\n<p>\u00a0<\/p>\n<p>\n<img decoding=\"async\" alt=\"Aper\u00e7u g\u00e9n\u00e9ral de l&#039;architecture du service d&#039;\u00e9valuation de l&#039;apparence bas\u00e9 sur des r\u00e9seaux neuronaux\" src=\"\/wp-content\/uploads\/2020\/07\/ba539d1c8197c7961d6e5e6a5c7e83c6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/swarm\/\">Mais cela signifie-t-il que vous pouvez utiliser le m\u00eame fichier docker-compose dans <\/a><\/noindex>\u00a0\u2014 un syst\u00e8me de clustering, dont les fonctionnalit\u00e9s sont int\u00e9gr\u00e9es dans Docker Engine et disponibles d\u00e8s la sortie de la bo\u00eete.<\/p>\n<p><\/p>\n<p>Avec l'\u00ab essaim \u00bb, toutes les n\u0153uds de notre cluster peuvent \u00eatre r\u00e9parties en 2 types \u2013 worker et manager. Sur les machines du premier type, des groupes de conteneurs (stacks) sont d\u00e9ploy\u00e9s, les machines du second type s'occupent du scaling, de l'\u00e9quilibrage et <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/swarm\/#feature-highlights\">d'autres fonctionnalit\u00e9s int\u00e9ressantes<\/a><\/noindex>. Les managers sont par d\u00e9faut aussi des workers.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Aper\u00e7u g\u00e9n\u00e9ral de l&#039;architecture du service d&#039;\u00e9valuation de l&#039;apparence bas\u00e9 sur des r\u00e9seaux neuronaux\" src=\"\/wp-content\/uploads\/2020\/07\/d195e2aab6d3552652102c2b5246abfc.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Un cluster avec un leader manager et trois workers<\/i><\/p>\n<p><\/p>\n<p>La taille minimale possible du cluster est de 1 n\u0153ud, la seule machine jouera simultan\u00e9ment le r\u00f4le de leader manager et de worker. En fonction de la taille du projet et des exigences minimales en mati\u00e8re de r\u00e9silience, il a \u00e9t\u00e9 d\u00e9cid\u00e9 d'adopter cette approche.<\/p>\n<p><\/p>\n<p>Pour anticiper, je dirai qu'\u00e0 partir de la premi\u00e8re livraison en production, qui a eu lieu \u00e0 la mi-juin, il n'y a eu aucun probl\u00e8me li\u00e9 \u00e0 cette organisation du cluster (mais cela ne signifie pas qu'une telle organisation soit en aucune fa\u00e7on admissible dans des projets de taille moyenne \u00e0 grande soumis \u00e0 des exigences de r\u00e9silience).<\/p>\n<p><\/p>\n<h3>Docker Stack<\/h3>\n<p><\/p>\n<p>En mode \u00ab essaim \u00bb, le d\u00e9ploiement des stacks (ensembles de services Docker) est g\u00e9r\u00e9 par <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/reference\/commandline\/stack\/\">docker stack<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Il prend en charge les configurations docker-compose, permettant d'utiliser des param\u00e8tres de d\u00e9ploiement suppl\u00e9mentaires.\u00a0\u00a0<\/p>\n<p><\/p>\n<p>Par exemple, gr\u00e2ce \u00e0 ces param\u00e8tres, les ressources de chaque instance du microservice d'estimation ont \u00e9t\u00e9 limit\u00e9es (nous allouons N c\u0153urs pour N instances, et dans le microservice, nous limitons le nombre de c\u0153urs utilis\u00e9s par PyTorch \u00e0 un seul)<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">attrai_estimator:\n  image: 'erqups\/attrai_estimator:1.2'\n  deploy:\n    replicas: 4\n    resources:\n      limits:\n        cpus: '4'\n    restart_policy:\n      condition: on-failure\n      \u2026<\/code><\/pre>\n<p><\/p>\n<p>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'\u00ab attrai-estimator \u00bb.<\/p>\n<p><\/p>\n<h3>Pour anticiper la question \u2013 pourquoi pas Kubernetes ?<\/h3>\n<p><\/p>\n<p>Il semble que l'utilisation de Kubernetes dans des projets de petite et moyenne taille soit un surco\u00fbt, toute la fonctionnalit\u00e9 n\u00e9cessaire peut \u00eatre obtenue avec Docker Swarm, qui est assez convivial en tant qu'orchestrateur de conteneurs et qui a \u00e9galement un faible seuil d'entr\u00e9e.<\/p>\n<p><\/p>\n<h3>Infrastructure<\/h3>\n<p><\/p>\n<p>Tout cela a \u00e9t\u00e9 d\u00e9ploy\u00e9 sur un VDS avec les caract\u00e9ristiques suivantes :<\/p>\n<p><\/p>\n<ul>\n<li>CPU : 4 c\u0153urs Intel&reg; Xeon&reg; Gold 5120 CPU @ 2,20 GHz<\/li>\n<li>RAM: 8 Go<\/li>\n<li>SSD: 160 Go<\/li>\n<\/ul>\n<p><\/p>\n<p>Apr\u00e8s des tests de charge locaux, il semblait qu'avec une forte afflux d'utilisateurs, cette machine serait juste \u00e0 la limite.<\/p>\n<p><\/p>\n<p>Cependant, juste apr\u00e8s le d\u00e9ploiement, j'ai post\u00e9 un lien vers l'une des images les plus populaires dans les pays de la CEI (oui, celle-l\u00e0), ce qui a suscit\u00e9 l'int\u00e9r\u00eat des gens et, en quelques heures, le service a trait\u00e9 avec succ\u00e8s des dizaines de milliers d'images. Pendant ce temps, aux moments les plus critiques, les ressources CPU et RAM n'\u00e9taient m\u00eame pas utilis\u00e9es \u00e0 moiti\u00e9.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Aper\u00e7u g\u00e9n\u00e9ral de l&#039;architecture du service d&#039;\u00e9valuation de l&#039;apparence bas\u00e9 sur des r\u00e9seaux neuronaux\" src=\"\/wp-content\/uploads\/2020\/07\/458d74dae00d455fbce1ca6a197325d7.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Aper\u00e7u g\u00e9n\u00e9ral de l&#039;architecture du service d&#039;\u00e9valuation de l&#039;apparence bas\u00e9 sur des r\u00e9seaux neuronaux\" src=\"\/wp-content\/uploads\/2020\/07\/e9383c47369c606d26e89a69f4d22b5a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Encore un peu de graphismes<\/h3>\n<p><\/p>\n<p>Nombre d'utilisateurs uniques et demandes d'\u00e9valuation depuis le d\u00e9ploiement, selon les jours<\/p>\n<p>\n<img decoding=\"async\" alt=\"Aper\u00e7u g\u00e9n\u00e9ral de l&#039;architecture du service d&#039;\u00e9valuation de l&#039;apparence bas\u00e9 sur des r\u00e9seaux neuronaux\" src=\"\/wp-content\/uploads\/2020\/07\/7112c78c8400d2ac73562243b16a015b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Distribution du temps d'inf\u00e9rence du pipeline d'\u00e9valuation<\/p>\n<p>\n<img decoding=\"async\" alt=\"Aper\u00e7u g\u00e9n\u00e9ral de l&#039;architecture du service d&#039;\u00e9valuation de l&#039;apparence bas\u00e9 sur des r\u00e9seaux neuronaux\" src=\"\/wp-content\/uploads\/2020\/07\/4c892ce607c3ff3db466459729dd0876.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Conclusions<\/h2>\n<p><\/p>\n<p>En r\u00e9sum\u00e9, je peux dire que l'architecture et l'approche d'orchestration des conteneurs ont pleinement port\u00e9 leurs fruits : m\u00eame aux moments de pointe, il n'y a pas eu de pannes ni de ralentissements dans le temps de traitement.\u00a0<\/p>\n<p><\/p>\n<p>Je pense que les projets de petite et moyenne taille qui utilisent l'inf\u00e9rence en temps r\u00e9el des r\u00e9seaux neuronaux sur CPU peuvent adopter avec succ\u00e8s les pratiques d\u00e9crites dans cet article.<\/p>\n<p><\/p>\n<p>Je tiens \u00e0 ajouter qu'\u00e0 l'origine, l'article \u00e9tait plus long, mais afin de ne pas poster un long texte, j'ai d\u00e9cid\u00e9 d'omettre certains points dans cet article - nous y reviendrons dans les prochaines publications.<\/p>\n<p><\/p>\n<p>Vous pouvez essayer le bot sur Telegram - @AttraiBot, il fonctionnera au moins jusqu'\u00e0 la fin de l'automne 2020. Je rappelle - aucune donn\u00e9e utilisateur n'est stock\u00e9e - ni les images originales, ni les r\u00e9sultats du pipeline d'\u00e9valuation - tout est effac\u00e9 apr\u00e8s traitement.<\/p>\n<p>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/511332\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435 \u041f\u0440\u0438\u0432\u0435\u0442! \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u0434\u0435\u043b\u044e\u0441\u044c \u043e\u043f\u044b\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0435\u0433\u043e \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u044b\u0435 \u0441\u0435\u0442\u0438. \u041f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u0445 \u043a \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b, \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0433\u043e\u0442\u043e\u0432\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0446\u0435\u043d\u0438\u043c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f. \u041f\u0440\u0438\u044f\u0442\u043d\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f! \u041f\u0430\u0440\u0443 \u0441\u043b\u043e\u0432 \u043e \u0437\u0430\u0434\u0430\u0447\u0435 \u0438 \u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f \u2013 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0444\u043e\u0442\u043e \u0434\u0430\u0442\u044c \u043e\u0446\u0435\u043d\u043a\u0443 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":89111,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-89110","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\".\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/obshhij-obzor-arhitektury-servisa-dlya-oczenki-vneshnosti-na-osnove-nejronnyh-setej\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041e\u0431\u0449\u0438\u0439 \u043e\u0431\u0437\u043e\u0440 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0434\u043b\u044f \u043e\u0446\u0435\u043d\u043a\u0438 \u0432\u043d\u0435\u0448\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u044b\u0445 \u0441\u0435\u0442\u0435\u0439 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\".\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/obshhij-obzor-arhitektury-servisa-dlya-oczenki-vneshnosti-na-osnove-nejronnyh-setej\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-07-18T17:42:10+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-07-18T17:42:10+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47 Aper\u00e7u g\u00e9n\u00e9ral de l'architecture du service d'\u00e9valuation de l'apparence bas\u00e9 sur des r\u00e9seaux neuronaux | ProHoster","description":".","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/obshhij-obzor-arhitektury-servisa-dlya-oczenki-vneshnosti-na-osnove-nejronnyh-setej","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041e\u0431\u0449\u0438\u0439 \u043e\u0431\u0437\u043e\u0440 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0434\u043b\u044f \u043e\u0446\u0435\u043d\u043a\u0438 \u0432\u043d\u0435\u0448\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u044b\u0445 \u0441\u0435\u0442\u0435\u0439 | ProHoster","og:description":".","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/obshhij-obzor-arhitektury-servisa-dlya-oczenki-vneshnosti-na-osnove-nejronnyh-setej","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-07-18T17:42:10+00:00","article:modified_time":"2020-07-18T17:42:10+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"89110","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 13:16:27","updated":"2022-09-29 06:10:39","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/89110","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=89110"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/89110\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/89111"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=89110"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=89110"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=89110"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}