Neyron şəbəkələrə əsaslanan görünüşün qiymətləndirilməsi üçün xidmət arxitekturasına ümumi baxış

Neyron şəbəkələrə əsaslanan görünüşün qiymətləndirilməsi üçün xidmət arxitekturasına ümumi baxış

Giriş

Привет!

Bu yazıda neyroşəbəkələrdən istifadə edərək bir layihə üçün mikroservis arxitekturasının qurulması təcrübəmi bölüşəcəyəm.

Memarlıq tələbləri haqqında danışaq, müxtəlif struktur diaqramlarına baxaq, bitmiş arxitekturanın hər bir komponentini təhlil edək, həmçinin həllin texniki ölçülərini qiymətləndirək.

Oxumadan həzz alın!

Problem və onun həlli haqqında bir neçə kəlmə

Əsas fikir bir fotoşəkil əsasında bir insanın cəlbediciliyini on ballıq şkala ilə qiymətləndirməkdir.

Bu yazıda biz həm istifadə olunan neyron şəbəkələri, həm də məlumatların hazırlanması və öyrədilməsi prosesini təsvir etməkdən uzaqlaşacağıq. Bununla belə, növbəti nəşrlərdən birində biz mütləq qiymətləndirmə boru kəmərini dərin səviyyədə təhlil etməyə qayıdacayıq.

İndi biz ən yüksək səviyyədə qiymətləndirmə boru kəmərindən keçəcəyik və ümumi layihə arxitekturası kontekstində mikroservislərin qarşılıqlı əlaqəsinə diqqət yetirəcəyik. 

Cəlbediciliyin qiymətləndirilməsi boru kəməri üzərində işləyərkən tapşırıq aşağıdakı komponentlərə bölündü:

  1. Fotolarda üzlərin seçilməsi
  2. Hər bir şəxsin reytinqi
  3. Nəticəni göstərin

Birincisi, əvvəlcədən hazırlanmış qüvvələr tərəfindən həll edilir MTCNN. İkincisi, istifadə edərək, PyTorch-da konvolutional neyron şəbəkəsi öyrədildi ResNet34 - "CPU-da keyfiyyət / nəticə çıxarma sürəti" balansından

Neyron şəbəkələrə əsaslanan görünüşün qiymətləndirilməsi üçün xidmət arxitekturasına ümumi baxış

Qiymətləndirmə boru kəmərinin funksional diaqramı

Layihənin memarlıq tələblərinin təhlili

Həyat dövründə ML Modelin yerləşdirilməsinin arxitekturası və avtomatlaşdırılması üzrə işin layihə mərhələləri çox vaxt ən çox vaxt aparan və resurs tələb edən mərhələlərdəndir.

Neyron şəbəkələrə əsaslanan görünüşün qiymətləndirilməsi üçün xidmət arxitekturasına ümumi baxış

ML layihəsinin həyat dövrü

Bu layihə də istisna deyil - qiymətləndirmə boru kəmərini arxitekturaya qərq etməyi tələb edən onlayn xidmətə bükmək qərarı verildi. Aşağıdakı əsas tələblər müəyyən edilmişdir:

  1. Vahid jurnal saxlama - bütün xidmətlər jurnalları bir yerdə yazmalıdır, təhlil etmək üçün əlverişli olmalıdır
  2. Qiymətləndirmə xidmətinin üfüqi miqyasının mümkünlüyü - ən çox ehtimal olunan darboğaz kimi
  3. Nəticə üçün vaxtın paylanmasında kənar göstəricilərin qarşısını almaq üçün hər bir təsviri qiymətləndirmək üçün eyni miqdarda prosessor resursları ayrılmalıdır.
  4. Həm xüsusi xidmətlərin, həm də bütövlükdə yığının sürətli (yenidən) yerləşdirilməsi
  5. Lazım gələrsə, müxtəlif xidmətlərdə ümumi obyektlərdən istifadə etmək bacarığı

memarlıq

Tələbləri təhlil etdikdən sonra məlum oldu ki, mikroservis arxitekturası demək olar ki, mükəmməl uyğun gəlir.

Lazımsız başağrılarından qurtulmaq üçün ön tərəf kimi Telegram API seçilib.

Əvvəlcə bitmiş arxitekturanın struktur diaqramına baxaq, sonra komponentlərin hər birinin təsvirinə keçək, həmçinin uğurlu təsvirin işlənməsi prosesini rəsmiləşdirək.

Neyron şəbəkələrə əsaslanan görünüşün qiymətləndirilməsi üçün xidmət arxitekturasına ümumi baxış

Bitmiş memarlığın struktur diaqramı

Diaqramın hər bir komponenti haqqında daha ətraflı danışaq, onları ifadə edərək, təsvirin qiymətləndirilməsi prosesində Vahid Məsuliyyət.

Mikroservis "attrai-telegram-bot"

Bu mikroservis Telegram API ilə bütün qarşılıqlı əlaqələri əhatə edir. 2 əsas ssenari var: fərdi şəkil ilə işləmək və qiymətləndirmə boru kəmərinin nəticəsi ilə işləmək. Hər iki ssenariyə ümumi mənada baxaq.

Şəkil ilə fərdi mesaj qəbul edərkən:

  1. Aşağıdakı yoxlamalardan ibarət filtrasiya aparılır:
    • Optimal şəkil ölçüsünün mövcudluğu
    • Artıq növbədə olan istifadəçi şəkillərinin sayı
  2. İlkin süzgəcdən keçərkən şəkil docker həcmində saxlanılır
  3. Tapşırıq, digər şeylərlə yanaşı, həcmimizdə yerləşən təsvirə gedən yolu da əhatə edən "to_estimate" növbəsində hazırlanır.
  4. Yuxarıdakı addımlar uğurla tamamlanarsa, istifadəçi növbədəki tapşırıqların sayına əsasən hesablanan təxmini təsvirin emal müddəti ilə bir mesaj alacaq. Səhv baş verərsə, istifadəçi nəyin səhv ola biləcəyi barədə məlumatı olan mesaj göndərməklə açıq şəkildə xəbərdar ediləcək.

Həmçinin, bu mikroservis, kərəviz işçisi kimi, qiymətləndirmə boru kəmərindən keçən tapşırıqlar üçün nəzərdə tutulmuş "sonra_qiymətləndirmə" növbəsini dinləyir.

“After_estimate”dən yeni tapşırıq alarkən:

  1. Şəkil uğurla işlənilibsə, nəticəni istifadəçiyə göndəririk, yoxsa, xəta barədə məlumat veririk.
  2. Qiymətləndirmə boru kəmərinin nəticəsi olan şəklin silinməsi

Qiymətləndirmə mikroservisi “attrai-estimator”

Bu mikroservis kərəviz işçisidir və təsvirin qiymətləndirilməsi boru kəməri ilə əlaqəli hər şeyi əhatə edir. Burada yalnız bir iş alqoritmi var - gəlin onu təhlil edək.

“to_estimate”dən yeni tapşırıq alarkən:

  1. Şəkli qiymətləndirmə boru kəməri ilə keçirək:
    1. Şəklin yaddaşa yüklənməsi
    2. Şəkili lazımi ölçüyə gətiririk
    3. Bütün üzlərin tapılması (MTCNN)
    4. Bütün üzləri qiymətləndiririk (son addımda tapılan üzləri bir dəstəyə sarırıq və ResNet34-dən nəticə çıxarırıq)
    5. Son şəkli göstərin
      1. Hədiyyə qutularını çəkək
      2. Reytinqlərin çəkilməsi
  2. Fərdi (orijinal) şəklin silinməsi
  3. Qiymətləndirmə boru kəmərindən çıxışın saxlanması
  4. Biz tapşırığı yuxarıda müzakirə edilən “attrai-telegram-bot” mikroservisi tərəfindən dinlənilən “sonra_qiymətləndirmə” növbəsinə qoyuruq.

Graylog (+ mongoDB + Elasticsearch)

boz zolaq mərkəzləşdirilmiş log idarəsi üçün həlldir. Bu layihədə ondan təyinatı üzrə istifadə olunub.

Seçim adi deyil, onun üzərinə düşürdü ELK stack, Python-dan onunla işləmək rahatlığına görə. Graylog-a daxil olmaq üçün sizə lazım olan tək şey paketdən GELFTCPHandler əlavə etməkdir boz python mikroservisimizin qalan kök logger işləyicilərinə.

Əvvəllər yalnız ELK yığını ilə işləmiş biri kimi mən Graylog ilə işləyərkən ümumi müsbət təcrübə qazandım. Depressiv olan yeganə şey Kibana xüsusiyyətlərinin Graylog veb interfeysindən üstün olmasıdır.

RabbitMQ

RabbitMQ AMQP protokoluna əsaslanan mesaj brokeridir.

Bu layihədə ondan istifadə edilmişdir ən stabil və zamanla sınaqdan keçirilmişdir Kərəviz üçün broker və davamlı rejimdə işləyib.

Redis

Redis açar-dəyər məlumat strukturları ilə işləyən NoSQL DBMS-dir

Bəzən müxtəlif Python mikroservislərində müəyyən məlumat strukturlarını həyata keçirən ümumi obyektlərdən istifadə etmək zərurəti yaranır.

Məsələn, Redis “telegram_user_id => növbədəki aktiv tapşırıqların sayı” formasının heşmapını saxlayır ki, bu da bir istifadəçidən gələn sorğuların sayını müəyyən dəyərlə məhdudlaşdırmağa və bununla da DoS hücumlarının qarşısını almağa imkan verir.

Uğurlu təsvirin işlənməsi prosesini rəsmiləşdirək

  1. İstifadəçi şəkli Telegram botuna göndərir
  2. "attrai-telegram-bot" Telegram API-dən mesaj alır və onu təhlil edir
  3. Şəkil ilə tapşırıq "to_estimate" asinxron növbəsinə əlavə olunur.
  4. İstifadəçi planlaşdırılan qiymətləndirmə vaxtı ilə bir mesaj alır
  5. "attrai-estimator" "təxmin etmək" növbəsindən tapşırığı götürür, təxminləri boru kəməri vasitəsilə aparır və tapşırığı "qiymətləndirmədən sonra" növbəyə hazırlayır
  6. "attrai-telegram-bot" "sonra_qiymətləndirmə" növbəsini dinləyir, nəticəni istifadəçiyə göndərir

DevOps

Nəhayət, memarlığı nəzərdən keçirdikdən sonra eyni dərəcədə maraqlı hissəyə - DevOps-a keçə bilərsiniz

Docker sürüsü

 

Neyron şəbəkələrə əsaslanan görünüşün qiymətləndirilməsi üçün xidmət arxitekturasına ümumi baxış

Docker sürüsü  — funksionallığı Docker Mühərrikinin daxilində həyata keçirilən və qutudan kənarda mövcud olan klaster sistemi.

"Sürü" istifadə edərək, klasterimizdəki bütün qovşaqları 2 növə bölmək olar - işçi və menecer. Birinci tip maşınlarda qablar qrupları (stoplar) yerləşdirilir, ikinci tip maşınlar miqyaslama, balanslaşdırma və digər gözəl xüsusiyyətlər. Menecerlər də standart olaraq işçidirlər.

Neyron şəbəkələrə əsaslanan görünüşün qiymətləndirilməsi üçün xidmət arxitekturasına ümumi baxış

Bir lider menecer və üç işçi ilə klaster

Minimum mümkün klaster ölçüsü 1 qovşaqdır; bir maşın eyni zamanda lider menecer və işçi kimi çıxış edəcəkdir. Layihənin ölçüsünə və qüsurlara dözümlülük üçün minimum tələblərə əsaslanaraq, bu yanaşmadan istifadə etmək qərara alındı.

İrəliyə baxaraq deyim ki, iyunun ortalarında olan ilk istehsal təhvilindən bəri bu klaster təşkilatı ilə bağlı heç bir problem olmayıb (lakin bu o demək deyil ki, belə bir təşkilat hər hansı bir orta-böyük şirkətdə məqbuldur. xətaya dözümlülük tələblərinə tabe olan layihələr).

Docker Stack

Sürü rejimində o, yığınların yerləşdirilməsinə cavabdehdir (doker xidmətləri dəstləri) docker yığını

O, əlavə olaraq yerləşdirmə seçimlərindən istifadə etməyə imkan verən docker-compose konfiqurasiyalarını dəstəkləyir.  

Məsələn, bu parametrlərdən istifadə edərək, qiymətləndirmə mikroxidməti nümunələrinin hər biri üçün resurslar məhdud idi (biz N nümunə üçün N nüvə ayırırıq, mikroservisin özündə PyTorch tərəfindən istifadə olunan nüvələrin sayını bir ilə məhdudlaşdırırıq)

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

Qeyd etmək vacibdir ki, Redis, RabbitMQ və Graylog statistik xidmətlərdir və onları "attrai-estimator" kimi asanlıqla ölçmək mümkün deyil.

Sualı qabaqcadan ifadə etmək - niyə Kubernetes olmasın?

Belə görünür ki, Kubernetes-in kiçik və orta ölçülü layihələrdə istifadəsi əlavə xərcdir; bütün lazımi funksionallığı bir konteyner orkestratoru üçün olduqca istifadəçi dostu olan və həmçinin giriş üçün aşağı maneə olan Docker Swarm-dan əldə etmək olar.

İnfrastruktur

Bütün bunlar aşağıdakı xüsusiyyətlərə malik VDS-də yerləşdirilmişdir:

  • CPU: 4 nüvəli Intel® Xeon® Gold 5120 CPU @ 2.20GHz
  • RAM: 8 GB
  • SSD: 160 GB

Yerli yük testindən sonra, ciddi bir istifadəçi axını ilə bu maşının kifayət edəcəyi görünürdü.

Ancaq yerləşdirmədən dərhal sonra mən MDB-də ən populyar şəkil lövhələrindən birinə keçid yerləşdirdim (bəli, eyni), bundan sonra insanlar maraqlandı və bir neçə saat ərzində xidmət on minlərlə şəkli uğurla emal etdi. Eyni zamanda, pik anlarda CPU və RAM resursları hətta yarı istifadə edilmədi.

Neyron şəbəkələrə əsaslanan görünüşün qiymətləndirilməsi üçün xidmət arxitekturasına ümumi baxış
Neyron şəbəkələrə əsaslanan görünüşün qiymətləndirilməsi üçün xidmət arxitekturasına ümumi baxış

Daha bir neçə qrafika

Unikal istifadəçilərin sayı və gündən asılı olaraq yerləşdirmədən bəri qiymətləndirmə sorğuları

Neyron şəbəkələrə əsaslanan görünüşün qiymətləndirilməsi üçün xidmət arxitekturasına ümumi baxış

Qiymətləndirmə boru kəməri çıxarış vaxtının paylanması

Neyron şəbəkələrə əsaslanan görünüşün qiymətləndirilməsi üçün xidmət arxitekturasına ümumi baxış

Tapıntılar

Xülasə etmək üçün deyə bilərəm ki, arxitektura və konteynerlərin orkestrləşdirilməsinə yanaşma özünü tamamilə doğrultdu - hətta pik anlarda emal müddətində heç bir düşmə və ya əyilmə yox idi. 

Düşünürəm ki, prosesində CPU-da neyron şəbəkələrinin real vaxt nəticəsinə əsasən istifadə edən kiçik və orta ölçülü layihələr bu məqalədə təsvir olunan təcrübələri uğurla qəbul edə bilər.

Əlavə edəcəyəm ki, əvvəlcə məqalə daha uzun idi, lakin uzun müddət oxunmamaq üçün bu məqalədəki bəzi məqamları buraxmaq qərarına gəldim - gələcək nəşrlərdə onlara qayıdacağıq.

Telegram-da botu soxmaq olar - @AttraiBot, o, ən azı 2020-ci ilin payızının sonuna qədər işləyəcək. Nəzərinizə çatdırım ki, heç bir istifadəçi məlumatı saxlanılmır - nə orijinal şəkillər, nə də qiymətləndirmə boru kəmərinin nəticələri - emaldan sonra hər şey sökülür.

Mənbə: www.habr.com

Добавить комментарий