
Sissejuhatus
Tere!
Selles artiklis jagan kogemusi mikroteenuste arhitektuuri loomisel projektile, mis kasutab tehisnÀrvivÔrke.
RÀÀgime arhitektuuri nĂ”uetest, vaatame erinevaid struktuuri diagramme, analĂŒĂŒsime iga valmis arhitektuuri komponendi ning hindame lahenduse tehnilisi mÔÔdikuid.
Head lugemist!
MĂ”ned sĂ”nad ĂŒlesandest ja selle lahendusest
Peamine idee on hinnata inimese atraktiivsust fotode pĂ”hjal kĂŒmne punkti sĂŒsteemis.
Selles artiklis ei kĂ€sitle me ei kasutatavaid tehisnĂ€rvivĂ”rke ega andmete ettevalmistamise ja treenimise protsessi. KĂŒll aga naaseme ĂŒhes jĂ€rgnevates publikatsioonides sĂŒvitsi pipeline'i analĂŒĂŒsi juurde.
Praegu lĂ€bime pipeline'i ĂŒlevaate, keskendudes mikroteenuste omavahelisele suhtlemisele projekti ĂŒldises arhitektuuris.Â
Atraktiivsuse hindamise pipeline'i töötamisel oli ĂŒlesanne dekomponeeritud jĂ€rgmistesse osadesse:
- NĂ€gude eristamine fotodel
- Iga nÀo hindamine
- Tulemuse renderdamine
Esimene probleem lahendatakse eelĂ”petatud . Teise jaoks treiti konvolutsiooniline nĂ€rvivĂ”rk PyTorchis, kasutades backbone'ina â tasakaalu «kvaliteet / CPU-lt innfereerimise kiirus»

Töötluse hindamise funktsionaalne diagramm
NĂ”uete analĂŒĂŒs projekti arhitektuurile
ElutsĂŒkli projekti etapid arhitektuuri ja mudeli juurutamise automatiseerimise osas on sageli ĂŒhed kĂ”ige aeganĂ”udvamad ning ressursimahukad.

ML projekti elutsĂŒkkel
See projekt ei ole erand â otsustati, et hindamise töövoog pakitakse veebiteenuseks, mille jaoks tuli sĂŒveneda arhitektuuri. MÀÀratleti jĂ€rgmised pĂ”hiv nĂ”uded:
- Ăhtne logide salvestamine â kĂ”ik teenused peavad kirjutama logid ĂŒhte kohta, neid peab olema mugav analĂŒĂŒsida
- Hindamisteenuse horisontaalne skaleeritavus â kui tĂ”enĂ€olisem Bottleneck
- Iga pildi hindamiseks tuleb eraldada sama palju CPU ressursse â et vĂ€ltida infereerimise aja jaotuses kĂ”rvalekaldeid
- Kiire (taas)juurutamine nii konkreetsete teenuste kui ka kogu stÀki jaoks
- VĂ”imalus kasutada vajadusel erinevates teenustes ĂŒhiseid objekte
Architecture
PĂ€rast nĂ”uete analĂŒĂŒsi jĂ€i selgeks, et mikroteenus arhitektuur sobitub praktiliselt ideaalselt.
Liigne peavalu vÀltimiseks valiti frontendiks Telegram API.
Alustuseks vaatame valminud arhitektuuri struktuuridiagrammi, seejÀrel liigume edasi iga komponendi kirjeldamise juurde ja formaliseerime eduka pildi töötlemise protsessi.

Valminud arhitektuuri struktuuridiagramm
RÀÀgime lĂ€hemalt iga diagrammi komponendi kohta, mÀÀratleme nende ĂŒksiku vastutuse pildi hindamise protsessis.
MikrosluĆŸba «attrai-telegram-bot»
See mikrosluĆŸba kapseldab kĂ”ik suhtlused Telegram API-ga. TĂ”stame esile 2 peamist stsenaariumi - töötamine kasutaja pildiga ja töötamine hindamise pipelini tulemusega. Vaatame mĂ”lemat stsenaariumi ĂŒldiselt.
Kasutaja pildi saatmise korral:
- Teostatakse filtreerimine, mis koosneb jÀrgmistest kontrollidest:
- Pildi optimaalse suuruse olemasolu
- Kasutaja piltide arv, mis juba jÀrjekorras on
- Esialgse filtreerimise lÀbimise korral salvestatakse pilt docker mahutisse
- Ootele âto_estimateâ lisatakse ĂŒlesanne, milles on muu hulgas pildi tee, mis asub meie mahutis
- Kui ĂŒlaltoodud etapid on edukalt lĂ€bitud, saab kasutaja teadet pildi töötlemise umbkaudse aja kohta, mis arvutatakse jĂ€rjekorras olevate ĂŒlesannete arvu pĂ”hjal. Vigade korral teavitame kasutajat selgelt â saatmise teel teate, milles on kirjas, mis vĂ”is valesti minna.
Samuti kuulab see mikroteenus, nagu celery töötaja, jĂ€rjekorda âafter_estimateâ, mis on mĂ”eldud hindamisprotsessist lĂ€binud ĂŒlesannetele.
Uue ĂŒlesande saamisel âafter_estimateâ:
- Kui pilt on edukalt töödeldud, saadame tulemuse kasutajale, kui mitte â teavitame veast
- Kustutame pildi, mis on hindamisprotsessi tulemus
Hindamis mikroteenus âattrai-estimatorâ
See mikroteenus on celery töötaja ja sisaldab endas kĂ”ike, mis on seotud pildi hindamise protsessiga. Siin on töö meetod ĂŒhekordne â tutvustame seda.
Uue ĂŒlesande saamisel âto_estimateâ:
- KÀime pildi lÀbi hindamisprotsessi:
- Laadime pildi mÀllu
- Kohandame pildi soovitud suurusele
- Otsime kÔik nÀod (MTCNN)
- Hindame kÔiki nÀgusid (pakkime selle punktis leitud nÀod ja teeme ResNet34-ga jÀreldused)
- Renderdame lÔplikku pilti
- Joonistame vÀlja piirjooned
- Joonistame hinnangud
- Kustutame kasutaja (algse) pildi
- Salvestame hindamise vÀljundi
- Paneme ĂŒlesande jĂ€rjekorda "after_estimate", millele kuulab eeltoodud mikroteenus "attrai-telegram-bot"
Graylog (+ mongoDB + Elasticsearch)
on lahendus logide keskse haldamise jaoks. Antud projektis kasutati seda tema otseseks otstarbeks.
Valik langes just tema kasuks, mitte tuttava stÀki, mugavuse tÔttu töötamisel Pythonis. KÔik, mis on vajalik Graylogis logimiseks, on GELFTCPHandleri lisamine paketi juurde meie Python mikroteenuse teistele juur logijatele.
Mina, kui inimene, kes on varem töötanud vaid ELK stĂ€kiga, sain Graylogiga töötamisel positiivse kogemuse. Ainus, mis pettumust valmistab, on Kibana funktsioonide ĂŒleolek Graylogi veebiliidese ees.
RabbitMQ
â on AMQP-protokollil pĂ”hinev sĂ”numite vahetus sĂŒsteem.
Selles projektis kasutati seda vahendina Celery jaoks ning see töötas durable-reĆŸiimis.
Redis
â on NoSQL andmebaas, mis töötab âvĂ”ti â vÀÀrtusâ andmestruktuuridega.
MĂ”nikord on vajalik kasutada erinevates python-mikroteenustes ĂŒhiseid objekte, mis rakendavad mĂ”ningaid andmestruktuure.
NĂ€iteks Redis salvestab hashmap'i kujul âtelegram_user_id => aktiivsete ĂŒlesannete arv jĂ€rjekorrasâ, mis vĂ”imaldab piirata ĂŒhe kasutaja pĂ€ringute arvu kindla vÀÀrtusega ja seelĂ€bi vĂ€ltida DoS-rĂŒnnakuid.
Formaliseerime pildi eduka töötlemise protsessi
- Kasutaja saadab pildi Telegrami boti
- «attrai-telegram-bot» saab sĂ”numi Telegram API-st ja analĂŒĂŒsib seda
- Pilt lisatakse asĂŒnkroonsesse jĂ€rjekorda «to_estimate»
- Kasutaja saab sÔnumi kavandatud hindamise ajast
- «attrai-estimator» vĂ”tab ĂŒlesande jĂ€rjekorrast «to_estimate», kĂ€ivitab selle hindamispipeline'i ja edastab ĂŒlesande jĂ€rjekorda «after_estimate»
- «attrai-telegram-bot», mis kuulab jÀrjekorda «after_estimate», saadab tulemuse kasutajale
DevOps
LĂ”puks, pĂ€rast arhitektuuri ĂŒlevaatamist, saab liikuda mitte vĂ€hem huvitavasse ossa â DevOps
Docker Swarm
Â

 â klastri sĂŒsteem, mille funktsionaalsus on sisse ehitatud Docker Engine'i ja saadaval vĂ€lja pakitud.
Kasutades âparveâ, saab meie klastri kĂ”ik sĂ”lmed jagada kaheks tĂŒĂŒbiks â worker ja manager. Esimese tĂŒĂŒbi masinatel kĂ€ivitatakse konteinerigruppide (stekkide) rippmenĂŒĂŒd, teise tĂŒĂŒbi masinad vastutavad skaleerimise, tasakaalustamise ja . Managers on vaikimisi ka worker'id.

Klastril on ĂŒks leader manager ja kolm worker'it
Klastri minimaalne suurus on 1 sĂ”lm, ainus masin tĂ€idab samaaegselt nii leader manager'i kui ka worker'i ĂŒlesandeid. Projekti suurusest ja minimaalsetest nĂ”uetest sĂ”ltuva töökindluse osas tehti otsus kasutada just sellist lĂ€henemist.
Kiirelt öeldes, alates esimesest tootmisest, mis toimus juuni keskpaiku, ei olnud mingeid probleeme seoses selle klastri korraldusega (kuid see ei tÀhenda, et selline korraldus oleks mingil kujul lubatav keskmise suurusega projektides, millele kehtivad töökindluse nÔuded).
Docker Stack
ReĆŸiimis «roja» vastutab stekkide (docker teenuste komplekti) juurutamise eest
See toetab docker-compose konfiguratsioone, vĂ”imaldades lisaks kasutada juurutamisparameetreid. Â
NĂ€iteks piiratud ressursside mÀÀramine iga mikroteenuse instantsi jaoks (jagame N instantsi jaoks N protsessorituuma, mikroteenuses piirame PyTorch'iga 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 stateful teenused ning nende skaleerimine pole sama lihtne kui «attrai-estimatoril»
Eelmise kĂŒsimuse eeldamine â miks mitte Kubernetes?
Tundub, et Kubernetes'e kasutamine vĂ€ikestes ja keskmise suurusega projektides on ĂŒleliigne, kogu vajalik funktsionaalsus on vĂ”imalik saada Docker Swarm'ilt, mis on konteinerite orkestreerimiseks ĂŒsna kasutajasĂ”bralik ja mille sisseastumispiir on madal.
Infrastruktuur
KÔik see juurutati VDS-il jÀrgmiste omadustega:
- CPU: 4 IntelÂź XeonÂź Gold 5120 CPU @ 2.20GHz tuuma
- RAM: 8 GB
- SSD: 160 GB
PÀrast kohalikku koormustestimist nÀis, et tÔsise kasutajate voolu korral jÀÀb sellest masinast napilt puudu.
Kuid kohe pĂ€rast juurutamist jagasin linki ĂŒhe populaarseima pildi jagamise platvormi kohta (jah, just selle), pĂ€rast mida hakkasid inimesed huvituma ja mĂ”ne tunni jooksul suutis teenus edukalt töödelda kĂŒmneid tuhandeid pilte. Samuti ei olnud pikki koormusi CPU ja RAM ressursid isegi pooledki kasutuses.


Veidi graafikat
Unikaalsete kasutajate ja hindamispÀringute arv juurutamise hetkest alates, sÔltuvalt pÀevast

Hindamise toru töötlusaegade jaotumine

JĂ€reldused
KokkuvĂ”tteks vĂ”in öelda, et arhitektuur ja konteinerite orkestreerimise lĂ€henemine Ă”igustasid end tĂ€ielikult â isegi tipptundidel ei olnud langusi ega aeglaseid töötlemise hetki.Â
Arvan, et vÀikese ja keskmise suurusega projektid, mis kasutavad oma protsessis reaalaja nÀrvivÔrkude jÀreldust CPU-l, saavad edukalt omaks vÔtta artiklis kirjeldatud praktikaid.
Lisan, et algselt oli artikkel pikem, kuid et mitte postitada pikka lugemist, otsustasin mĂ”ned aspektid selles artiklis vĂ€lja jĂ€tta â naaseme nende juurde jĂ€rgmistes publikatsioonides.
Boti saab proovida Telegramis â @AttraiBot, see töötab vĂ€hemalt 2020. aasta sĂŒgiseni. Tuletan meelde â mingeid kasutajaandmeid ei salvestata â ei algseid pilte, ega ka tulemusi hinnangupipeline'ist â kĂ”ik kustutatakse pĂ€rast töötlemist.
Allikas: habr.com
