
Ees on jĂ€lle objektide tuvastamise ĂŒlesanne. Prioriteet on töö kiirus vastuvĂ”etava tĂ€psuse juures. VĂ”ta arhitektuur YOLOv3 ja Ă”pi seda edasi. TĂ€psus (mAp75) ĂŒle 0,95. Kuid lĂ€biviimise kiirus on endiselt madal. Kurat.
TĂ€na jĂ€tame kvantiseerimise kĂ”rvale. Ja allpool vaatame ĂŒle Mudeli kĂ€rpimine â ĂŒleliigsete osade eemaldamine vĂ”rgust, et kiirendada jĂ€reldusi ilma tĂ€psuse kaotuseta. Visuaalselt â kust, kui palju ja kuidas saab kĂ€rpida. Uurime, kuidas seda kĂ€sitsi teha ja kus saab automatiseerida. LĂ”pus â reposoitor keras'ele.
Sissejuhatus
Eelmises töökohas, Permi Macroscopis, omandasin harjumuse â alati jĂ€lgida algoritmide tĂ€itmise aega. Ja vĂ”rgu töötlemise aega kontrolida alati adekvaatsuse filtri kaudu. Tavaliselt ei lĂ€binud state-of-the-art tootmisest seda filtrit, mis viis mind kĂ€rpimise juurde.
KĂ€rpimine â vana teema, millest rÀÀgiti 2017. aastal. Peamine idee â treenitud vĂ”rgu suuruse vĂ€hendamine ilma tĂ€psuse kaotuseta, eemaldades erinevaid sĂ”lmu. KĂ”lab vahvalt, aga harva kuulen selle rakendamisest. TĂ”enĂ€oliselt puuduvad rakendused, pole venekeelseid artikleid vĂ”i arvavad kĂ”ik, et kĂ€rpimine on midagi uut ja vaikivad.
Aga lÀhme edasi uurima
Pilguheide bioloogiasse
Mulle meeldib, kui sĂŒvaĂ”ppes saavad inspiratsiooni ideed bioloogiast. Neile, nagu ka evolutsioonile, vĂ”ib toetuda (ja kas teadsid, et ReLU sarnaneb vĂ€ga ?)
Mudeli kÀrpimise protsess on samuti seotud bioloogiaga. VÔrgu reaktsiooni saab vÔrrelda aju plastilisusega. MÔned huvitavad nÀited on raamatus :
- Naisel, kes sĂŒndis ainult ĂŒhe poolega, pööras aju ennast ĂŒmber, et tĂ€ita puudumise poole funktsioone
- Noormees lasi endal maha osa ajust, mis vastutas nÀgemise eest. Aja jooksul vÔtsid teised ajupiirkonnad need funktsioonid enda kanda. (ei proovi korrata)
Nii saab ka teie mudelist eemaldada osa nĂ”rgemaid konvolutsioone. ĂĂ€rmisel juhul aitavad jÀÀnud konvolutsioonid asendada eemaldatud osi.
Kas armastad ĂŒlekandmist Ă”ppimist vĂ”i Ă”pid nullist?
Variant number ĂŒks. Sa kasutad Transfer Learning und Yolov3, Retina, Mask-RCNN vĂ”i U-Net. Kuid sagedamini ei ole meil vaja tuvastada 80 objekti kategooriat nagu COCO-s. Minu praktikas piirduvad asjad 1-2 klassiga. VĂ”ib arvestada, et 80 klassi arhitektuur on siin ĂŒlearune. Tekkib mĂ”te, et arhitektuuri tuleks vĂ€hendada. Samal ajal tahaksin seda teha ilma olemasolevate eelĂ”ppete kaalude kaotamata.
Variant number kaks. VĂ”ib-olla on sul palju andmeid ja arvutusressursse vĂ”i vajad lihtsalt superkohandatud arhitektuuri. Pole vahet. Aga sa Ă”petad vĂ”rku nullist. Tavaline jĂ€rjekord on - vaatame andmestruktuuri, valime ĂŒleliigse vĂ”imsuse arhitektuuri ja maksimeerime dropout'ide abil ĂŒleĂ”ppimise kaitset. Olen nĂ€inud dropout'e 0.6, Karl.
MĂ”lemal juhul saab vĂ”rku vĂ€hendada. Motivatsioon on olemas. NĂŒĂŒd liigume vĂ€lja selgitama, mis asi on prune.
Ăldine algoritm
Oleme otsustanud, et saame eemaldada konvolutsioonid. See nĂ€eb vĂ€lja ĂŒsna lihtne:

Iga konvolutsiooni eemaldamine on vĂ”rgu jaoks stress, mis tavaliselt toob kaasa teatud tĂ”usu veas. Ăhest kĂŒljest on see veatĂ”us nĂ€itaja, kui Ă”igesti me konvolutsioone eemaldame (nt suur tĂ”us nĂ€itab, et me teeme midagi valesti). Kuid vĂ€ike tĂ”us on tĂ€iesti lubatav ja tihti kaob see hilisema kerge tĂ€iendĂ”ppega vĂ€ikese LR-iga. Lisame tĂ€iendĂ”ppe sammu:

NĂŒĂŒd peame aru saama, millal tahame meie LearningPruning tsĂŒklit lĂ”petada. Siin vĂ”ivad olla eksootilised vĂ”imalused, kui me peame vĂ”rku vĂ€hendama kindla suuruse ja töötlemiskiiruseni (nt mobiilseadmete jaoks). Kuid kĂ”ige sagedasem variant on jĂ€tkata tsĂŒklit, kuni viga ĂŒletab lubatud taseme. Lisame tingimuse:

Nii et algoritm muutub selgeks. JÀÀb selgeks teha, kuidas mÀÀrata eemaldatavad konvolutsioonid.
Eemaldatavate konvolutsioonide otsimine
Me peame eemaldama mĂ”ningaid konvolutsioone. ĂkskĂ”ikseid eemaldada ja "otsida" igat - halb idee, kuigi see töötab. Aga kuna peame olema mĂ”istlikud, saame mĂ”elda ja pĂŒĂŒda vĂ€lja selekteerida "nĂ”rgad" konvolutsioonid, mida eemaldada. VĂ”imalusi on mitmeid:
- . Idee, mis ĂŒtleb, et vĂ€ikese kaaluvÀÀrtusega konvolutsioonid annavad vĂ€ikese panuse lĂ”ppotsuse langetamisse.
- VÀikseim L1-meetod, arvestades keskmist ja standardhÀlvet. TÀiendame hindamise iseloomuga jaotuse.
- . TÀpsem mÀÀramine vÀheolulistest koondustest, kuid aeganÔudev ja ressursimahukas.
- Teised
Iga variandil on oma eluÔigus ja rakenduse eripÀrad. Siin vaatleme varianti, millel on madalaim L1-mÔÔt.
KĂ€sitsi protsess YOLOv3 jaoks
TĂ”hususe arhitektuur sisaldab jÀÀkplokke. Kuid kuigi need on sĂŒgavate vĂ”rkude jaoks tĂ”husad, vĂ”ivad nad meile segadust tekitada. Probleem on selles, et nendes kihtides ei saa eemaldada erinevate indeksitega koondusi:

Seega eristame kihti, millest saame koondusi vabalt eemaldada:

NĂŒĂŒd loome töötsĂŒkli:
- Eksportime aktiveerimised
- Hinnake, kui palju on vaja sisse lÔigata
- LÔikame vÀlja
- Koolitame 10 epohhi LR=1e-4
- Testime
Koonduste eksportimine on kasulik, et hinnata, kui suurt osa saame kindlal sammul eemaldada. Eksportimise nÀidised:

NÀeme, et praktiliselt igal pool on 5% koondustest vÀga madala L1-normiga ja saame need eemaldada. Igal sammul kordus selline eksport ja tehti hinnang, millistest kihtidest ja kui palju on vÔimalik eemaldada.
Kogu protsess mahtus 4 sammu (siin ja igal pool numbrid RTX 2060 Super jaoks):
| suudab tÀielikult eemaldada kÔik failid, mis asuvad kohaliku hoidla versioonis | mAp75 | Parameetrite arv, mln | VÔrgu suurus, mb | Algse, % | Jooksuaeg, ms | LÔikamise 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% kihtidest, kus on 400+ koondust |
| 4 | 0.9555 | 31 | 124 | 51 | 146 | 10% kihtidest, kus on 100+ koondust |
Teise sammu jooksul lisandus ĂŒks positiivne efekt â mĂ€lu suutis mahutada batĆĄi suurusega 4, mis kiirendas tĂ€iendamisprotsessi oluliselt.
Neljandas etapis peatus protsess, kuna isegi pikem tÀiendamine ei tÔstnud mAp75 vanade vÀÀrtusteni.
KokkuvÔttes Ônnestus kiirendada jÀrelevalvet 15%, vÀhendada suurust 35% ja mitte kaotada tÀpsuses.
Automatiseerimine lihtsama arhitektuuri jaoks
Lihtsate vÔrguarhitektuuride (ilma tingimuslike add, concat ja jÀÀkblokkideta) puhul on vÔimalik töötlemine kÔikide koonduskihtide peal ning protsessi automatiseerimine.
Selle variandi rakendasin .
KÔik on lihtne: teilt on vaja ainult kaotuse funktsiooni, optimeerijat ja batƥi genereerijaid:
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, # epohide arvu, mis treenivad kÀrpimise sammu vahel
"stop_loss": 0.1, # kaotus peatamiseks
"pruning_percent_step": 0.05, # osa konvolutsioonidest, mis kustutatakse igal kÀrpimise sammul
"pruning_standart_deviation_part": 0.2 # nihke mÀÀramine kÀrpimise osale
}Lisaks on ellu viidud piirang, mis pÔhineb standardhÀlbel. EesmÀrk on piirata eemaldatavat osa, jÀttes vÀlja konvolutsioonid, mille L1 mÔÔtmed on juba "piisavad":

Nii vÔimaldame eemaldada ainult nÔrkade konvolutsioonide distributsioone, mis on sarnased paremale, ja mitte mÔjutada eemaldamist distributsioonidest, mis on sarnased vasakule:

Jaotuste lÀhenedes normaalsele jaotusest, saab kÀrpimise standardhÀlbe osa sobitada jÀrgmiselt:

Soovitan lubada 2 sigmat. VÔi ei pruugi sellele omadusele tugineda, jÀttes vÀÀrtuse < 1.0.
Tulemuseks on graafik vÔrgu suurusest, kadudest ja vÔrgu tööaja graafik kogu testi jooksul, normeeritud tasemele 1.0. NÀiteks siin oli vÔrgu suurust vÀhendatud peaaegu kaks korda ilma kvaliteedi kadumiseta (vÀike konvolutsioonivÔrk 100k kaalu jaoks):

Töötlemise kiirus on tavalistele kÔikumistele alluv ja praktiliselt ei muutunud. Sellel on seletus:
- Konvolutsioonide arv muutub mugavast (32, 64, 128) ebamugavateks videokaartidel â 27, 51 jne. Siin vĂ”in eksida, kuid tĂ”enĂ€oliselt mĂ”jutab see.
- Arhitektuur ei ole lai, vaid jĂ€rjestikune. Laiuse vĂ€hendamisel ei muuda me sĂŒgavust. Nii vĂ€hendame koormust, kuid ei muuda kiirus.
SeetÔttu vÀljendus tÀiustamine CUDA koormuse vÀhenemises töötlusel 20-30%, kuid mitte töötlemise aja vÀhenemises.
Summary
MĂ”elgem veidi. Vaatasime kahte kĂ€rpimise varianti â YOLOv3 jaoks (kui tuleb kĂ€sitsi töötada) ja vĂ”rke lihtsama arhitektuuriga. NĂ€htavalt on mĂ”lemal juhul vĂ”imalik saavutada vĂ”rgu suuruse ja kiiruseta arvutamise vĂ€henemist tĂ€psuse kaotamata. Tulemused:
- Suuruse vÀhenemine
- Töötluse kiirus
- CUDA koormuse vÀhenemine
- SeetĂ”ttu ökoloogilisus (Optimeerime tulevikus arvutusressursside kasutamist. Kusagil rÔÔmustab ĂŒks )
Lisa
- PÀrast kÀrpimise sammu saab edendada ja kvantimist (nÀiteks TensorRT-ga)
- Tensorflow pakub vÔimalusi . Töötab.
- soovin edasi areneda ja oleksin tÀnulik abi eest
Allikas: habr.com
