Ülevaade teenuse arhitektuurist vĂ€limuse hindamiseks nĂ€rvivĂ”rkude pĂ”hjal

Ülevaade teenuse arhitektuurist vĂ€limuse hindamiseks nĂ€rvivĂ”rkude pĂ”hjal

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:

  1. NĂ€olist tuvastamist piltidel
  2. Iga nÀo hindamine
  3. Tulemuse renderdamine

Esimene probleem lahendatakse eelnevalt treenitud MTCNN. Teise jaoks treeniti konvolutsiooniline nĂ€rvivĂ”rk PyTorch'is, kus backbone'ina kasutati ResNet34 – kaalu tasakaalu „kvaliteet / CPU infereerimise kiirus"

Ülevaade teenuse arhitektuurist vĂ€limuse hindamiseks nĂ€rvivĂ”rkude pĂ”hjal

Hindamispipeline'i funktsionaalne diagramm

Projekti arhitektuurinĂ”uete analĂŒĂŒs

Elu tsĂŒklis ML projekti arhitektuuri ja mudeli juurutamise automatiseerimise etapid on sageli ajaliselt ja ressursiliselt kĂ”ige kulukamad.

Ülevaade teenuse arhitektuurist vĂ€limuse hindamiseks nĂ€rvivĂ”rkude pĂ”hjal

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:

  1. Üksne logide salvestamine - kĂ”ik teenused peavad kirjutama logid ĂŒhte kohta, et neid oleks mugav analĂŒĂŒsida
  2. Hindamisteenuse horisontaalne skaleerimise vÔimalus - kuna see on tÔenÀoliselt pudelikael
  3. Iga pildi hindamiseks tuleb eraldada sama palju protsessori ressursse - vÀltimaks ajakulu jaotuses erandeid
  4. Kiire (taas)juurutamine nii konkreetsete teenuste kui ka kogu stack'i jaoks
  5. 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.

Ülevaade teenuse arhitektuurist vĂ€limuse hindamiseks nĂ€rvivĂ”rkude pĂ”hjal

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:

  1. Toimub filtreerimine, mis koosneb jÀrgmistest kontrollidest:
    • Pildi optimaalse suuruse olemasolu
    • Kasutaja piltide arv, mis juba jĂ€rjekorras on
  2. Kui esialgne filtreerimine on lĂ€bitud, salvestatakse pilt docker volĂŒĂŒmisse
  3. JĂ€rjekorda “to_estimate” produtseeritakse ĂŒlesanne, milles muu hulgas sisaldub tee pildini, mis asub meie volĂŒĂŒmis
  4. 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”:

  1. Kui pilt on edukalt töödeldud, saadame tulemuse kasutajale, kui ei - teavitame veast
  2. 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”:

  1. Lastakse pilt lÀbi hindamisprotsessi:
    1. Laadime pildi mÀlu
    2. Kohandame pildi soovitud suurusele
    3. Leiame kÔik nÀod (MTCNN)
    4. Hindame kĂ”iki nĂ€gusid (ĂŒmbritseme eelnevalt leitud nĂ€od partii formaadis ja teeme inferentsi ResNet34 abil)
    5. Renderdame lÔpppildi
      1. Joonistame vÀlja piirjooned
      2. Joonistame vÀlja hinnangud
  2. Kustutame kasutaja (algse) pildi
  3. Salvestame hindamise vÀljundi
  4. Paneme ĂŒlesande jĂ€rjekorda „after_estimate“, mida kuulab ĂŒlalmainitud mikroteenus „attrai-telegram-bot“

Graylog (+ mongoDB + Elasticsearch)

Graylog — on lahendus logide tsentraalseks haldamiseks. Selles projektis kasutati seda oma otstarbele vastavalt.

Valiku pĂ”hjuseks oli just see, mitte tuntud ELK stack, kuna sellega töötamine Pythonis on mugav. KĂ”ik, mis on vajalik Graylogi logimiseks, on lisada GELFTCPHandler pakist graypy 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

RabbitMQ — on AMQP protokollil pĂ”hinev sĂ”numite vahetus sĂŒsteem.

Selles projektis kasutati seda kui kĂ”ige stabiilsemat ja aja jooksul testitud vahetussĂŒsteemi Celery jaoks ja see töötas durable reĆŸiimis.

Redis

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

  1. Kasutaja saadab pildi Telegrami botile
  2. „attrai-telegram-bot“ saab sĂ”numi Telegrami API-lt ja tĂ”lgendab selle
  3. Ülesanne pildiga lisatakse asĂŒnkroonsesse jĂ€rjekorda „to_estimate“
  4. Kasutaja saab sÔnumi planeeritud hindamise ajaga
  5. „attrai-estimator“ vĂ”tab ĂŒlesande jĂ€rjekorrast „to_estimate“, edastab selle hindamisprotsessi lĂ€bi ja toodab ĂŒlesande jĂ€rjekorda „after_estimate“
  6. „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

 

Ülevaade teenuse arhitektuurist vĂ€limuse hindamiseks nĂ€rvivĂ”rkude pĂ”hjal

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 teiste Ă€gedate funktsioonide eest.MĂ€ngijad on vaikimisi ka töötajad.

Ülevaade teenuse arhitektuurist vĂ€limuse hindamiseks nĂ€rvivĂ”rkude pĂ”hjal

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 docker stack

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.

Ülevaade teenuse arhitektuurist vĂ€limuse hindamiseks nĂ€rvivĂ”rkude pĂ”hjal
Ülevaade teenuse arhitektuurist vĂ€limuse hindamiseks nĂ€rvivĂ”rkude pĂ”hjal

Veidi graafikat

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

Ülevaade teenuse arhitektuurist vĂ€limuse hindamiseks nĂ€rvivĂ”rkude pĂ”hjal

Hindamisprotsessi infereerimise ajajaotus

Ülevaade teenuse arhitektuurist vĂ€limuse hindamiseks nĂ€rvivĂ”rkude pĂ”hjal

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

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster