Përmbledhje e përgjithshme e arkitekturës së shërbimit për vlerësimin e pamjes në bazë të rrjeteve neuronale

Përmbledhje e përgjithshme e arkitekturës së shërbimit për vlerësimin e pamjes në bazë të rrjeteve neuronale

Hyrje

đŸ„‡Si tĂ« arrish nĂ« qiell dhe tĂ« bĂ«hesh pilot | ProHoster

Në këtë artikull do të ndaj përvojën time në ndërtimin e një arkitekture mikro-shërbimesh për një projekt që përdor rrjete nervore.

Do të flasim rreth kërkesave të arkitekturës, do të shohim diagramet e ndryshme strukturore, do të shqyrtojmë çdo komponent të arkitekturës së gatshme dhe do të vlerësojmë metrikat teknike të zgjidhjes.

Lexim të këndshëm!

Për disa fjalë rreth detyrës dhe zgjidhjes së saj

Ideja kryesore është që, në bazë të fotove, të japim një vlerësim të atraktivitetit të personit në një shkallë nga 1 në 10.

Në këtë artikull ne do të largohemi nga përshkrimi i rrjeteve nervore që përdoren dhe procesit të përgatitjes së të dhënave dhe trajnimit. Megjithatë, në një nga publikimet e ardhshme, ne do të kthehemi me siguri në shqyrtimin e pipeline-it të vlerësimit në një nivel më të thellë.

Tani ne do të kalojmë në mënyrë të përgjithshme përmes pipeline-it të vlerësimit, duke përqendruar vëmendjen në ndërveprimin e mikro-shërbimeve në kontekstin e arkitekturës së përgjithshme të projektit. 

Gjatë punës mbi pipeline-in e vlerësimit të atraktivitetit, detyra u dekompozua në përbërësit në vijim:

  1. Identifikimi i fytyrave në foto
  2. Vlerësimi i secilës nga fytyrat
  3. Renderimi i rezultatit

E para zgjidhet me ndihmĂ«n e MTCNN. PĂ«r tĂ« dytĂ«n, njĂ« rrjet nervor konvulucional u trajnuar nĂ« PyTorch, duke pĂ«rdorur si backbone ResNet34 – nga balanca "cilĂ«si / shpejtĂ«si inferencĂ«s nĂ« CPU"

Përmbledhje e përgjithshme e arkitekturës së shërbimit për vlerësimin e pamjes në bazë të rrjeteve neuronale

Diagrami funksional i pipeline-it të vlerësimit

Analiza e kërkesave për arkitekturën e projektit

Në ciklin e jetës ML e projektit, etapet e punës mbi arkitekturën dhe automatizimin e vendosjes së modelit janë shpesh nga më të shtrenjtat në kohë dhe burime.

Përmbledhje e përgjithshme e arkitekturës së shërbimit për vlerësimin e pamjes në bazë të rrjeteve neuronale

Cikli i jetës së projektit ML

Ky projekt nuk Ă«shtĂ« pĂ«rjashtim – u vendos qĂ« pipeline-i i vlerĂ«simit tĂ« paketojĂ« si njĂ« shĂ«rbim online, pĂ«r kĂ«tĂ« ishte e nevojshme tĂ« thellohemi nĂ« arkitekturĂ«. KĂ«to ishin disa kĂ«rkesa bazĂ« tĂ« identifikuara:

  1. NjĂ« repository tĂ« vetme pĂ«r log-e – tĂ« gjithĂ« shĂ«rbimet duhet tĂ« shkruajnĂ« log-e nĂ« njĂ« vend, dhe tĂ« jetĂ« e lehtĂ« pĂ«r t'i analizuar ato
  2. MundĂ«sia e shkallĂ«zimit horizontal tĂ« shĂ«rbimit tĂ« vlerĂ«simit — si ngushticĂ« mĂ« e mundshme
  3. PĂ«r çdo imazh duhet tĂ« ndahen tĂ« njĂ«jtat burime tĂ« procesorit — pĂ«r tĂ« shmangur shpĂ«rthimet nĂ« shpĂ«rndarjen e kohĂ«s pĂ«r inferencĂ«n
  4. Zhvillim të shpejtë (përsëritje) si të shërbimeve specifike ashtu edhe të stack-ut në tërësi
  5. Mundësia, nëse është e nevojshme, për të përdorur objekte të përbashkëta në shërbime të ndryshme

Arkitektura

Pas analizimit të kërkesave, bëhet e qartë se arkitektura mikroshërbimeve përshtatet praktikisht perfekt.

Për të eliminuar ndonjë dhimbje të panevojshme, u zgjodh Telegram API si frontend.

Fillimisht, le të shqyrtojmë diagramin strukturore të arkitekturës përfundimtare, pastaj do të kalojmë në përshkrimin e secilit nga komponentët, si dhe do të formalisht procesin e përpunimit të suksesshëm të imazhit.

Përmbledhje e përgjithshme e arkitekturës së shërbimit për vlerësimin e pamjes në bazë të rrjeteve neuronale

Diagrami strukturore i arkitekturës përfundimtare

Të flasim më në detaje për secilin nga komponentët e diagramit, të shënojmë përgjegjësinë e tyre të Vetme në procesin e vlerësimit të imazhit.

Mikrosherbimi «attrai-telegram-bot»

Ky mikrosherbim inkapsulon të gjitha ndërveprimet me Telegram API. Mund të veçojmë 2 skenarë kryesorë - puna me imazhin e përdoruesit dhe puna me rezultatin e pipeline-it të vlerësimit. Të dy scenarët do t'i shqyrtojmë në mënyrë të përgjithshme.

Kur merret një mesazh nga përdoruesi me imazhin:

  1. Kryhet filtrimi, që përfshin verifikimet e mëposhtme:
    • Prania e madhĂ«sisĂ« optimale tĂ« imazhit
    • Numri i imazheve tĂ« pĂ«rdoruesit, qĂ« tashmĂ« janĂ« nĂ« radhĂ«
  2. Pas kalimit të filtrimit fillestar, imazhi ruhet në volumet docker
  3. NjĂ« detyrĂ« e prodhuar dĂ«rgohet nĂ« radha “to_estimate”, e cila pĂ«rfshin, midis tĂ« tjerash, rrugĂ«n pĂ«r nĂ« imazhin qĂ« ndodhet nĂ« volumet tonĂ«
  4. Nëse etapet e lartpërmendura kalohen me sukses - përdoruesi do të marrë një mesazh me një kohë të përafërt për përpunimin e imazhit, e cila llogaritet mbi numrin e detyrave në radhë. Në rast gabimi, përdoruesi do të informohet qartë për këtë - duke dërguar një mesazh me informacion se çfarë mund të ketë shkuar keq.

Gjithashtu, ky mikrosherbim, si punonjĂ«s celery, dĂ«gjon radhĂ«n “after_estimate”, e cila Ă«shtĂ« e destinuar pĂ«r detyrat qĂ« kanĂ« kaluar pĂ«rmes pipeline-it tĂ« vlerĂ«simit.

Kur merret njĂ« detyrĂ« e re nga “after_estimate”:

  1. NĂ«se imazhi Ă«shtĂ« pĂ«rpunuar me sukses – dĂ«rgojmĂ« rezultatin pĂ«rdoruesit, nĂ«se jo – e njoftojmĂ« pĂ«r gabimin
  2. Fshijmë imazhin, që është rezultati i pipeline-it të vlerësimit

Mikrosherbimi i vlerësimit «attrai-estimator»

Ky mikrosherbim është një punonjës celery dhe inkapsulon gjithçka që lidhet me pipeline-in e vlerësimit të imazhit. Algoritmi i punës këtu është i vetmi - do ta shqyrtojmë atë.

Kur merret njĂ« detyrĂ« e re nga “to_estimate”:

  1. Përshkruajmë imazhin përmes pipeline-it të vlerësimit:
    1. Ngarko imazhin në memorje
    2. Bring the image to the desired size
    3. Find all faces (MTCNN)
    4. Evaluate all faces (wrap faces found in the previous step into a batch and infer using ResNet34)
    5. Render the final image
      1. Draw bounding boxes
      2. Draw evaluations
  2. Delete the user’s (original) image
  3. Save the output from the evaluation pipeline
  4. Place the task in the ‘after_estimate’ queue, which is listened to by the previously discussed microservice ‘attrai-telegram-bot’

Graylog (+ mongoDB + Elasticsearch)

Graylog — is a solution for centralized log management. In this project, it was used for its intended purpose.

The choice fell specifically on it, rather than the familiar ELK stack, due to the convenience of working with it from Python. All that is needed to log in Graylog is to add GELFTCPHandler from the graypy to other root logger handlers of our python microservice.

As someone who has previously only worked with the ELK stack, I generally had a positive experience working with Graylog. The only downside is Kibana’s superior features compared to Graylog’s web interface.

RabbitMQ

RabbitMQ — is a message broker based on the AMQP protocol.

In this project, it was used as the most stable and time-tested broker for Celery and operated in durable mode.

Redis

Redis — is a NoSQL DBMS that works with key-value data structures.

Sometimes it's necessary to use common objects in different python microservices that implement some data structures.

For example, Redis stores a hashmap like ‘telegram_user_id => number of active tasks in the queue’, which allows limiting the number of requests from a single user to a certain value, thereby preventing DoS attacks.

Formalize the process of successful image processing

  1. The user sends an image to the Telegram bot
  2. ‘attrai-telegram-bot’ receives a message from the Telegram API and parses it
  3. The task with the image is added to the asynchronous queue ‘to_estimate’
  4. The user receives a message with the planned estimation time
  5. ‘attrai-estimator’ takes the task from the ‘to_estimate’ queue, runs it through the evaluation pipeline, and produces a task in the ‘after_estimate’ queue
  6. ‘attrai-telegram-bot’, listening to the ‘after_estimate’ queue, sends the result to the user

DevOps

Finally, after reviewing the architecture, we can move on to the equally interesting part — DevOps

Docker Swarm

 

Përmbledhje e përgjithshme e arkitekturës së shërbimit për vlerësimin e pamjes në bazë të rrjeteve neuronale

Docker Swarm  — njĂ« sistem klasterizimi, funksionaliteti i tĂ« cilit Ă«shtĂ« realizuar brenda Docker Engine dhe Ă«shtĂ« i aksesueshĂ«m nga kutia.

Me ndihmĂ«n e «rojeve», tĂ« gjithĂ« nodet e klasterit tonĂ« mund tĂ« ndahen nĂ« 2 lloje – punonjĂ«s dhe menaxher. NĂ« pajisjet e llojit tĂ« parĂ« krijohen grupe kontejnerĂ«sh (stacks), pajisjet e llojit tĂ« dytĂ« janĂ« pĂ«rgjegjĂ«se pĂ«r shkallĂ«zimin, balancimin dhe karakteristika tĂ« tjera tĂ« shkĂ«lqyera. MenaxherĂ«t pĂ«r default janĂ« gjithashtu punonjĂ«s.

Përmbledhje e përgjithshme e arkitekturës së shërbimit për vlerësimin e pamjes në bazë të rrjeteve neuronale

Një klaster me një menaxher lider dhe tre punonjës

Madhësia minimale e mundshme e klasterit është 1 nod, pajisja e vetme do të veprojë njëkohësisht si menaxher lider dhe punonjës. Duke u bazuar në madhësinë e projektit dhe kërkesat minimale për qëndrueshmëri, u mor vendimi për të përdorur këtë qasje.

Duke e kaluar përpara, do të them se që nga shpërndarja e parë në prodhim, e cila ndodhi në mes të qershorit, nuk ka pasur probleme të lidhura me organizimin e këtij klasteri (por kjo nuk do të thotë se një organizim i tillë është i pranueshëm në ndonjë projekt të mesëm ose të madh që ka kërkesa për qëndrueshmëri).

Docker Stack

Në modin e «rojeve» për shpërndarjen e stacks (grupimi i shërbimeve docker) është përgjegjës docker stack

Ai mbështet konfigurime docker-compose, duke lejuar përdorimin e parametrave të deploy-it për më tepër.  

Për shembull, me ndihmën e këtyre parametrave u kufizuan burimet për secilën nga instancat e mikroshërbimit të vlerësimit (ndajmë N qarqe për N instanca, në vetë mikroshërbimin kufizojmë numrin e qarqeve të përdorura nga PyTorch në një)

attrai_estimator:
  image: 'erqups/attrai_estimator:1.2'
  deploy:
    replicas: 4
    resources:
      limits:
        cpus: '4'
    restart_policy:
      condition: on-failure
      


ËshtĂ« e rĂ«ndĂ«sishme tĂ« theksohet se Redis, RabbitMQ dhe Graylog janĂ« shĂ«rbime stateful dhe nuk Ă«shtĂ« aq e lehtĂ« t'i shkallĂ«zojmĂ« ato si «attrai-estimator»

Duke parashikuar pyetjen—pse jo Kubernetes?

Duket se përdorimi i Kubernetes në projekte të vogla dhe të mesme është një overhed, të gjitha funksionalitetet e nevojshme mund të merren nga Docker Swarm, i cili është mjaft miqësor me përdoruesit si një orkestrator kontejnerësh, si dhe ka një prag të ulët hyrës.

Infrastruktura

Të gjitha këto u zhvilluan në VDS me karakteristika të mëposhtme:

  • CPU: 4 bĂ«rthama IntelÂź XeonÂź Gold 5120 CPU @ 2.20GHz
  • RAM: 8 GB
  • SSD: 160 GB

Pas testeve lokale të ngarkesës, dukej se gjatë një fluksi të rëndë përdoruesish, kjo pajisje do të ishte në kufi.

Por vetëm pas implementimit, kam postuar një lidhje në një nga board-et më të njohura të imazheve në CIS (po, atë të famshmen), pas së cilës njerëzit u interesuan dhe brenda disa orëve shërbimi përpunoi me sukses dhjetëra mijëra imazhe. Në momentet kulmore, burimet CPU dhe RAM nuk u shfrytëzuan as në gjysmën e kapacitetit.

Përmbledhje e përgjithshme e arkitekturës së shërbimit për vlerësimin e pamjes në bazë të rrjeteve neuronale
Përmbledhje e përgjithshme e arkitekturës së shërbimit për vlerësimin e pamjes në bazë të rrjeteve neuronale

Pak më shumë grafikë

Numri i përdoruesve unikë dhe kërkesave për vlerësim, që nga momenti i implementimit, varion sipas ditës

Përmbledhje e përgjithshme e arkitekturës së shërbimit për vlerësimin e pamjes në bazë të rrjeteve neuronale

Distribucioni i kohës së inferencës së pipeline-it të vlerësimit

Përmbledhje e përgjithshme e arkitekturës së shërbimit për vlerësimin e pamjes në bazë të rrjeteve neuronale

Përfundimet

NĂ« pĂ«rmbledhje, mund tĂ« them se arkitektura dhe qasja pĂ«r orkestrimin e kontejnerĂ«ve e justifikuan vetveten plotĂ«sisht — edhe nĂ« momentet kulmore nuk kishte rĂ«nie dhe vonesa nĂ« kohĂ«n e pĂ«rpunimit. 

Mendoj që projektet e vogla dhe të mesme, që përdorin inferencën në kohë reale të rrjeteve neuronale në CPU, mund të përfitojnë suksesshëm nga praktikat e përshkruara në këtë artikull.

Do tĂ« shtoja se fillimisht artikulli ishte mĂ« i gjatĂ«, por, pĂ«r tĂ« mos postuar njĂ« dokument tĂ« gjatĂ«, vendosa tĂ« lĂ« disa pika jashtĂ« — do tĂ« kthehemi te to nĂ« publikime tĂ« ardhshme.

Mund ta provoni botin nĂ« Telegram — @AttraiBot, do tĂ« funksionojĂ«, tĂ« paktĂ«n, deri nĂ« fund tĂ« vjeshtĂ«s sĂ« vitit 2020. Kujtoj — nuk ruhet asnjĂ« tĂ« dhĂ«nĂ« personale — as imazhet origjinale, as rezultatet e pipeline-it tĂ« vlerĂ«simit — gjithçka fshihet pas pĂ«rpunimit.

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster