Téhnik Jedi pikeun ngurangan jaringan convolutional - pruning
Sateuacan anjeun deui tugas ngadeteksi objék. Prioritasna nyaéta laju operasi kalayan akurasi anu tiasa ditampi. Anjeun nyandak arsitektur YOLOv3 sarta salajengna ngalatih eta. Akurasi (mAp75) langkung ageung tibatan 0.95. Tapi laju ngajalankeun masih low. Crap.
Dinten ieu kami bakal ngalangkungan kuantisasi. Jeung handapeun cut urang bakal kasampak Model Pruning - motong bagian kaleuleuwihan jaringan pikeun nyepetkeun Inferensi tanpa leungitna akurasi. Ieu jelas dimana, sabaraha jeung kumaha motong. Hayu urang terang kumaha ngalakukeun ieu sacara manual sareng dimana anjeun tiasa ngajadikeun otomatis. Dina tungtungna aya Repository on keras.
perkenalan
Di tempat kuring saméméhna gawé, Macroscop di Perm, abdi kaala hiji kabiasaan - mun salawasna ngawas waktu palaksanaan algoritma. Sarta salawasna pariksa runtime jaringan ngaliwatan hiji filter kacukupan. Biasana kaayaan-of-nu-seni dina produksi teu lulus filter ieu, nu ngarah kuring ka Pruning.
Pruning mangrupikeun topik kuno anu dibahas dina Kuliah Stanford dina 2017. Gagasan utama nyaéta ngirangan ukuran jaringan anu dilatih tanpa kaleungitan akurasi ku cara ngaleungitkeun sababaraha titik. Ieu disada tiis, tapi kuring jarang ngadangu ngeunaan pamakéan na. Panginten, teu cekap palaksanaan, teu aya tulisan basa Rusia, atanapi ngan saukur sadayana nganggap éta pruning terang-kumaha sareng tetep jempé.
Tapi hayu urang pisahkeun
A glimpse kana biologi
Abdi resep nalika Deep Learning ningali ideu anu asalna tina biologi. Aranjeunna, sapertos évolusi, tiasa dipercaya (naha anjeun terang yén ReLU mirip pisan sareng fungsi aktivasina neuron dina uteuk?)
Prosés Pruning Modél ogé deukeut jeung biologi. Réspon jaringan di dieu tiasa dibandingkeun sareng plastisitas otak. Aya sababaraha conto anu pikaresepeun dina buku. Norman Doidge:
Otak awéwé anu dilahirkeun ngan ukur hiji satengah parantos diprogram deui pikeun ngalaksanakeun fungsi satengah anu leungit.
Lalaki éta nembak bagian otakna anu tanggung jawab pikeun visi. Kana waktu, bagian séjén otak nyandak alih fungsi ieu. (Kami henteu nyobian ngulang)
Kitu ogé, anjeun tiasa motong kaluar sababaraha convolutions lemah tina model Anjeun. Salaku jalan terakhir, kebat sésana bakal ngabantosan ngagentos anu dipotong.
Naha anjeun resep Transfer Learning atanapi anjeun diajar ti mimiti?
Pilihan nomer hiji. Anjeun nganggo Transfer Learning dina Yolov3. Rétina, Topeng-RCNN atanapi U-Net. Tapi lolobana waktu urang teu kudu ngakuan 80 kelas objék kawas di COCO. Dina prakna mah, sadayana dugi ka kelas 1-2. Urang tiasa nganggap yén arsitéktur pikeun 80 kelas kaleuleuwihan di dieu. Ieu nunjukkeun yén arsitéktur kedah dilakukeun langkung alit. Sumawona, kuring hoyong ngalakukeun ieu tanpa kaleungitan beurat anu tos dilatih.
Pilihan nomer dua. Panginten anjeun gaduh seueur data sareng sumber komputasi, atanapi ngan ukur peryogi arsitéktur super-custom. Henteu masalah. Tapi anjeun diajar jaringan ti scratch. Prosedur anu biasa nyaéta ningali struktur data, pilih arsitéktur anu kaleuleuwihan dina kakuatan, sareng nyorong dropout tina latihan deui. Kuring nempo 0.6 dropouts, Karl.
Dina duanana kasus, jaringan bisa ngurangan. Dimotivasi. Ayeuna hayu urang terang naon jinis pruning sunat
Algoritma umum
Urang mutuskeun yén urang bisa nyabut bundles. Sigana cukup basajan:
Nyoplokkeun konvolusi naon waé nyaéta stres pikeun jaringan, anu biasana nyababkeun sababaraha paningkatan kasalahan. Di hiji sisi, kanaékan kasalahan ieu mangrupikeun indikator kumaha leres urang ngaleungitkeun konvolusi (contona, paningkatan anu ageung nunjukkeun yén urang ngalakukeun anu salah). Tapi kanaékan leutik cukup ditarima sarta mindeng ngaleungitkeun ku lampu saterusna latihan tambahan kalayan LR leutik. Tambahkeun léngkah latihan tambahan:
Ayeuna urang kedah terang iraha urang badé ngeureunkeun Pembelajaran<->Pruning loop. Meureun aya pilihan aheng dieu lamun urang kudu ngurangan jaringan kana ukuran jeung speed nu tangtu (contona, pikeun alat nu bagerak). Nanging, pilihan anu paling umum nyaéta neraskeun siklus dugi kasalahanna langkung luhur tibatan anu ditampi. Tambahkeun kaayaan:
Janten, algoritma janten jelas. Tetep terang kumaha carana nangtukeun konvolusi anu dihapus.
Milarian buntelan anu dihapus
Urang kudu miceun sababaraha convolutions. Rushing payun na "shooting" saha mangrupakeun ide goréng, sanajan bakal jalan. Tapi saprak anjeun boga sirah, Anjeun bisa mikir jeung nyoba milih convolutions "lemah" pikeun nyoplokkeun. Aya sababaraha pilihan:
Tiap pilihan boga hak hirup jeung fitur palaksanaan sorangan. Di dieu urang tempo pilihan jeung pangleutikna L1-ukuran
Prosés manual pikeun YOLOv3
Arsitéktur aslina ngandung blok residual. Tapi euweuh urusan kumaha tiis aranjeunna keur jaringan jero, aranjeunna bakal ngahalangan urang rada. Kasusahna nyaéta anjeun teu tiasa ngahapus rekonsiliasi sareng indéks anu béda dina lapisan ieu:
Ku alatan éta, hayu urang milih lapisan ti mana urang bisa bebas ngahapus reconciliations:
Ayeuna hayu urang ngawangun siklus gawé:
Ngunggah aktivasina
Figuring kaluar sabaraha motong
Keureut
Diajar 10 epochs kalawan LR=1e-4
Nguji
Unloading convolutions mangpaat keur estimasi sabaraha bagian urang bisa dipiceun dina hambalan nu tangtu. Conto ngabongkar muatan:
Urang nempo yén ampir unggal madhab 5% convolutions boga L1-norma pisan low sarta kami bisa nyabut aranjeunna. Dina unggal hambalan, unloading ieu terus-terusan sarta hiji assessment dijieun tina lapisan mana jeung sabaraha bisa motong kaluar.
Sakabeh prosés réngsé dina 4 léngkah (angka di dieu sareng di mana waé pikeun RTX 2060 Super):
lengkah
mAp75
Jumlah parameter, juta
Ukuran jaringan, mb
Ti mimiti,%
Waktos ngajalankeun, ms
Kaayaan sunatan
0
0.9656
60
241
100
180
-
1
0.9622
55
218
91
175
5% sadaya
2
0.9625
50
197
83
168
5% sadaya
3
0.9633
39
155
64
155
15% pikeun lapisan kalawan 400+ convolutions
4
0.9555
31
124
51
146
10% pikeun lapisan kalawan 100+ convolutions
Hiji pangaruh positif ditambahkeun kana hambalan 2 - ukuran bets 4 pas kana mémori, nu greatly gancangan prosés latihan tambahan.
Dina hambalan 4, prosésna dieureunkeun sabab malah latihan tambahan jangka panjang teu ngangkat mAp75 kana nilai heubeul.
Hasilna, urang junun nyepetkeun inferensi ku 15%, ngurangan ukuranana ku 35% jeung teu leungit kahayang.
Automation pikeun arsitéktur basajan
Pikeun arsitéktur jaringan basajan (tanpa tambahan kondisional, concaternate jeung blok residual), éta rada mungkin fokus kana ngolah sagala lapisan convolutional tur ngajadikeun otomatis prosés motong kaluar convolutions.
Kuring dilaksanakeun pilihan ieu di dieu.
Éta saderhana: anjeun ngan ukur peryogi fungsi leungitna, pangoptimal sareng generator bets:
import pruning
from keras.optimizers import Adam
from keras.utils import Sequence
train_batch_generator = BatchGenerator...
score_batch_generator = BatchGenerator...
opt = Adam(lr=1e-4)
pruner = pruning.Pruner("config.json", "categorical_crossentropy", opt)
pruner.prune(train_batch, valid_batch)
{
"input_model_path": "model.h5",
"output_model_path": "model_pruned.h5",
"finetuning_epochs": 10, # the number of epochs for train between pruning steps
"stop_loss": 0.1, # loss for stopping process
"pruning_percent_step": 0.05, # part of convs for delete on every pruning step
"pruning_standart_deviation_part": 0.2 # shift for limit pruning part
}
Salaku tambahan, watesan dumasar kana simpangan baku dilaksanakeun. Tujuanana nyaéta pikeun ngawatesan bagian anu dipiceun, henteu kalebet konvolusi kalayan ukuran L1 anu parantos "cukup":
Ku kituna, kami ngidinan Anjeun pikeun miceun ngan convolutions lemah tina sebaran sarupa jeung katuhu jeung teu mangaruhan panyabutan tina sebaran sarupa jeung kénca:
Nalika sebaran ngadeukeutan normal, koefisien pruning_standart_deviation_part bisa dipilih tina:
Abdi nyarankeun asumsi 2 sigma. Atawa anjeun bisa malire fitur ieu, ninggalkeun nilai <1.0.
Kaluaran nyaéta grafik ukuran jaringan, leungitna, sareng waktos jalanna jaringan pikeun sakabéh tés, dinormalisasi kana 1.0. Contona, di dieu ukuran jaringan diréduksi ampir 2 kali tanpa kaleungitan kualitas (jaringan convolutional leutik kalayan beurat 100k):
Laju ngajalankeun tunduk kana fluctuations normal sarta tetep ampir unchanged. Aya katerangan pikeun ieu:
Jumlah convolutions robah tina merenah (32, 64, 128) mun teu paling merenah pikeun kartu vidéo - 27, 51, jsb. Kuring bisa jadi salah di dieu, tapi paling dipikaresep eta boga pangaruh.
Arsitéktur henteu lega, tapi konsisten. Ku ngurangan lebar, urang teu mangaruhan jero. Ku kituna, urang ngurangan beban, tapi teu ngarobah laju.
Ku alatan éta, perbaikan dinyatakeun dina pangurangan beban CUDA salami ngajalankeun ku 20-30%, tapi henteu dina réduksi dina waktos jalan.
hasil
Hayu urang ngeunteung. Kami nganggap 2 pilihan pikeun pruning - pikeun YOLOv3 (nalika anjeun kedah damel sareng panangan anjeun) sareng jaringan kalayan arsitéktur anu langkung saderhana. Ieu bisa ditempo yén dina dua kasus kasebut nyaéta dimungkinkeun pikeun ngahontal réduksi ukuran jaringan sarta speedup tanpa leungitna akurasi. Hasil:
Ngurangan ukuranana
Laju gancangan
Ngurangan Beban CUDA
Hasilna, ramah lingkungan (Urang ngaoptimalkeun pamakéan masa depan sumberdaya komputasi. Hiji tempat senang Greta Thunberg)
lampiran
Saatos léngkah pruning, anjeun tiasa nambihan kuantisasi (contona, nganggo TensorRT)