Kanne
Tere!
Selles artiklis jagan oma kogemusi närvivõrke kasutava projekti jaoks mikroteenuse arhitektuuri loomisel.
Räägime arhitektuurinõuetest, vaatame erinevaid struktuuriskeeme, analüüsime igat valminud arhitektuuri komponenti ning hindame ka lahenduse tehnilisi mõõdikuid.
Nautige lugemist!
Paar sõna probleemist ja selle lahendusest
Põhiidee on hinnata foto põhjal inimese atraktiivsust kümnepallisel skaalal.
Selles artiklis loobume nii kasutatavate närvivõrkude kui ka andmete ettevalmistamise ja treenimise protsessi kirjeldamisest. Kuid ühes järgmistest väljaannetest tuleme kindlasti tagasi hindamistorustiku põhjaliku analüüsi juurde.
Nüüd läbime hindamisprotsessi tipptasemel ja keskendume mikroteenuste koostoimele projekti üldise arhitektuuri kontekstis.
Atraktiivsuse hindamise torustiku kallal töötades jaotati ülesanne järgmisteks komponentideks:
- Fotodel nägude valimine
- Iga inimese hinnang
- Renderdage tulemus
Esimene lahendatakse eelkoolitatud jõududega
Hindamiskonveieri funktsionaalne skeem
Projekti arhitektuuri nõuete analüüs
Elutsüklis
ML-projekti elutsükkel
See projekt pole erand – otsustati pakkida hindamiskonveier võrguteenuseks, mis nõudis arhitektuurisse sukeldumist. Määrati kindlaks järgmised põhinõuded:
- Ühtne logihoidla – kõik teenused peaksid kirjutama logid ühte kohta, neid peaks olema mugav analüüsida
- Hindamisteenuse horisontaalse skaleerimise võimalus – kui kõige tõenäolisem pudelikael
- Iga pildi hindamiseks tuleks eraldada sama palju protsessoriressursse, et vältida kõrvalekaldeid järelduste tegemise aja jaotuses
- Nii konkreetsete teenuste kui ka virna kui terviku kiire (ümber)juurutamine
- Võimalus vajadusel kasutada erinevates teenustes levinud objekte
arhitektuur
Pärast nõuete analüüsimist sai selgeks, et mikroteenuse arhitektuur sobib peaaegu ideaalselt.
Asjatutest peavaludest vabanemiseks valiti kasutajaliideseks Telegrami API.
Kõigepealt vaatame valmis arhitektuuri struktuuriskeemi, seejärel liigume edasi iga komponendi kirjelduse juurde ja vormistame ka eduka pilditöötluse protsessi.
Valmis arhitektuuri ehitusskeem
Räägime üksikasjalikumalt diagrammi igast komponendist, märkides neile ühe vastutuse pildi hindamise protsessis.
Mikroteenus “attrai-telegram-bot”
See mikroteenus kapseldab kõik koostoimed Telegram API-ga. On kaks peamist stsenaariumi: kohandatud pildiga töötamine ja hindamiskonveieri tulemusega töötamine. Vaatame mõlemat stsenaariumi üldiselt.
Kui saate kohandatud pildiga sõnumi:
- Filtreerimine viiakse läbi, mis koosneb järgmistest kontrollidest:
- Optimaalse pildisuuruse olemasolu
- Juba järjekorras olevate kasutajapiltide arv
- Esialgse filtreerimise läbimisel salvestatakse pilt dockeri helitugevusse
- Järjekorda "to_estimate" luuakse ülesanne, mis sisaldab muuhulgas teed meie köites asuva pildi juurde
- Kui ülaltoodud sammud on edukalt sooritatud, saab kasutaja teate ligikaudse pilditöötluse aja järgi, mis arvutatakse järjekorras olevate ülesannete arvu alusel. Kui ilmneb tõrge, teavitatakse kasutajat selgesõnaliselt, saates sõnumi, mis sisaldab teavet selle kohta, mis võis valesti minna.
Samuti kuulab see mikroteenus sarnaselt selleritöölisele “after_estimate” järjekorda, mis on mõeldud hindamiskonveieri läbinud ülesannete jaoks.
Kui saate "after_estimate"-lt uue ülesande:
- Kui pildi töötlemine õnnestub, saadame tulemuse kasutajale, kui mitte, siis teavitame veast.
- Hindamiskonveieri tulemuseks oleva kujutise eemaldamine
Hindamise mikroteenus "attrai-estimator"
See mikroteenus on selleri töötaja ja sisaldab kõike, mis on seotud pildi hindamise torujuhtmega. Siin on ainult üks tööalgoritm – analüüsime seda.
Uue ülesande saamisel "to_estimate":
- Käivitame pildi läbi hindamiskonveieri:
- Pildi mällu laadimine
- Toome pildi vajaliku suuruseni
- Kõigi nägude otsimine (MTCNN)
- Hindame kõiki nägusid (viimases etapis leitud näod koondame partii ja järeldame ResNet34)
- Renderdage lõplik pilt
- Joonistame piirdekastid
- Reitingute joonistamine
- Kohandatud (algse) pildi kustutamine
- Väljundi salvestamine hindamiskonveierist
- Panime ülesande “after_estimate” järjekorda, mida kuulab ülalpool käsitletud “attrai-telegram-bot” mikroteenus.
Graylog (+ mongoDB + Elasticsearch)
Valik langes talle, mitte tavapärasele
Varem ainult ELK-stackiga töötanud inimesena sain Graylogiga töötades üldiselt positiivse kogemuse. Ainus, mis masendav, on Kibana funktsioonide paremus Graylogi veebiliidese ees.
JänesMQ
Selles projektis kasutati seda kui
Redis
Mõnikord on vajadus kasutada tavalisi objekte, mis rakendavad teatud andmestruktuure erinevates Pythoni mikroteenustes.
Näiteks salvestab Redis räsikaardi kujul “telegrammi_kasutaja_id => aktiivsete ülesannete arv järjekorras”, mis võimaldab piirata ühe kasutaja päringute arvu teatud väärtuseni ja seeläbi vältida DoS-rünnakuid.
Vormistame eduka pilditöötluse protsessi
- Kasutaja saadab pildi Telegrami robotile
- "attrai-telegram-bot" saab sõnumi Telegram API-lt ja analüüsib seda
- Pildiga ülesanne lisatakse asünkroonsesse järjekorda “to_estimate”
- Kasutaja saab teate planeeritud hindamisajaga
- "attrai-estimator" võtab ülesande "to_estimate" järjekorrast, käivitab hinnangud läbi konveieri ja toodab ülesande "after_estimate" järjekorda
- "attrai-telegram-bot" kuulab "after_estimate" järjekorda, saadab tulemuse kasutajale
DevOps
Lõpuks, pärast arhitektuuri ülevaatamist, võite liikuda sama huvitava osa juurde - DevOps
Dockeri sülem
“Sülemi” kasutades saab kõik meie klastri sõlmed jagada kahte tüüpi – töötaja ja juht. Esimest tüüpi masinatel on kasutusel konteinerite rühmad (virnad), teist tüüpi masinad vastutavad skaleerimise, tasakaalustamise ja
Klaster ühe juhi ja kolme töötajaga
Minimaalne võimalik klastri suurus on 1 sõlm; üks masin toimib samaaegselt nii juhi kui ka töötajana. Lähtudes projekti mahust ja tõrketaluvuse miinimumnõuetest, otsustati kasutada seda lähenemist.
Tulevikku vaadates ütlen, et alates esimesest tootmise tarnimisest, mis oli juuni keskel, pole selle klastriorganisatsiooniga seotud probleeme olnud (aga see ei tähenda, et selline organisatsioon oleks kuidagi vastuvõetav üheski keskmises-suures). projektid, mille suhtes kehtivad tõrketaluvuse nõuded).
Docker Stack
Sülemisrežiimis vastutab ta virnade (dokiteenuste komplektide) juurutamise eest.
See toetab dokkide koostamise konfiguratsioone, võimaldades teil lisaks kasutada juurutamisvalikuid.
Näiteks neid parameetreid kasutades olid ressursid iga hindamise mikroteenuse eksemplari jaoks piiratud (eraldame N tuuma N eksemplari jaoks, mikroteenuses endas piirame PyTorchi poolt kasutatavate tuumade arvu ühega)
attrai_estimator:
image: 'erqups/attrai_estimator:1.2'
deploy:
replicas: 4
resources:
limits:
cpus: '4'
restart_policy:
condition: on-failure
…
Oluline on märkida, et Redis, RabbitMQ ja Graylog on olekupõhised teenused ja neid ei saa nii lihtsalt skaleerida kui "attrai-estimatorit".
Eelnev küsimus – miks mitte Kubernetes?
Tundub, et Kubernetese kasutamine väikestes ja keskmistes projektides on kulukas, kogu vajaliku funktsionaalsuse saab Docker Swarmist, mis on konteinerorkestri jaoks üsna kasutajasõbralik ja millel on ka madal sisenemisbarjäär.
Infrastruktuur
Kõik see võeti kasutusele VDS-is järgmiste omadustega:
- CPU: 4-tuumaline Intel® Xeon® Gold 5120 protsessor @ 2.20 GHz
- RAM: 8 GB
- SSD: 160 GB
Pärast kohalikku koormustestimist tundus, et tõsise kasutajate juurdevoolu korral sellest masinast piisab.
Kuid kohe pärast juurutamist postitasin lingi SRÜ ühele populaarsemale pilditahvlile (jah, seesama), misjärel tekkis inimestel huvi ja teenus töötles mõne tunniga edukalt kümneid tuhandeid pilte. Samal ajal ei kasutatud tipphetkedel CPU ja RAM-i ressursse pooleldi ära.
Veel natuke graafikat
Unikaalsete kasutajate ja hindamistaotluste arv alates kasutuselevõtust olenevalt päevast
Hindamiskonveieri järelduste ajajaotus
Järeldused
Kokkuvõtteks võin öelda, et arhitektuur ja lähenemine konteinerite orkestreerimisele õigustas end igati – isegi tipphetkedel ei toimunud töötlemisaja langust ega longust.
Ma arvan, et väikesed ja keskmise suurusega projektid, mis kasutavad oma protsessis protsessori närvivõrkude reaalajas järeldusi, saavad selles artiklis kirjeldatud tavasid edukalt kasutusele võtta.
Lisan, et algselt oli artikkel pikem, kuid selleks, et pikka lugemist mitte postitada, otsustasin mõned punktid sellest artiklist välja jätta - nende juurde tuleme tulevastes väljaannetes tagasi.
Boti saab pista Telegramis - @AttraiBot, see töötab vähemalt 2020. aasta sügise lõpuni. Tuletan meelde, et kasutajaandmeid ei salvestata – ei originaalpilte ega hindamiskonveieri tulemusi – kõik lammutatakse pärast töötlemist.
Allikas: www.habr.com