
Ees on taas objektide tuvastamise ĂŒlesanne. Peamine prioriteet on töö kiirus vastuvĂ”etava tĂ€psuse juures. Kasutad YOLOv3 arhitektuuri ja tĂ€iendad seda. TĂ€psus (mAp75) ĂŒle 0.95. Kuid töötlemise kiirus on endiselt madal. Kuradi.
TĂ€na jĂ€tame kvantiseerimise kĂ”rvale. Ja allpool vaatame Model Pruning â ĂŒleliigsete osade eemaldamine vĂ”rgu kiirendamiseks ilma tĂ€psuse kaotamiseta. Selgelt â kust, kui palju ja kuidas on vĂ”imalik lĂ”igata. Arutame, kuidas seda kĂ€sitsi teha ja kus saab automatiseerida. LĂ”pus â repository keras'e jaoks.
Sissejuhatus
Eelmisel töökohtadel, permis Macroscopis, omandasin ma ĂŒhe harjumuse â alati jĂ€lgida algoritmide tĂ€itmise aega. Ja vĂ”rgu töötlemise aega kontrollida alati adekvaatsuse filtri kaudu. Tavaliselt ei vasta state-of-the-art tootmises sellele filtrile, mis viis mind Pruning'uni.
Pruning â vana teema, millest rÀÀgiti 2017. aastal. Peamine idee â koolitatud vĂ”rgu suuruse vĂ€hendamine ilma tĂ€psuse kaotamiseta, eemaldades mitmesuguseid sĂ”lmi. KĂ”lab hĂ€sti, kuid ma harva kuulen selle rakendamisest. TĂ”enĂ€oliselt puuduvad rakendused, ei ole venekeelseid artikleid vĂ”i lihtsalt peetakse pruningât omaette teadmisteks ja vaikivad.
Aga lÀheme siis arutama
Vaade bioloogiale
Mulle meeldib, kui sĂŒgavale Ă”ppimisse toovad ideid bioloogiast. Neile, nagu ka evolutsioonile, vĂ”ib usaldada (kas teadsite, et ReLU on vĂ€ga sarnane ?)
Model Pruning protsess on samuti lÀhedane bioloogiale. VÔrgu reaktsiooni saab vÔrrelda aju plastilisusega. Raamatus on paar huvitavat nÀidet :
- Naise aju, kellel oli sĂŒndides vaid ĂŒks pool, programmeeris end ise ĂŒmber, et tĂ€ita puuduvat poole funktsioone
- Noormees tulistas endale osa ajust, mis vastutab nĂ€gemise eest. Aja jooksul vĂ”tsid teised ajupiirkonnad need funktsioonid enda kanda. (ei pĂŒĂŒa korrata)
Nii saab ka teie mudelist eemaldada osad nĂ”rgad konvolutsioonid. ĂĂ€rmisel juhul aitavad allesjÀÀnud konvolutsioonid asendada eemaldatud.
Kas armastad Transfer Learningut vÔi Ôpid algusest peale?
Variant number ĂŒks. Kasutad Transfer Learningut Yolov3-l. Retina, Mask-RCNN vĂ”i U-Net. Kuid sageli pole meil vaja tuvastada 80 klassi objekte, nagu COCO-s. Minu praktikas piirduvad asjad 1-2 klassiga. VĂ”ib eeldada, et 80 klassile mĂ”eldud arhitektuur on siin ĂŒleliigne. Tundub, et see tuleks vĂ€hendada. Ja oleks soovitav teha seda ilma olemasolevaid eelĂ”petatud kehiseid kaotamata.
Variant number kaks. VĂ”ib-olla on sul palju andmeid ja arvutusvĂ”imekust vĂ”i lihtsalt vaja ĂŒlireguleeritud arhitektuuri. Pole oluline. Kuid Ă”pid vĂ”rku algusest peale. Tavaline jĂ€rjekord â vaatame andmestruktuuri, valime ĂLELIIGSE vĂ”imsusega arhitektuuri ja pushime dropout'e ĂŒleĂ”ppimise vastu. Olen nĂ€inud dropout'e 0.6, Karl.
MĂ”lemal juhul saab vĂ”rku vĂ€hendada. Oleme motiveeritud. NĂŒĂŒd liigume edasi arutama, mis asi see pruning on.
Ăldine algoritm
Oleme otsustanud, et saame eemaldada konvolutsioonid. See tundub ĂŒsna lihtne:

Iga konvolutsiooni eemaldamine on vĂ”rgu jaoks stress, mis toob tavaliselt kaasa ka teatud tĂ”usu vea. Ăhelt poolt on see vea tĂ”us mĂ€rk sellest, kui Ă”igesti me konvolutsioonide eemaldamisega tegeleme (nĂ€iteks suur tĂ”us ĂŒtleb, et me teeme midagi valesti). Kuid vĂ€ike tĂ”us on tĂ€iesti aktsepteeritav ja sageli kĂ”rvaldatakse jĂ€rgnevate kergete Ă”petustega vĂ€ikese LR-ga. Lisame Ă”petamise etapi:

NĂŒĂŒd peame aru saama, millal soovime lĂ”petada meie Learning<->Pruning tsĂŒkli. Siin vĂ”ivad olla eksootilised variandid, kus peame vĂ”rku vĂ€hendama teatud suurusele ja töötlemise kiiruseni (nĂ€iteks mobiilseadmete jaoks). Siiski on kĂ”ige sagedasem variant â tsĂŒkli jĂ€tkamine seni, kuni viga ei ole ĂŒle lubatud. Lisame tingimuse:

Nii et algoritm on arusaadav. JÀÀb avatuks, kuidas mÀÀrata eemaldatavad konvolutsioonid.
Eemaldatavate konvolutsioonide otsimine
Peame eemaldama mĂ”ned konvolutsioonid. Karm rĂŒndamine ja igaĂŒhe "maha tulistamine" on halb idee, kuigi see töötab. Kuid kuna pea on olemas, saab mĂ”elda ja proovida eristada eemaldamiseks ânĂ”rgadâ konvolutsioonid. Variant on mitu:
- . Idee, mis ĂŒtleb, et vĂ€ikesed kaaludega konvolutsioonid annavad vĂ€hese panuse lĂ”ppotsusesse.
- VĂ€ikseim L1-mÔÔde arvestades keskmist ja ŃŃĐ°ĐœĐŽĐ°ŃŃhĂ€lvet. TĂ€iendame jaotuse iseloomu hindamisega.
- . TĂ€psem mÀÀratlemine vĂ€ikese tĂ€htsusega konvolutsioonidest, kuid ĂŒsna ajamahukas ja ressursimahukas.
- Muud
Igal variandil on eluÔigus ja oma rakenduse omadused. Siin vaatame vÀikseimale L1-mÔÔtmele pÔhinevat varianti.
KĂ€sitsi protsess YOLOv3 jaoks
Algse arhitektuuris on jÀÀnud jÀÀkplokid. Kuigi need on sĂŒgavate vĂ”rkude jaoks ÀÀrmiselt kasulikud, vĂ”ivad need meid siiski takistada. Probleem on selles, et erinevate indeksitega kokkulangevusi ei saa nende kihtide sees kustutada:

Seega eristame kihte, kust saame vabalt kokkulangevusi eemaldada:

NĂŒĂŒd loome töötsĂŒkli:
- Laadime vÀlja aktiveeringud
- Kalkuleerime, kui palju kÀrpida
- KĂ€rpime
- Treeni 10 epohi LR=1e-4
- Testime
Kokkusurumine on kasulik, et hinnata, kui palju me teatud sammul eemaldada saame. NÀited vÀljalaskmisest:

NĂ€gime, et praktiliselt igal pool on 5% kokkusurumisest ĂŒsna madala L1-normiga ja saame need eemaldada. Igal sammul korrati sellist vĂ€ljalaset ja hinnati, millistelt kihtidelt ja kui palju saab kĂ€rpida.
Kogu protsess mahtus 4 sammu (siin ja igal pool numbrid RTX 2060 Super jaoks):
| Samm | mAp75 | Parameetrite arv, miljonites | VÔrgu suurus, MB | Algse suuruse % | KÀitamisaeg, ms | KÀrpimise tingimus |
|---|---|---|---|---|---|---|
| 0 | 0.9656 | 60 | 241 | 100 | 180 | â |
| 1 | 0.9622 | 55 | 218 | 91 | 175 | 5% kÔigist |
| 2 | 0.9625 | 50 | 197 | 83 | 168 | 5% kÔigist |
| 3 | 0.9633 | 39 | 155 | 64 | 155 | 15% kihtide jaoks, kus on 400+ kokkusurumist |
| 4 | 0.9555 | 31 | 124 | 51 | 146 | 10% kihtide jaoks, kus on 100+ kokkusurumist |
Teise etapi juurde lisandus ĂŒks positiivne efekt â mĂ€lu mahub batch-size 4, mis kiirendas tĂ€iendĂ”ppe protsessi.
Neljas etapp peatati, kuna isegi pikaajaline tÀiendÔpe ei tÔstnud mAp75 varasematele tasemetele.
KokkuvÔttes Ônnestus kiirendada inference'i 15%, vÀhendada suurust 35% ja mitte kaotada tÀpsuses.
Automatiseerimine lihtsamate arhitektuuride jaoks
Lihtsamate vÔrguarhitektuuride (ilma tingimuslike add, concatenate ja residual plokkideta) puhul on tÀiesti vÔimalik orienteeruda kÔigi kokkusurumiste töötlemisel ja automatiseerida kokkusurumise eemaldamise protsess.
Sellise variandi olen ma rakendanud .
KÔik on lihtne: teilt on ainult vajalik kahanemise funktsioon, optimeerija ja batch-generaadoreid:
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)Vajadusel saab konfigureerimise parameetreid muuta:
{
"input_model_path": "model.h5",
"output_model_path": "model_pruned.h5",
"finetuning_epochs": 10, # epohhide arv treenimise ajal kÀrpimise etappide vahel
"stop_loss": 0.1, # kaotus peatamise protsessi jaoks
"pruning_percent_step": 0.05, # osa konvolutsioonidest, mis eemaldatakse igal kÀrpimise sammul
"pruning_standart_deviation_part": 0.2 # piiri seotuse kÀrpimise osa
}Lisaks on rakendatud piirang, mis pÔhineb standardhÀlbel. EesmÀrk on piirata eemaldatavate osakaalu, vÀlistades kokkusurumised, mille L1-mÔÔdikud on juba "piisavad":

Sellega lubame eemaldada ainult nÔrgad kokkusurumised jaotustest, mis meenutavad paremat, ning mitte mÔjutada eemaldamist jaotustest, mis meenutavad vasakut:

Jaotuse lÀhenedes normaalsele, saab pruning_standart_deviation_part koosta jÀlgida:

Soovitan 2 sigma piirangut. VÔi vÔib selle eripÀra mitte silmas pidada, jÀttes vÀÀrtuse < 1.0.
LÔpptulemusena saadakse vÔrgusuuruse, kaotuse ja kÀitamisaja graafikid kogu katse jooksul, normeeritud 1.0-le. NÀiteks siin oli vÔrgu suurus peaaegu kahekordistunud kvaliteedi kaotamata (vÀike konvolutsiooniline vÔrgu 100k kaaluga):

KÀitamisaeg allub normaalsetele kÔikumistele ja ei ole praktiliselt muutunud. Sellel on seletus:
- Kokkusurumiste arv muutub mugavast (32, 64, 128) ebamugavaks videokaartidele â 27, 51 jne. Siin vĂ”in eksida, kuid tĂ”enĂ€oliselt see mĂ”jutab.
- Arhitektuur ei ole lai, kuid jĂ€rjestikune. Laidude vĂ€hendamine ei muuda sĂŒgavust. Seega vĂ€hendame koormat, kuid ei muuda kiirus.
SeetÔttu vÀljendub paranemine CUDA koormuse vÀhenemises 20-30% kÀitamisel, kuid mitte kÀitamise aja vÀhenemises.
KokkuvÔte
Reflekteerime. Oleme vaadanud kahte pruning'i varianti â YOLOv3 jaoks (kui tuleb kĂ€tega töötada) ja lihtsama arhitektuuriga vĂ”rke. On ilmne, et mĂ”lemas olukorras saab saavutada vĂ”rgu suuruse vĂ€hendamise ja kiirendamise ilma tĂ€psuse kaotamata. Tulemused:
- Suuruse vÀhenemine
- KĂ€itamise kiirus
- CUDA koormuse vÀhenemine
- JĂ€rgnevalt ka keskkonnaalane mĂ”ju (me optimeerime tulevase arvutusressursside kasutamise). Kuskil on ĂŒks )
Lisa
- PÀrast kÀrpimist saab veel töötada ka kvantimisega (nÀiteks TensorRT kaudu)
- Tensorflow pakub vÔimalusi . See töötab.
- soovin seda edasi arendada ja olen avatud abile
Allikas: habr.com
