{"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\/sv\/blog\/administrirovanie\/obshhij-obzor-arhitektury-servisa-dlya-oczenki-vneshnosti-na-osnove-nejronnyh-setej","title":{"rendered":"\u00d6versikt \u00f6ver tj\u00e4nstens arkitektur f\u00f6r utv\u00e4rdering av utseendet baserat p\u00e5 neurala n\u00e4tverk","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"\u00d6versikt \u00f6ver tj\u00e4nstens arkitektur f\u00f6r utv\u00e4rdering av utseendet baserat p\u00e5 neurala n\u00e4tverk\" src=\"\/wp-content\/uploads\/2020\/07\/f624e995fbee3496f1f7890b98106df4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Inledning<\/h2>\n<p><\/p>\n<p>Hej!<\/p>\n<p><\/p>\n<p>I denna artikel kommer jag att dela med mig av erfarenheter av att bygga en mikrotj\u00e4nstarkitektur f\u00f6r ett projekt som anv\u00e4nder neurala n\u00e4tverk.<\/p>\n<p><\/p>\n<p>Vi kommer att diskutera kraven p\u00e5 arkitekturen, titta p\u00e5 olika strukturella diagram, g\u00e5 igenom var och en av komponenterna i den f\u00e4rdiga arkitekturen samt bed\u00f6ma de tekniska metrikserna f\u00f6r l\u00f6sningen.<\/p>\n<p><\/p>\n<p>Trevlig l\u00e4sning!<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>N\u00e5gra ord om uppgiften och dess l\u00f6sning<\/h2>\n<p><\/p>\n<p>Huvudid\u00e9n \u00e4r att ge en bed\u00f6mning av en persons attraktivitet baserat p\u00e5 ett foto p\u00e5 en tiogradig skala.<\/p>\n<p><\/p>\n<p>I denna artikel kommer vi att avvika fr\u00e5n att beskriva b\u00e5de de anv\u00e4nda neurala n\u00e4tverken och processen f\u00f6r dataf\u00f6rberedelse och inl\u00e4rning. Men i en av kommande publikationer kommer vi definitivt att \u00e5terkomma till att analysera pipelinen f\u00f6r bed\u00f6mning p\u00e5 en djupare niv\u00e5.<\/p>\n<p><\/p>\n<p>Just nu kommer vi p\u00e5 en \u00f6vergripande niv\u00e5 att g\u00e5 igenom pipelinen f\u00f6r bed\u00f6mning och vi kommer att fokusera p\u00e5 interaktionen mellan mikrotj\u00e4nster i kontexten av projektets \u00f6vergripande arkitektur.\u00a0<\/p>\n<p><\/p>\n<p>N\u00e4r vi arbetade med pipelinen f\u00f6r att bed\u00f6ma attraktivitet, s\u00e5 delades uppgiften upp i f\u00f6ljande best\u00e5ndsdelar:<\/p>\n<p><\/p>\n<ol>\n<li>Utvinning av ansikten fr\u00e5n foton<\/li>\n<li>Bed\u00f6mning av varje ansikte<\/li>\n<li>Rendering av resultatet<\/li>\n<\/ol>\n<p><\/p>\n<p>Den f\u00f6rsta l\u00f6ses med hj\u00e4lp av en f\u00f6rutbildad <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1604.02878\">MTCNN<\/a><\/noindex>. F\u00f6r den andra tr\u00e4nades ett konvolutionsn\u00e4tverk p\u00e5 PyTorch, d\u00e4r en <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1512.03385\">ResNet34<\/a><\/noindex> anv\u00e4ndes som backbone f\u00f6r att balansera \u2018kvalitet \/ hastighet p\u00e5 inferens p\u00e5 CPU\u2019<\/p>\n<p>\n<img decoding=\"async\" alt=\"\u00d6versikt \u00f6ver tj\u00e4nstens arkitektur f\u00f6r utv\u00e4rdering av utseendet baserat p\u00e5 neurala n\u00e4tverk\" src=\"\/wp-content\/uploads\/2020\/07\/181cc89a2cf5295bdcd4b838216f96d6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Funktionsdiagram f\u00f6r bed\u00f6mningspipen<\/i><\/p>\n<p><\/p>\n<h2>Analys av kraven p\u00e5 projektets arkitektur<\/h2>\n<p><\/p>\n<p>I livscykeln <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Machine_learning\">ML<\/a><\/noindex> f\u00f6r projektet \u00e4r faserna f\u00f6r att arbeta med arkitektur och automatisering av distribution av modellen ofta de mest tidskr\u00e4vande och resurskr\u00e4vande.<\/p>\n<p>\n<img decoding=\"async\" alt=\"\u00d6versikt \u00f6ver tj\u00e4nstens arkitektur f\u00f6r utv\u00e4rdering av utseendet baserat p\u00e5 neurala n\u00e4tverk\" src=\"\/wp-content\/uploads\/2020\/07\/4949f217d31c863176122ed87b43a88c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Livscykel f\u00f6r ML-projekt<\/i><\/p>\n<p><\/p>\n<p>Detta projekt \u00e4r inget undantag - beslutet togs att kapsla in bed\u00f6mningspipen i en online-tj\u00e4nst, f\u00f6r detta kr\u00e4vdes det att vi dykte ner i arkitekturen. f\u00f6ljande grundl\u00e4ggande krav anges:<\/p>\n<p><\/p>\n<ol>\n<li>Enhetlig loggf\u00f6rvaring - alla tj\u00e4nster b\u00f6r skriva loggar p\u00e5 en och samma plats, de b\u00f6r vara l\u00e4tta att analysera<\/li>\n<li>M\u00f6jlighet till horisontell skalning av bed\u00f6mningstj\u00e4nsten - som den mest troliga flaskhalsen<\/li>\n<li>Samma m\u00e4ngd processorresurser ska tilldelas f\u00f6r varje bildbed\u00f6mning - f\u00f6r att undvika avvikelser i tidsf\u00f6rdelningen f\u00f6r inferens<\/li>\n<li>Snabb (om) distribution av b\u00e5de specifika tj\u00e4nster och stacken som helhet<\/li>\n<li>M\u00f6jlighet, om s\u00e5 beh\u00f6vs, att anv\u00e4nda gemensamma objekt i olika tj\u00e4nster<\/li>\n<\/ol>\n<p><\/p>\n<h2>Arkitektur<\/h2>\n<p><\/p>\n<p>Efter att ha analyserat kraven st\u00e5r det klart att en mikrotj\u00e4nstarkitektur passar n\u00e4stan perfekt.<\/p>\n<p><\/p>\n<p>F\u00f6r att undvika \u00f6verfl\u00f6dig huvudv\u00e4rk valdes Telegram API som frontend.<\/p>\n<p><\/p>\n<p>Vi b\u00f6rjar med att titta p\u00e5 den strukturella diagrammet f\u00f6r den f\u00e4rdiga arkitekturen, d\u00e4refter g\u00e5r vi vidare till beskrivningen av varje komponent och formaliserar processen f\u00f6r framg\u00e5ngsrik bildbehandling.<\/p>\n<p>\n<img decoding=\"async\" alt=\"\u00d6versikt \u00f6ver tj\u00e4nstens arkitektur f\u00f6r utv\u00e4rdering av utseendet baserat p\u00e5 neurala n\u00e4tverk\" src=\"\/wp-content\/uploads\/2020\/07\/163ec019341e9d71a1e0854c6026bd01.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Det strukturella diagrammet f\u00f6r den f\u00e4rdiga arkitekturen<\/i><\/p>\n<p><\/p>\n<p>L\u00e5t oss g\u00e5 in mer detaljerat p\u00e5 varje komponent i diagrammet och definiera deras Single Responsibility i processen f\u00f6r bildbed\u00f6mning.<\/p>\n<p><\/p>\n<h3>Mikrotj\u00e4nsten \u00abattrai-telegram-bot\u00bb<\/h3>\n<p><\/p>\n<p>Denna mikrotj\u00e4nst kapslar in all interaktion med Telegram API. Tv\u00e5 huvudscenarier kan urskiljas \u2013 hantering av anv\u00e4ndarens bild och hantering av resultatet fr\u00e5n bed\u00f6mningspipeline. Vi g\u00e5r igenom b\u00e5da scenarierna i allm\u00e4nhet.<\/p>\n<p><\/p>\n<p>Vid mottagning av ett anv\u00e4ndarmeddelande med en bild:<\/p>\n<p><\/p>\n<ol>\n<li>Filtrering genomf\u00f6rs, som best\u00e5r av f\u00f6ljande kontroller:\n<ul>\n<li>N\u00e4rvaron av optimal bildstorlek<\/li>\n<li>Antalet bilder fr\u00e5n anv\u00e4ndaren som redan finns i k\u00f6n<\/li>\n<\/ul>\n<\/li>\n<li>Vid godk\u00e4nd f\u00f6rsta filtrering sparas bilden i en dockervolym<\/li>\n<li>En uppgift produceras i k\u00f6n \"to_estimate\", som bland annat inneh\u00e5ller s\u00f6kv\u00e4gen till bilden som ligger i v\u00e5r volym<\/li>\n<li>Om de ovanst\u00e5ende stegen har genomf\u00f6rts framg\u00e5ngsrikt \u2013 f\u00e5r anv\u00e4ndaren ett meddelande med den uppskattade bearbetningstiden f\u00f6r bilden, baserat p\u00e5 antalet uppgifter i k\u00f6n. I h\u00e4ndelse av fel kommer anv\u00e4ndaren att informeras tydligt \u2013 genom att skicka ett meddelande med information om vad som kan ha g\u00e5tt fel. <\/li>\n<\/ol>\n<p><\/p>\n<p>Dessutom lyssnar denna mikrotj\u00e4nst, som celery-arbetare, p\u00e5 k\u00f6n \"after_estimate\", som \u00e4r avsedd f\u00f6r uppgifter som har passerat genom bed\u00f6mningspipeline.<\/p>\n<p><\/p>\n<p>Vid mottagning av en ny uppgift fr\u00e5n \"after_estimate\":<\/p>\n<p><\/p>\n<ol>\n<li>Om bilden har bearbetats framg\u00e5ngsrikt \u2013 skickar vi resultatet till anv\u00e4ndaren, om inte \u2013 meddelar vi om ett fel.<\/li>\n<li>Vi tar bort bilden som \u00e4r resultatet av bed\u00f6mningspipen.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Mikrotj\u00e4nsten f\u00f6r bed\u00f6mning \u00abattrai-estimator\u00bb<\/h3>\n<p><\/p>\n<p>Denna mikrotj\u00e4nst \u00e4r en celery-arbetare och kapslar in allt som r\u00f6r bed\u00f6mningspipen f\u00f6r bilden. Arbetsalgoritmen h\u00e4r \u00e4r en \u2013 vi g\u00e5r igenom den.<\/p>\n<p><\/p>\n<p>Vid mottagning av en ny uppgift fr\u00e5n \"to_estimate\":<\/p>\n<p><\/p>\n<ol>\n<li>Vi k\u00f6r bilden genom bed\u00f6mningspipen:\n<ol>\n<li>Vi laddar bilden i minnet<\/li>\n<li>Justera bilden till \u00f6nskad storlek<\/li>\n<li>Identifiera alla ansikten (MTCNN)<\/li>\n<li>Utv\u00e4rdera alla ansikten (bunta de identifierade ansiktena fr\u00e5n f\u00f6reg\u00e5ende steg och utf\u00f6r inferens med ResNet34)<\/li>\n<li>Rendera den slutliga bilden\n<ol>\n<li>Rita bounding boxes<\/li>\n<li>Rita utv\u00e4rderingarna<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<\/li>\n<li>Ta bort anv\u00e4ndarens (ursprungliga) bild<\/li>\n<li>Spara utg\u00e5ngen fr\u00e5n utv\u00e4rderingspipen<\/li>\n<li>L\u00e4gg till uppgiften i k\u00f6n \u201cafter_estimate\u201d, som lyssnas p\u00e5 av mikrotj\u00e4nsten \u201cattrai-telegram-bot\u201d<\/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 \u00e4r en l\u00f6sning f\u00f6r centraliserad logghantering. I detta projekt anv\u00e4ndes det f\u00f6r sitt avsedda syfte.<\/p>\n<p><\/p>\n<p>Valet f\u00f6ll faktiskt p\u00e5 det, ist\u00e4llet f\u00f6r den bekanta <noindex><a rel=\"nofollow\" href=\"https:\/\/www.elastic.co\/what-is\/elk-stack\">ELK<\/a><\/noindex> stacken, p\u00e5 grund av anv\u00e4ndarv\u00e4nligheten i Python. Det enda som beh\u00f6vs f\u00f6r att logga i Graylog \u00e4r att l\u00e4gga till GELFTCPHandler fr\u00e5n paketet <noindex><a rel=\"nofollow\" href=\"https:\/\/pypi.org\/project\/graypy\/\">graypy<\/a><\/noindex> till de \u00f6vriga root logger handlers av v\u00e5r python-mikrotj\u00e4nst.<\/p>\n<p><\/p>\n<p>Jag, som en person som tidigare endast arbetat med ELK-stacken, fick totalt sett en positiv upplevelse av att arbeta med Graylog. Det enda som \u00e4r nedsl\u00e5ende \u00e4r den \u00f6verl\u00e4gsenhet i funktioner som Kibana har j\u00e4mf\u00f6rt med Graylogs webbgr\u00e4nssnitt.<\/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 \u00e4r en meddelandebroker baserad p\u00e5 AMQP-protokollet.<\/p>\n<p><\/p>\n<p>I detta projekt anv\u00e4ndes den som <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.celeryproject.org\/en\/latest\/getting-started\/brokers\/#broker-overview\">den mest stabila och tidtestade<\/a><\/noindex> brokern f\u00f6r Celery och arbetade i h\u00e5llbar l\u00e4ge.<\/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 \u00e4r en NoSQL-databas som arbetar med datatyper av typen \"nyckel-v\u00e4rde\"<\/p>\n<p><\/p>\n<p>Ibland beh\u00f6ver man anv\u00e4nda gemensamma objekt i olika python-mikrotj\u00e4nster som implementerar vissa datatyper.<\/p>\n<p><\/p>\n<p>Till exempel, i Redis lagras en hashmap av typen \"telegram_user_id =&gt; antal aktiva uppgifter i k\u00f6n\", vilket g\u00f6r att antalet f\u00f6rfr\u00e5gningar fr\u00e5n en anv\u00e4ndare kan begr\u00e4nsas till ett visst v\u00e4rde och d\u00e4rmed f\u00f6rhindra DoS-attacker.<\/p>\n<p><\/p>\n<h3>Formaliserar processen f\u00f6r framg\u00e5ngsrik bildbehandling<\/h3>\n<p><\/p>\n<ol>\n<li>Anv\u00e4ndaren skickar en bild till Telegram-boten<\/li>\n<li>\u201cattrai-telegram-bot\u201d tar emot meddelandet fr\u00e5n Telegram API och analyserar det<\/li>\n<li>Uppgiften med bilden l\u00e4ggs till i den asynkrona k\u00f6n \u201cto_estimate\u201d<\/li>\n<li>Anv\u00e4ndaren f\u00e5r meddelande med planerad utv\u00e4rderingstid<\/li>\n<li>\u201cattrai-estimator\u201d tar uppgiften fr\u00e5n k\u00f6n \u201cto_estimate\u201d, k\u00f6r den genom utv\u00e4rderingspipen och producerar uppgiften i k\u00f6n \u201cafter_estimate\u201d<\/li>\n<li>\u201cattrai-telegram-bot\u201d, som lyssnar p\u00e5 k\u00f6n \u201cafter_estimate\u201d, skickar resultatet till anv\u00e4ndaren<\/li>\n<\/ol>\n<p><\/p>\n<h2>DevOps<\/h2>\n<p><\/p>\n<p>Till sist, efter att ha granskat arkitekturen, kan vi g\u00e5 vidare till den inte mindre intressanta delen \u2014 DevOps<\/p>\n<p><\/p>\n<h3>Docker Swarm<\/h3>\n<p><\/p>\n<p>\u00a0<\/p>\n<p>\n<img decoding=\"async\" alt=\"\u00d6versikt \u00f6ver tj\u00e4nstens arkitektur f\u00f6r utv\u00e4rdering av utseendet baserat p\u00e5 neurala n\u00e4tverk\" 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&#8212; \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438, \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0432\u043d\u0443\u0442\u0440\u0438 Docker Engine \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438.<\/p>\n<p><\/p>\n<p>Genom hj\u00e4lp av \"sv\u00e4rmen\" kan alla noder i v\u00e5rt kluster delas upp i tv\u00e5 typer \u2013 worker och manager. P\u00e5 maskiner av den f\u00f6rsta typen deployas grupper av containrar (stacks), maskiner av den andra typen ansvarar f\u00f6r skalning, balansering och <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/swarm\/#feature-highlights\">andra coola funktioner.<\/a><\/noindex>Managern \u00e4r som standard \u00e4ven en worker.<\/p>\n<p>\n<img decoding=\"async\" alt=\"\u00d6versikt \u00f6ver tj\u00e4nstens arkitektur f\u00f6r utv\u00e4rdering av utseendet baserat p\u00e5 neurala n\u00e4tverk\" src=\"\/wp-content\/uploads\/2020\/07\/d195e2aab6d3552652102c2b5246abfc.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Kluster med en leader manager och tre workers.<\/i><\/p>\n<p><\/p>\n<p>Den minsta m\u00f6jliga storleken p\u00e5 klustret \u00e4r 1 nod, den enda maskinen kommer att fungera som b\u00e5de leader manager och worker. Baserat p\u00e5 projektets storlek och minimala krav p\u00e5 fel\u00f6verlevnad beslutades det att anv\u00e4nda just denna strategi.<\/p>\n<p><\/p>\n<p>F\u00f6r att g\u00e5 vidare kan jag s\u00e4ga att sedan den f\u00f6rsta production-leveransen, som skedde i mitten av juni, har det inte funnits n\u00e5gra problem relaterade till denna klusterorganisation (men det betyder inte att en s\u00e5dan organisation \u00e4r p\u00e5 n\u00e5got s\u00e4tt till\u00e5ten i medelstora till stora projekt, som har krav p\u00e5 fel\u00f6verlevnad).<\/p>\n<p><\/p>\n<h3>Docker Stack<\/h3>\n<p><\/p>\n<p>I \"sv\u00e4rml\u00e4get\" ansvarar f\u00f6r deployeringen av stacks (upps\u00e4ttningar av docker-tj\u00e4nster) <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/reference\/commandline\/stack\/\">docker stack<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Den st\u00f6der docker-compose konfigurationer, vilket dessutom m\u00f6jligg\u00f6r anv\u00e4ndning av deploy-parametrar.\u00a0\u00a0<\/p>\n<p><\/p>\n<p>Till exempel, med hj\u00e4lp av dessa parametrar begr\u00e4nsades resurserna p\u00e5 varje instans av mikrotj\u00e4nsten f\u00f6r bed\u00f6mning (vi tilldelar N instanser N k\u00e4rnor, och i sj\u00e4lva mikrotj\u00e4nsten begr\u00e4nsar vi antalet k\u00e4rnor som anv\u00e4nds av PyTorch till en).<\/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>Det \u00e4r viktigt att notera att Redis, RabbitMQ och Graylog \u00e4r stateful tj\u00e4nster och det \u00e4r inte lika enkelt att skala dem som \"attrai-estimator\".<\/p>\n<p><\/p>\n<h3>F\u00f6r att f\u00f6rutsp\u00e5 fr\u00e5gan \u2013 varf\u00f6r inte Kubernetes?<\/h3>\n<p><\/p>\n<p>Det verkar som att anv\u00e4ndning av Kubernetes i sm\u00e5 och medelstora projekt \u00e4r en \u00f6verbelastning, all n\u00f6dv\u00e4ndig funktionalitet kan erh\u00e5llas fr\u00e5n Docker Swarm, som \u00e4r ganska anv\u00e4ndarv\u00e4nlig f\u00f6r beh\u00e5llarorkestrering och har en l\u00e5g tr\u00f6skel f\u00f6r att komma ig\u00e5ng.<\/p>\n<p><\/p>\n<h3>Infrastruktur<\/h3>\n<p><\/p>\n<p>Detta rullades ut p\u00e5 VDS med f\u00f6ljande specifikationer:<\/p>\n<p><\/p>\n<ul>\n<li>CPU: 4 \u044f\u0434\u0440\u0430 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>Efter lokal belastningstestning verkade det som att denna maskin skulle vara precis tillr\u00e4cklig vid ett stort infl\u00f6de av anv\u00e4ndare.<\/p>\n<p><\/p>\n<p>Men direkt efter lanseringen postade jag en l\u00e4nk till en av de mest popul\u00e4ra bildtavlorna i CIS (ja, precis den), vilket v\u00e4ckte intresse och under n\u00e5gra timmar behandlade tj\u00e4nsten framg\u00e5ngsrikt tiotusentals bilder. Under peak-\u00f6gonblicken anv\u00e4ndes varken CPU- eller RAM-resurserna ens till h\u00e4lften.<\/p>\n<p>\n<img decoding=\"async\" alt=\"\u00d6versikt \u00f6ver tj\u00e4nstens arkitektur f\u00f6r utv\u00e4rdering av utseendet baserat p\u00e5 neurala n\u00e4tverk\" src=\"\/wp-content\/uploads\/2020\/07\/458d74dae00d455fbce1ca6a197325d7.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"\u00d6versikt \u00f6ver tj\u00e4nstens arkitektur f\u00f6r utv\u00e4rdering av utseendet baserat p\u00e5 neurala n\u00e4tverk\" src=\"\/wp-content\/uploads\/2020\/07\/e9383c47369c606d26e89a69f4d22b5a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Lite mer grafik<\/h3>\n<p><\/p>\n<p>Antalet unika anv\u00e4ndare och beg\u00e4rningar om bed\u00f6mning, sedan lanseringen, beroende p\u00e5 dagen<\/p>\n<p>\n<img decoding=\"async\" alt=\"\u00d6versikt \u00f6ver tj\u00e4nstens arkitektur f\u00f6r utv\u00e4rdering av utseendet baserat p\u00e5 neurala n\u00e4tverk\" src=\"\/wp-content\/uploads\/2020\/07\/7112c78c8400d2ac73562243b16a015b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>F\u00f6rdelning av inferenstid f\u00f6r bed\u00f6mningspipelin<\/p>\n<p>\n<img decoding=\"async\" alt=\"\u00d6versikt \u00f6ver tj\u00e4nstens arkitektur f\u00f6r utv\u00e4rdering av utseendet baserat p\u00e5 neurala n\u00e4tverk\" src=\"\/wp-content\/uploads\/2020\/07\/4c892ce607c3ff3db466459729dd0876.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Slutsatser<\/h2>\n<p><\/p>\n<p>Sammanfattningsvis kan jag s\u00e4ga att arkitekturen och tillv\u00e4gag\u00e5ngss\u00e4ttet f\u00f6r orkestrering av containrar fullst\u00e4ndigt har bevisat sin v\u00e4rdighet - \u00e4ven under peak-\u00f6gonblicken intr\u00e4ffade det inga nedg\u00e5ngar eller f\u00f6rseningar i bearbetningstiden.\u00a0<\/p>\n<p><\/p>\n<p>Jag tror att sm\u00e5 och medelstora projekt som anv\u00e4nder realtidsinfernsering av neurala n\u00e4tverk p\u00e5 CPU framg\u00e5ngsrikt kan adoptera de metoder som beskrivs i denna artikel.<\/p>\n<p><\/p>\n<p>Jag till\u00e4gger att artikeln ursprungligen var l\u00e4ngre, men f\u00f6r att inte posta en l\u00e5ng l\u00e4sning beslutade jag att utel\u00e4mna vissa punkter i denna artikel - vi kommer att \u00e5terkomma till dem i kommande publikationer.<\/p>\n<p><\/p>\n<p>Du kan testa boten p\u00e5 Telegram - @AttraiBot, den kommer att fungera \u00e5tminstone fram till slutet av h\u00f6sten 2020. Jag p\u00e5minner om - inga anv\u00e4ndardata lagras - varken ursprungsbilder eller resultat fr\u00e5n bed\u00f6mningspipelinen - allt raderas efter bearbetning.<\/p>\n<p>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/obshhij-obzor-arhitektury-servisa-dlya-oczenki-vneshnosti-na-osnove-nejronnyh-setej\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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\u00d6versikt av arkitekturen f\u00f6r tj\u00e4nsten f\u00f6r bed\u00f6mning av utseendet baserat p\u00e5 neurala n\u00e4tverk | ProHoster","description":".","canonical_url":"https:\/\/prohoster.info\/sv\/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":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/89110","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=89110"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/89110\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/89111"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=89110"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=89110"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=89110"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}