Jedai tehnika konvolutsioonivĂ”rkude vĂ€hendamiseks — pruning

Jedai tehnika konvolutsioonivĂ”rkude vĂ€hendamiseks — pruning

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 Stanfordi loengutes 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 ajurakkude aktiveerimise funktsiooniga?)

Model Pruning protsess on samuti lÀhedane bioloogiale. VÔrgu reaktsiooni saab vÔrrelda aju plastilisusega. Raamatus on paar huvitavat nÀidet Norman Doidge'i:

  1. Naise aju, kellel oli sĂŒndides vaid ĂŒks pool, programmeeris end ise ĂŒmber, et tĂ€ita puuduvat poole funktsioone
  2. 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:

Jedai tehnika konvolutsioonivĂ”rkude vĂ€hendamiseks — pruning

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:

Jedai tehnika konvolutsioonivĂ”rkude vĂ€hendamiseks — pruning

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:

Jedai tehnika konvolutsioonivĂ”rkude vĂ€hendamiseks — pruning

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:

  1. VĂ€ikseim L1-mÔÔde vĂ”i low_magnitude_pruning. Idee, mis ĂŒtleb, et vĂ€ikesed kaaludega konvolutsioonid annavad vĂ€hese panuse lĂ”ppotsusesse.
  2. VĂ€ikseim L1-mÔÔde arvestades keskmist ja ŃŃ‚Đ°ĐœĐŽĐ°Ń€Ń‚hĂ€lvet. TĂ€iendame jaotuse iseloomu hindamisega.
  3. Konvolutsioonide maskeerimine ja nende vĂ€ike mĂ”ju lĂ”pptĂ€psusele vĂ€listamine.. TĂ€psem mÀÀratlemine vĂ€ikese tĂ€htsusega konvolutsioonidest, kuid ĂŒsna ajamahukas ja ressursimahukas.
  4. 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:

Jedai tehnika konvolutsioonivĂ”rkude vĂ€hendamiseks — pruning

Seega eristame kihte, kust saame vabalt kokkulangevusi eemaldada:

Jedai tehnika konvolutsioonivĂ”rkude vĂ€hendamiseks — pruning

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

  1. Laadime vÀlja aktiveeringud
  2. Kalkuleerime, kui palju kÀrpida
  3. KĂ€rpime
  4. Treeni 10 epohi LR=1e-4
  5. Testime

Kokkusurumine on kasulik, et hinnata, kui palju me teatud sammul eemaldada saame. NÀited vÀljalaskmisest:

Jedai tehnika konvolutsioonivĂ”rkude vĂ€hendamiseks — pruning

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):

SammmAp75Parameetrite arv, miljonitesVÔrgu suurus, MBAlgse suuruse %KÀitamisaeg, msKÀrpimise tingimus
00.965660241100180—
10.962255218911755% kÔigist
20.962550197831685% kÔigist
30.9633391556415515% kihtide jaoks, kus on 400+ kokkusurumist
40.9555311245114610% 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 siit.
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":

Jedai tehnika konvolutsioonivĂ”rkude vĂ€hendamiseks — pruning

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

Jedai tehnika konvolutsioonivĂ”rkude vĂ€hendamiseks — pruning

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

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

Jedai tehnika konvolutsioonivĂ”rkude vĂ€hendamiseks — pruning

KÀitamisaeg allub normaalsetele kÔikumistele ja ei ole praktiliselt muutunud. Sellel on seletus:

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

Lisa

  • PĂ€rast kĂ€rpimist saab veel töötada ka kvantimisega (nĂ€iteks TensorRT kaudu)
  • Tensorflow pakub vĂ”imalusi low_magnitude_pruning. See töötab.
  • Repo soovin seda edasi arendada ja olen avatud abile

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster