
Sissejuhatus
Tere!
Selles artiklis jagan kogemusi mikroteenuste arhitektuuri loomisel projektile, mis kasutab nÀrvivÔrke.
RÀÀgime arhitektuuri nĂ”uetest, vaatame erinevaid struktuuri diagramme, analĂŒĂŒsime iga valmis arhitektuuri komponenti ning hindame lahenduse tehnilisi nĂ€itajaid.
Head lugemist!
MĂ”ned sĂ”nad ĂŒlesandest ja selle lahendusest
Peamine mĂ”te on hinnata inimese atraktiivsust kĂŒmnepallisel skaalal fotode pĂ”hjal.
Selles artiklis kĂ”rvale jĂ€tame kirjeldused nii kasutatavatest nĂ€rvivĂ”rkudest kui ka andmete ettevalmistamise ja Ă”petamise protsessist. Siiski, ĂŒhes jĂ€rgmises publikatsioonis, naaseme kindlasti sĂŒvaprobleemide analĂŒĂŒsi juurde.
Praegu vaatleme ĂŒlemise taseme lĂ”ikes hindamispipeline'i, keskendudes mikroteenuste koostoimele projekti ĂŒldises arhitektuuris.Â
Atraktiivsuse hindamisprotsessis jagunes ĂŒlesanne jĂ€rgmisteks osadeks:
- NĂ€olist tuvastamist piltidel
- Iga nÀo hindamine
- Tulemuse renderdamine
Esimene probleem lahendatakse eelnevalt treenitud . Teise jaoks treeniti konvolutsiooniline nĂ€rvivĂ”rk PyTorch'is, kus backbone'ina kasutati â kaalu tasakaalu âkvaliteet / CPU infereerimise kiirus"

Hindamispipeline'i funktsionaalne diagramm
Projekti arhitektuurinĂ”uete analĂŒĂŒs
Elu tsĂŒklis projekti arhitektuuri ja mudeli juurutamise automatiseerimise etapid on sageli ajaliselt ja ressursiliselt kĂ”ige kulukamad.

ML projekti elu tsĂŒkkel
See projekt ei ole erand - otsustati mĂ€hkida hindamispipeline veebiteenusesse, milleks tuli sĂŒveneda arhitektuuri. MÀÀrati jĂ€rgmised pĂ”hinĂ”uded:
- Ăksne logide salvestamine - kĂ”ik teenused peavad kirjutama logid ĂŒhte kohta, et neid oleks mugav analĂŒĂŒsida
- Hindamisteenuse horisontaalne skaleerimise vÔimalus - kuna see on tÔenÀoliselt pudelikael
- Iga pildi hindamiseks tuleb eraldada sama palju protsessori ressursse - vÀltimaks ajakulu jaotuses erandeid
- Kiire (taas)juurutamine nii konkreetsete teenuste kui ka kogu stack'i jaoks
- VĂ”imalus, vajadusel, kasutada erinevates teenustes ĂŒhiseid objekte
Arhitektuur
PĂ€rast nĂ”uete analĂŒĂŒsi sai selgeks, et mikroteenuste arhitektuur sobib praktiliselt ideaalselt.
Liigne peavalu vÀltimiseks valiti front-endina Telegram API.
Alustame valmis arhitektuuri struktuuridiagrammi vaatamisega, seejÀrel liikumme iga komponendi kirjeldamise juurde ning formaliseerime eduka pildi töötlemise protsessi.

Valmis arhitektuuri struktuuridiagramm
Arutame iga diagrammi komponendi ĂŒle, tuvastame nende ĂŒhe vastutuse pildi hindamise protsessis.
Mikroteenus âattrai-telegram-botâ
See mikroteenus kapseldab kĂ”ik interaktsioonid Telegram API-ga. VĂ”ime eristada kahte peamist stsenaariumi: töötamine kasutaja pildiga ja töötamine hindamise töötluse tulemusega. Vaatame mĂ”lemat stsenaariumi ĂŒldiselt.
Kasutaja sÔnumi pildi saamisel:
- Toimub filtreerimine, mis koosneb jÀrgmistest kontrollidest:
- Pildi optimaalse suuruse olemasolu
- Kasutaja piltide arv, mis juba jÀrjekorras on
- Kui esialgne filtreerimine on lĂ€bitud, salvestatakse pilt docker volĂŒĂŒmisse
- JĂ€rjekorda âto_estimateâ produtseeritakse ĂŒlesanne, milles muu hulgas sisaldub tee pildini, mis asub meie volĂŒĂŒmis
- Kui ĂŒlaltoodud etapid on edukalt lĂ€bitud, saab kasutaja sĂ”numi pildi töötlemise umbkaudse aja kohta, mis arvutatakse jĂ€rjekorras olevate ĂŒlesannete arvu alusel. Vea korral teavitatakse kasutajat selgelt - saadetakse sĂ”num, kus on teave selle kohta, mis oleks vĂ”inud valesti minna.
Samuti kuulab see mikroteenus, nagu celery worker, jĂ€rjekorda âafter_estimateâ, mis on mĂ”eldud hindamise töötluse lĂ€binud ĂŒlesannetele.
Uue ĂŒlesande saamisel jĂ€rjekorrast âafter_estimateâ:
- Kui pilt on edukalt töödeldud, saadame tulemuse kasutajale, kui ei - teavitame veast
- Kustutame pildi, mis on hindamise töötluse tulemus
Hindamisteenus âattrai-estimatorâ
See mikroteenus on celery worker ja kapseldab kĂ”ik, mis on seotud pildihindamise töötlusega. Siin on tööprotsess ĂŒks - vaatame seda.
Uue ĂŒlesande saamisel jĂ€rjekorrast âto_estimateâ:
- Lastakse pilt lÀbi hindamisprotsessi:
- Laadime pildi mÀlu
- Kohandame pildi soovitud suurusele
- Leiame kÔik nÀod (MTCNN)
- Hindame kĂ”iki nĂ€gusid (ĂŒmbritseme eelnevalt leitud nĂ€od partii formaadis ja teeme inferentsi ResNet34 abil)
- Renderdame lÔpppildi
- Joonistame vÀlja piirjooned
- Joonistame vÀlja hinnangud
- Kustutame kasutaja (algse) pildi
- Salvestame hindamise vÀljundi
- Paneme ĂŒlesande jĂ€rjekorda âafter_estimateâ, mida kuulab ĂŒlalmainitud mikroteenus âattrai-telegram-botâ
Graylog (+ mongoDB + Elasticsearch)
â on lahendus logide tsentraalseks haldamiseks. Selles projektis kasutati seda oma otstarbele vastavalt.
Valiku pĂ”hjuseks oli just see, mitte tuntud stack, kuna sellega töötamine Pythonis on mugav. KĂ”ik, mis on vajalik Graylogi logimiseks, on lisada GELFTCPHandler pakist muude meie python-mikrosĂŒsteemi juurlogeri haldurite hulka.
Mina, inimesena, kes on varem töötanud ainult ELK stackiga, sain Graylogiga töötamisest kokkuvĂ”ttes positiivse kogemuse. Ainus, mis hĂ€irib, on Kibana funktsioonide ĂŒlekaal Graylogi veebiliidese ees.
RabbitMQ
â on AMQP protokollil pĂ”hinev sĂ”numite vahetus sĂŒsteem.
Selles projektis kasutati seda kui vahetussĂŒsteemi Celery jaoks ja see töötas durable reĆŸiimis.
Redis
â on NoSQL andmebaas, mis töötab âvĂ”ti â vÀÀrtusâ andmestruktuuridega.
Tuleb kohati kasutada erinevates python-mikrosĂŒsteemides ĂŒhiseid objekte, mis rakendavad mĂ”ningaid andmestruktuure.
NĂ€iteks, Redis sisaldab hashmapi kujul âtelegram_user_id => aktiivsete ĂŒlesannete arv jĂ€rjekorrasâ, mis vĂ”imaldab piirata teatud vÀÀrtusega ĂŒhe kasutaja pĂ€ringute arvu, vĂ€ltides seelĂ€bi DoS-rĂŒnnakuid.
Formuleerime Àra töötava pildi töötlemise protsessi
- Kasutaja saadab pildi Telegrami botile
- âattrai-telegram-botâ saab sĂ”numi Telegrami API-lt ja tĂ”lgendab selle
- Ălesanne pildiga lisatakse asĂŒnkroonsesse jĂ€rjekorda âto_estimateâ
- Kasutaja saab sÔnumi planeeritud hindamise ajaga
- âattrai-estimatorâ vĂ”tab ĂŒlesande jĂ€rjekorrast âto_estimateâ, edastab selle hindamisprotsessi lĂ€bi ja toodab ĂŒlesande jĂ€rjekorda âafter_estimateâ
- âattrai-telegram-botâ, mis kuulab jĂ€rjekorda âafter_estimateâ, saadab tulemuse kasutajale
DevOps
LĂ”puks, pĂ€rast arhitektuuri ĂŒlevaatamist, vĂ”ime minna mitte vĂ€hem huvitavasse ossa â DevOps
Docker Swarm
Â

 â klasteriseerimisĂŒsteem, mille funktsioon on rakendatud Docker Engine'i sees ja on tootes saadaval.
Roya abil saab meie klastris kĂ”ik sĂ”lmed jagada kahe tĂŒĂŒbi vahel â worker ja manager. Esimese tĂŒĂŒbi masinatel kĂ€ivitatakse konteinerigruppide (stekid) komplekte, teise tĂŒĂŒbi masinad vastutavad skaleerimise, tasakaalustamise ja MĂ€ngijad on vaikimisi ka töötajad.

Klaster, kus on ĂŒks juhtiv manager ja kolm töötajat.
Minimaalne klasteri suurus on 1 sÔlm, ainus masin töötab samal ajal juhtiva manageri ja töötajana. Projekti suurusest ja minimaalsetest nÔudmistest talitlushÀirete osas lÀhtuvalt on otsustatud kasutada just seda lÀhenemist.
Eelnevalt öeldes, alates esimesest tootmispaigaldusest, mis toimus juuni keskel, ei ole olnud selle klasteri korraldusega seotud probleeme (kuid see ei tÀhenda, et selline korraldus oleks lubatav igasugustes keskmise ja suurte projektide puhul, millega kaasnevad talitlushÀirete nÔuded).
Docker Stack
Roya reĆŸiimis vastutab stekide (docker teenuste komplektide) kĂ€ivitamise eest
See toetab docker-compose konfigureeringuid, vĂ”imaldades lisaks kasutada deploy parameetreid. Â
NĂ€iteks nende parameetrite abil piirati ressursside jagamist iga ĂŒksiku mikroteenuse hindamiseks (jagame N instantsile N tuuma, mikroteenuses piirame PyTorchi 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 ei ole nii lihtne nagu 'attrai-estimator'.
Eelnevalt kĂŒsimusele â miks mitte Kubernetes?
Tundub, et Kubernetes'e kasutamine vĂ€ikeste ja keskmise suurusega projektide puhul on ĂŒleliigne, kogu vajalik funktsionaalsus on saadaval Docker Swarmis, mis on ĂŒsna kasutajasĂ”bralik konteinerite koordineerija ja mille sisenemislĂ€vi on madal.
Infrastruktuur
KÔik see paigaldati VDS-ile, millel on jÀrgmised omadused:
- CPU: 4 tuuma IntelÂź XeonÂź Gold 5120 CPU @ 2.20GHz
- RAM: 8 GB
- SSD: 160 GB
PĂ€rast kohalikku koormustestimist tundus, et tĂ”sise kĂŒlastajate voolu korral on sellist masinat napilt piisavalt.
Kuid kohe pĂ€rast kasutuselevĂ”ttu postitasin lingi ĂŒhele Venemaa ja naaberriikide populaarseimale pildifoorumile (jah, sellele samale), pĂ€rast mida hakkasid inimesed huvi tundma ja mĂ”ne tunni jooksul töötas teenus edukalt lĂ€bi kĂŒmneid tuhandeid pilte. Samal ajal ei kasutanud CPU ja RAM ressursid isegi pooli oma vĂ”imetest tipptundidel.


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

Hindamisprotsessi infereerimise ajajaotus

JĂ€reldused
KokkuvĂ”tlikult vĂ”in öelda, et arhitektuur ja konteinerite orkestreerimise lĂ€henemine on end tĂ€ielikult Ă”igustanud â isegi tipptundidel ei olnud viivitusi ega aeglustumist töötlemise ajas.Â
Arvan, et vĂ€ikeste ja keskmise suurusega projektid, mis kasutavad oma protsessis reaalajas nĂ€rvivĂ”rkude infereerimist CPU-l, vĂ”ivad edukalt ĂŒle vĂ”tta artiklis kirjeldatud tavasid.
Lisaks lisan, et algselt oli artikkel pikem, kuid et mitte postitada liiga mahukat sisu, otsustasin mĂ”ned punktid siin artiklis vahele jĂ€tta â tuleme nende juurde tagasi jĂ€rgmistes vĂ€ljaannetes.
Boti saab katsetada Telegramis â @AttraiBot, see töötab vĂ€hemalt kuni 2020. aasta sĂŒgise lĂ”puni. Tuletan meelde â mingeid kasutajaandmeid ei salvestata â ei algseid pilte ega hindamisprotsessi tulemusi â kĂ”ik kustutatakse pĂ€rast töötlemist.
Allikas: habr.com
