Jedi tehnika konvolutsiooniliste vĂ”rkude vĂ€hendamiseks — pruning

Jedi tehnika konvolutsiooniliste vĂ”rkude vĂ€hendamiseks — pruning

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 Stanfordi loengutes 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 aju neuronite aktiveerimisfunktsiooniga?)

Mudeli kÀrpimise protsess on samuti seotud bioloogiaga. VÔrgu reaktsiooni saab vÔrrelda aju plastilisusega. MÔned huvitavad nÀited on raamatus Norman Doidge:

  1. Naisel, kes sĂŒndis ainult ĂŒhe poolega, pööras aju ennast ĂŒmber, et tĂ€ita puudumise poole funktsioone
  2. 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:

Jedi tehnika konvolutsiooniliste vĂ”rkude vĂ€hendamiseks — pruning

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:

Jedi tehnika konvolutsiooniliste vĂ”rkude vĂ€hendamiseks — pruning

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:

Jedi tehnika konvolutsiooniliste vĂ”rkude vĂ€hendamiseks — pruning

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:

  1. VĂ€ikseim L1-meetod vĂ”i low_magnitude_pruning. Idee, mis ĂŒtleb, et vĂ€ikese kaaluvÀÀrtusega konvolutsioonid annavad vĂ€ikese panuse lĂ”ppotsuse langetamisse.
  2. VÀikseim L1-meetod, arvestades keskmist ja standardhÀlvet. TÀiendame hindamise iseloomuga jaotuse.
  3. Kooridneerimise peitmine ja vÀhem mÔjuvatest tulemustest loobumine. TÀpsem mÀÀramine vÀheolulistest koondustest, kuid aeganÔudev ja ressursimahukas.
  4. 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:

Jedi tehnika konvolutsiooniliste vĂ”rkude vĂ€hendamiseks — pruning

Seega eristame kihti, millest saame koondusi vabalt eemaldada:

Jedi tehnika konvolutsiooniliste vĂ”rkude vĂ€hendamiseks — pruning

NĂŒĂŒd loome töötsĂŒkli:

  1. Eksportime aktiveerimised
  2. Hinnake, kui palju on vaja sisse lÔigata
  3. LÔikame vÀlja
  4. Koolitame 10 epohhi LR=1e-4
  5. Testime

Koonduste eksportimine on kasulik, et hinnata, kui suurt osa saame kindlal sammul eemaldada. Eksportimise nÀidised:

Jedi tehnika konvolutsiooniliste vĂ”rkude vĂ€hendamiseks — pruning

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 versioonismAp75Parameetrite arv, mlnVÔrgu suurus, mbAlgse, %Jooksuaeg, msLÔikamise tingimus
00.965660241100180—
10.962255218911755% kÔigist
20.962550197831685% kÔigist
30.9633391556415515% kihtidest, kus on 400+ koondust
40.9555311245114610% 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 siin.
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":

Jedi tehnika konvolutsiooniliste vĂ”rkude vĂ€hendamiseks — pruning

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

Jedi tehnika konvolutsiooniliste vĂ”rkude vĂ€hendamiseks — pruning

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

Jedi tehnika konvolutsiooniliste vĂ”rkude vĂ€hendamiseks — pruning
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):

Jedi tehnika konvolutsiooniliste vĂ”rkude vĂ€hendamiseks — pruning

Töötlemise kiirus on tavalistele kÔikumistele alluv ja praktiliselt ei muutunud. Sellel on seletus:

  1. Konvolutsioonide arv muutub mugavast (32, 64, 128) ebamugavateks videokaartidel — 27, 51 jne. Siin vĂ”in eksida, kuid tĂ”enĂ€oliselt mĂ”jutab see.
  2. 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 Greta Thunberg)

Lisa

  • PĂ€rast kĂ€rpimise sammu saab edendada ja kvantimist (nĂ€iteks TensorRT-ga)
  • Tensorflow pakub vĂ”imalusi low_magnitude_pruning. Töötab.
  • Repo soovin edasi areneda ja oleksin tĂ€nulik abi eest

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster