Ieraksts
Hi!
Å ajÄ rakstÄ es dalÄ«Å”os pieredzÄ par mikropakalpojumu arhitektÅ«ras izveidi projektam, izmantojot neironu tÄ«klus.
ParunÄsim par arhitektÅ«ras prasÄ«bÄm, apskatÄ«sim dažÄdas strukturÄlÄs diagrammas, analizÄsim katru no gatavÄs arhitektÅ«ras komponentiem, kÄ arÄ« izvÄrtÄsim risinÄjuma tehniskos rÄdÄ«tÄjus.
Baudiet lasīŔanu!
Daži vÄrdi par problÄmu un tÄs risinÄjumu
GalvenÄ ideja ir pÄc fotogrÄfijas novÄrtÄt cilvÄka pievilcÄ«bu desmit ballu skalÄ.
Å ajÄ rakstÄ mÄs pÄrtrauksim gan izmantoto neironu tÄ«klu, gan datu sagatavoÅ”anas un apmÄcÄ«bas procesa aprakstu. TomÄr kÄdÄ no turpmÄkajÄm publikÄcijÄm mÄs noteikti atgriezÄ«simies pie novÄrtÄjuma cauruļvada padziļinÄtas analÄ«zes.
Tagad mÄs iziesim novÄrtÄjuma cauruļvadu augstÄkajÄ lÄ«menÄ« un koncentrÄsimies uz mikropakalpojumu mijiedarbÄ«bu kopÄjÄs projekta arhitektÅ«ras kontekstÄ.
StrÄdÄjot pie pievilcÄ«bas novÄrtÄÅ”anas cauruļvada, uzdevums tika sadalÄ«ts Å”Ädos komponentos:
- Seju atlase fotoattÄlos
- Katras personas vÄrtÄjums
- Atveidojiet rezultÄtu
Pirmais tiek atrisinÄts ar iepriekÅ” apmÄcÄ«tu spÄku palÄ«dzÄ«bu
NovÄrtÄÅ”anas konveijera funkcionÄlÄ diagramma
Projekta arhitektūras prasību analīze
DzÄ«ves ciklÄ
ML projekta dzīves cikls
Å is projekts nav izÅÄmums ā tika pieÅemts lÄmums ietÄ«t novÄrtÄjuma cauruļvadu tieÅ”saistes pakalpojumÄ, kas prasÄ«ja iedziļinÄties arhitektÅ«rÄ. Tika noteiktas Å”Ädas pamatprasÄ«bas:
- Vienota žurnÄlu krÄtuve ā visiem pakalpojumiem žurnÄli jÄraksta vienuviet, tiem jÄbÅ«t Ärti analizÄjamiem
- NovÄrtÄÅ”anas pakalpojuma horizontÄlÄs mÄrogoÅ”anas iespÄja - kÄ visticamÄkais saÅ”aurinÄjums
- Katra attÄla novÄrtÄÅ”anai ir jÄpieŔķir vienÄds procesora resursu apjoms, lai izvairÄ«tos no novirzÄm secinÄjumu veikÅ”anas laika sadalÄ«jumÄ.
- Ätra (pÄr)izvietoÅ”ana gan konkrÄtiem pakalpojumiem, gan steka kopumÄ
- IespÄja, ja nepiecieÅ”ams, izmantot kopÄ«gus objektus dažÄdos pakalpojumos
Arhitektūra
IzanalizÄjot prasÄ«bas, kļuva skaidrs, ka mikropakalpojumu arhitektÅ«ra atbilst gandrÄ«z ideÄli.
Lai atbrÄ«votos no liekÄm galvassÄpÄm, kÄ frontend tika izvÄlÄta Telegram API.
Vispirms apskatÄ«sim gatavÄs arhitektÅ«ras strukturÄlo diagrammu, pÄc tam pÄriesim pie katras sastÄvdaļas apraksta, kÄ arÄ« formalizÄsim veiksmÄ«gas attÄlu apstrÄdes procesu.
GatavÄs arhitektÅ«ras strukturÄlÄ diagramma
ParunÄsim sÄ«kÄk par katru no diagrammas sastÄvdaļÄm, apzÄ«mÄjot tos VienotÄ atbildÄ«ba attÄla novÄrtÄÅ”anas procesÄ.
Mikropakalpojums āattrai-telegram-botā
Å is mikropakalpojums ietver visas mijiedarbÄ«bas ar Telegram API. Ir divi galvenie scenÄriji: darbs ar pielÄgotu attÄlu un darbs ar novÄrtÄjuma konveijera rezultÄtu. ApskatÄ«sim abus scenÄrijus vispÄrÄ«gi.
SaÅemot pielÄgotu ziÅojumu ar attÄlu:
- Tiek veikta filtrÄÅ”ana, kas sastÄv no Å”ÄdÄm pÄrbaudÄm:
- OptimÄla attÄla izmÄra pieejamÄ«ba
- RindÄ jau esoÅ”o lietotÄju attÄlu skaits
- Izejot sÄkotnÄjo filtrÄÅ”anu, attÄls tiek saglabÄts doka sÄjumÄ
- RindÄ āto_estimateā tiek izveidots uzdevums, kas cita starpÄ ietver ceļu uz attÄlu, kas atrodas mÅ«su sÄjumÄ
- Ja iepriekÅ” minÄtÄs darbÄ«bas tiks veiktas veiksmÄ«gi, lietotÄjs saÅems ziÅojumu ar aptuveno attÄla apstrÄdes laiku, kas tiek aprÄÄ·inÄts, pamatojoties uz uzdevumu skaitu rindÄ. Ja rodas kļūda, lietotÄjs tiks skaidri informÄts, nosÅ«tot ziÅojumu ar informÄciju par iespÄjamo kļūdu.
TÄpat Å”is mikropakalpojums, tÄpat kÄ selerijas darbinieks, noklausÄs āafter_estimateā rindu, kas paredzÄta uzdevumiem, kas izgÄjuÅ”i izvÄrtÄÅ”anas konveijerÄ.
SaÅemot jaunu uzdevumu no āafter_estimateā:
- Ja attÄls ir sekmÄ«gi apstrÄdÄts, rezultÄtu nosÅ«tÄm lietotÄjam, ja nÄ, ziÅojam par kļūdu.
- NovÄrtÄÅ”anas konveijera rezultÄtÄ iegÅ«tÄ attÄla noÅemÅ”ana
NovÄrtÄÅ”anas mikropakalpojums āattrai-estimatorā
Å is mikropakalpojums ir seleriju darbinieks un ietver visu, kas saistÄ«ts ar attÄlu novÄrtÄÅ”anas cauruļvadu. Å eit ir tikai viens darba algoritms - analizÄsim to.
SaÅemot jaunu uzdevumu no āto_estimateā:
- IzpildÄ«sim attÄlu caur novÄrtÄÅ”anas cauruļvadu:
- AttÄla ielÄde atmiÅÄ
- Pievedam attÄlu vajadzÄ«gajÄ izmÄrÄ
- Visu seju atraŔana (MTCNN)
- MÄs novÄrtÄjam visas sejas (pÄdÄjÄ darbÄ«bÄ atrastÄs sejas iesaiÅojam grupÄ un secinÄm ResNet34)
- RenderÄjiet galÄ«go attÄlu
- UzzÄ«mÄsim ierobežojoÅ”os lodziÅus
- VÄrtÄjumu zÄ«mÄÅ”ana
- PielÄgota (sÄkotnÄjÄ) attÄla dzÄÅ”ana
- NovÄrtÄÅ”anas konveijera izvades saglabÄÅ”ana
- Uzdevumu ievietojÄm rindÄ āafter_estimateā, kuru noklausÄs iepriekÅ” aplÅ«kotais mikropakalpojums āattrai-telegram-botā.
Graylog (+ mongoDB + Elasticsearch)
IzvÄle krita uz viÅu, nevis uz parasto
KÄ cilvÄkam, kurÅ” iepriekÅ” bija strÄdÄjis tikai ar ELK steku, man bija kopumÄ pozitÄ«va pieredze darbÄ ar Graylog. VienÄ«gais, kas nomÄc, ir Kibana funkciju pÄrÄkums pÄr Graylog tÄ«mekļa saskarni.
RabbitMQ
Å ajÄ projektÄ tas tika izmantots kÄ
Redis
Dažreiz ir nepiecieÅ”ams izmantot kopÄ«gus objektus, kas ievieÅ” noteiktas datu struktÅ«ras dažÄdos Python mikropakalpojumos.
PiemÄram, Redis saglabÄ jaucÄjkarti formÄ ātelegram_user_id => aktÄ«vo uzdevumu skaits rindÄā, kas ļauj ierobežot viena lietotÄja pieprasÄ«jumu skaitu lÄ«dz noteiktai vÄrtÄ«bai un tÄdÄjÄdi novÄrst DoS uzbrukumus.
FormalizÄsim veiksmÄ«gas attÄlu apstrÄdes procesu
- LietotÄjs nosÅ«ta attÄlu uz Telegram robotu
- "attrai-telegram-bot" saÅem ziÅojumu no Telegram API un parsÄ to
- Uzdevums ar attÄlu tiek pievienots asinhronajai rindai āto_estimateā
- LietotÄjs saÅem ziÅojumu ar plÄnoto novÄrtÄÅ”anas laiku
- āattrai-estimatorā paÅem uzdevumu no rindas āto_estimateā, izpilda aplÄses cauri konveijeram un izveido uzdevumu rindÄ āafter_estimateā
- "attrai-telegram-bot" klausoties "after_estimate" rindu, nosÅ«ta rezultÄtu lietotÄjam
DevOps
Visbeidzot, pÄc arhitektÅ«ras pÄrskatÄ«Å”anas varat pÄriet uz tikpat interesanto daļu - DevOps
Dokera bars
Izmantojot ābaruā, visus mÅ«su klastera mezglus var iedalÄ«t 2 veidos ā strÄdnieks un vadÄ«tÄjs. PirmÄ tipa maŔīnÄs tiek izvietotas konteineru grupas (kaudzÄ«tes), otrÄ tipa maŔīnas ir atbildÄ«gas par mÄrogoÅ”anu, balansÄÅ”anu un
Klasteris ar vienu vadÄ«tÄju un trim darbiniekiem
MinimÄlais iespÄjamais klastera lielums ir 1 mezgls; viena iekÄrta vienlaikus darbosies kÄ vadoÅ”ais vadÄ«tÄjs un darbinieks. Pamatojoties uz projekta apjomu un minimÄlajÄm prasÄ«bÄm attiecÄ«bÄ uz kļūdu toleranci, tika nolemts izmantot Å”o pieeju.
Raugoties nÄkotnÄ, teikÅ”u, ka kopÅ” pirmÄs produkcijas piegÄdes, kas bija jÅ«nija vidÅ«, ar Å”o klastera organizÄciju nav bijuÅ”as nekÄdas problÄmas (bet tas nenozÄ«mÄ, ka Å”Äda organizÄcija ir kaut kÄdÄ veidÄ pieÅemama jebkurÄ vidÄji lielÄ projektiem, uz kuriem attiecas defektu tolerances prasÄ«bas).
Docker Stack
Swarm režīmÄ viÅÅ” ir atbildÄ«gs par steku (dokera pakalpojumu komplektu) izvietoÅ”anu.
TÄ atbalsta docker-compose konfigurÄcijas, ļaujot papildus izmantot izvietoÅ”anas opcijas.
PiemÄram, izmantojot Å”os parametrus, tika ierobežoti resursi katrai novÄrtÄÅ”anas mikropakalpojuma instancei (N gadÄ«jumiem mÄs pieŔķiram N kodolus, paÅ”Ä mikropakalpojumÄ mÄs ierobežojam PyTorch izmantoto kodolu skaitu lÄ«dz vienam)
attrai_estimator:
image: 'erqups/attrai_estimator:1.2'
deploy:
replicas: 4
resources:
limits:
cpus: '4'
restart_policy:
condition: on-failure
ā¦
Ir svarÄ«gi atzÄ«mÄt, ka Redis, RabbitMQ un Graylog ir statusa pakalpojumi un tos nevar tik vienkÄrÅ”i mÄrogot kÄ āattrai-estimatorā.
PareÄ£ojot jautÄjumu - kÄpÄc ne Kubernetes?
Å Ä·iet, ka Kubernetes izmantoÅ”ana mazos un vidÄjos projektos ir pieskaitÄma, visu nepiecieÅ”amo funkcionalitÄti var iegÅ«t no Docker Swarm, kas ir diezgan lietotÄjam draudzÄ«gs konteineru orÄ·estrim un arÄ« ar zemu barjeru ienÄkÅ”anai.
Infrastruktūra
Tas viss tika izvietots VDS ar Å”ÄdÄm Ä«paŔībÄm:
- CPU: 4 kodolu IntelĀ® XeonĀ® Gold 5120 CPU @ 2.20 GHz
- RAM: 8 GB
- SSD: 160 GB
PÄc vietÄjÄs slodzes testÄÅ”anas Ŕķita, ka ar nopietnu lietotÄju pieplÅ«dumu ar Å”o maŔīnu pietiks.
Bet uzreiz pÄc izvietoÅ”anas es ievietoju saiti uz vienu no populÄrÄkajÄm attÄlu panelÄm NVS (jÄp, to paÅ”u), pÄc kuras cilvÄki sÄka interesÄties un dažu stundu laikÄ pakalpojums veiksmÄ«gi apstrÄdÄja desmitiem tÅ«kstoÅ”u attÄlu. TajÄ paÅ”Ä laikÄ pÄ«Ä·a brīžos CPU un RAM resursi netika izmantoti pat lÄ«dz pusei.
VÄl dažas grafikas
UnikÄlo lietotÄju un novÄrtÄÅ”anas pieprasÄ«jumu skaits kopÅ” izvietoÅ”anas atkarÄ«bÄ no dienas
NovÄrtÄÅ”anas konveijera secinÄjumu laika sadalÄ«jums
Atzinumi
RezumÄjot, varu teikt, ka arhitektÅ«ra un pieeja konteineru orÄ·estrÄÅ”anai pilnÄ«bÄ sevi attaisnoja ā pat pÄ«Ä·a brīžos apstrÄdes laikÄ nebija nekÄdu kritumu vai kritumu.
Es domÄju, ka mazie un vidÄjie projekti, kas savÄ procesÄ izmanto centrÄlo procesora neironu tÄ«klu reÄllaika secinÄjumus, var veiksmÄ«gi izmantot Å”ajÄ rakstÄ aprakstÄ«to praksi.
PiebildÄ«Å”u, ka sÄkotnÄji raksts bija garÄks, taÄu, lai neliktu garu rakstu, nolÄmu dažus punktus Å”ajÄ rakstÄ izlaist ā pie tiem atgriezÄ«simies turpmÄkajÄs publikÄcijÄs.
Botu var iebÄzt Telegram - @AttraiBot, tas darbosies vismaz lÄ«dz 2020. gada rudens beigÄm. AtgÄdinÄÅ”u, ka netiek glabÄti nekÄdi lietotÄja dati - ne oriÄ£inÄlie attÄli, ne izvÄrtÄÅ”anas konveijera rezultÄti - pÄc apstrÄdes viss tiek nojaukts.
Avots: www.habr.com