Vispārējs pārskats par pakalpojumu arhitektÅ«ru izskata novērtÄ“Å”anai, pamatojoties uz neironu tÄ«kliem

Vispārējs pārskats par pakalpojumu arhitektÅ«ru izskata novērtÄ“Å”anai, pamatojoties uz neironu tÄ«kliem

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:

  1. Seju atlase fotoattēlos
  2. Katras personas vērtējums
  3. Atveidojiet rezultātu

Pirmais tiek atrisināts ar iepriekÅ” apmācÄ«tu spēku palÄ«dzÄ«bu MTCNN. Otrajā gadÄ«jumā PyTorch tika apmācÄ«ts konvolucionālais neironu tÄ«kls, izmantojot ResNet34 - no bilances "secināŔanas kvalitāte / ātrums uz CPU"

Vispārējs pārskats par pakalpojumu arhitektÅ«ru izskata novērtÄ“Å”anai, pamatojoties uz neironu tÄ«kliem

NovērtÄ“Å”anas konveijera funkcionālā diagramma

Projekta arhitektūras prasību analīze

Dzīves ciklā ML projekta darba posmi, kas saistīti ar modeļa izvietoŔanas arhitektūru un automatizāciju, bieži vien ir vieni no laikietilpīgākajiem un resursietilpīgākajiem.

Vispārējs pārskats par pakalpojumu arhitektÅ«ru izskata novērtÄ“Å”anai, pamatojoties uz neironu tÄ«kliem

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:

  1. Vienota žurnālu krātuve ā€“ visiem pakalpojumiem žurnāli jāraksta vienuviet, tiem jābÅ«t ērti analizējamiem
  2. NovērtÄ“Å”anas pakalpojuma horizontālās mērogoÅ”anas iespēja - kā visticamākais saÅ”aurinājums
  3. 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ā.
  4. Ātra (pār)izvietoÅ”ana gan konkrētiem pakalpojumiem, gan steka kopumā
  5. 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.

Vispārējs pārskats par pakalpojumu arhitektÅ«ru izskata novērtÄ“Å”anai, pamatojoties uz neironu tÄ«kliem

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:

  1. 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
  2. Izejot sākotnējo filtrÄ“Å”anu, attēls tiek saglabāts doka sējumā
  3. Rindā ā€œto_estimateā€ tiek izveidots uzdevums, kas cita starpā ietver ceļu uz attēlu, kas atrodas mÅ«su sējumā
  4. 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ā€:

  1. Ja attēls ir sekmīgi apstrādāts, rezultātu nosūtām lietotājam, ja nē, ziņojam par kļūdu.
  2. 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ā€:

  1. IzpildÄ«sim attēlu caur novērtÄ“Å”anas cauruļvadu:
    1. Attēla ielāde atmiņā
    2. Pievedam attēlu vajadzīgajā izmērā
    3. Visu seju atraŔana (MTCNN)
    4. Mēs novērtējam visas sejas (pēdējā darbībā atrastās sejas iesaiņojam grupā un secinām ResNet34)
    5. Renderējiet galīgo attēlu
      1. UzzÄ«mēsim ierobežojoÅ”os lodziņus
      2. Vērtējumu zÄ«mÄ“Å”ana
  2. Pielāgota (sākotnējā) attēla dzÄ“Å”ana
  3. NovērtÄ“Å”anas konveijera izvades saglabāŔana
  4. Uzdevumu ievietojām rindā ā€œafter_estimateā€, kuru noklausās iepriekÅ” aplÅ«kotais mikropakalpojums ā€œattrai-telegram-botā€.

Graylog (+ mongoDB + Elasticsearch)

Greylog ir risinājums centralizētai žurnālu pārvaldībai. Šajā projektā tas tika izmantots paredzētajam mērķim.

Izvēle krita uz viņu, nevis uz parasto ELK kaudze, jo ir ērti strādāt ar to no Python. Viss, kas jums jādara, lai pieteiktos Graylog, ir jāpievieno GELFTCPHandler no pakotnes pelēcīgs pārējiem mūsu Python mikropakalpojuma sakņu reģistrētāju apstrādātājiem.

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

RabbitMQ ir ziņojumu brokeris, kura pamatā ir AMQP protokols.

Šajā projektā tas tika izmantots kā visstabilākā un laika pārbaudītākā brokeris Selerijai un strādāja izturīgā režīmā.

Redis

Redis ir NoSQL DBVS, kas darbojas ar atslēgas vērtību datu struktūrām

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

  1. Lietotājs nosūta attēlu uz Telegram robotu
  2. "attrai-telegram-bot" saņem ziņojumu no Telegram API un parsē to
  3. Uzdevums ar attēlu tiek pievienots asinhronajai rindai ā€œto_estimateā€
  4. Lietotājs saņem ziņojumu ar plānoto novērtÄ“Å”anas laiku
  5. ā€œattrai-estimatorā€ paņem uzdevumu no rindas ā€œto_estimateā€, izpilda aplēses cauri konveijeram un izveido uzdevumu rindā ā€œafter_estimateā€
  6. "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

 

Vispārējs pārskats par pakalpojumu arhitektÅ«ru izskata novērtÄ“Å”anai, pamatojoties uz neironu tÄ«kliem

Dokera bars  ā€” klasterizācijas sistēma, kuras funkcionalitāte ir ieviesta Docker Engine iekÅ”ienē un ir pieejama jau no kastes.

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 citas lieliskas funkcijas. VadÄ«tāji arÄ« pēc noklusējuma ir darbinieki.

Vispārējs pārskats par pakalpojumu arhitektÅ«ru izskata novērtÄ“Å”anai, pamatojoties uz neironu tÄ«kliem

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. doku kaudze

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.

Vispārējs pārskats par pakalpojumu arhitektÅ«ru izskata novērtÄ“Å”anai, pamatojoties uz neironu tÄ«kliem
Vispārējs pārskats par pakalpojumu arhitektÅ«ru izskata novērtÄ“Å”anai, pamatojoties uz neironu tÄ«kliem

Vēl dažas grafikas

Unikālo lietotāju un novērtÄ“Å”anas pieprasÄ«jumu skaits kopÅ” izvietoÅ”anas atkarÄ«bā no dienas

Vispārējs pārskats par pakalpojumu arhitektÅ«ru izskata novērtÄ“Å”anai, pamatojoties uz neironu tÄ«kliem

NovērtÄ“Å”anas konveijera secinājumu laika sadalÄ«jums

Vispārējs pārskats par pakalpojumu arhitektÅ«ru izskata novērtÄ“Å”anai, pamatojoties uz neironu tÄ«kliem

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

Pievieno komentāru