{"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 valutare l'aspetto basato sulle reti neurali.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Panoramica generale dell&#039;architettura del servizio per valutare l&#039;aspetto basato sulle 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>Discuteremo i requisiti architetturali, analizzeremo vari diagrammi strutturali, esamineremo ciascun componente dell'architettura gi\u00e0 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>Un paio di parole sul compito e sulla sua soluzione<\/h2>\n<p><\/p>\n<p>L'idea principale \u00e8 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 non ci concentreremo sulla descrizione delle reti neurali utilizzate n\u00e9 sul processo di preparazione dei dati e dell'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 daremo un'occhiata al pipeline di valutazione a un livello alto, ponendo l'accento sull'interazione dei microservizi nel contesto dell'architettura generale del progetto.\u00a0<\/p>\n<p><\/p>\n<p>Nell'affrontare il pipeline di valutazione dell'attrattivit\u00e0, il compito \u00e8 stato decomposto nei seguenti elementi:<\/p>\n<p><\/p>\n<ol>\n<li>Riconoscimento dei volti nelle foto<\/li>\n<li>Valutazione di ciascun volto<\/li>\n<li>Rendering del risultato<\/li>\n<\/ol>\n<p><\/p>\n<p>Il primo \u00e8 risolto da un modello pre-addestrato <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 in bilanciamento tra \u00abqualit\u00e0 \/ velocit\u00e0 di inferenza su CPU\u00bb<\/p>\n<p>\n<img decoding=\"async\" alt=\"Panoramica generale dell&#039;architettura del servizio per valutare l&#039;aspetto basato sulle 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\">Supporto ML<\/a><\/noindex> del progetto, le fasi di lavoro sulla progettazione e automazione del deployment del modello sono spesso 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 valutare l&#039;aspetto basato sulle reti neurali.\" src=\"\/wp-content\/uploads\/2020\/07\/4949f217d31c863176122ed87b43a88c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Ciclo di vita del progetto ML<\/i><\/p>\n<p><\/p>\n<p>Questo progetto non fa eccezione \u2013 \u00e8 stata presa la decisione di avvolgere il pipeline di valutazione in un servizio online, il che ha richiesto un'immersione nell'architettura. Sono stati definiti i seguenti requisiti di base:<\/p>\n<p><\/p>\n<ol>\n<li>Un'unica repository dei log \u2013 tutti i servizi devono scrivere i log in un unico posto, rendendo facile l'analisi<\/li>\n<li>Possibilit\u00e0 di scalabilit\u00e0 orizzontale del servizio di valutazione \u2014 come il possibile colosso Bottleneck<\/li>\n<li>A ciascuna immagine deve essere dedicata la stessa quantit\u00e0 di risorse del processore \u2014 per evitare outlier nella distribuzione dei tempi di inferenza<\/li>\n<li>Velocit\u00e0 di (ri)distribuzione sia di servizi specifici che dell'intero stack<\/li>\n<li>Possibilit\u00e0 di utilizzare oggetti comuni in diversi servizi, se necessario<\/li>\n<\/ol>\n<p><\/p>\n<h2>Architettura<\/h2>\n<p><\/p>\n<p>Dall'analisi dei requisiti, \u00e8 diventato chiaro che l'architettura a microservizi si adatta praticamente alla perfezione.<\/p>\n<p><\/p>\n<p>Per eliminare il fastidio, \u00e8 stato scelto Telegram API come frontend.<\/p>\n<p><\/p>\n<p>Iniziamo esaminando il diagramma strutturale dell'architettura pronta, quindi passeremo alla descrizione di ciascun componente e formuleremo il processo per una corretta elaborazione dell'immagine.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Panoramica generale dell&#039;architettura del servizio per valutare l&#039;aspetto basato sulle 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 nel dettaglio di ciascun componente del diagramma e definiamo la loro Responsabilit\u00e0 Singola 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 Telegram API. Si possono distinguere due scenari principali: elaborazione dell'immagine dell'utente e gestione dei risultati della pipeline di valutazione. Analizziamo entrambi gli scenari in modo generale.<\/p>\n<p><\/p>\n<p>Quando si riceve un messaggio dall'utente con un'immagine:<\/p>\n<p><\/p>\n<ol>\n<li>Si esegue un filtraggio che consiste nelle seguenti verifiche:\n<ul>\n<li>Presenza di immagini di dimensioni ottimali<\/li>\n<li>Numero di immagini dell'utente gi\u00e0 in coda<\/li>\n<\/ul>\n<\/li>\n<li>Durante la filtrazione iniziale, l'immagine viene salvata in un volume docker<\/li>\n<li>Nella coda \u201cto_estimate\u201d viene prodotto un task, che include il percorso dell'immagine presente nel nostro volume<\/li>\n<li>Se i passaggi sopra menzionati vengono completati 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 sar\u00e0 chiaramente informato con un messaggio che indica cosa potrebbe essere andato storto. <\/li>\n<\/ol>\n<p><\/p>\n<p>Inoltre, questo microservizio, come worker celery, ascolta la coda \u00abafter_estimate\u00bb, progettata per i task che hanno superato il pipeline di valutazione.<\/p>\n<p><\/p>\n<p>Alla ricezione di un nuovo task da \u201cafter_estimate\u201d:<\/p>\n<p><\/p>\n<ol>\n<li>Se l'immagine \u00e8 stata elaborata con successo, inviamo il risultato all'utente; in caso contrario, notifichiamo l'errore<\/li>\n<li>Rimuoviamo 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 worker celery e racchiude tutto ci\u00f2 che riguarda il pipeline di valutazione dell'immagine. L'algoritmo di funzionamento qui \u00e8 uno solo \u2013 esaminiamolo.<\/p>\n<p><\/p>\n<p>Alla ricezione di un nuovo task da \u201cto_estimate\u201d:<\/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>Adattiamo l'immagine alle dimensioni corrette<\/li>\n<li>Identifichiamo tutti i volti (MTCNN)<\/li>\n<li>Valutiamo tutti i volti (raggruppiamo i volti trovati nel passaggio precedente e facciamo inferenze con 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>Rimuoviamo l'immagine utente (originale)<\/li>\n<li>Salviamo l'uscita del pipeline di valutazione<\/li>\n<li>Mettiamo il task in coda \"after_estimate\", che viene ascoltato dal microservizio \"attrai-telegram-bot\" sopra menzionato<\/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 stata utilizzata per il suo scopo principale.<\/p>\n<p><\/p>\n<p>La scelta \u00e8 ricaduta proprio su di esso, anzich\u00e9 sul noto <noindex><a rel=\"nofollow\" href=\"https:\/\/www.elastic.co\/what-is\/elk-stack\">ELK<\/a><\/noindex> stack, a causa della facilit\u00e0 di utilizzo con 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> ai restanti root logger handlers del nostro microservizio Python.<\/p>\n<p><\/p>\n<p>Io, come persona che aveva lavorato solo con l'ELK stack in precedenza, ho avuto un'esperienza positiva lavorando con Graylog. L'unica cosa che delude \u00e8 il predominio 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\">il broker pi\u00f9 stabile e collaudato nel tempo<\/a><\/noindex> per Celery e ha funzionato in modalit\u00e0 durabile.<\/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 \u00abchiave \u2014 valore\u00bb.<\/p>\n<p><\/p>\n<p>A volte \u00e8 necessario utilizzare in diversi microservizi Python oggetti condivisi che implementano determinate strutture di dati.<\/p>\n<p><\/p>\n<p>Ad esempio, in Redis si conserva una hashmap del tipo \u00abtelegram_user_id =&gt; numero di task attivi in coda\u00bb, il che consente di limitare il numero di richieste da un utente a un determinato valore, evitando cos\u00ec attacchi DoS.<\/p>\n<p><\/p>\n<h3>Formalizziamo il processo di elaborazione delle immagini<\/h3>\n<p><\/p>\n<ol>\n<li>L'utente invia un'immagine al bot di Telegram<\/li>\n<li>\u00abattrai-telegram-bot\u00bb riceve il messaggio dall'API di Telegram e lo analizza<\/li>\n<li>Il task con l'immagine viene aggiunto alla coda asincrona \u00abto_estimate\u00bb<\/li>\n<li>L'utente riceve un messaggio con il tempo previsto di valutazione<\/li>\n<li>\u00abattrai-estimator\u00bb prende il task dalla coda \u00abto_estimate\u00bb, lo elabora attraverso il pipeline di valutazione e produce il task nella coda \u00abafter_estimate\u00bb<\/li>\n<li>\u00abattrai-telegram-bot\u00bb, che ascolta la coda \u00abafter_estimate\u00bb, invia il risultato all'utente<\/li>\n<\/ol>\n<p><\/p>\n<h2>DevOps<\/h2>\n<p><\/p>\n<p>Infine, dopo aver esaminato l'architettura, possiamo passare a una parte non meno 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 valutare l&#039;aspetto basato sulle 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, le cui funzionalit\u00e0 sono implementate all'interno di Docker Engine e disponibili out-of-the-box.<\/p>\n<p><\/p>\n<p>Con l'ausilio del \"gruppo\", tutti i nodi del nostro cluster possono essere suddivisi 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 di scalabilit\u00e0, bilanciamento e <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/swarm\/#feature-highlights\">altre fantastiche funzionalit\u00e0.<\/a><\/noindex>I manager sono per impostazione predefinita anche worker.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Panoramica generale dell&#039;architettura del servizio per valutare l&#039;aspetto basato sulle reti neurali.\" src=\"\/wp-content\/uploads\/2020\/07\/d195e2aab6d3552652102c2b5246abfc.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Un 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 da leader manager e worker. In base alla dimensione 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>Anticipando, dico che dalla prima consegna in produzione, avvenuta a met\u00e0 giugno, non ci sono stati problemi correlati a questa organizzazione del cluster (ma ci\u00f2 non significa che tale configurazione sia in alcun modo accettabile per progetti di media-grande dimensione, che presentano requisiti di tolleranza ai guasti).<\/p>\n<p><\/p>\n<h3>Docker Stack<\/h3>\n<p><\/p>\n<p>In modalit\u00e0 'stack', \u00e8 responsabile del deployment degli stack (insiemi di servizi Docker) <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/reference\/commandline\/stack\/\">docker stack<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Supporta i file di configurazione docker-compose, permettendo di utilizzare anche parametri di deploy.\u00a0\u00a0<\/p>\n<p><\/p>\n<p>Ad esempio, attraverso questi parametri sono state limitate le risorse per ciascuno degli istanziamenti del microservizio di valutazione (assegniamo N istanze a N core; 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 come per 'attrai-estimator'.<\/p>\n<p><\/p>\n<h3>Prevedendo la domanda: perch\u00e9 non Kubernetes?<\/h3>\n<p><\/p>\n<p>Sembra che utilizzare Kubernetes in progetti piccoli e medi sia un sovraccarico; tutte le funzionalit\u00e0 necessarie possono essere ottenute da Docker Swarm, che \u00e8 abbastanza user-friendly come orchestratore di container e ha una bassa barriera all'ingresso.<\/p>\n<p><\/p>\n<h3>Infrastruttura<\/h3>\n<p><\/p>\n<p>Tutto questo \u00e8 stato implementato su un VDS con le seguenti caratteristiche:<\/p>\n<p><\/p>\n<ul>\n<li>CPU: 4 core Intel&reg; Xeon&reg; 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 il test di carico locale, sembrava che questa macchina potesse reggere solo con il minimo sforzo durante un afflusso significativo di utenti.<\/p>\n<p><\/p>\n<p>Ma subito dopo il deployment, ho condiviso il link su uno dei pi\u00f9 popolari imageboard nella CSI (s\u00ec, quello stesso), e le persone si sono mostrate interessate; nel giro di poche ore, il servizio ha elaborato con successo decine di migliaia di immagini. Anche nei momenti di picco, le risorse CPU e RAM non erano nemmeno utilizzate a met\u00e0.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Panoramica generale dell&#039;architettura del servizio per valutare l&#039;aspetto basato sulle 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 valutare l&#039;aspetto basato sulle reti neurali.\" src=\"\/wp-content\/uploads\/2020\/07\/e9383c47369c606d26e89a69f4d22b5a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Ancora un po' di grafica<\/h3>\n<p><\/p>\n<p>Numero di utenti unici e richieste di valutazione, dal momento del deployment, a seconda del giorno<\/p>\n<p>\n<img decoding=\"async\" alt=\"Panoramica generale dell&#039;architettura del servizio per valutare l&#039;aspetto basato sulle reti neurali.\" src=\"\/wp-content\/uploads\/2020\/07\/7112c78c8400d2ac73562243b16a015b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Distribuzione del tempo di inferenza del pipeline di valutazione<\/p>\n<p>\n<img decoding=\"async\" alt=\"Panoramica generale dell&#039;architettura del servizio per valutare l&#039;aspetto basato sulle 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 container si sono rivelati completamente efficaci: anche nei momenti di picco non ci sono stati cali o ritardi nel tempo di elaborazione.\u00a0<\/p>\n<p><\/p>\n<p>Penso che progetti di piccole e medie dimensioni, che utilizzano inferenze in tempo reale di 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 evitare di pubblicare un lungo testo ho deciso di omettere alcuni punti in questo articolo \u2014 ne riparleremo nei prossimi post.<\/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 dell'utente viene memorizzato \u2014 n\u00e9 le immagini originali, n\u00e9 i risultati del processo 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 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\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\" \/>\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) 4.9.10\" \/>\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=\"\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\" \/>\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 basato su reti neurali | ProHoster","description":"Introduzione Ciao! In questo articolo condivider\u00f2 la mia esperienza nella costruzione di un'architettura a microservizi per un progetto che utilizza reti neurali. Parleremo dei requisiti architettonici, guarderemo varie diagrammi strutturali, analizzeremo ciascun componente dell'architettura finale e valuteremo le metriche tecniche della soluzione. Buona lettura! Due parole sulla sfida e sulla sua soluzione L'idea principale \u00e8 fornire una valutazione basata su una foto.","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":"\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","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"},"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}]}}