entri
Hello!
Ing artikel iki aku bakal nuduhake pengalaman mbangun arsitektur microservice kanggo proyek nggunakake jaringan syaraf.
Ayo ngobrol babagan syarat arsitektur, deleng macem-macem diagram struktural, nganalisa saben komponen arsitektur rampung, lan uga ngevaluasi metrik teknis solusi kasebut.
Seneng maca!
Sawetara tembung babagan masalah lan solusi
Ide utama yaiku kanggo ngevaluasi daya tarik wong ing skala sepuluh titik adhedhasar foto.
Ing artikel iki kita bakal pindhah saka njlèntrèhaké loro jaringan syaraf digunakake lan proses preparation lan latihan data. Nanging, ing salah sawijining publikasi ing ngisor iki, kita mesthi bakal bali maneh kanggo nganalisa pipeline penilaian ing tingkat sing jero.
Saiki kita bakal ngliwati pipa evaluasi ing tingkat paling dhuwur, lan bakal fokus ing interaksi layanan mikro ing konteks arsitektur proyek sakabèhé.
Nalika nggarap pipa penilaian daya tarik, tugas kasebut dipérang dadi komponen ing ngisor iki:
- Milih pasuryan ing foto
- Rating saben wong
- Render asil
Pisanan ditanggulangi dening pasukan sing wis dilatih
Diagram fungsional pipa evaluasi
Analisis syarat arsitektur proyek
Ing siklus urip
Siklus urip proyek ML
Proyèk iki ora ana sing istiméwa - kaputusan digawe kanggo mbungkus pipa penilaian dadi layanan online, sing kudu nyemplungake awake dhewe ing arsitektur. Persyaratan dhasar ing ngisor iki diidentifikasi:
- Panyimpenan log terpadu - kabeh layanan kudu nulis log ing sak panggonan, mesthine trep kanggo nganalisa
- Kemungkinan skala horisontal layanan taksiran - minangka Bottleneck sing paling mungkin
- Jumlah sumber daya prosesor sing padha kudu dialokasikan kanggo ngevaluasi saben gambar supaya ora ana outlier ing distribusi wektu kanggo inferensi.
- Cepet (re) panyebaran loro layanan tartamtu lan tumpukan minangka kabèh
- Kemampuan, yen perlu, nggunakake obyek umum ing macem-macem layanan
arsitektur
Sawise nganalisa syarat kasebut, dadi jelas manawa arsitektur microservice cocog banget.
Kanggo nyingkirake sirah sing ora perlu, API Telegram dipilih minangka frontend.
Pisanan, ayo ndeleng diagram struktural arsitektur sing wis rampung, banjur pindhah menyang deskripsi saben komponen, lan uga ngresmikake proses pangolahan gambar sing sukses.
Diagram struktural saka arsitektur rampung
Ayo dadi pirembagan ing liyane rinci babagan saben komponen saka diagram, denoting wong Tanggung jawab Single ing proses evaluasi gambar.
Layanan mikro "attrai-telegram-bot"
Layanan mikro iki ngemot kabeh interaksi karo API Telegram. Ana 2 skenario utama: nggarap gambar khusus lan nggarap asil pipo penilaian. Ayo katon ing loro skenario ing istilah umum.
Nalika nampa pesen khusus kanthi gambar:
- Filtrasi ditindakake, kalebu pemeriksaan ing ngisor iki:
- Kasedhiyan ukuran gambar sing optimal
- Jumlah gambar pangguna sing wis ana ing antrian
- Nalika ngliwati panyaring awal, gambar kasebut disimpen ing volume docker
- Tugas digawe ing antrian "kanggo_estimasi", sing kalebu, ing antarane, dalan menyang gambar sing ana ing volume kita.
- Yen langkah-langkah ing ndhuwur wis rampung kanthi sukses, pangguna bakal nampa pesen kanthi kira-kira wektu pangolahan gambar, sing diitung adhedhasar jumlah tugas ing antrian. Yen ana kesalahan, pangguna bakal dilaporake kanthi jelas kanthi ngirim pesen kanthi informasi babagan apa sing salah.
Uga, layanan mikro iki, kaya buruh celery, ngrungokake antrian "after_estimate", sing dimaksudake kanggo tugas sing wis liwat pipa evaluasi.
Nalika nampa tugas anyar saka "after_estimate":
- Yen gambar diproses kanthi sukses, kita ngirim asil menyang pangguna; yen ora, kita bakal menehi kabar babagan kesalahan.
- Mbusak gambar sing minangka asil saka pipa evaluasi
Evaluasi microservice "attrai-estimator"
Layanan mikro iki minangka pekerja celery lan ngrampungake kabeh sing ana gandhengane karo pipa evaluasi gambar. Mung ana siji algoritma sing bisa digunakake ing kene - ayo analisa.
Nalika nampa tugas anyar saka "to_estimate":
- Ayo mbukak gambar liwat pipa evaluasi:
- Ngunggah gambar menyang memori
- Kita nggawa gambar menyang ukuran sing dibutuhake
- Nggoleki kabeh pasuryan (MTCNN)
- Kita ngevaluasi kabeh pasuryan (kita mbungkus pasuryan sing ditemokake ing langkah pungkasan dadi batch lan inferensi ResNet34)
- Nggawe gambar pungkasan
- Ayo nggambar kothak wates
- Nggambar rating
- Mbusak gambar khusus (asli).
- Nyimpen output saka pipa evaluasi
- Kita sijine tugas ing "after_estimate" antrian, kang dirungokake dening microservice "attrai-telegram-bot" rembugan ndhuwur.
Graylog (+ mongoDB + Elasticsearch)
Pilihan tiba ing dheweke, lan ora ing sing biasa
Minangka wong sing sadurunge mung nggarap tumpukan ELK, aku duwe pengalaman positif sakabèhé nalika nggarap Graylog. Siji-sijine sing nyenengake yaiku keunggulan fitur Kibana ing antarmuka web Graylog.
KelinciMQ
Ing project iki digunakake minangka
Redis
Kadhangkala ana perlu kanggo nggunakake obyek umum sing ngleksanakake struktur data tartamtu ing microservices Python beda.
Contone, Redis nyimpen peta hash saka wangun "telegram_user_id => jumlah tugas aktif ing antrian," sing ngidini sampeyan mbatesi jumlah panjalukan saka siji pangguna menyang nilai tartamtu lan, kanthi mangkono, nyegah serangan DoS.
Ayo dadi resmi proses pangolahan gambar sing sukses
- Pangguna ngirim gambar menyang bot Telegram
- "attrai-telegram-bot" nampa pesen saka Telegram API lan ngurai
- Tugas karo gambar ditambahake menyang antrian asinkron "to_estimate"
- Pangguna nampa pesen kanthi wektu pambiji sing direncanakake
- "attrai-estimator" njupuk tugas saka antrian "to_estimate", nglakokake taksiran liwat pipa lan ngasilake tugas menyang antrian "after_estimate".
- "attrai-telegram-bot" ngrungokake antrian "after_estimate", ngirim asil menyang pangguna
DevOps
Pungkasan, sawise mriksa arsitektur, sampeyan bisa pindhah menyang bagean sing padha menarik - DevOps
Grombolan Docker
Nggunakake "grombolan", kabeh kelenjar ing kluster kita bisa dipérang dadi 2 jinis - buruh lan manajer. Ing mesin jinis pisanan, klompok wadhah (tumpukan) disebarake, mesin saka jinis liya tanggung jawab kanggo skala, imbangan lan
Kluster karo siji manajer pimpinan lan telung buruh
Ukuran kluster minimal sing bisa ditindakake yaiku 1 simpul; mesin siji bakal tumindak minangka manajer pimpinan lan buruh. Adhedhasar ukuran proyek lan syarat minimal kanggo toleransi kesalahan, diputusake nggunakake pendekatan iki.
Ing ngarep, aku bakal ujar manawa wiwit pangiriman produksi pisanan, yaiku ing pertengahan Juni, ora ana masalah sing ana gandhengane karo organisasi kluster iki (nanging iki ora ateges manawa organisasi kasebut bisa ditampa kanthi cara apa wae. proyek, sing tundhuk karo syarat toleransi fault).
Tumpukan Docker
Ing mode swarm, dheweke tanggung jawab kanggo nyebarake tumpukan (set layanan docker)
Ndhukung konfigurasi docker-compose, ngidini sampeyan nggunakake opsi panyebaran tambahan.
Contone, nggunakake paramèter kasebut, sumber daya kanggo saben instance microservice evaluasi diwatesi (kita nyedhiyakake N inti kanggo N instans, ing microservice dhewe mbatesi jumlah inti sing digunakake dening PyTorch dadi siji)
attrai_estimator:
image: 'erqups/attrai_estimator:1.2'
deploy:
replicas: 4
resources:
limits:
cpus: '4'
restart_policy:
condition: on-failure
…
Wigati dicathet yen Redis, RabbitMQ lan Graylog minangka layanan stateful lan ora bisa diukur kanthi gampang kaya "attrai-estimator"
Foreshadowing pitakonan - kok ora Kubernetes?
Katon yen nggunakake Kubernetes ing proyek cilik lan medium minangka overhead; kabeh fungsi sing dibutuhake bisa dipikolehi saka Docker Swarm, sing cukup pangguna-loropaken kanggo orkestra kontainer lan uga duwe alangan sing sithik kanggo mlebu.
Infrastruktur
Kabeh iki disebarake ing VDS kanthi karakteristik ing ngisor iki:
- CPU: 4 inti Intel® Xeon® Gold 5120 CPU @ 2.20GHz
- RAM: 8 GB
- SSD: 160GB
Sawise tes beban lokal, katon manawa kanthi akeh pangguna pangguna, mesin iki bakal cukup.
Nanging, sanalika sawise penyebaran, aku ngirim link menyang salah sawijining papan gambar sing paling populer ing CIS (yup, sing padha), sawise wong dadi kasengsem lan ing sawetara jam layanan kasebut kasil ngolah puluhan ewu gambar. Ing wektu sing padha, ing wektu puncak, sumber daya CPU lan RAM ora setengah digunakake.
Sawetara grafis liyane
Jumlah pangguna unik lan panjaluk evaluasi wiwit penyebaran, gumantung ing dina
Distribusi wektu inferensi pipa evaluasi
temonan
Kanggo ngringkes, aku bisa ujar manawa arsitektur lan pendekatan kanggo orkestrasi kontaner mbenerake awake dhewe - sanajan ing wektu puncak ora ana tetes utawa dips ing wektu pangolahan.
Aku mikir yen proyek cilik lan medium sing nggunakake inferensi nyata-wektu saka jaringan syaraf ing CPU ing proses bisa kasil nganggo laku diterangake ing artikel iki.
Aku bakal nambah manawa wiwitane artikel kasebut luwih dawa, nanging supaya ora ngirim maca sing dawa, aku mutusake ngilangi sawetara poin ing artikel iki - kita bakal bali menyang publikasi sabanjure.
Sampeyan bisa nyopot bot ing Telegram - @AttraiBot, bakal bisa paling ora nganti pungkasan musim gugur 2020. Ayo kula ngelingake yen ora ana data pangguna sing disimpen - ora gambar asli, utawa asil pipa evaluasi - kabeh dibongkar sawise diproses.
Source: www.habr.com