{"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\/de\/blog\/administrirovanie\/obshhij-obzor-arhitektury-servisa-dlya-oczenki-vneshnosti-na-osnove-nejronnyh-setej","title":{"rendered":"Allgemeiner \u00dcberblick \u00fcber die Architektur des Dienstes zur Bewertung des Aussehens auf der Grundlage neuronaler Netze","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Allgemeiner \u00dcberblick \u00fcber die Architektur des Dienstes zur Bewertung des Aussehens auf der Grundlage neuronaler Netze\" src=\"\/wp-content\/uploads\/2020\/07\/f624e995fbee3496f1f7890b98106df4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Einleitung<\/h2>\n<p><\/p>\n<p>Hallo!<\/p>\n<p><\/p>\n<p>In diesem Artikel werde ich meine Erfahrungen beim Aufbau einer Mikroservice-Architektur f\u00fcr ein Projekt, das neuronale Netze verwendet, teilen.<\/p>\n<p><\/p>\n<p>Lassen Sie uns \u00fcber die Anforderungen an die Architektur sprechen, verschiedene Strukturdiagramme ansehen, jeden der Komponenten der fertigen Architektur analysieren und die technischen Metriken der L\u00f6sung bewerten.<\/p>\n<p><\/p>\n<p>Viel Spa\u00df beim Lesen!<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Ein paar Worte zur Aufgabe und ihrer L\u00f6sung<\/h2>\n<p><\/p>\n<p>Die grundlegende Idee ist, basierend auf Fotos die Attraktivit\u00e4t einer Person auf einer Skala von eins bis zehn zu bewerten.<\/p>\n<p><\/p>\n<p>In diesem Artikel werden wir von der Beschreibung sowohl der verwendeten neuronalen Netze als auch des Prozesses der Datenvorbereitung und des Trainings absehen. In einem der n\u00e4chsten Beitr\u00e4ge werden wir jedoch auf die Analyse des Bewertungs-Pipelines auf einer tieferen Ebene zur\u00fcckkommen.<\/p>\n<p><\/p>\n<p>Jetzt werden wir den Bewertungs-Pipeline auf einer hohen Ebene durchgehen, wobei wir den Fokus auf die Interaktion der Mikroservices im Kontext der Gesamtarchitektur des Projekts legen.\u00a0<\/p>\n<p><\/p>\n<p>Bei der Arbeit an der Bewertungs-Pipeline wurde die Aufgabe in folgende Komponenten dekonstruiert:<\/p>\n<p><\/p>\n<ol>\n<li>Gesichtserkennung auf Fotos<\/li>\n<li>Bewertung jedes Gesichts<\/li>\n<li>Rendering des Ergebnisses<\/li>\n<\/ol>\n<p><\/p>\n<p>Das erste wird mithilfe von einem vortrainierten <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1604.02878\">MTCNN<\/a><\/noindex>gel\u00f6st. F\u00fcr das zweite wurde ein konvolutionales neuronales Netz auf PyTorch trainiert, wobei als Backbone verwendet wurde <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1512.03385\">ResNet34<\/a><\/noindex> \u2013 aus dem Balance zwischen \"Qualit\u00e4t \/ Geschwindigkeit der Inferenz auf CPU\".<\/p>\n<p>\n<img decoding=\"async\" alt=\"Allgemeiner \u00dcberblick \u00fcber die Architektur des Dienstes zur Bewertung des Aussehens auf der Grundlage neuronaler Netze\" src=\"\/wp-content\/uploads\/2020\/07\/181cc89a2cf5295bdcd4b838216f96d6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Funktionsdiagramm der Bewertungs-Pipeline<\/i><\/p>\n<p><\/p>\n<h2>Analyse der Anforderungen an die Architektur des Projekts<\/h2>\n<p><\/p>\n<p>Im Lebenszyklus <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Machine_learning\">ML<\/a><\/noindex> sind die Arbeitsschritte an der Architektur und der Automatisierung des Modellausrollens oft die zeit- und ressourcenintensivsten.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Allgemeiner \u00dcberblick \u00fcber die Architektur des Dienstes zur Bewertung des Aussehens auf der Grundlage neuronaler Netze\" src=\"\/wp-content\/uploads\/2020\/07\/4949f217d31c863176122ed87b43a88c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Lebenszyklus eines ML-Projekts<\/i><\/p>\n<p><\/p>\n<p>Dieses Projekt ist da keine Ausnahme \u2013 es wurde beschlossen, die Bewertungs-Pipeline in einen Online-Service zu verpacken, was ein Eintauchen in die Architektur erforderte. Es wurden folgende grundlegende Anforderungen festgelegt:<\/p>\n<p><\/p>\n<ol>\n<li>Zentralisierte Log-Speicherung \u2013 alle Dienste sollten Protokolle an einem Ort schreiben, die einfach zu analysieren sind.<\/li>\n<li>M\u00f6glichkeit der horizontalen Skalierung des Bewertungsdienstes \u2013 als wahrscheinlichster Bottleneck<\/li>\n<li>Es sollten gleich viele CPU-Ressourcen f\u00fcr die Bewertung jedes Bildes bereitgestellt werden \u2013 um Ausrei\u00dfer in der Verteilung der Zeit f\u00fcr die Inferenz zu vermeiden.<\/li>\n<li>Schnelle (Neu-)Bereitstellung sowohl der spezifischen Dienste als auch des gesamten Stacks.<\/li>\n<li>Die M\u00f6glichkeit, bei Bedarf gemeinsame Objekte in verschiedenen Diensten zu nutzen.<\/li>\n<\/ol>\n<p><\/p>\n<h2>Architektur<\/h2>\n<p><\/p>\n<p>Nach der Analyse der Anforderungen wurde deutlich, dass die Mikroservice-Architektur praktisch perfekt passt.<\/p>\n<p><\/p>\n<p>Um unn\u00f6tigen Kopfschmerzen zu entgehen, wurde Telegram API als Frontend gew\u00e4hlt.<\/p>\n<p><\/p>\n<p>Zun\u00e4chst betrachten wir das Strukturdiagramm der fertigen Architektur, anschlie\u00dfend werden wir jedes der Komponenten beschreiben und den Prozess der erfolgreichen Bildverarbeitung formalisieren.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Allgemeiner \u00dcberblick \u00fcber die Architektur des Dienstes zur Bewertung des Aussehens auf der Grundlage neuronaler Netze\" src=\"\/wp-content\/uploads\/2020\/07\/163ec019341e9d71a1e0854c6026bd01.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Strukturdiagramm der fertigen Architektur<\/i><\/p>\n<p><\/p>\n<p>Lassen Sie uns n\u00e4her auf jede der Komponenten des Diagramms eingehen und deren Single Responsibility im Prozess der Bildbewertung kennzeichnen.<\/p>\n<p><\/p>\n<h3>Mikroservice \u201eattrai-telegram-bot\u201c<\/h3>\n<p><\/p>\n<p>Dieser Mikroservice kapselt alle Interaktionen mit der Telegram API. Es lassen sich zwei Hauptszenarien unterscheiden \u2013 die Arbeit mit dem Benutzerbild und die Arbeit mit dem Ergebnis der Bewertungs-Pipeline. Wir werden beide Szenarien im Allgemeinen durchgehen.<\/p>\n<p><\/p>\n<p>Beim Erhalt einer Benutzer-Nachricht mit einem Bild:<\/p>\n<p><\/p>\n<ol>\n<li>Es erfolgt eine Filterung, die aus den folgenden Pr\u00fcfungen besteht:\n<ul>\n<li>Vorhandensein der optimalen Bildgr\u00f6\u00dfe<\/li>\n<li>Anzahl der Bilder des Benutzers, die sich bereits in der Warteschlange befinden<\/li>\n<\/ul>\n<\/li>\n<li>Nach Bestehen der ersten Filterung wird das Bild im Docker-Volume gespeichert.<\/li>\n<li>In die Warteschlange \"to_estimate\" wird eine Aufgabe produziert, die unter anderem den Pfad zum Bild, das sich in unserem Volume befindet, enth\u00e4lt.<\/li>\n<li>Wenn die oben genannten Schritte erfolgreich abgeschlossen sind, erh\u00e4lt der Benutzer eine Nachricht mit der ungef\u00e4hren Verarbeitungszeit des Bildes, die basierend auf der Anzahl der Aufgaben in der Warteschlange berechnet wird. Bei einem Fehler wird der Benutzer ausdr\u00fccklich dar\u00fcber informiert \u2013 durch das Senden einer Nachricht mit Informationen dar\u00fcber, was schiefgelaufen sein k\u00f6nnte. <\/li>\n<\/ol>\n<p><\/p>\n<p>Dieser Mikroservice fungiert auch als Celery-Worker und lauscht der Warteschlange \"after_estimate\", die f\u00fcr Aufgaben bestimmt ist, die durch die Bewertungs-Pipeline gegangen sind.<\/p>\n<p><\/p>\n<p>Beim Erhalt einer neuen Aufgabe aus \"after_estimate\":<\/p>\n<p><\/p>\n<ol>\n<li>Wenn das Bild erfolgreich verarbeitet wurde, senden wir das Ergebnis an den Benutzer, andernfalls informieren wir \u00fcber den Fehler.<\/li>\n<li>Wir l\u00f6schen das Bild, das das Ergebnis der Bewertungs-Pipeline darstellt.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Mikroservice zur Bewertung \u201eattrai-estimator\u201c<\/h3>\n<p><\/p>\n<p>Dieser Mikroservice ist ein Celery-Worker und kapselt alles, was mit der Bildbewertungs-Pipeline zu tun hat. Der Arbeitsalgorithmus ist einfach \u2013 wir werden ihn durchgehen.<\/p>\n<p><\/p>\n<p>Bei Erhalt einer neuen Aufgabe aus \"to_estimate\":<\/p>\n<p><\/p>\n<ol>\n<li>Wir leiten das Bild durch die Bewertungs-Pipeline:\n<ol>\n<li>Wir laden das Bild in den Speicher.<\/li>\n<li>Wir bringen das Bild auf die gew\u00fcnschte Gr\u00f6\u00dfe<\/li>\n<li>Wir finden alle Gesichter (MTCNN)<\/li>\n<li>Wir bewerten alle Gesichter (wir packen die zuvor gefundenen Gesichter in einen Batch und inferenzen ResNet34)<\/li>\n<li>Wir rendern das endg\u00fcltige Bild\n<ol>\n<li>Wir zeichnen Bounding Boxes<\/li>\n<li>Wir zeichnen die Bewertungen<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<\/li>\n<li>Wir entfernen das Benutzerbild (Originalbild)<\/li>\n<li>Wir speichern den Output aus der Bewertungs-Pipeline<\/li>\n<li>Wir legen die Aufgabe in die Warteschlange \u201eafter_estimate\u201c, die vom oben erl\u00e4uterten Microservice \u201eattrai-telegram-bot\u201c geh\u00f6rt wird<\/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> ist eine L\u00f6sung f\u00fcr das zentrale Log-Management. In diesem Projekt wurde es f\u00fcr seinen urspr\u00fcnglichen Zweck verwendet.<\/p>\n<p><\/p>\n<p>Die Wahl fiel auf ihn und nicht auf den allen bekannten <noindex><a rel=\"nofollow\" href=\"https:\/\/www.elastic.co\/what-is\/elk-stack\">ELK<\/a><\/noindex> Stack, wegen der Bequemlichkeit der Arbeit mit ihm aus Python. Alles, was f\u00fcr das Logging in Graylog erforderlich ist, ist es, GELFTCPHandler aus dem Paket <noindex><a rel=\"nofollow\" href=\"https:\/\/pypi.org\/project\/graypy\/\">graypy<\/a><\/noindex> zu den anderen Root Logger Handlers unseres Python-Microservices hinzuzuf\u00fcgen.<\/p>\n<p><\/p>\n<p>Ich, als jemand, der vorher nur mit dem ELK-Stack gearbeitet hat, hatte insgesamt positive Erfahrungen bei der Arbeit mit Graylog. Das einzige, was entt\u00e4uscht, ist die \u00dcberlegenheit der Funktionen von Kibana gegen\u00fcber der Web-Oberfl\u00e4che von 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> ist ein Nachrichtenbroker basierend auf dem AMQP-Protokoll.<\/p>\n<p><\/p>\n<p>In diesem Projekt wurde er als <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.celeryproject.org\/en\/latest\/getting-started\/brokers\/#broker-overview\">der stabilste und bew\u00e4hrte<\/a><\/noindex> Broker f\u00fcr Celery verwendet und arbeitete im dauerhaften Modus.<\/p>\n<p><\/p>\n<h3>Redis<\/h3>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/redis.io\/\">Redis<\/a><\/noindex> ist eine NoSQL-Datenbank, die mit Datensensoren vom Typ \u201eSchl\u00fcssel \u2013 Wert\u201c arbeitet<\/p>\n<p><\/p>\n<p>Manchmal besteht die Notwendigkeit, in verschiedenen Python-Microservices gemeinsame Objekte zu verwenden, die bestimmte Datenstrukturen implementieren.<\/p>\n<p><\/p>\n<p>Zum Beispiel wird in Redis eine Hashmap vom Typ \u201etelegram_user_id =&gt; Anzahl aktiver Aufgaben in der Warteschlange\u201c gespeichert, die es erm\u00f6glicht, die Anzahl der Anfragen von einem Benutzer auf einen bestimmten Wert zu begrenzen und so DoS-Angriffe zu verhindern.<\/p>\n<p><\/p>\n<h3>Wir formalisieren den Prozess der erfolgreichen Bildverarbeitung<\/h3>\n<p><\/p>\n<ol>\n<li>Der Benutzer sendet ein Bild an den Telegram-Bot<\/li>\n<li>\u201eattrai-telegram-bot\u201c erh\u00e4lt die Nachricht von der Telegram-API und analysiert sie<\/li>\n<li>Die Aufgabe mit dem Bild wird in die asynchrone Warteschlange \u201eto_estimate\u201c hinzugef\u00fcgt<\/li>\n<li>Der Benutzer erh\u00e4lt eine Nachricht mit der voraussichtlichen Bewertungszeit<\/li>\n<li>\u201eattrai-estimator\u201c nimmt die Aufgabe aus der Warteschlange \u201eto_estimate\u201c, f\u00fchrt sie durch die Bewertungs-Pipeline und produziert die Aufgabe in der Warteschlange \u201eafter_estimate\u201c<\/li>\n<li>\u201eattrai-telegram-bot\u201c, der die Warteschlange \u201eafter_estimate\u201c h\u00f6rt, sendet das Ergebnis an den Benutzer<\/li>\n<\/ol>\n<p><\/p>\n<h2>DevOps<\/h2>\n<p><\/p>\n<p>Schlie\u00dflich, nach der \u00dcberpr\u00fcfung der Architektur, k\u00f6nnen wir zum nicht weniger interessanten Teil \u00fcbergehen \u2013 DevOps<\/p>\n<p><\/p>\n<h3>Docker Swarm<\/h3>\n<p><\/p>\n<p>\u00a0<\/p>\n<p>\n<img decoding=\"async\" alt=\"Allgemeiner \u00dcberblick \u00fcber die Architektur des Dienstes zur Bewertung des Aussehens auf der Grundlage neuronaler Netze\" 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 ein Clustersystem, dessen Funktionalit\u00e4t innerhalb von Docker Engine implementiert und sofort verf\u00fcgbar ist.<\/p>\n<p><\/p>\n<p>Durch die Verwendung von \u201eRoya\u201c k\u00f6nnen alle Knoten unseres Clusters in zwei Typen unterteilt werden \u2013 Worker und Manager. Auf Maschinen des ersten Typs werden Gruppen von Containern (St\u00e4cke) bereitgestellt, w\u00e4hrend Maschinen des zweiten Typs f\u00fcr Skalierung, Lastverteilung und <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/swarm\/#feature-highlights\">andere coole Funktionen<\/a><\/noindex>. Manager fungieren standardm\u00e4\u00dfig auch als Worker.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Allgemeiner \u00dcberblick \u00fcber die Architektur des Dienstes zur Bewertung des Aussehens auf der Grundlage neuronaler Netze\" src=\"\/wp-content\/uploads\/2020\/07\/d195e2aab6d3552652102c2b5246abfc.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Cluster mit einem Leader-Manager und drei Workern<\/i><\/p>\n<p><\/p>\n<p>Die minimal m\u00f6gliche Gr\u00f6\u00dfe eines Clusters betr\u00e4gt 1 Knoten, wodurch eine einzige Maschine gleichzeitig als Leader-Manager und Worker agiert. Basierend auf der Projektgr\u00f6\u00dfe und den minimalen Anforderungen an Ausfallsicherheit wurde diese Vorgehensweise gew\u00e4hlt.<\/p>\n<p><\/p>\n<p>Vorausblickend kann ich sagen, dass seit der ersten Produktionseinf\u00fchrung Mitte Juni keine Probleme im Zusammenhang mit dieser Clusterorganisation aufgetreten sind (aber das bedeutet nicht, dass eine solche Organisation in mittelgro\u00dfen Projekten, die Anforderungen an die Ausfallsicherheit haben, in irgendeiner Weise akzeptabel ist).<\/p>\n<p><\/p>\n<h3>Docker Stack<\/h3>\n<p><\/p>\n<p>Im \u201eRoya\u201c-Modus ist der Einsatz von Stacks (Sammlungen von Docker-Services) verantwortlich <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/reference\/commandline\/stack\/\">docker stack<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Es unterst\u00fctzt Docker-Compose-Konfigurationen und erm\u00f6glicht dar\u00fcber hinaus die Nutzung von Deploy-Parametern.\u00a0\u00a0<\/p>\n<p><\/p>\n<p>Beispielsweise wurden mit diesen Parametern die Ressourcen f\u00fcr jede der Instanzen des Bewertung-Mikroservices beschr\u00e4nkt (wir weisen N Instanzen N Kerne zu, und im Mikroservice beschr\u00e4nken wir die Anzahl der Kerne, die von PyTorch verwendet werden, auf einen).<\/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>Es ist wichtig zu beachten, dass Redis, RabbitMQ und Graylog \u2013 Stateful-Services sind und es nicht so einfach ist, sie wie \u201eattrai-estimator\u201c zu skalieren.<\/p>\n<p><\/p>\n<h3>Vorweg genommen \u2014 warum nicht Kubernetes?<\/h3>\n<p><\/p>\n<p>Es scheint, dass die Nutzung von Kubernetes in kleinen und mittelgro\u00dfen Projekten \u00fcberfl\u00fcssig ist; die gesamte notwendige Funktionalit\u00e4t kann von Docker Swarm erhalten werden, das recht benutzerfreundlich f\u00fcr Container-Orchestrierung ist und eine niedrige Einstiegsh\u00fcrde hat.<\/p>\n<p><\/p>\n<h3>Infrastruktur<\/h3>\n<p><\/p>\n<p>Das Ganze wurde auf einem VDS mit folgenden Eigenschaften bereitgestellt:<\/p>\n<p><\/p>\n<ul>\n<li>CPU: 4 Intel&reg; Xeon&reg; Gold 5120 Kerne @ 2,20GHz<\/li>\n<li>RAM: 8 GB<\/li>\n<li>SSD: 160 GB<\/li>\n<\/ul>\n<p><\/p>\n<p>Nach lokalen Lasttests schien es, dass bei einem starken Anstieg an Nutzern diese Maschine gerade genug Leistung bietet.<\/p>\n<p><\/p>\n<p>Aber direkt nach dem Deployment habe ich einen Link zu einem der beliebtesten Imageboards in der GUS gepostet (ja, genau diesem), woraufhin die Leute interessiert waren und der Dienst in wenigen Stunden erfolgreich zehntausende Bilder verarbeitet hat. Dabei wurden zu Spitzenzeiten die CPU- und RAM-Ressourcen nicht einmal zur H\u00e4lfte genutzt.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Allgemeiner \u00dcberblick \u00fcber die Architektur des Dienstes zur Bewertung des Aussehens auf der Grundlage neuronaler Netze\" src=\"\/wp-content\/uploads\/2020\/07\/458d74dae00d455fbce1ca6a197325d7.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Allgemeiner \u00dcberblick \u00fcber die Architektur des Dienstes zur Bewertung des Aussehens auf der Grundlage neuronaler Netze\" src=\"\/wp-content\/uploads\/2020\/07\/e9383c47369c606d26e89a69f4d22b5a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Ein wenig Grafik<\/h3>\n<p><\/p>\n<p>Anzahl der einzigartigen Benutzer und Bewertungsanfragen seit dem Deployment, je nach Tag<\/p>\n<p>\n<img decoding=\"async\" alt=\"Allgemeiner \u00dcberblick \u00fcber die Architektur des Dienstes zur Bewertung des Aussehens auf der Grundlage neuronaler Netze\" src=\"\/wp-content\/uploads\/2020\/07\/7112c78c8400d2ac73562243b16a015b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Verteilung der Inferrenzzeit des Bewertungs-Pipelines<\/p>\n<p>\n<img decoding=\"async\" alt=\"Allgemeiner \u00dcberblick \u00fcber die Architektur des Dienstes zur Bewertung des Aussehens auf der Grundlage neuronaler Netze\" src=\"\/wp-content\/uploads\/2020\/07\/4c892ce607c3ff3db466459729dd0876.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Das DBMS Tarantool ist ein attraktives, zukunftstr\u00e4chtiges Produkt zur Erstellung von hochbelasteten Anwendungen.<\/h2>\n<p><\/p>\n<p>Zusammenfassend kann ich sagen, dass die Architektur und der Ansatz zur Orchestrierung von Containern sich voll und ganz bew\u00e4hrt haben \u2013 selbst zu Spitzenzeiten gab es keine Ausf\u00e4lle oder Verz\u00f6gerungen bei der Bearbeitungszeit.\u00a0<\/p>\n<p><\/p>\n<p>Ich denke, kleine und mittelgro\u00dfe Projekte, die in ihrem Prozess die Echtzeiteinferrenz von neuronalen Netzen auf CPU nutzen, k\u00f6nnen die in diesem Artikel beschriebenen Praktiken erfolgreich \u00fcbernehmen.<\/p>\n<p><\/p>\n<p>Ich f\u00fcge hinzu, dass der urspr\u00fcngliche Artikel l\u00e4nger war, aber um einen Longread zu vermeiden, habe ich einige Punkte in diesem Artikel weggelassen \u2013 wir werden in zuk\u00fcnftigen Ver\u00f6ffentlichungen darauf zur\u00fcckkommen.<\/p>\n<p><\/p>\n<p>Den Bot kannst du auf Telegram antippen \u2013 @AttraiBot, er wird mindestens bis Ende Herbst 2020 funktionieren. Ich erinnere daran \u2013 es werden keine Benutzerdaten gespeichert \u2013 weder die urspr\u00fcnglichen Bilder noch die Ergebnisse des Bewertungs-Pipelines \u2013 alles wird nach der Verarbeitung gel\u00f6scht.<\/p>\n<p>Quelle: <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\/de\/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=\"de_DE\" \/>\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\/de\/blog\/administrirovanie\/obshhij-obzor-arhitektury-servisa-dlya-oczenki-vneshnosti-na-osnove-nejronnyh-setej\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-07-18T17:42:10+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-07-18T17:42:10+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47\u00dcberblick \u00fcber die Architektur des Dienstes zur Bewertung der Erscheinung auf Basis von neuronalen Netzen | ProHoster","description":".","canonical_url":"https:\/\/prohoster.info\/de\/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":"de_DE","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\/de\/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\/de\/wp-json\/wp\/v2\/posts\/89110","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=89110"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/89110\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/89111"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=89110"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=89110"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=89110"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}