Gambaran keseluruhan seni bina perkhidmatan untuk penilaian penampilan berdasarkan rangkaian saraf

Gambaran keseluruhan seni bina perkhidmatan untuk penilaian penampilan berdasarkan rangkaian saraf

Entry

Hello!

Dalam artikel ini saya akan berkongsi pengalaman saya membina seni bina perkhidmatan mikro untuk projek menggunakan rangkaian saraf.

Mari kita bincangkan tentang keperluan seni bina, lihat pelbagai rajah struktur, analisis setiap komponen seni bina siap, dan juga menilai metrik teknikal penyelesaian.

Nikmati bacaan!

Sedikit perkataan tentang masalah dan penyelesaiannya

Idea utama adalah untuk menilai daya tarikan seseorang pada skala sepuluh mata berdasarkan foto.

Dalam artikel ini kita akan beralih daripada menerangkan kedua-dua rangkaian saraf yang digunakan dan proses penyediaan dan latihan data. Walau bagaimanapun, dalam salah satu penerbitan berikut, kami pasti akan kembali menganalisis saluran paip penilaian pada tahap yang mendalam.

Sekarang kita akan melalui saluran paip penilaian di peringkat atas, dan akan menumpukan pada interaksi perkhidmatan mikro dalam konteks seni bina projek keseluruhan. 

Apabila bekerja pada saluran paip penilaian daya tarikan, tugas itu telah diuraikan kepada komponen berikut:

  1. Memilih wajah dalam foto
  2. Penilaian setiap orang
  3. Berikan hasilnya

Yang pertama diselesaikan oleh kuasa pra-terlatih MTCNN. Untuk yang kedua, rangkaian neural convolutional telah dilatih pada PyTorch, menggunakan ResNet34 – daripada baki "kualiti / kelajuan inferens pada CPU"

Gambaran keseluruhan seni bina perkhidmatan untuk penilaian penampilan berdasarkan rangkaian saraf

Gambar rajah fungsi saluran paip penilaian

Analisis keperluan seni bina projek

Dalam kitaran hidup ML peringkat projek kerja pada seni bina dan automasi penggunaan model selalunya antara yang paling memakan masa dan memakan sumber.

Gambaran keseluruhan seni bina perkhidmatan untuk penilaian penampilan berdasarkan rangkaian saraf

Kitaran hayat projek ML

Projek ini tidak terkecuali - keputusan telah dibuat untuk membungkus saluran penilaian ke dalam perkhidmatan dalam talian, yang memerlukan melibatkan diri dalam seni bina. Keperluan asas berikut telah dikenalpasti:

  1. Storan log bersatu – semua perkhidmatan harus menulis log di satu tempat, mereka harus mudah untuk dianalisis
  2. Kemungkinan penskalaan mendatar perkhidmatan penilaian - sebagai Bottleneck yang paling mungkin
  3. Jumlah sumber pemproses yang sama harus diperuntukkan untuk menilai setiap imej untuk mengelakkan outlier dalam pengagihan masa untuk inferens
  4. Penggunaan pantas (semula) kedua-dua perkhidmatan khusus dan timbunan secara keseluruhan
  5. Keupayaan, jika perlu, untuk menggunakan objek biasa dalam perkhidmatan yang berbeza

seni bina

Selepas menganalisis keperluan, menjadi jelas bahawa seni bina perkhidmatan mikro sesuai dengan hampir sempurna.

Untuk menghilangkan sakit kepala yang tidak perlu, API Telegram telah dipilih sebagai bahagian hadapan.

Mula-mula, mari kita lihat gambarajah struktur seni bina yang telah siap, kemudian teruskan kepada penerangan bagi setiap komponen, dan juga memformalkan proses pemprosesan imej yang berjaya.

Gambaran keseluruhan seni bina perkhidmatan untuk penilaian penampilan berdasarkan rangkaian saraf

Gambar rajah struktur seni bina siap

Mari kita bercakap dengan lebih terperinci tentang setiap komponen rajah, menandakan mereka Tanggungjawab Tunggal dalam proses penilaian imej.

Perkhidmatan mikro "attrai-telegram-bot"

Perkhidmatan mikro ini merangkumi semua interaksi dengan API Telegram. Terdapat 2 senario utama: bekerja dengan imej tersuai dan bekerja dengan hasil saluran paip penilaian. Mari kita lihat kedua-dua senario secara umum.

Apabila menerima mesej tersuai dengan imej:

  1. Penapisan dilakukan, terdiri daripada pemeriksaan berikut:
    • Ketersediaan saiz imej yang optimum
    • Bilangan imej pengguna sudah dalam baris gilir
  2. Apabila melepasi penapisan awal, imej disimpan dalam jumlah docker
  3. Tugasan dihasilkan dalam baris gilir "untuk_anggaran", yang termasuk, antara lain, laluan ke imej yang terletak dalam volum kami
  4. Jika langkah di atas berjaya diselesaikan, pengguna akan menerima mesej dengan anggaran masa pemprosesan imej, yang dikira berdasarkan bilangan tugas dalam baris gilir. Jika ralat berlaku, pengguna akan dimaklumkan secara eksplisit dengan menghantar mesej dengan maklumat tentang perkara yang mungkin telah berlaku.

Selain itu, perkhidmatan mikro ini, seperti pekerja saderi, mendengar baris gilir "after_estimate", yang bertujuan untuk tugasan yang telah melalui saluran paip penilaian.

Apabila menerima tugas baharu daripada "after_estimate":

  1. Jika imej berjaya diproses, kami menghantar hasilnya kepada pengguna; jika tidak, kami memberitahu tentang ralat.
  2. Mengalih keluar imej yang merupakan hasil daripada saluran paip penilaian

"attrai-estimator" perkhidmatan mikro penilaian

Perkhidmatan mikro ini ialah pekerja saderi dan merangkumi semua yang berkaitan dengan saluran paip penilaian imej. Terdapat hanya satu algoritma yang berfungsi di sini - mari analisanya.

Apabila menerima tugas baharu daripada "to_estimate":

  1. Mari jalankan imej melalui saluran paip penilaian:
    1. Memuatkan imej ke dalam ingatan
    2. Kami membawa imej ke saiz yang diperlukan
    3. Mencari semua muka (MTCNN)
    4. Kami menilai semua muka (kami membalut wajah yang terdapat dalam langkah terakhir ke dalam kumpulan dan inferens ResNet34)
    5. Berikan imej akhir
      1. Mari kita lukis kotak sempadan
      2. Melukis penilaian
  2. Memadam imej tersuai (asal).
  3. Menyimpan output daripada saluran paip penilaian
  4. Kami meletakkan tugasan dalam baris gilir "after_estimate", yang didengari oleh perkhidmatan mikro "attrai-telegram-bot" yang dibincangkan di atas.

Graylog (+ mongoDB + Elasticsearch)

greylog adalah penyelesaian untuk pengurusan log berpusat. Dalam projek ini, ia digunakan untuk tujuan yang dimaksudkan.

Pilihan jatuh padanya, dan bukan pada yang biasa ELK stack, kerana kemudahan bekerja dengannya dari Python. Apa yang anda perlu lakukan untuk log masuk ke Graylog ialah menambah GELFTCPHandler daripada pakej kelabu kepada seluruh pengendali pembalak akar perkhidmatan mikro python kami.

Sebagai seseorang yang sebelum ini hanya bekerja dengan timbunan ELK, saya mempunyai pengalaman positif keseluruhan semasa bekerja dengan Graylog. Satu-satunya perkara yang menyedihkan ialah keunggulan dalam ciri Kibana berbanding antara muka web Graylog.

RabbitMQ

RabbitMQ ialah broker mesej berdasarkan protokol AMQP.

Dalam projek ini ia digunakan sebagai yang paling stabil dan diuji masa broker untuk Saderi dan bekerja dalam mod tahan lama.

Redis

Redis ialah DBMS NoSQL yang berfungsi dengan struktur data nilai kunci

Kadangkala terdapat keperluan untuk menggunakan objek biasa yang melaksanakan struktur data tertentu dalam perkhidmatan mikro Python yang berbeza.

Sebagai contoh, Redis menyimpan peta cincang dalam bentuk "telegram_user_id => bilangan tugas aktif dalam baris gilir," yang membolehkan anda mengehadkan bilangan permintaan daripada satu pengguna kepada nilai tertentu dan, dengan itu, menghalang serangan DoS.

Mari kita rasmikan proses pemprosesan imej yang berjaya

  1. Pengguna menghantar imej ke bot Telegram
  2. "attrai-telegram-bot" menerima mesej daripada API Telegram dan menghuraikannya
  3. Tugas dengan imej ditambahkan pada baris gilir tak segerak "untuk_anggaran"
  4. Pengguna menerima mesej dengan masa penilaian yang dirancang
  5. "attrai-estimator" mengambil tugasan daripada baris gilir "to_estimate", menjalankan anggaran melalui saluran paip dan menghasilkan tugasan ke dalam baris gilir "after_estimate"
  6. "attrai-telegram-bot" mendengar baris gilir "after_estimate", menghantar hasilnya kepada pengguna

DevOps

Akhirnya, selepas menyemak seni bina, anda boleh beralih ke bahagian yang sama menarik - DevOps

Kumpulan Docker

 

Gambaran keseluruhan seni bina perkhidmatan untuk penilaian penampilan berdasarkan rangkaian saraf

Kumpulan Docker  — sistem pengelompokan, yang fungsinya dilaksanakan di dalam Enjin Docker dan tersedia di luar kotak.

Menggunakan "swarm", semua nod dalam kelompok kami boleh dibahagikan kepada 2 jenis - pekerja dan pengurus. Pada mesin jenis pertama, kumpulan bekas (tindanan) digunakan, mesin jenis kedua bertanggungjawab untuk penskalaan, pengimbangan dan ciri hebat lain. Pengurus juga adalah pekerja secara lalai.

Gambaran keseluruhan seni bina perkhidmatan untuk penilaian penampilan berdasarkan rangkaian saraf

Kluster dengan seorang pengurus pemimpin dan tiga pekerja

Saiz kluster minimum yang mungkin ialah 1 nod; satu mesin akan bertindak secara serentak sebagai pengurus pemimpin dan pekerja. Berdasarkan saiz projek dan keperluan minimum untuk toleransi kesalahan, telah diputuskan untuk menggunakan pendekatan ini.

Memandang ke hadapan, saya akan mengatakan bahawa sejak penghantaran pengeluaran pertama, iaitu pada pertengahan Jun, tidak ada masalah yang berkaitan dengan organisasi kluster ini (tetapi ini tidak bermakna organisasi sedemikian boleh diterima dalam apa jua cara dalam mana-mana organisasi sederhana besar. projek, yang tertakluk kepada keperluan toleransi kesalahan).

Timbunan Docker

Dalam mod swarm, dia bertanggungjawab untuk menggunakan tindanan (set perkhidmatan buruh pelabuhan) timbunan buruh pelabuhan

Ia menyokong konfigurasi docker-compose, membolehkan anda menggunakan pilihan penggunaan tambahan.  

Sebagai contoh, menggunakan parameter ini, sumber untuk setiap contoh perkhidmatan mikro penilaian adalah terhad (kami memperuntukkan teras N untuk kejadian N, dalam perkhidmatan mikro itu sendiri kami mengehadkan bilangan teras yang digunakan oleh PyTorch kepada satu)

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

Adalah penting untuk ambil perhatian bahawa Redis, RabbitMQ dan Graylog adalah perkhidmatan stateful dan ia tidak boleh diskalakan semudah "attrai-estimator"

Membayangkan soalan - mengapa tidak Kubernetes?

Nampaknya menggunakan Kubernetes dalam projek bersaiz kecil dan sederhana adalah overhead; semua fungsi yang diperlukan boleh diperolehi daripada Docker Swarm, yang agak mesra pengguna untuk pengatur kontena dan juga mempunyai halangan yang rendah untuk masuk.

Infrastruktur

Semua ini telah digunakan pada VDS dengan ciri-ciri berikut:

  • CPU: 4 teras Intel® Xeon® Gold 5120 CPU @ 2.20GHz
  • RAM: 8 GB
  • SSD: 160GB

Selepas ujian beban tempatan, nampaknya dengan kemasukan pengguna yang serius, mesin ini sudah memadai.

Tetapi, sejurus selepas penggunaan, saya menyiarkan pautan ke salah satu papan imej paling popular dalam CIS (yup, yang sama), selepas itu orang ramai berminat dan dalam beberapa jam perkhidmatan itu berjaya memproses puluhan ribu imej. Pada masa yang sama, pada saat-saat puncak, sumber CPU dan RAM tidak separuh digunakan.

Gambaran keseluruhan seni bina perkhidmatan untuk penilaian penampilan berdasarkan rangkaian saraf
Gambaran keseluruhan seni bina perkhidmatan untuk penilaian penampilan berdasarkan rangkaian saraf

Beberapa lagi grafik

Bilangan pengguna unik dan permintaan penilaian sejak penggunaan, bergantung pada hari tersebut

Gambaran keseluruhan seni bina perkhidmatan untuk penilaian penampilan berdasarkan rangkaian saraf

Pengagihan masa inferens saluran paip penilaian

Gambaran keseluruhan seni bina perkhidmatan untuk penilaian penampilan berdasarkan rangkaian saraf

Penemuan

Untuk meringkaskan, saya boleh mengatakan bahawa seni bina dan pendekatan kepada orkestrasi kontena mewajarkan sepenuhnya - walaupun pada saat-saat puncak tiada kejatuhan atau kendur dalam masa pemprosesan. 

Saya berpendapat bahawa projek kecil dan sederhana yang menggunakan inferens masa nyata rangkaian saraf pada CPU dalam prosesnya boleh berjaya menerima pakai amalan yang diterangkan dalam artikel ini.

Saya akan menambah bahawa pada mulanya artikel itu lebih panjang, tetapi untuk tidak menyiarkan bacaan panjang, saya memutuskan untuk meninggalkan beberapa perkara dalam artikel ini - kami akan kembali kepada mereka dalam penerbitan akan datang.

Anda boleh mencucuk bot di Telegram - @AttraiBot, ia akan berfungsi sekurang-kurangnya sehingga penghujung musim luruh 2020. Biar saya ingatkan anda bahawa tiada data pengguna disimpan - sama ada imej asal, mahupun keputusan saluran penilaian - semuanya dirobohkan selepas diproses.

Sumber: www.habr.com

Tambah komen