AI pada setrika domestik
Kami berbicara tentang bagaimana kami mem-porting kerangka kerja kami untuk jaringan saraf dan menghadapi sistem pengenalan ke prosesor Rusia Elbrus.

Itu adalah tugas yang menarik, pada musim semi 2019 kami membicarakannya di kantor Yandex pada pertemuan besar tentang Elbrus, sekarang kami berbagi dengan Habr.
Secara singkat - apa itu Elbrus
Ini adalah prosesor Rusia dengan arsitekturnya sendiri, yang dikembangkan di
MCST . Maxim Gorshenin berbicara tentang dia dengan baik di salurannya:
www.youtube.com/watch?v=H8eBgJ58EPYSecara singkat - apa itu PuzzleLib
Ini adalah platform kami untuk jaringan saraf, yang telah kami kembangkan dan gunakan sejak 2015. Analogi Google TensorFlow dan Facebook PyTorch. Menariknya, PuzzleLib mendukung tidak hanya prosesor NVIDIA dan Intel, tetapi juga kartu video AMD.
Meskipun kami memiliki perpustakaan kecil (TensorFlow memiliki sekitar 2 juta baris, kami memiliki 100 ribu), kami lebih baik dalam kecepatan - sedikit, tetapi lebih baik =)
Kami belum dalam open source, perpustakaan digunakan untuk proyek kami. Perpustakaan lengkap: mendukung tahap pelatihan dan tahap inferensi jaringan saraf. Anda dapat membangun berulang, jaringan saraf convolutional, ada juga antarmuka untuk membuat grafik perhitungan sewenang-wenang.
PuzzleLib punya
- Modul untuk merakit jaringan saraf (Aktivasi (Sigmoid, Tanh, ReLU, ELU, LeakyReLU, SoftMaxPlus), AvgPool (1D, 2D, 3D), BatchNorm (1D, 2D, 3D, ND), Conv (1D, 2D, 3D, ND) , CrossMapLRN, Deconv (1D, 2D, 3D, ND), Putus Sekolah (1D, 2D), dll.)
- Pengoptimal (AdaDelta, AdaGrad, Adam, Hooks, LBFGS, MomentumSGD, NesterovSGD, RMSProp, dll.)
- Jaringan saraf siap pakai (Resnet, Inception, YOLO, U-Net, dll.)
Ini adalah yang akrab, akrab bagi semua yang terlibat dalam jaringan saraf, blok untuk desainer jaringan saraf (karena kerangka kerja apa pun adalah konstruktor yang terdiri dari blok dan algoritma komputasi khas).
Kami punya ide untuk meluncurkan perpustakaan kami pada arsitektur Elbrus.
Mengapa kami ingin mendukung Elbrus?
- Ini adalah satu-satunya prosesor Rusia, saya ingin memahami bagaimana hal itu terjadi, betapa mudahnya untuk bekerja dengannya.
- Kami berpikir bahwa mungkin menarik bagi organisasi negara bahwa perangkat lunak Rusia yang kami kembangkan bekerja pada perangkat keras Rusia.
- Dan tentu saja, kami hanya tertarik, karena Elbrus adalah prosesor VLIW , yaitu, prosesor dengan instruksi panjang, dan tidak ada prosesor tujuan umum yang lengkap di dunia.
Semuanya berawal dari fakta bahwa kami bertemu dengan MCST, berbicara, dan meminjamkan komputer
Elbrus 401 untuk pengembangan.
Apa yang saya sukai : Linux berjalan di Elbrus, ada python di Linux ini, dan itu tidak berfungsi dalam mode emulasi - ini adalah python asli yang dibuat untuk Elbrus. Ada juga bundel pustaka python standar, misalnya numpy, yang sangat disukai semua pengembang.
Ada beberapa tugas yang harus kami kumpulkan secara tambahan: misalnya, di PuzzleLib kami menggunakan format hdf untuk menyimpan bobot jaringan saraf, dan, oleh karena itu, kami harus membangun perpustakaan libhdf dan h5py menggunakan kompiler lcc. Tapi kami tidak punya masalah perakitan.
Pustaka visi komputer OpenCV juga sudah dikompilasi, tetapi tidak ada ikatan untuk python - kami membangunnya secara terpisah.
Perpustakaan dlib yang terkenal juga cukup mudah untuk dikompilasi. Hanya ada sedikit kesulitan: beberapa file proyek open source ini tidak memiliki penanda-bom untuk menentukan utf-8, yang mengacaukan lcc lexer. Sebenarnya, hanya ada format file yang salah, yang harus diperbaiki di sumbernya.
Kami memutuskan untuk mulai mengenali wajah terlebih dahulu. Ini adalah kasus penggunaan yang dapat dimengerti bagi banyak orang, di mana teknologi ini digunakan. PuzzleLib, seperti perpustakaan lain, memiliki bagian backend yang agak besar, yaitu basis kode khusus untuk arsitektur prosesor yang berbeda.
Backends kami:- CUDA (NVIDIA)
- Buka CL + MI Terbuka (AMD)
- mlkDNN (Intel)
- CPU (numpy)
Di Elbrus, kami meluncurkan backend numpy, yang sangat sederhana, karena platform membutuhkan minimal segalanya:
Platform -> kompiler c90 -> python -> numpyKami memiliki perpustakaan tanpa faktor-faktor yang menyulitkan (misalnya, tanpa sistem perakitan khusus) - selain fakta bahwa kami perlu mengumpulkan binder tertentu. Kami menjalankan tes, semuanya berfungsi - baik grid konvolusional maupun berulang. Pengenalan wajah yang kami luncurkan cukup sederhana, berdasarkan Inception-ResNet.
Hasil pekerjaan pertamaPada Intel Core i7 7700, waktu pemrosesan untuk satu gambar adalah 0,1 detik, dan di sini - 15. Itu perlu untuk mengoptimalkan.
Tentu saja, berharap numpy akan bekerja dengan baik dengan cepat akan salah.
Bagaimana kami mengoptimalkan komputasi
Kami mengukur kecepatan inferensi melalui python profiler dan menemukan bahwa hampir sepanjang waktu dihabiskan mengalikan matriks dalam numpy. Untuk sampel, mereka menulis perkalian yang paling sederhana, manual dari matriks, dan itu ternyata lebih cepat, meskipun tidak jelas mengapa.
Tampaknya numpy.dot seharusnya ditulis sedikit lebih naif daripada perkalian sederhana seperti itu. Namun demikian, kami yakin, memeriksa - ternyata lebih cepat (12 detik per frame, bukan 15).
Selanjutnya, kami belajar tentang perpustakaan aljabar linier EML, yang sedang dikembangkan di ICST, dan mengganti panggilan np.dot dengan cblas_sgemm. Itu menjadi 10 kali lebih cepat (1,5 detik) - kami sangat senang.
Ini diikuti oleh beberapa optimasi langkah demi langkah. Karena kami hanya menjalankan pengenalan wajah, dan biasanya bukan data yang arbitrer, kami memutuskan untuk mempertajam operasi kami hanya di bawah tensor 4d dan membuat Fusion - setelah itu waktu pemrosesan menurun 2 kali - menjadi 0,75 detik.
Penjelasan: Fusion adalah ketika beberapa operasi digabungkan menjadi satu, misalnya konvolusi, normalisasi dan aktivasi. Alih-alih membuat operan dalam tiga siklus, satu operan dilakukan.
Perpustakaan semacam itu tersedia dari NVIDIA (
TensorRT ). Grafik komputasi dimasukkan ke dalamnya, dan perpustakaan menghasilkan grafik yang dioptimalkan dan dipercepat, khususnya karena fakta bahwa ia dapat menciutkan operasi menjadi satu. Intel juga memiliki yang serupa (nGraph dan
OpenVINO ).
Kemudian kami melihat bahwa karena ada banyak konvolusi 1x1 di Inception-ResNet, kami memiliki penyalinan data tambahan. Kami memutuskan untuk berspesialisasi dalam fakta bahwa kami mengerjakan batch dari 1 foto (yaitu, jangan memproses 100 foto dalam batch, tetapi menyediakan mode streaming) - ada kasus penggunaan seperti itu ketika Anda perlu bekerja bukan dengan arsip, tetapi dengan streaming (misalnya, untuk pengawasan video atau ACS). Kami membuat bagian khusus tanpa
im2col (dihapus salinan besar) - itu menjadi 0,45 detik.
Kemudian kami melihat lagi pada profiler, kami memiliki segalanya dengan cara yang sama - meskipun semua tahapan menyusut dalam waktu, kami masih 80% dari waktu yang dihabiskan untuk perhitungan blok inferensi konvolusional.
Kami menyadari bahwa kami perlu memparalelkan
gemm (penggandaan matriks umum). Permata itu, yang dalam EML, ternyata berulir tunggal. Oleh karena itu, kami harus menulis permata multi-utas sendiri. Idenya adalah ini: sebuah matriks besar dibagi menjadi subblok, dan kemudian ada perkalian dari matriks-matriks kecil ini. Kami menulis permata dengan OpenMP, tetapi tidak berhasil, kesalahan terhenti. Kami mengambil kumpulan benang secara manual, paralelisasi memberi 0,33 detik per frame.
Selanjutnya, kami diberi akses jarak jauh ke server yang lebih kuat dengan
Elbrus 8C , di mana kecepatan meningkat menjadi 0,2 detik per frame.
Video berikut ini menunjukkan karya demo stand dengan pengenalan wajah pada komputer Elbrus 401-PC dengan prosesor Elbrus 4C:
Kesimpulan dan Rencana Masa Depan
- Ini berfungsi tidak hanya menghadapi pengenalan, tetapi pada prinsipnya kerangka kerja jaringan saraf, sehingga kami dapat mengumpulkan detektor, pengklasifikasi dan menjalankannya pada Elbrus.
- Kami telah membuat demo stand dengan Web-UI untuk menunjukkan pengenalan wajah di PuzzleLib.
- Pengenalan wajah pada Elbrus sudah cukup cepat untuk tugas-tugas praktis, maka Anda dapat mempercepatnya jika perlu.
- Anda bisa bekerja dengan Elbrus. Kami dulu bekerja dengan prosesor eksotis - misalnya, dengan prosesor Rusia tensor yang masih dikembangkan, dengan kartu video AMD dan perangkat lunak mereka. Semuanya tidak begitu bagus dan sederhana di sana. Yaitu, jika kita mengambil MI Open library dari AMD, ini adalah perpustakaan yang ditulis dengan sangat buruk di mana tidak semua kombinasi langkah, bantalan, dan ukuran filter mengarah pada perhitungan yang berhasil. Kualitas alat dari Elbrus bagus - jika Anda memiliki proyek dengan Python, C atau C ++, menjalankannya pada Elbrus tidak sulit sama sekali.
- Perlu juga dicatat bahwa pengerjaan optimasi langkah demi langkah yang kita bicarakan bukanlah operasi khusus untuk bekerja di Elbrus. Ini adalah operasi prosesor multi-core standar. Menurut pendapat kami, ini adalah pertanda baik bahwa prosesor dapat dioperasikan seperti halnya prosesor reguler dari Intel / NVIDIA.
Paket:
- Karena Elbrus memiliki kekhasan dalam hal itu adalah prosesor VLIW, dimungkinkan untuk membuat beberapa optimasi khusus untuk Elbrus.
- Lakukan kuantisasi (bekerja dengan int8 alih-alih float32), yang menghemat memori dan meningkatkan kecepatan. Dengan demikian, dalam hal ini, tentu saja, mungkin ada penurunan dalam kualitas perhitungan - tetapi ini mungkin tidak. Kami telah memperhatikan kedua kasus dalam praktiknya.
Kami berencana untuk lebih memahami, mengeksplorasi kemampuan prosesor VLIW. Faktanya, untuk saat ini, kami cukup mempercayai kompiler karena jika kami menulis kode yang baik, kompiler mengoptimalkannya dengan baik, karena ia mengetahui fitur-fitur Elbrus.
Secara umum, itu menarik, kita akan mengerti lebih jauh. Ini tidak memakan banyak waktu - semua operasi pelabuhan membutuhkan waktu seminggu.
Pada Januari 2020 kami berencana untuk menempatkan PuzzleLib di sumber terbuka, kami akan menulis lebih banyak tentang ini di sini =)
Terima kasih atas perhatian anda!