{"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\/nl\/blog\/administrirovanie\/obshhij-obzor-arhitektury-servisa-dlya-oczenki-vneshnosti-na-osnove-nejronnyh-setej","title":{"rendered":"Algemene overzicht van de architectuur van de dienst voor het beoordelen van uiterlijke kenmerken op basis van neurale netwerken","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Algemene overzicht van de architectuur van de dienst voor het beoordelen van uiterlijke kenmerken op basis van neurale netwerken\" src=\"\/wp-content\/uploads\/2020\/07\/f624e995fbee3496f1f7890b98106df4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Inleiding<\/h2>\n<p><\/p>\n<p>Hallo!<\/p>\n<p><\/p>\n<p>In dit artikel deel ik mijn ervaring met het opbouwen van een microservicesarchitectuur voor een project dat neurale netwerken gebruikt.<\/p>\n<p><\/p>\n<p>Laten we het hebben over de vereisten voor de architectuur, verschillende structurele diagrammen bekijken, elk van de componenten van de uiteindelijke architectuur analyseren en de technische metrics van de oplossing beoordelen.<\/p>\n<p><\/p>\n<p>Prettige lectuur!<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Een paar woorden over de taak en de oplossing<\/h2>\n<p><\/p>\n<p>Het hoofddoel is om op basis van een foto de aantrekkelijkheid van een persoon op een schaal van tien te beoordelen.<\/p>\n<p><\/p>\n<p>In dit artikel zullen we afwijken van de beschrijving van zowel de gebruikte neurale netwerken als het gegevensvoorbereidings- en leerproces. Echter, in een van de volgende publicaties zullen we zeker terugkomen op de verdieping van de beoordeling.<\/p>\n<p><\/p>\n<p>Op dit moment zullen we de beoordeling op hoog niveau doornemen en de nadruk leggen op de interactie tussen de microservices in de context van de algemene architectuur van het project.\u00a0<\/p>\n<p><\/p>\n<p>Bij het werken aan de aantrekkelijkheid beoordelingspijplijn was de taak ontleed in de volgende onderdelen:<\/p>\n<p><\/p>\n<ol>\n<li>Gezichtherkenning op foto\u2019s<\/li>\n<li>Beoordeling van elk van de gezichten<\/li>\n<li>Rendering van het resultaat<\/li>\n<\/ol>\n<p><\/p>\n<p>Het eerste wordt opgepakt door de voorgetrainde <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1604.02878\">MTCNN<\/a><\/noindex>. Voor het tweede werd een convolutioneel neuraal netwerk getraind op PyTorch, met als backbone <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1512.03385\">ResNet34<\/a><\/noindex> \u2013 voor de balans tussen \"kwaliteit \/ snelheid van inferentie op CPU\"<\/p>\n<p>\n<img decoding=\"async\" alt=\"Algemene overzicht van de architectuur van de dienst voor het beoordelen van uiterlijke kenmerken op basis van neurale netwerken\" src=\"\/wp-content\/uploads\/2020\/07\/181cc89a2cf5295bdcd4b838216f96d6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Functioneel diagram van de beoordelingspijplijn<\/i><\/p>\n<p><\/p>\n<h2>Analyse van de vereisten voor de architectuur van het project<\/h2>\n<p><\/p>\n<p>In de levenscyclus <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Machine_learning\">ML<\/a><\/noindex> van het project zijn de fasen van werken aan de architectuur en de automatisering van het implementeren van het model vaak de meest tijdrovende en resource-intensieve.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Algemene overzicht van de architectuur van de dienst voor het beoordelen van uiterlijke kenmerken op basis van neurale netwerken\" src=\"\/wp-content\/uploads\/2020\/07\/4949f217d31c863176122ed87b43a88c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Levenscyclus van een ML-project<\/i><\/p>\n<p><\/p>\n<p>Dit project is geen uitzondering \u2013 het werd besloten om de beoordelingspijplijn te verpakken in een online service, waarvoor het nodig was om zich in de architectuur te verdiepen. Er werden de volgende basisvereisten vastgesteld:<\/p>\n<p><\/p>\n<ol>\n<li>E\u00e9n opslagplaats voor logs \u2013 alle diensten moeten logs op \u00e9\u00e9n locatie schrijven, ze moeten gemakkelijk te analyseren zijn<\/li>\n<li>Mogelijkheid tot horizontale schaalvergroting van de beoordelingsdienst \u2014 als de meest waarschijnlijke bottleneck<\/li>\n<li>Voor elke afbeelding moet een gelijk aantal CPU-resources worden toegewezen \u2014 om uitschieters in de tijdsverdeling van de inferentie te vermijden<\/li>\n<li>Snelle (her)implementatie van zowel specifieke diensten als de stack in zijn geheel<\/li>\n<li>De mogelijkheid om indien nodig gedeelde objecten in verschillende services te gebruiken.<\/li>\n<\/ol>\n<p><\/p>\n<h2>Architectuur<\/h2>\n<p><\/p>\n<p>Na analyse van de vereisten bleek dat de microservicesarchitectuur vrijwel perfect past.<\/p>\n<p><\/p>\n<p>Om onnodige hoofdpijn te vermijden, is Telegram API als frontend gekozen.<\/p>\n<p><\/p>\n<p>Laten we beginnen met het structurele diagram van de voltooide architectuur, waarna we elk van de componenten zullen beschrijven en formeel het proces van succesvolle afbeeldingverwerking zullen vastleggen.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Algemene overzicht van de architectuur van de dienst voor het beoordelen van uiterlijke kenmerken op basis van neurale netwerken\" src=\"\/wp-content\/uploads\/2020\/07\/163ec019341e9d71a1e0854c6026bd01.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Structureel diagram van de voltooide architectuur<\/i><\/p>\n<p><\/p>\n<p>Laten we gedetailleerd ingaan op elk van de componenten van het diagram en hun Single Responsibility in het beoordelingsproces van de afbeelding aanduiden.<\/p>\n<p><\/p>\n<h3>Microservice 'attrai-telegram-bot'<\/h3>\n<p><\/p>\n<p>Deze microservice encapsuleert alle interacties met de Telegram API. Twee belangrijke scenario's kunnen worden onderscheiden: het werken met de gebruikersafbeelding en het werken met het resultaat van de beoordelingspipeline. We zullen beide scenario's in algemene termen bekijken.<\/p>\n<p><\/p>\n<p>Bij het ontvangen van een gebruikersbericht met een afbeelding:<\/p>\n<p><\/p>\n<ol>\n<li>Wordt er een filtering uitgevoerd bestaande uit de volgende controles:\n<ul>\n<li>De aanwezigheid van een optimale afbeeldingsgrootte<\/li>\n<li>Het aantal afbeeldingen van de gebruiker dat al in de wachtrij staat<\/li>\n<\/ul>\n<\/li>\n<li>Na het doorlopen van de eerste filtering wordt de afbeelding opgeslagen in een docker volume<\/li>\n<li>Er wordt een taak naar de wachtrij 'to_estimate' gestuurd, waarin onder andere het pad naar de afbeelding in onze volume is opgenomen.<\/li>\n<li>Als bovenstaande stappen succesvol zijn doorlopen, ontvangt de gebruiker een bericht met de geschatte verwerkingstijd van de afbeelding, berekend op basis van het aantal taken in de wachtrij. In het geval van een fout wordt de gebruiker duidelijk ge\u00efnformeerd via een bericht met informatie over wat er mogelijk verkeerd is gegaan. <\/li>\n<\/ol>\n<p><\/p>\n<p>Deze microservice fungeert ook als celery worker en luistert naar de wachtrij 'after_estimate', die bedoeld is voor taken die de beoordelingspipeline hebben doorlopen.<\/p>\n<p><\/p>\n<p>Bij het ontvangen van een nieuwe taak uit 'after_estimate':<\/p>\n<p><\/p>\n<ol>\n<li>Als de afbeelding succesvol is verwerkt, sturen we het resultaat naar de gebruiker; als dat niet het geval is, informeren we over de fout.<\/li>\n<li>Verwijder de afbeelding die het resultaat is van de beoordelingspipeline.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Microservice voor beoordeling 'attrai-estimator'<\/h3>\n<p><\/p>\n<p>Deze microservice is een celery worker en encapsuleert alles wat met de beoordelingspipeline van de afbeelding te maken heeft. Het werkingsalgoritme is hier \u00e9\u00e9n en we zullen het uiteenzetten.<\/p>\n<p><\/p>\n<p>Bij het ontvangen van een nieuwe taak uit 'to_estimate':<\/p>\n<p><\/p>\n<ol>\n<li>We run the image through the evaluation pipeline:\n<ol>\n<li>Loading the image into memory<\/li>\n<li>Resizing the image to the required dimensions<\/li>\n<li>Detecting all faces (MTCNN)<\/li>\n<li>Evaluating all faces (batching the detected faces from the previous step and inferring with ResNet34)<\/li>\n<li>Rendering the final image\n<ol>\n<li>Drawing bounding boxes<\/li>\n<li>Drawing evaluations<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<\/li>\n<li>Removing the user\u2019s (original) image<\/li>\n<li>Saving the output from the evaluation pipeline<\/li>\n<li>Adding the task to the 'after_estimate' queue, which is listened to by the previously discussed microservice 'attrai-telegram-bot'<\/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 is a solution for centralized log management. In this project, it was used for its intended purpose.<\/p>\n<p><\/p>\n<p>The choice fell precisely on it, instead of the familiar <noindex><a rel=\"nofollow\" href=\"https:\/\/www.elastic.co\/what-is\/elk-stack\">ELK<\/a><\/noindex> stack, due to the convenience of working with it from Python. All that needs to be done for logging in Graylog is to add GELFTCPHandler from the package <noindex><a rel=\"nofollow\" href=\"https:\/\/pypi.org\/project\/graypy\/\">graypy<\/a><\/noindex> to the other root logger handlers of our python microservice.<\/p>\n<p><\/p>\n<p>As someone who previously worked only with the ELK stack, I overall had a positive experience using Graylog. The only downside is the superior features of Kibana over Graylog's web interface.<\/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 is a message broker based on the AMQP protocol.<\/p>\n<p><\/p>\n<p>In this project, it was used as <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.celeryproject.org\/en\/latest\/getting-started\/brokers\/#broker-overview\">the most stable and time-tested<\/a><\/noindex> broker for Celery and operated in durable mode.<\/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 is a NoSQL database management system that works with key-value data structures.<\/p>\n<p><\/p>\n<p>Sometimes there's a need to share common objects implementing certain data structures across different python microservices.<\/p>\n<p><\/p>\n<p>For example, Redis stores a hashmap of 'telegram_user_id =&gt; number of active tasks in the queue', which allows limiting the number of requests from a single user to a specific value, thereby preventing DoS attacks.<\/p>\n<p><\/p>\n<h3>Formalizing the process of successful image processing<\/h3>\n<p><\/p>\n<ol>\n<li>The user sends an image to the Telegram bot<\/li>\n<li>'attrai-telegram-bot' receives the message from the Telegram API and parses it<\/li>\n<li>The task with the image is added to the asynchronous queue 'to_estimate'<\/li>\n<li>The user receives a message with the planned evaluation time<\/li>\n<li>'attrai-estimator' takes the task from the 'to_estimate' queue, processes it through the evaluation pipeline, and produces the task into the 'after_estimate' queue<\/li>\n<li>'attrai-telegram-bot', listening to the 'after_estimate' queue, sends the result back to the user<\/li>\n<\/ol>\n<p><\/p>\n<h2>DevOps<\/h2>\n<p><\/p>\n<p>Uiteindelijk, na het overzicht van de architectuur, kunnen we naar het niet minder interessante deel gaan \u2014 DevOps<\/p>\n<p><\/p>\n<h3>Docker Swarm<\/h3>\n<p><\/p>\n<p>\u00a0<\/p>\n<p>\n<img decoding=\"async\" alt=\"Algemene overzicht van de architectuur van de dienst voor het beoordelen van uiterlijke kenmerken op basis van neurale netwerken\" 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\/\">Docker Swarm <\/a><\/noindex>\u00a0\u2014 een clustersysteem waarvan de functionaliteit is ge\u00efmplementeerd binnen Docker Engine en standaard beschikbaar is.<\/p>\n<p><\/p>\n<p>Met de \u2018swarm\u2019 kunnen we alle knooppunten van onze cluster onderverdelen in 2 types \u2013 worker en manager. Op de machines van het eerste type worden groepen containers (stacks) uitgerold, de machines van het tweede type zijn verantwoordelijk voor schaling, balans en <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/swarm\/#feature-highlights\">andere geweldige functies<\/a><\/noindex>. Managers zijn standaard ook workers.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Algemene overzicht van de architectuur van de dienst voor het beoordelen van uiterlijke kenmerken op basis van neurale netwerken\" src=\"\/wp-content\/uploads\/2020\/07\/d195e2aab6d3552652102c2b5246abfc.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Een cluster met \u00e9\u00e9n leader manager en drie workers<\/i><\/p>\n<p><\/p>\n<p>De minimaal mogelijke grootte van een cluster is 1 knoop, de enige machine zal tegelijkertijd functioneren als zowel leader manager als worker. Gezien de grootte van het project en de minimale eisen aan redundantie is besloten om deze aanpak te gebruiken.<\/p>\n<p><\/p>\n<p>Om vooruit te lopen, kan ik zeggen dat sinds de eerste productieplaatsing, die halverwege juni was, er geen problemen zijn geweest met deze clustervorming (maar dat betekent niet dat deze structuur in enige middelgrote tot grote projecten zonder eisen aan redundantie aanvaardbaar is).<\/p>\n<p><\/p>\n<h3>Docker Stack<\/h3>\n<p><\/p>\n<p>In de \u2018swarm\u2019 modus is de inzet van stacks (sets van docker services) verantwoordelijk voor <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/reference\/commandline\/stack\/\">docker stack<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Het ondersteunt docker-compose configuraties, waardoor het ook mogelijk is om deploy parameters te gebruiken.\u00a0\u00a0<\/p>\n<p><\/p>\n<p>Bijvoorbeeld, met deze parameters zijn de resources op elk van de instanties van de beoordelings microservice beperkt (we wijzen N cores toe op N instanties; in de microservice beperken we het aantal cores dat door PyTorch wordt gebruikt tot \u00e9\u00e9n)<\/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>Het is belangrijk op te merken dat Redis, RabbitMQ en Graylog \u2014 stateful services zijn en het is niet zo eenvoudig om ze te schalen als \u2018attrai-estimator\u2019<\/p>\n<p><\/p>\n<h3>Voordat ik de vraag voorschotelde \u2014 waarom niet Kubernetes?<\/h3>\n<p><\/p>\n<p>Het lijkt erop dat het gebruik van Kubernetes in kleine en middelgrote projecten overbodig is, alle benodigde functionaliteit kan worden verkregen van Docker Swarm, dat vrij gebruiksvriendelijk is als container orchestrator en bovendien een lage instapdrempel heeft.<\/p>\n<p><\/p>\n<h3>Infrastructuur<\/h3>\n<p><\/p>\n<p>Dit alles werd uitgerold op een VDS met de volgende specificaties:<\/p>\n<p><\/p>\n<ul>\n<li>CPU: 4 kernen Intel\u00ae Xeon\u00ae Gold 5120 CPU @ 2.20GHz<\/li>\n<li>RAM: 8 GB<\/li>\n<li>SSD: 160 GB<\/li>\n<\/ul>\n<p><\/p>\n<p>Na het lokale belastingstest leek het erop dat deze machine bij een sterke toestroom van gebruikers net voldoende zou zijn.<\/p>\n<p><\/p>\n<p>Maar meteen na de deploy heb ik een link gepost naar een van de meest populaire afbeeldingsborden in de GOS (ja, diezelfde), waarna mensen ge\u00efnteresseerd raakten en de service binnen enkele uren tienduizenden afbeeldingen succesvol verwerkte. In de piekmomenten werden de CPU- en RAM-resources niet eens voor de helft gebruikt.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Algemene overzicht van de architectuur van de dienst voor het beoordelen van uiterlijke kenmerken op basis van neurale netwerken\" src=\"\/wp-content\/uploads\/2020\/07\/458d74dae00d455fbce1ca6a197325d7.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Algemene overzicht van de architectuur van de dienst voor het beoordelen van uiterlijke kenmerken op basis van neurale netwerken\" src=\"\/wp-content\/uploads\/2020\/07\/e9383c47369c606d26e89a69f4d22b5a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Nog wat grafieken<\/h3>\n<p><\/p>\n<p>Aantal unieke gebruikers en evaluatieverzoeken, sinds de deploy, afhankelijk van de dag<\/p>\n<p>\n<img decoding=\"async\" alt=\"Algemene overzicht van de architectuur van de dienst voor het beoordelen van uiterlijke kenmerken op basis van neurale netwerken\" src=\"\/wp-content\/uploads\/2020\/07\/7112c78c8400d2ac73562243b16a015b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Verdeling van de inferentietijd van de evaluatiepipeline<\/p>\n<p>\n<img decoding=\"async\" alt=\"Algemene overzicht van de architectuur van de dienst voor het beoordelen van uiterlijke kenmerken op basis van neurale netwerken\" src=\"\/wp-content\/uploads\/2020\/07\/4c892ce607c3ff3db466459729dd0876.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Conclusies<\/h2>\n<p><\/p>\n<p>Samenvattend kan ik zeggen dat de architectuur en de benadering van containerorkestratie volledig gerechtvaardigd zijn \u2014 zelfs in piekmomenten waren er geen uitval of vertragingen in de verwerkingstijd.\u00a0<\/p>\n<p><\/p>\n<p>Ik denk dat kleine en middelgrote projecten die real-time inferentie van neurale netwerken op CPU gebruiken, succesvol de praktijken uit dit artikel kunnen overnemen.<\/p>\n<p><\/p>\n<p>Ik voeg toe dat het artikel oorspronkelijk langer was, maar om geen longread te posten, heb ik bepaalde punten in dit artikel weggelaten \u2014 we zullen daarop terugkomen in volgende publicaties.<\/p>\n<p><\/p>\n<p>Je kunt de bot uitproberen op Telegram \u2014 @AttraiBot, het zal in ieder geval werken tot het einde van de herfst van 2020. Ter herinnering \u2014 er worden geen gebruikersgegevens opgeslagen \u2014 noch de originele afbeeldingen, noch de resultaten van de evaluatiepipeline \u2014 alles wordt na verwerking gewist.<\/p>\n<p>Bron: <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.3 - 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\/nl\/blog\/administrirovanie\/obshhij-obzor-arhitektury-servisa-dlya-oczenki-vneshnosti-na-osnove-nejronnyh-setej\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"nl_NL\" \/>\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\/nl\/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\udd47Algemene overzicht van de architectuur van de service voor het beoordelen van uiterlijk op basis van neurale netwerken | ProHoster","description":".","canonical_url":"https:\/\/prohoster.info\/nl\/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":"nl_NL","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\/nl\/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\/nl\/wp-json\/wp\/v2\/posts\/89110","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=89110"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/89110\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media\/89111"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=89110"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=89110"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=89110"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}