Sajikan semuanya

Belum lama berselang, di galaksi yang agak jauh, di satu planet provinsi ada keturunan monyet yang terkenal yang sangat malas sehingga mereka memutuskan untuk menciptakan kecerdasan buatan. "Yah, apa?" Mereka berpikir. Adalah baik untuk memiliki "otak" penasihat yang akan berpikir untuk Anda ketika diperlukan, masalah Anda dapat dengan cepat diselesaikan, dan itu bahkan lebih baik daripada yang dapat dilakukan makhluk hidup ... Dan, tanpa memikirkan konsekuensinya, mereka memulai monyet mereka Membalikkan otak dan proses kognitif pada blok bangunan dibongkar. Mereka berpikir, berpikir dan berpikir, Anda tidak akan percaya itu - model neuron, algoritma pembelajaran matematika, dan kemudian jaringan saraf dengan topologi yang berbeda ditarik. Tentu saja, ini tidak berhasil untuk mengatakan dengan baik. Ada banyak kekurangan, dibandingkan dengan kecerdasan alami, tetapi sejumlah masalah tertentu, model ini memungkinkan kami untuk menyelesaikan dengan akurasi yang masuk akal. Dan perlahan-lahan, keterampilan digital dan serial mulai muncul dalam bentuk model jaringan saraf. Hari ini, para pecinta terkasih sejarah alam semesta, kita akan menyentuh pada organisasi dan implementasi berbagai keterampilan kecerdasan buatan.


Tentang penciptaan dan pelatihan model jaringan saraf (keterampilan) tentang Habré banyak ditulis, oleh karena itu kita tidak akan membicarakannya hari ini. Setelah melatih atau menerima keterampilan AI berserial, kami berharap untuk menggunakannya dalam sistem informasi target kami, dan di sini muncul masalah. Apa yang berfungsi di laboratorium tidak dapat ditransfer ke produksi dalam bentuk aslinya, perlu menerapkan seluruh tumpukan teknologi yang terkait dan bahkan membuat modifikasi signifikan pada platform target (tentu saja ada pengecualian dalam bentuk CoreML, tetapi ini adalah kasus khusus dan hanya untuk peralatan Apple). Selain itu, ada banyak sekali alat untuk pengembangan dan serialisasi model, apakah benar-benar perlu bagi semua orang untuk mengembangkan solusi integrasi terpisah? Selain itu, bahkan di laboratorium, seringkali perlu untuk mendapatkan kesimpulan cepat dari model, tanpa menunggu pemuatan seluruh tumpukan pengembangan yang terkait.
Sebagai saran untuk menyelesaikan masalah ini, saya ingin memberi tahu Anda tentang alat opensource yang relatif baru, yang, mungkin, akan berguna bagi Anda ketika mengembangkan proyek yang terkait dengan AI.

0Mind (baca ZeroMind) adalah server keterampilan gratis. Solusinya adalah server aplikasi modular, universal, mudah diperluas dengan elemen kerangka kerja untuk melayani model pembelajaran mesin heterogen (sangat mudah diakses). Server jelek di Python 3 dan menggunakan Tornado untuk pemrosesan permintaan asinkron. Terlepas dari kerangka pembelajaran mesin mana yang digunakan untuk menyiapkan dan membuat serial model, 0Mind membuatnya mudah untuk menggunakan keterampilan atau kelompok keterampilan menggunakan API REST universal. Faktanya, solusinya adalah server web yang tidak sinkron dengan API REST, disatukan untuk bekerja dengan model keterampilan AI, dan seperangkat adaptor untuk berbagai kerangka kerja pembelajaran mesin. Anda mungkin telah bekerja dengan tensorflow serve - ini adalah solusi yang serupa, tetapi 0Mind tidak ditumpuk dan dapat melayani beberapa model kerangka kerja yang berbeda pada port yang sama. Jadi, alih-alih memperkenalkan seluruh tumpukan teknologi untuk mendapatkan model AI dalam sistem informasi target, Anda dapat menggunakan REST API yang sederhana dan familier untuk keterampilan yang menarik, di samping itu, model yang disiapkan tetap berada di server dan tidak berakhir dalam distribusi perangkat lunak. Agar tidak membingungkan lagi dengan istilah yang rumit, mari beralih ke contoh penggunaan dan mulai menggunakan mantra konsol.

Instalasi


Semuanya sederhana di sini:

git clone git@github.com:MisteryX/0Mind.git 0Mind 

Sekarang kita memiliki contoh server yang berfungsi. Instal dependensi:

 cd 0Mind pip3 install -r requirements.txt 

Atau jika Anda menggunakan Conda:

 conda install --yes --file requirements.txt 

Peringatan penting adalah bahwa server mendukung beberapa kerangka pembelajaran mesin, dan agar tidak menambahkan semuanya tergantung padanya dan tidak menginstalnya, Anda sendiri yang memutuskan kerangka kerja kerangka mana yang akan Anda muat di host dengan instance 0Mind, instal dan konfigurasikan alat-alat ini secara mandiri.

Kustomisasi


Titik masuk atau server utama yang dapat dieksekusi adalah model_pool.py .
Opsi startup yang mungkin adalah -c atau --config_file dengan path ke file konfigurasi. Secara default, 0Mind menggunakan file configs / model_pool_config.json sebagai file konfigurasi. Server juga menggunakan file config / logger.json untuk mengontrol pencatatan standar modul pencatatan Python.

Untuk menunjukkan kemampuannya, kita dapat membiarkan file konfigurasi default tetap utuh. Baca lebih lanjut tentang konfigurasi dalam dokumentasi resmi .

Pengaturan server utama adalah: id, host, port, tugas.

id - (nomor) pengidentifikasi unik dari kumpulan model (digunakan untuk menyeimbangkan dan menangani dalam jaringan kumpulan yang didistribusikan)
host - (string) alamat jaringan atau nama domain dari host ini
port - (nomor) di port mana Anda ingin meng-host layanan 0Mind (harus gratis di host ini)
tugas - (daftar objek) daftar tugas yang dimuat dengan layanan (mungkin kosong). Dalam konfigurasi default, model demo CNN_MNIST yang disiapkan oleh Keras dimuat, dan kami akan menggunakannya untuk menunjukkan kemampuan.

Parameter konfigurasi tambahan (opsional):

model_types - (daftar string) Anda dapat membatasi jenis model yang dimuat ke kumpulan ini dengan menentukannya dalam daftar ini. Jika daftarnya kosong, maka tidak ada batasan.

debug - (tipe Boolean) bertanggung jawab untuk mengaktifkan atau menonaktifkan mode debug Tornado. Dalam mode debug, jika terjadi kesalahan, informasi kesalahan yang diperluas dikembalikan ke stdout, yang berguna ketika mengembangkan ekstensi.

Kemungkinan


Hal utama dalam 0Mind adalah daftar kerangka kerja yang didukung dan fitur REST API .

Permintaan ke REST API dapat dilakukan dengan menggunakan peramban atau utilitas http. Dalam panduan ini, dan juga dalam dokumentasi untuk server, kami akan menggunakan cURL sebagai alat paling sederhana dan terjangkau untuk sistem terbuka.

Saat ini, 0Mind API memiliki total 10 permintaan:

1. http: // $ HOST: $ PORT / info - informasi umum tentang instance 0Mind
2. http: // $ HOST: $ PORT / info / system - informasi sistem tentang host tempat 0Mind dijalankan
3. http: // $ HOST: $ PORT / info / task - informasi tentang tugas yang ditentukan
4. http: // $ HOST: $ PORT / info / tugas - daftar tugas misalnya 0Mind
5. http: // $ HOST: $ PORT / model / list - daftar pengidentifikasi model yang dimuat ke dalam kumpulan
6. http: // $ HOST: $ PORT / model / info - menampilkan informasi antarmuka tentang model
7. http: // $ HOST: $ PORT / model / load - mengunggah model baru ke kumpulan
8. http: // $ HOST: $ PORT / model / drop - membongkar model yang sebelumnya dimuat dari pool
9. http: // $ HOST: $ PORT / model / predict - meminta output dari model
10.http: // $ HOST: $ PORT / command / stop - menghentikan layanan 0Mind dan menghentikan prosesnya

Informasi


Anda dapat memulai contoh server, misalnya, seperti ini:

 python3 model_pool.py 

Misalnya, kami akan mendapatkan informasi umum tentang instance server yang berjalan:

 curl http://127.0.0.1:5885/info 

 {"service": "ModelPool", "id": 1, "options": {"debug": false}, "version": [1, 1, 4]} 

Oke, sekarang kita cari tahu model mana yang dimuat ke kolam:

 curl http://127.0.0.1:5885/model/list 

 {"id": 1, "check_sum": "4d8a15e3cc35750f016ce15a43937620", "models": ["1"]} 

Sekarang mari kita perjelas antarmuka model yang dimuat dengan pengenal "1":

 curl http://127.0.0.1:5885/model/info?id=1 

 {"inputs": {"0": {"name": "conv2d_1_input:0", "type": "float32", "shape": [null, 28, 28, 1]}}, "outputs": {"0": {"name": "dense_2/Softmax:0", "type": "float32", "shape": [null, 10]}}, "tool": "keras"} 

Masih mencari tahu dengan filter mana model dimuat. Untuk melakukan ini, kami mengklarifikasi detail tugas memuat model dengan pengenal "1":

 curl http://127.0.0.1:5885/info/task?id=1 

 {"id": "1", "model_file": "ML/models/mnist_cnn_model.keras", "model_type": "keras", "input_filters": {"conv2d_1_input:0": ["i_img_file_to_ns_arr.ImageFileToNormAndScaledNPArrayFilter"]}, "output_filters": {}} 

Seperti yang Anda lihat, model kami memiliki satu filter input - i_img_file_to_ns_arr.ImageFileToNormAndScaledNPArrayFilter dan filter input dengan nama - conv2d_1_input: 0. Filter ini hanya mengubah file gambar yang ditentukan menjadi tensor dan menskalanya sesuai dengan input model. Filter adalah alat umum 0Mind yang hebat. Karena preprocessing dan postprocessing data untuk model adalah sama, Anda dapat mengakumulasikan filter ini untuk penggunaan cepat dalam pekerjaan lebih lanjut dengan model lain, menunjukkan tugas yang diinginkan sebagai atribut untuk memuat model.

Output data dari model (inferensi)


Nah, sekarang kita memiliki semua informasi yang diperlukan untuk inferensi, kita bisa mendapatkan kesimpulan dari model. Sebagai input, kami menggunakan gambar dari test suite yang termasuk dalam distribusi 0Mind samples / image5.png :



 curl -d '{"conv2d_1_input:0": [{"image_file": "samples/image5.png"}]}' -H "Content-Type:application/json" -X POST http://127.0.0.1:5885/model/predict?id=1 

Untuk satu-satunya input model “conv2d_1_input: 0” dengan filter “i_img_file_to_ns_arr.ImageFileToNormAndScaledNPArrayFilter” kami mengirim data dalam format yang diterima oleh filter - [{“image_file”: “samples / image5.png”}]. Sebagai tanggapan dari 0Mind, kami mendapatkan output model:

 {"result": {"dense_2/Softmax:0": [[2.190017217283827e-21, 1.6761866200587505e-11, 2.2447325167271673e-14, 0.00011080023978138342, 1.881280855367115e-17, 0.9998891353607178, 1.6690393796396863e-16, 9.67975005705668e-12, 1.1265206161566871e-13, 2.086113400079359e-13]]}, "model_time": 0.002135753631591797} 

Jadi, satu-satunya output dari model "dense_2 / Softmax: 0" (lihat informasi model di atas) memberi kami vektor kepercayaan model dalam klasifikasi gambar ini. Seperti yang Anda lihat, probabilitas tertinggi adalah 0,99 untuk kelas dengan indeks 6 (kelas adalah angka 0-9), yang sesuai dengan nomor 5 . Dengan demikian, model berhasil diatasi dengan pengakuan naskah dan memberikan kesimpulan dengan keyakinan tinggi. Waktu inferensi model pada host 0Mind adalah 0,002135753631591797 detik, karena outputnya menggunakan CPU x86 biasa.

Pemuatan dan pembongkaran model yang dinamis


Sekarang bongkar model kami dari kolam:

 curl http://127.0.0.1:5885/model/drop?id=1 

 {"result": true, "unload_time": 0.000152587890625, "memory_released": 0, "model_id": "1"} 

Kami memuat model yang sama lagi, tetapi sekarang dengan pengidentifikasi yang berbeda ("baru") dan filter output dari model io_argmax.ArgMaxFilter, yang kemungkinan besar akan menurunkan indeks dari vektor kepercayaan model. Kami harus mengubah indeks input dan output model - ini disebabkan oleh fitur Keras:

 curl -d '{"id": "new", "output_filters": {"dense_2_1/Softmax:0": ["io_argmax.ArgMaxFilter"]}, "model_file": "ML/models/mnist_cnn_model.keras", "input_filters": {"conv2d_1_input_1:0": ["i_img_file_to_ns_arr.ImageFileToNormAndScaledNPArrayFilter"]}, "model_type": "keras"}' -H "Content-Type:application/json" -X POST http://127.0.0.1:5885/model/load 

 {"result": true, "load_time": 0.45618462562561035, "memory_consumed": 16183296, "model_id": "new"} 

Dan sekarang kami meminta model untuk mengenali kami dua gambar sekaligus dalam satu permintaan sampel / image5.png dan sampel / image1.png :


 curl -d '{"conv2d_1_input:0": [{"image_file": "samples/image5.png"}, {"image_file": "samples/image1.png"}]}' -H "Content-Type:application/json" -X POST http://127.0.0.1:5885/model/predict?id=new 

 {"result": {"dense_2_1/Softmax:0": [5, 1]}, "model_time": 0.003907206535339355} 

Model demo tidak salah lagi.

Ekstensi


Memperluas kemampuan 0Mind tidak sulit, berkat arsitektur modularnya, penggunaan alat-alat populer dan konvensi kode yang baik dalam proyek tersebut. Vektor ekstensi utama dapat:

  1. Adaptor adalah kelas interlayer untuk bekerja dengan pembelajaran mesin baru dan kerangka kerja jaringan saraf.
  2. Filter adalah penangan data untuk memasuki dan meninggalkan model keterampilan.
  3. Penangan permintaan - memungkinkan Anda untuk menambahkan fungsionalitas baru ke permintaan dan respons API 0Mind.

Source: https://habr.com/ru/post/id440908/


All Articles