{"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 Beurteilung des Erscheinungsbilds basierend auf neuronalen Netzwerken.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Allgemeiner \u00dcberblick \u00fcber die Architektur des Dienstes zur Beurteilung des Erscheinungsbilds basierend auf neuronalen Netzwerken.\" 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 teile ich meine Erfahrungen beim Aufbau einer Mikroservice-Architektur f\u00fcr ein Projekt, das neuronale Netze verwendet.<\/p>\n<p><\/p>\n<p>Wir sprechen \u00fcber die Anforderungen an die Architektur, betrachten verschiedene Strukturdiagramme, analysieren jeden der Komponenten der fertigen Architektur und bewerten die technischen Metriken der L\u00f6sung.<\/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 Grundidee besteht darin, die Attraktivit\u00e4t einer Person anhand eines Fotos 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 Datenaufbereitung und des Trainings absehen. In einer der n\u00e4chsten Ver\u00f6ffentlichungen werden wir jedoch auf die detaillierte Analyse des Bewertungs-Pipelines zur\u00fcckkommen.<\/p>\n<p><\/p>\n<p>Im Moment werden wir die Bewertungs-Pipeline auf einer hohen Ebene durchgehen und uns auf die Interaktion der Mikroservices im Kontext der Gesamtarchitektur des Projekts konzentrieren.\u00a0<\/p>\n<p><\/p>\n<p>Bei der Arbeit an der Bewertung der Attraktivit\u00e4t wurde die Aufgabe in die folgenden Bestandteile unterteilt:<\/p>\n<p><\/p>\n<ol>\n<li>Gesichtserkennung auf dem Foto<\/li>\n<li>Bewertung jedes der Gesichter<\/li>\n<li>Ergebnis-Rendering<\/li>\n<\/ol>\n<p><\/p>\n<p>Das erste wird durch ein vortrainiertes Modell gel\u00f6st <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1604.02878\">MTCNN<\/a><\/noindex>. F\u00fcr das zweite wurde ein neuronales Netzwerk mit Convolutional Neural Networks auf PyTorch trainiert, wobei ResNet34 als Backbone verwendet wurde. <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1512.03385\">ResNet34<\/a><\/noindex> \u2013 aus dem Ziel \u201eQualit\u00e4t \/ Geschwindigkeit der Inferenz auf CPU\u201c<\/p>\n<p>\n<img decoding=\"async\" alt=\"Allgemeiner \u00dcberblick \u00fcber die Architektur des Dienstes zur Beurteilung des Erscheinungsbilds basierend auf neuronalen Netzwerken.\" src=\"\/wp-content\/uploads\/2020\/07\/181cc89a2cf5295bdcd4b838216f96d6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Funktionsdiagramm des Bewertungs-Pipeline<\/i><\/p>\n<p><\/p>\n<h2>Analyse der Anforderungen an die Projektarchitektur<\/h2>\n<p><\/p>\n<p>Im Lebenszyklus <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Machine_learning\">ML<\/a><\/noindex> des Projekts sind die Phasen der Arbeit an der Architektur und der Automatisierung der Modellbereitstellung oft eine der zeit- und ressourcenintensivsten.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Allgemeiner \u00dcberblick \u00fcber die Architektur des Dienstes zur Beurteilung des Erscheinungsbilds basierend auf neuronalen Netzwerken.\" 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 keine Ausnahme \u2013 es wurde entschieden, die Bewertungspipeline in einen Online-Service zu integrieren, was ein tiefes Eintauchen in die Architektur erforderte. Folgende grundlegende Anforderungen wurden festgelegt:<\/p>\n<p><\/p>\n<ol>\n<li>Zentrales Log-Repository \u2013 alle Dienste sollten ihre Logs an einem Ort schreiben, um eine bequeme Analyse zu erm\u00f6glichen.<\/li>\n<li>M\u00f6glichkeit zur horizontalen Skalierung des Bewertungsdienstes \u2013 als wahrscheinlichster Engpass.<\/li>\n<li>Jedes Bild sollte mit der gleichen Menge an Rechenressourcen bewertet werden \u2013 um Ausrei\u00dfer in der Verteilung der Inferenzzeit zu vermeiden.<\/li>\n<li>Schnelles (Neu-)Bereitstellen sowohl einzelner Dienste als auch des gesamten Stacks.<\/li>\n<li>Die M\u00f6glichkeit, bei Bedarf in verschiedenen Diensten gemeinsame Objekte zu verwenden.<\/li>\n<\/ol>\n<p><\/p>\n<h2>Architektur von<\/h2>\n<p><\/p>\n<p>Nach der Analyse der Anforderungen wurde deutlich, dass die mikroservicebasierte Architektur fast perfekt passt.<\/p>\n<p><\/p>\n<p>Um \u00fcberfl\u00fcssige Kopfschmerzen zu vermeiden, wurde das Telegram API als Frontend gew\u00e4hlt.<\/p>\n<p><\/p>\n<p>Zuerst betrachten wir das strukturelle Diagramm der fertigen Architektur, anschlie\u00dfend gehen wir auf die Beschreibung jeder Komponente ein und formalisierten den Prozess der erfolgreichen Bildverarbeitung.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Allgemeiner \u00dcberblick \u00fcber die Architektur des Dienstes zur Beurteilung des Erscheinungsbilds basierend auf neuronalen Netzwerken.\" src=\"\/wp-content\/uploads\/2020\/07\/163ec019341e9d71a1e0854c6026bd01.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Das strukturelle Diagramm der fertigen Architektur.<\/i><\/p>\n<p><\/p>\n<p>Lassen Sie uns n\u00e4her auf jede Komponente des Diagramms eingehen und ihre Single Responsibility im Prozess der Bildbewertung kennzeichnen.<\/p>\n<p><\/p>\n<h3>Mikroservice \u00abattrai-telegram-bot\u00bb<\/h3>\n<p><\/p>\n<p>Dieser Mikroservice kapselt alle Interaktionen mit dem Telegram API ein. Es lassen sich zwei Hauptszenarien unterscheiden \u2013 die Bearbeitung des Benutzerbildes und die Arbeit mit dem Ergebnis des Bewertungs-Pipelines. Beide Szenarien werden wir allgemein untersuchen.<\/p>\n<p><\/p>\n<p>Beim Empfang einer Benutzernachricht 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>Bei der ersten Filterung wird das Bild in einem Docker-Volume gespeichert.<\/li>\n<li>In die Warteschlange \u201eto_estimate\u201c wird eine Aufgabe eingereiht, die unter anderem den Pfad zum Bild enth\u00e4lt, das in unserem Volume liegt.<\/li>\n<li>Wenn die oben genannten Schritte erfolgreich abgeschlossen sind, erh\u00e4lt der Benutzer eine Nachricht mit der gesch\u00e4tzten Bearbeitungszeit des Bildes, die auf der Anzahl der Aufgaben in der Warteschlange basiert. Im Falle eines Fehlers wird der Benutzer ausdr\u00fccklich dar\u00fcber informiert \u2013 durch eine Nachricht mit Informationen dazu, was schiefgelaufen sein k\u00f6nnte. <\/li>\n<\/ol>\n<p><\/p>\n<p>Dieser Mikrodienst fungiert als Celery-Worker und h\u00f6rt auf die Warteschlange \u201eafter_estimate\u201c, die f\u00fcr Aufgaben vorgesehen ist, die den Bewertungspipeline durchlaufen haben.<\/p>\n<p><\/p>\n<p>Beim Erhalt einer neuen Aufgabe aus \u201eafter_estimate\u201c:<\/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 einen Fehler.<\/li>\n<li>Wir l\u00f6schen das Bild, das das Ergebnis der Bewertungspipeline ist.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Mikrodienst zur Bewertung \u201eattrai-estimator\u201c<\/h3>\n<p><\/p>\n<p>Dieser Mikrodienst ist ein Celery-Worker und umfasst alles, was mit der Bewertung des Bildes zu tun hat. Der Algorithmus ist einfach \u2013 lassen Sie uns diesen durchgehen.<\/p>\n<p><\/p>\n<p>Beim Erhalt einer neuen Aufgabe aus \u201eto_estimate\u201c:<\/p>\n<p><\/p>\n<ol>\n<li>Wir f\u00fchren das Bild durch die Evaluierungs-Pipeline:\n<ol>\n<li>Laden das Bild in den Speicher<\/li>\n<li>Passen das Bild auf die ben\u00f6tigte Gr\u00f6\u00dfe an<\/li>\n<li>Erkennen alle Gesichter (MTCNN)<\/li>\n<li>Bewerten alle Gesichter (packen die im vorherigen Schritt gefundenen Gesichter in ein Batch und f\u00fchren Inferenzen mit ResNet34 durch)<\/li>\n<li>Rendern das endg\u00fcltige Bild\n<ol>\n<li>Zeichnen die Begrenzungsrahmen<\/li>\n<li>Zeichnen die Bewertungen<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<\/li>\n<li>L\u00f6schen das Benutzerbild (urspr\u00fcngliches Bild)<\/li>\n<li>Speichern den Output der Evaluierungs-Pipeline<\/li>\n<li>Legen die Aufgabe in die Warteschlange \"after_estimate\", die vom oben genannten Microservice \"attrai-telegram-bot\" \u00fcberwacht 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 vorgesehenen Zweck verwendet.<\/p>\n<p><\/p>\n<p>Die Wahl fiel genau auf dieses System und nicht auf das allgemein bekannte <noindex><a rel=\"nofollow\" href=\"https:\/\/www.elastic.co\/what-is\/elk-stack\">ELK<\/a><\/noindex> Stack, aufgrund der Bequemlichkeit der Arbeit mit ihm aus Python heraus. Alles, was man f\u00fcr das Logging in Graylog tun muss, ist, GELFTCPHandler aus dem Paket <noindex><a rel=\"nofollow\" href=\"https:\/\/pypi.org\/project\/graypy\/\">graypy<\/a><\/noindex> zu den anderen Root-Logger-Handlern unseres Python-Microservices hinzuzuf\u00fcgen.<\/p>\n<p><\/p>\n<p>Als jemand, der zuvor nur mit dem ELK-Stack gearbeitet hat, habe ich insgesamt positive Erfahrungen mit Graylog gemacht. Einziges Manko ist die \u00dcberlegenheit der Features 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> \u2014 ist ein Nachrichtenbroker, der auf dem AMQP-Protokoll basiert.<\/p>\n<p><\/p>\n<p>In diesem Projekt wurde er verwendet als <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.celeryproject.org\/en\/latest\/getting-started\/brokers\/#broker-overview\">der stabilste und besonders bew\u00e4hrte<\/a><\/noindex> Broker f\u00fcr Celery und arbeitete im durable 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> \u2014 ist eine NoSQL-Datenbank, die mit Datenstrukturen vom Typ \u201eSchl\u00fcssel-Wert\u201c arbeitet.<\/p>\n<p><\/p>\n<p>Manchmal ist es notwendig, in verschiedenen Python-Mikrodiensten gemeinsame Objekte zu verwenden, die bestimmte Datenstrukturen implementieren.<\/p>\n<p><\/p>\n<p>Zum Beispiel speichert Redis eine Hashmap in der Form \u201etelegram_user_id =&gt; Anzahl aktiver Aufgaben in der Warteschlange\u201c, was es erm\u00f6glicht, die Anzahl der Anfragen eines Benutzers auf einen bestimmten Wert zu begrenzen und so DoS-Angriffe zu verhindern.<\/p>\n<p><\/p>\n<h3>Formalisiert 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 empf\u00e4ngt 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 eingef\u00fcgt.<\/li>\n<li>Der Benutzer erh\u00e4lt eine Nachricht mit der gesch\u00e4tzten Bewertungszeit.<\/li>\n<li>\u201eattrai-estimator\u201c holt die Aufgabe aus der Warteschlange \u201eto_estimate\u201c, verarbeitet sie durch die Bewertungspipeline und produziert die Aufgabe in die Warteschlange \u201eafter_estimate\u201c.<\/li>\n<li>\u201eattrai-telegram-bot\u201c, der die Warteschlange \u201eafter_estimate\u201c \u00fcberwacht, sendet das Ergebnis an den Benutzer.<\/li>\n<\/ol>\n<p><\/p>\n<h2>DevOps<\/h2>\n<p><\/p>\n<p>Nach der \u00dcberpr\u00fcfung der Architektur k\u00f6nnen wir nun zu einem 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 Beurteilung des Erscheinungsbilds basierend auf neuronalen Netzwerken.\" 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 Cluster-System, dessen Funktionen im Docker Engine integriert sind und sofort verf\u00fcgbar sind.<\/p>\n<p><\/p>\n<p>Mit Hilfe eines \u201eClusters\u201c k\u00f6nnen alle Knoten unseres Clusters in zwei Typen unterteilt werden \u2013 Worker und Manager. Auf den Maschinen des ersten Typs werden Gruppen von Containern (Stacks) bereitgestellt, w\u00e4hrend die Maschinen des zweiten Typs f\u00fcr das Skalieren, die Lastverteilung und <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/swarm\/#feature-highlights\">andere coole Features verantwortlich sind.<\/a><\/noindex>Manager sind standardm\u00e4\u00dfig auch Worker.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Allgemeiner \u00dcberblick \u00fcber die Architektur des Dienstes zur Beurteilung des Erscheinungsbilds basierend auf neuronalen Netzwerken.\" 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 Clustergr\u00f6\u00dfe betr\u00e4gt 1 Knoten; die einzige Maschine fungiert gleichzeitig als Leader-Manager und Worker. Je nach Projektgr\u00f6\u00dfe und minimale Anforderungen an die Fehlertoleranz wurde beschlossen, diesen Ansatz zu verwenden.<\/p>\n<p><\/p>\n<p>Um vorzugreifen, kann ich sagen, dass seit der ersten Produktionsbereitstellung, die Mitte Juni stattfand, keine Probleme in Verbindung mit dieser Clusterorganisation aufgetreten sind (das bedeutet jedoch nicht, dass eine solche Organisation in irgendeiner Weise in mittelgro\u00dfen Projekten ohne Anforderungen an die Fehlertoleranz akzeptabel ist).<\/p>\n<p><\/p>\n<h3>Docker Stack<\/h3>\n<p><\/p>\n<p>Im Modus \u201eSwarm\u201c ist docker stack f\u00fcr die Bereitstellung von Stacks (Docker-Dienste) 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 erlaubt die Verwendung zus\u00e4tzlicher Bereitstellungsparameter.\u00a0\u00a0<\/p>\n<p><\/p>\n<p>Zum Beispiel wurden mit diesen Parametern die Ressourcen f\u00fcr jede Instanz des Evaluierungs-Mikrodienstes begrenzt (wir weisen N Kerne f\u00fcr N Instanzen zu, und im Mikrodienst beschr\u00e4nken wir die Anzahl der von PyTorch verwendeten Kerne 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 Stateful-Services sind und sie nicht so einfach skalierbar sind wie \u201eattrai-estimator\u201c.<\/p>\n<p><\/p>\n<h3>Antizipierend die Frage \u2014 warum nicht Kubernetes?<\/h3>\n<p><\/p>\n<p>Es scheint, dass die Nutzung von Kubernetes in kleinen und mittleren Projekten ein Overhead ist; die gesamte ben\u00f6tigte Funktionalit\u00e4t kann von Docker Swarm bereitgestellt werden, das recht benutzerfreundlich f\u00fcr einen Containerorchestrator ist und einen niedrigen Einstieg bietet.<\/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 Kerne 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>Nach den lokalen Lasttests schien es, dass dieses System bei einem starken Anstieg der Benutzer gerade ausreicht.<\/p>\n<p><\/p>\n<p>Aber direkt nach dem Deployment teilte ich einen Link zu einem der beliebtesten Imageboards im GUS-Raum (ja, genau das), woraufhin die Leute interessiert waren und der Service innerhalb weniger Stunden erfolgreich zehntausende Bilder verarbeitete. Dabei wurden in den Spitzenzeiten die Ressourcen von CPU und RAM nicht einmal zur H\u00e4lfte genutzt.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Allgemeiner \u00dcberblick \u00fcber die Architektur des Dienstes zur Beurteilung des Erscheinungsbilds basierend auf neuronalen Netzwerken.\" 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 Beurteilung des Erscheinungsbilds basierend auf neuronalen Netzwerken.\" src=\"\/wp-content\/uploads\/2020\/07\/e9383c47369c606d26e89a69f4d22b5a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Noch ein paar Grafiken<\/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 Beurteilung des Erscheinungsbilds basierend auf neuronalen Netzwerken.\" src=\"\/wp-content\/uploads\/2020\/07\/7112c78c8400d2ac73562243b16a015b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Verteilung der Inferenzzeit der Bewertungs-Pipeline<\/p>\n<p>\n<img decoding=\"async\" alt=\"Allgemeiner \u00dcberblick \u00fcber die Architektur des Dienstes zur Beurteilung des Erscheinungsbilds basierend auf neuronalen Netzwerken.\" src=\"\/wp-content\/uploads\/2020\/07\/4c892ce607c3ff3db466459729dd0876.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Fazit<\/h2>\n<p><\/p>\n<p>Zusammenfassend kann ich sagen, dass die Architektur und der Ansatz zur Orchestrierung der Container sich voll und ganz bew\u00e4hrt haben \u2014 selbst in Spitzenzeiten gab es keine Ausf\u00e4lle oder Verz\u00f6gerungen bei der Verarbeitung.\u00a0<\/p>\n<p><\/p>\n<p>Ich denke, kleine und mittelgro\u00dfe Projekte, die in ihrem Prozess Echtzeit-Inferenz von neuronalen Netzen auf CPU verwenden, k\u00f6nnen die in diesem Artikel beschriebenen Praktiken erfolgreich \u00fcbernehmen.<\/p>\n<p><\/p>\n<p>Ich m\u00f6chte hinzuf\u00fcgen, dass der Artikel urspr\u00fcnglich l\u00e4nger war, aber um keinen Longread zu posten, habe ich beschlossen, einige Punkte in diesem Artikel auszulassen \u2013 wir werden in zuk\u00fcnftigen Ver\u00f6ffentlichungen darauf zur\u00fcckkommen.<\/p>\n<p><\/p>\n<p>Den Bot kann man auf Telegram ansto\u00dfen \u2013 @AttraiBot, er wird mindestens bis zum Ende des Herbstes 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 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\/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) 4.9.10\" \/>\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=\"\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\/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\udd47Allgemeine \u00dcbersicht \u00fcber die Architektur des Dienstes zur Bewertung des Aussehens basierend auf neuronalen Netzen | ProHoster","description":"Einf\u00fchrung Hallo! In diesem Artikel teile ich meine Erfahrungen beim Aufbau einer Microservices-Architektur f\u00fcr ein Projekt, das neuronale Netze verwendet. Wir werden \u00fcber die Anforderungen an die Architektur sprechen, verschiedene Strukturdiagramme ansehen, jeden der Komponenten der fertigen Architektur analysieren und die technischen Kennzahlen der L\u00f6sung bewerten. Viel Spa\u00df beim Lesen! Ein paar Worte zur Aufgabe und ihrer L\u00f6sung Die Hauptidee ist, basierend auf einem Foto eine Bewertung abzugeben.","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":"\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\/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"},"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}]}}