{"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\/it\/blog\/administrirovanie\/obshhij-obzor-arhitektury-servisa-dlya-oczenki-vneshnosti-na-osnove-nejronnyh-setej","title":{"rendered":"Panoramica generale dell'architettura del servizio per la valutazione dell'aspetto basata su reti neurali","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Panoramica generale dell&#039;architettura del servizio per la valutazione dell&#039;aspetto basata su reti neurali\" src=\"\/wp-content\/uploads\/2020\/07\/f624e995fbee3496f1f7890b98106df4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Introduzione<\/h2>\n<p><\/p>\n<p>Ciao!<\/p>\n<p><\/p>\n<p>In questo articolo condivider\u00f2 l'esperienza nella costruzione di un'architettura microservizi per un progetto che utilizza reti neurali.<\/p>\n<p><\/p>\n<p>Parleremo dei requisiti per l'architettura, daremo un'occhiata ai diversi diagrammi strutturali, analizzeremo ciascuno dei componenti dell'architettura pronta e valuteremo le metriche tecniche della soluzione.<\/p>\n<p><\/p>\n<p>Buona lettura!<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Qualche parola sul compito e la sua soluzione<\/h2>\n<p><\/p>\n<p>L'idea principale \u00e8 quella di fornire una valutazione dell'attrattivit\u00e0 di una persona basata su una foto, utilizzando una scala da uno a dieci.<\/p>\n<p><\/p>\n<p>In questo articolo ci allontaneremo dalla descrizione delle reti neurali utilizzate e del processo di preparazione dei dati e di addestramento. Tuttavia, in una delle prossime pubblicazioni, torneremo sicuramente ad analizzare il pipeline di valutazione a un livello pi\u00f9 approfondito.<\/p>\n<p><\/p>\n<p>Ora percorreremo a livello alto il pipeline di valutazione, concentrandoci sull'interazione dei microservizi nel contesto dell'architettura generale del progetto.\u00a0<\/p>\n<p><\/p>\n<p>Durante il lavoro sul pipeline di valutazione dell'attrattivit\u00e0, il compito \u00e8 stato scomposto nei seguenti componenti:<\/p>\n<p><\/p>\n<ol>\n<li>Identificazione dei volti nelle foto<\/li>\n<li>Valutazione di ciascuno dei volti<\/li>\n<li>Rendering del risultato<\/li>\n<\/ol>\n<p><\/p>\n<p>Il primo viene risolto attraverso una rete pre-addestrata di <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1604.02878\">MTCNN<\/a><\/noindex>. Per il secondo \u00e8 stata addestrata una rete neurale convoluzionale su PyTorch, utilizzando come backbone <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1512.03385\">ResNet34<\/a><\/noindex> \u2013 dal bilancio \"qualit\u00e0 \/ velocit\u00e0 di inferenza su CPU\"<\/p>\n<p>\n<img decoding=\"async\" alt=\"Panoramica generale dell&#039;architettura del servizio per la valutazione dell&#039;aspetto basata su reti neurali\" src=\"\/wp-content\/uploads\/2020\/07\/181cc89a2cf5295bdcd4b838216f96d6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Diagramma funzionale del pipeline di valutazione<\/i><\/p>\n<p><\/p>\n<h2>Analisi dei requisiti per l'architettura del progetto<\/h2>\n<p><\/p>\n<p>Nel ciclo di vita <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Machine_learning\">ML<\/a><\/noindex> di un progetto, le fasi di lavoro sull'architettura e sull'automazione del rilascio del modello sono spesso tra le pi\u00f9 dispendiose in termini di tempo e risorse.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Panoramica generale dell&#039;architettura del servizio per la valutazione dell&#039;aspetto basata su reti neurali\" src=\"\/wp-content\/uploads\/2020\/07\/4949f217d31c863176122ed87b43a88c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Ciclo di vita di un progetto ML<\/i><\/p>\n<p><\/p>\n<p>Questo progetto non fa eccezione: \u00e8 stata presa la decisione di racchiudere il pipeline di valutazione in un servizio online, per il quale \u00e8 stato necessario immergersi nell'architettura. Sono stati definiti i seguenti requisiti di base:<\/p>\n<p><\/p>\n<ol>\n<li>Un'unica archiviazione dei log: tutti i servizi devono scrivere i log in un unico posto, con la possibilit\u00e0 di analizzarli facilmente.<\/li>\n<li>Possibilit\u00e0 di scaling orizzontale del servizio di valutazione \u2014 come il pi\u00f9 probabile collo di bottiglia.<\/li>\n<li>A ciascuna immagine deve essere allocato lo stesso numero di risorse della CPU \u2014 per evitare sbalzi nella distribuzione del tempo di inferenza.<\/li>\n<li>Rilascio rapido (ripristino) sia di servizi specifici che dell'intero stack.<\/li>\n<li>La possibilit\u00e0, se necessario, di utilizzare oggetti comuni in diversi servizi<\/li>\n<\/ol>\n<p><\/p>\n<h2>Architettura<\/h2>\n<p><\/p>\n<p>Dopo aver analizzato i requisiti, \u00e8 diventato chiaro che l'architettura a microservizi si adatta praticamente perfettamente.<\/p>\n<p><\/p>\n<p>Per evitare ulteriori grattacapi, \u00e8 stata scelta l'API di Telegram come front-end.<\/p>\n<p><\/p>\n<p>Iniziamo esaminando il diagramma strutturale dell'architettura pronta, quindi passeremo alla descrizione di ciascun componente e formalizzeremo il processo di elaborazione delle immagini con successo.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Panoramica generale dell&#039;architettura del servizio per la valutazione dell&#039;aspetto basata su reti neurali\" src=\"\/wp-content\/uploads\/2020\/07\/163ec019341e9d71a1e0854c6026bd01.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Diagramma strutturale dell'architettura pronta<\/i><\/p>\n<p><\/p>\n<p>Parliamo pi\u00f9 in dettaglio di ciascun componente del diagramma, evidenziando il loro Single Responsibility nel processo di valutazione dell'immagine.<\/p>\n<p><\/p>\n<h3>Microservizio \u00abattrai-telegram-bot\u00bb<\/h3>\n<p><\/p>\n<p>Questo microservizio incapsula tutte le interazioni con l'API di Telegram. Si possono individuare 2 scenari principali: lavoro con l'immagine dell'utente e lavoro con il risultato del pipeline di valutazione. Analizzeremo entrambi gli scenari in modo generale.<\/p>\n<p><\/p>\n<p>Quando si riceve un messaggio dall'utente contenente un'immagine:<\/p>\n<p><\/p>\n<ol>\n<li>Viene eseguita una filtrazione, composta dai seguenti controlli:\n<ul>\n<li>Presenza di dimensioni ottimali dell'immagine<\/li>\n<li>Numero di immagini dell'utente gi\u00e0 in coda<\/li>\n<\/ul>\n<\/li>\n<li>Superata la filtrazione iniziale, l'immagine viene salvata nel volume Docker<\/li>\n<li>Nel queue 'to_estimate' viene prodotto un task, nel quale \u00e8 incluso il percorso dell'immagine nel nostro volume<\/li>\n<li>Se le fasi sopra indicate vengono superate con successo, l'utente ricever\u00e0 un messaggio con il tempo approssimativo di elaborazione dell'immagine, calcolato in base al numero di task in coda. In caso di errore, l'utente verr\u00e0 informato chiaramente tramite un messaggio con informazioni su ci\u00f2 che potrebbe essere andato storto. <\/li>\n<\/ol>\n<p><\/p>\n<p>Inoltre, questo microservizio, come lavoratore Celery, ascolta la coda 'after_estimate', destinata ai task che hanno superato il pipeline di valutazione.<\/p>\n<p><\/p>\n<p>Quando si riceve un nuovo task da 'after_estimate':<\/p>\n<p><\/p>\n<ol>\n<li>Se l'immagine \u00e8 stata elaborata con successo, inviamo il risultato all'utente; se no, informiamo dell'errore.<\/li>\n<li>Eliminiamo l'immagine, che \u00e8 il risultato del pipeline di valutazione.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Microservizio di valutazione \u00abattrai-estimator\u00bb<\/h3>\n<p><\/p>\n<p>Questo microservizio \u00e8 un lavoratore Celery e incapsula tutto ci\u00f2 che riguarda il pipeline di valutazione dell'immagine. L'algoritmo di funzionamento \u00e8 semplice: lo analizziamo.<\/p>\n<p><\/p>\n<p>Quando si riceve un nuovo task da 'to_estimate':<\/p>\n<p><\/p>\n<ol>\n<li>Passiamo l'immagine attraverso il pipeline di valutazione:\n<ol>\n<li>Carichiamo l'immagine in memoria<\/li>\n<li>Modifichiamo l'immagine alla dimensione necessaria<\/li>\n<li>Troviamo tutti i volti (MTCNN)<\/li>\n<li>Valutiamo tutti i volti (incapsuliamo i volti trovati nel passo precedente in un batch e inferring ResNet34)<\/li>\n<li>Renderizziamo l'immagine finale\n<ol>\n<li>Disegniamo i bounding box<\/li>\n<li>Disegniamo le valutazioni<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<\/li>\n<li>Eliminiamo l'immagine dell'utente (originale)<\/li>\n<li>Salviamo l'uscita dal pipeline di valutazione<\/li>\n<li>Mettiamo il task nella coda 'after_estimate', ascoltata dal microservizio 'attrai-telegram-bot' sopra descritto<\/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 \u00e8 una soluzione per la gestione centralizzata dei log. In questo progetto, \u00e8 stato utilizzato per il suo scopo originale.<\/p>\n<p><\/p>\n<p>La scelta \u00e8 caduta proprio su di lui, e non sul noto <noindex><a rel=\"nofollow\" href=\"https:\/\/www.elastic.co\/what-is\/elk-stack\">ELK<\/a><\/noindex> stack, per il motivo della facilit\u00e0 di lavoro con esso da Python. Tutto ci\u00f2 che \u00e8 necessario fare per il logging in Graylog \u00e8 aggiungere GELFTCPHandler dal pacchetto <noindex><a rel=\"nofollow\" href=\"https:\/\/pypi.org\/project\/graypy\/\">graypy<\/a><\/noindex> agli altri handler del root logger del nostro microservizio Python.<\/p>\n<p><\/p>\n<p>Io, come persona che ha lavorato solo con lo stack ELK fino ad ora, ho avuto un'esperienza positiva durante il lavoro con Graylog. L'unica cosa che delude \u00e8 la superiorit\u00e0 delle funzionalit\u00e0 di Kibana rispetto all'interfaccia web di 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 \u00e8 un broker di messaggi basato sul protocollo AMQP.<\/p>\n<p><\/p>\n<p>In questo progetto \u00e8 stato utilizzato come <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.celeryproject.org\/en\/latest\/getting-started\/brokers\/#broker-overview\">broker pi\u00f9 stabile e collaudato dal tempo<\/a><\/noindex> per Celery e ha funzionato in modalit\u00e0 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 \u00e8 un DBMS NoSQL che lavora con strutture di dati di tipo 'chiave \u2014 valore'<\/p>\n<p><\/p>\n<p>A volte c'\u00e8 la necessit\u00e0 di utilizzare oggetti comuni tra diversi microservizi Python che implementano determinate strutture di dati.<\/p>\n<p><\/p>\n<p>Ad esempio, in Redis si memorizza una hashmap del tipo 'telegram_user_id =&gt; numero di task attivi in coda', il che consente di limitare il numero di richieste da un singolo utente a un valore specifico e, in tal modo, prevenire attacchi DoS.<\/p>\n<p><\/p>\n<h3>Formalizziamo il processo di elaborazione dell'immagine<\/h3>\n<p><\/p>\n<ol>\n<li>L'utente invia un'immagine al bot di Telegram<\/li>\n<li>\u2018attrai-telegram-bot\u2019 riceve il messaggio dall'API di Telegram e lo analizza<\/li>\n<li>Il task con l'immagine viene aggiunto alla coda asincrona 'to_estimate'<\/li>\n<li>L'utente riceve un messaggio con il tempo previsto di valutazione<\/li>\n<li>\u2018attrai-estimator\u2019 prende il task dalla coda 'to_estimate', lo passa attraverso il pipeline di valutazione e produce il task nella coda 'after_estimate'<\/li>\n<li>\u2018attrai-telegram-bot\u2019, che ascolta la coda 'after_estimate', invia il risultato all'utente<\/li>\n<\/ol>\n<p><\/p>\n<h2>DevOps<\/h2>\n<p><\/p>\n<p>Finalmente, dopo aver esaminato l'architettura, possiamo passare a una parte altrettanto interessante: il DevOps<\/p>\n<p><\/p>\n<h3>Docker Swarm<\/h3>\n<p><\/p>\n<p>\u00a0<\/p>\n<p>\n<img decoding=\"async\" alt=\"Panoramica generale dell&#039;architettura del servizio per la valutazione dell&#039;aspetto basata su reti neurali\" 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 sistema di clustering il cui funzionamento \u00e8 implementato all'interno di Docker Engine e disponibile out of the box.<\/p>\n<p><\/p>\n<p>Attraverso il \"swoop\", tutti i nodi del nostro cluster possono essere divisi in 2 tipi: worker e manager. Sulle macchine del primo tipo vengono distribuiti gruppi di container (stack), mentre le macchine del secondo tipo si occupano della scalabilit\u00e0, del bilanciamento e <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/swarm\/#feature-highlights\">di altre funzionalit\u00e0 interessanti<\/a><\/noindex>. I manager, per impostazione predefinita, sono anche worker.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Panoramica generale dell&#039;architettura del servizio per la valutazione dell&#039;aspetto basata su reti neurali\" src=\"\/wp-content\/uploads\/2020\/07\/d195e2aab6d3552652102c2b5246abfc.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Cluster con un leader manager e tre worker<\/i><\/p>\n<p><\/p>\n<p>La dimensione minima possibile del cluster \u00e8 di 1 nodo, l'unica macchina funger\u00e0 sia da leader manager che da worker. In base alle dimensioni del progetto e ai requisiti minimi di tolleranza ai guasti, \u00e8 stata presa la decisione di utilizzare proprio questo approccio.<\/p>\n<p><\/p>\n<p>In anticipo, posso dire che, dall'implementazione della prima produzione, avvenuta a met\u00e0 giugno, non ci sono stati problemi legati a questa organizzazione del cluster (ma questo non significa che tale organizzazione sia minimamente accettabile in qualsiasi progetto medio-grande, a cui si applicano requisiti di tolleranza ai guasti).<\/p>\n<p><\/p>\n<h3>Docker Stack<\/h3>\n<p><\/p>\n<p>In modalit\u00e0 \"swoop\", la distribuzione degli stack (insiemi di servizi docker) \u00e8 gestita da <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/reference\/commandline\/stack\/\">docker stack<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Supporta le configurazioni docker-compose, consentendo di utilizzare anche parametri di deploy.\u00a0\u00a0<\/p>\n<p><\/p>\n<p>Ad esempio, utilizzando questi parametri sono state limitate le risorse per ciascuno degli istanze del microservizio di valutazione (dedicando N core a N istanze, nel microservizio limitiamo il numero di core utilizzato da PyTorch a uno)<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">attrai_estimator:\n\u00a0\u00a0image: 'erqups\/attrai_estimator:1.2'\n\u00a0\u00a0deploy:\n\u00a0\u00a0\u00a0\u00a0replicas: 4\n\u00a0\u00a0\u00a0\u00a0resources:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0limits:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0cpus: '4'\n\u00a0\u00a0\u00a0\u00a0restart_policy:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0condition: on-failure\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u2026<\/code><\/pre>\n<p><\/p>\n<p>\u00c8 importante notare che Redis, RabbitMQ e Graylog sono servizi stateful e non \u00e8 cos\u00ec semplice scalare anche loro come \"attrai-estimator\".<\/p>\n<p><\/p>\n<h3>Anticipando la domanda: perch\u00e9 non Kubernetes?<\/h3>\n<p><\/p>\n<p>Sembra che utilizzare Kubernetes in progetti di piccole e medie dimensioni sia un sovraccarico, tutta la funzionalit\u00e0 necessaria pu\u00f2 essere ottenuta da Docker Swarm, che \u00e8 piuttosto user friendly come orchestratore di container, e ha anche una bassa barriera all'ingresso.<\/p>\n<p><\/p>\n<h3>Infrastruttura<\/h3>\n<p><\/p>\n<p>Tutto ci\u00f2 \u00e8 stato distribuito su un VDS con le seguenti caratteristiche:<\/p>\n<p><\/p>\n<ul>\n<li>CPU: 4 core 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>Dopo un test di carico locale, sembrava che con un forte afflusso di utenti, questa macchina fosse al limite.<\/p>\n<p><\/p>\n<p>Ma subito dopo il deploy, ho condiviso il link a uno dei pi\u00f9 popolari imageboard della CSI (s\u00ec, proprio quello), dopo di che le persone si sono interessate e in poche ore il servizio ha elaborato con successo decine di migliaia di immagini. In questo caso, nei momenti di picco, le risorse CPU e RAM non sono state utilizzate nemmeno a met\u00e0.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Panoramica generale dell&#039;architettura del servizio per la valutazione dell&#039;aspetto basata su reti neurali\" src=\"\/wp-content\/uploads\/2020\/07\/458d74dae00d455fbce1ca6a197325d7.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Panoramica generale dell&#039;architettura del servizio per la valutazione dell&#039;aspetto basata su reti neurali\" src=\"\/wp-content\/uploads\/2020\/07\/e9383c47369c606d26e89a69f4d22b5a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Un'altra grafica<\/h3>\n<p><\/p>\n<p>Numero di utenti unici e richieste di valutazione, dal momento del deploy, a seconda del giorno<\/p>\n<p>\n<img decoding=\"async\" alt=\"Panoramica generale dell&#039;architettura del servizio per la valutazione dell&#039;aspetto basata su reti neurali\" src=\"\/wp-content\/uploads\/2020\/07\/7112c78c8400d2ac73562243b16a015b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Distribuzione dei tempi di inferenza del pipeline di valutazione<\/p>\n<p>\n<img decoding=\"async\" alt=\"Panoramica generale dell&#039;architettura del servizio per la valutazione dell&#039;aspetto basata su reti neurali\" src=\"\/wp-content\/uploads\/2020\/07\/4c892ce607c3ff3db466459729dd0876.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Conclusioni<\/h2>\n<p><\/p>\n<p>In sintesi, posso dire che l'architettura e l'approccio all'orchestrazione dei contenitori si sono dimostrati completamente validi: anche nei momenti di picco non ci sono stati cali o ritardi nei tempi di elaborazione.\u00a0<\/p>\n<p><\/p>\n<p>Penso che i progetti di piccole e medie dimensioni che utilizzano l'inferenza in tempo reale delle reti neurali su CPU possano adottare con successo le pratiche descritte in questo articolo.<\/p>\n<p><\/p>\n<p>Aggiungo che inizialmente l'articolo era pi\u00f9 lungo, ma per non pubblicare un lungo post ho deciso di omettere alcuni punti in questo articolo \u2014 torneremo su di essi nei prossimi articoli.<\/p>\n<p><\/p>\n<p>Puoi provare il bot su Telegram \u2014 @AttraiBot, funzioner\u00e0 almeno fino alla fine dell'autunno 2020. Ricordo che nessun dato utente viene memorizzato \u2014 n\u00e9 le immagini originali n\u00e9 i risultati del pipeline di valutazione \u2014 tutto viene eliminato dopo l'elaborazione.<\/p>\n<p>Fonte: <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.1.1 - 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\/it\/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.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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\/it\/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\udd47Panoramica generale dell'architettura del servizio per la valutazione dell'aspetto basata su reti neurali | ProHoster","description":".","canonical_url":"https:\/\/prohoster.info\/it\/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":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/89110","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=89110"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/89110\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/89111"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=89110"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=89110"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=89110"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}