Կոնվոլյուցիոն ցանցերի կրճատման ջեդայ տեխնիկա՝ էտում

Կոնվոլյուցիոն ցանցերի կրճատման ջեդայ տեխնիկա՝ էտում

Նախքան կրկին խնդիրն է հայտնաբերել օբյեկտները: Առաջնահերթությունը շահագործման արագությունն է՝ ընդունելի ճշգրտությամբ։ Դուք վերցնում եք YOLOv3 ճարտարապետությունը և հետագայում վերապատրաստում այն: Ճշգրտությունը (mAp75) 0.95-ից մեծ է: Բայց գործարկման տոկոսադրույքը դեռ ցածր է: Խեղճ.

Այսօր մենք շրջանցելու ենք քվանտացումը։ Եվ կտրվածքի տակ մենք կնայենք Model Pruning — ցանցի ավելորդ մասերի կրճատում` Եզրակացությունն արագացնելու համար` առանց ճշգրտության կորստի: Պարզ է, թե որտեղ, որքան և ինչպես կտրել: Եկեք պարզենք, թե ինչպես դա անել ձեռքով և որտեղ կարող եք ավտոմատացնել այն: Վերջում կա կերասների շտեմարան։

Ներածություն

Իմ նախորդ աշխատանքի վայրում՝ Պերմում գտնվող Macroscop-ում, ես ձեռք բերեցի մեկ սովորություն՝ միշտ վերահսկել ալգորիթմների կատարման ժամանակը: Եվ միշտ ստուգեք ցանցի գործարկման ժամանակը համարժեքության ֆիլտրի միջոցով: Սովորաբար արտադրության մեջ գերժամանակակից ժամանակակից ֆիլտրը չի անցնում այս ֆիլտրը, որն ինձ հանգեցրեց Pruning-ին:

Էտումը հին թեմա է, որը քննարկվել է Ստենֆորդի դասախոսություններ 2017 թվականին։ Հիմնական գաղափարը վերապատրաստված ցանցի չափը նվազեցնելն է՝ առանց ճշգրտությունը կորցնելու՝ հեռացնելով տարբեր հանգույցներ։ Այն թույն է թվում, բայց ես հազվադեպ եմ լսում դրա օգտագործման մասին: Հավանաբար, չկան բավարար իրականացումներ, չկան ռուսալեզու հոդվածներ, կամ պարզապես բոլորը դա համարում են էտող նոու-հաու և լռում են։
Բայց եկեք այն առանձնացնենք

Հայացք կենսաբանության մեջ

Ինձ դուր է գալիս, երբ Deep Learning-ը դիտարկում է կենսաբանությունից բխող գաղափարները: Նրանց, ինչպես էվոլյուցիան, կարելի է վստահել (գիտեի՞ք, որ ReLU-ն շատ նման է ուղեղում նեյրոնների ակտիվացման գործառույթը?)

Model Pruning գործընթացը նույնպես մոտ է կենսաբանությանը: Ցանցի արձագանքն այստեղ կարելի է համեմատել ուղեղի պլաստիկության հետ։ Գրքում մի երկու հետաքրքիր օրինակ կա. Նորման Դոիդջ:

  1. Կնոջ ուղեղը, ով ծնվել է միայն մեկ կեսով, վերածրագրավորվել է, որպեսզի կատարի բացակայող կեսի գործառույթները:
  2. Տղան կոտրել է իր ուղեղի այն հատվածը, որը պատասխանատու է տեսողության համար։ Ժամանակի ընթացքում ուղեղի այլ մասեր ստանձնեցին այդ գործառույթները: (չենք փորձում կրկնել)

Նմանապես, դուք կարող եք հեռացնել որոշ թույլ ոլորումներ ձեր մոդելից: Որպես վերջին միջոց, մնացած կապոցները կօգնեն փոխարինել կտրվածները:

Դուք սիրում եք Transfer Learning-ը, թե՞ սովորում եք զրոյից:

Տարբերակ թիվ մեկ. Դուք օգտագործում եք Transfer Learning-ը Yolov3-ում: Retina, Mask-RCNN կամ U-Net: Բայց շատ ժամանակ մենք կարիք չունենք ճանաչելու 80 օբյեկտների դասեր, ինչպես COCO-ում: Իմ պրակտիկայում ամեն ինչ սահմանափակվում է 1-2 դասարաններով: Կարելի է ենթադրել, որ 80 դասի ճարտարապետությունն այստեղ ավելորդ է։ Սա հուշում է, որ ճարտարապետությունը պետք է փոքրացնել: Ավելին, ես կցանկանայի դա անել առանց կորցնելու առկա նախապես մարզված կշիռները։

Տարբերակ թիվ երկու. Միգուցե դուք ունեք շատ տվյալներ և հաշվողական ռեսուրսներ, կամ պարզապես կարիք ունեք գերհարմարեցված ճարտարապետության: Կարևոր չէ: Բայց դուք զրոյից եք սովորում ցանցը: Սովորական ընթացակարգն այն է, որ դիտարկենք տվյալների կառուցվածքը, ընտրենք այնպիսի ճարտարապետություն, որն ունի ՉԱՓԱՌԻԿ հզորություն և դուրս մղել վերապատրաստումից: Ես տեսա 0.6 դուրս թողած, Կարլ.

Երկու դեպքում էլ ցանցը կարող է կրճատվել: Մոտիվացված. Հիմա եկեք պարզենք, թե ինչ է թլպատման էտումը

Ընդհանուր ալգորիթմ

Մենք որոշեցինք, որ կարող ենք հեռացնել կապոցները։ Այն բավականին պարզ է թվում.

Կոնվոլյուցիոն ցանցերի կրճատման ջեդայ տեխնիկա՝ էտում

Ցանկացած ոլորում հեռացնելը սթրեսային է ցանցի համար, ինչը սովորաբար հանգեցնում է սխալի որոշակի աճի: Մի կողմից, սխալի այս աճը ցուցիչ է, թե որքան ճիշտ ենք մենք հեռացնում ոլորումները (օրինակ, մեծ աճը ցույց է տալիս, որ մենք ինչ-որ բան սխալ ենք անում): Բայց փոքր աճը միանգամայն ընդունելի է և հաճախ վերացվում է փոքր LR-ով հետագա թեթև լրացուցիչ մարզումների միջոցով: Ավելացնել լրացուցիչ վերապատրաստման քայլ.

Կոնվոլյուցիոն ցանցերի կրճատման ջեդայ տեխնիկա՝ էտում

Այժմ մենք պետք է հասկանանք, թե երբ ենք ուզում դադարեցնել մեր Learning<->Pruning loop-ը: Այստեղ կարող են լինել էկզոտիկ տարբերակներ, երբ մենք պետք է փոքրացնենք ցանցը որոշակի չափի և արագության (օրինակ՝ շարժական սարքերի համար): Այնուամենայնիվ, ամենատարածված տարբերակն այն է, որ ցիկլը շարունակվի, մինչև սխալը դառնա ընդունելիից բարձր: Ավելացնել պայման.

Կոնվոլյուցիոն ցանցերի կրճատման ջեդայ տեխնիկա՝ էտում

Այսպիսով, ալգորիթմը պարզ է դառնում. Մնում է պարզել, թե ինչպես կարելի է որոշել ջնջված ոլորումները:

Փնտրեք ջնջված փաթեթներ

Մենք պետք է հեռացնենք որոշ ոլորումներ: Առաջ շտապելը և որևէ մեկին «գնդակահարելը» վատ գաղափար է, թեև այն կաշխատի: Բայց քանի որ գլուխ ունեք, կարող եք մտածել և փորձել հեռացնել «թույլ» ոլորումներ: Կան մի քանի տարբերակներ.

  1. Ամենափոքր L1-չափ կամ ցածր_մագնիտուդ_էտում. Այն գաղափարը, որ փոքր կշիռներով ոլորումները քիչ ներդրում ունեն վերջնական որոշման մեջ
  2. Ամենափոքր L1 չափումը հաշվի առնելով միջին և ստանդարտ շեղումը: Մենք լրացնում ենք բաշխման բնույթի գնահատմամբ:
  3. Քողարկելով ոլորումները և բացառելով նրանց, որոնք ամենաքիչն են ազդում վերջնական ճշգրտության վրա. Աննշան ոլորումների ավելի ճշգրիտ որոշում, բայց շատ ժամանակատար և ռեսուրսներ խլող:
  4. ՈՒրիշ

Տարբերակներից յուրաքանչյուրն ունի կյանքի իրավունք և իր իրականացման առանձնահատկությունները: Այստեղ մենք դիտարկում ենք ամենափոքր L1 չափման տարբերակը

Ձեռքով գործընթաց YOLOv3-ի համար

Բնօրինակ ճարտարապետությունը պարունակում է մնացորդային բլոկներ: Բայց ինչքան էլ թույն լինեն խորը ցանցերի համար, մեզ մի քիչ կխանգարեն։ Դժվարությունն այն է, որ դուք չեք կարող ջնջել հաշտեցումները տարբեր ինդեքսներով այս շերտերում.

Կոնվոլյուցիոն ցանցերի կրճատման ջեդայ տեխնիկա՝ էտում

Հետևաբար, եկեք ընտրենք շերտեր, որոնցից մենք կարող ենք ազատորեն ջնջել հաշտեցումները.

Կոնվոլյուցիոն ցանցերի կրճատման ջեդայ տեխնիկա՝ էտում

Հիմա եկեք կառուցենք աշխատանքային ցիկլ.

  1. Ակտիվացումների վերբեռնում
  2. Պարզելով, թե որքան պետք է կտրել
  3. Կտրեք այն
  4. 10 դարաշրջանի ուսուցում LR=1e-4-ով
  5. Փորձարկում

Կոնվուլյացիաների բեռնաթափումը օգտակար է գնահատելու համար, թե որքան մաս կարող ենք հեռացնել որոշակի քայլում: Բեռնաթափման օրինակներ.

Կոնվոլյուցիոն ցանցերի կրճատման ջեդայ տեխնիկա՝ էտում

Մենք տեսնում ենք, որ գրեթե ամենուր ոլորումների 5%-ն ունի շատ ցածր L1-նորմա, և մենք կարող ենք դրանք հեռացնել: Ամեն քայլափոխի այս բեռնաթափումը կրկնվում էր և գնահատվում, թե որ շերտերն ու քանիսը կարելի է կտրել։

Ամբողջ գործընթացը ավարտվեց 4 քայլով (համարներն այստեղ և ամենուր RTX 2060 Super-ի համար).

Քայլ mAp75 Պարամետրերի քանակը, միլիոն Ցանցի չափը, mb սկզբից, % Գործարկման ժամանակը, ms Թլպատման վիճակ
0 0.9656 60 241 100 180 -
1 0.9622 55 218 91 175 բոլորի 5%-ը
2 0.9625 50 197 83 168 բոլորի 5%-ը
3 0.9633 39 155 64 155 15% 400+ ոլորումներ ունեցող շերտերի համար
4 0.9555 31 124 51 146 10% 100+ ոլորումներ ունեցող շերտերի համար

Քայլ 2-ին ավելացվել է մեկ դրական ազդեցություն՝ խմբաքանակի 4-րդ չափը տեղավորվում է հիշողության մեջ, ինչը մեծապես արագացրել է լրացուցիչ մարզումների գործընթացը:
Քայլ 4-ում գործընթացը դադարեցվել է, քանի որ նույնիսկ երկարաժամկետ լրացուցիչ ուսուցումը չի բարձրացրել mAp75-ը հին արժեքներին:
Արդյունքում մեզ հաջողվեց արագացնել եզրակացությունը 15%, փոքրացրեք չափը 35% և ճշգրիտ չկորցնել:

Ավտոմատացում ավելի պարզ ճարտարապետության համար

Ցանցային ավելի պարզ ճարտարապետությունների համար (առանց պայմանական հավելումների, կապակցված և մնացորդային բլոկների), միանգամայն հնարավոր է կենտրոնանալ բոլոր կոնվոլյուցիոն շերտերի մշակման վրա և ավտոմատացնել ոլորումների անջատման գործընթացը:

Ես իրականացրել եմ այս տարբերակը այստեղ.
Դա պարզ է. ձեզ միայն անհրաժեշտ է կորստի ֆունկցիա, օպտիմիզատոր և խմբաքանակի գեներատորներ.

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
}

Բացի այդ, կիրառվում է ստանդարտ շեղման վրա հիմնված սահմանափակում: Նպատակն է սահմանափակել հեռացված մասը՝ բացառելով արդեն «բավարար» L1 չափումներով ոլորումները.

Կոնվոլյուցիոն ցանցերի կրճատման ջեդայ տեխնիկա՝ էտում

Այսպիսով, մենք թույլ ենք տալիս հեռացնել միայն թույլ ոլորումները աջին նման բաշխումներից և չազդել ձախի նման բաշխումներից հեռացման վրա.

Կոնվոլյուցիոն ցանցերի կրճատման ջեդայ տեխնիկա՝ էտում

Երբ բաշխումը մոտենում է նորմալին, pruning_standart_deviation_part գործակիցը կարող է ընտրվել հետևյալից.

Կոնվոլյուցիոն ցանցերի կրճատման ջեդայ տեխնիկա՝ էտում
Ես խորհուրդ եմ տալիս 2 սիգմայի ենթադրություն: Կամ կարող եք անտեսել այս հատկությունը՝ թողնելով < 1.0 արժեքը:

Արդյունքը ամբողջ թեստի համար ցանցի չափի, կորստի և ցանցի գործարկման գրաֆիկն է՝ նորմալացված 1.0-ի: Օրինակ, այստեղ ցանցի չափը կրճատվել է գրեթե 2 անգամ՝ առանց որակի կորստի (փոքր կոնվոլյուցիոն ցանց՝ 100 հազար կշիռներով).

Կոնվոլյուցիոն ցանցերի կրճատման ջեդայ տեխնիկա՝ էտում

Գործողության արագությունը ենթակա է նորմալ տատանումների և գործնականում մնում է անփոփոխ: Սրա բացատրությունը կա.

  1. Կոնվուլյացիաների քանակը փոխվում է հարմարից (32, 64, 128) մինչև վիդեո քարտերի համար ոչ ամենահարմարը՝ 27, 51 և այլն: Ես կարող էի սխալվել այստեղ, բայց ամենայն հավանականությամբ դա ազդեցություն ունի։
  2. Ճարտարապետությունը լայն չէ, բայց հետևողական։ Լայնությունը նվազեցնելով՝ մենք չենք ազդում խորության վրա։ Այսպիսով, մենք նվազեցնում ենք բեռը, բայց չենք փոխում արագությունը:

Հետևաբար, բարելավումն արտահայտվել է աշխատանքի ընթացքում CUDA-ի բեռնվածության 20-30%-ով նվազմամբ, բայց ոչ գործարկման ժամանակի կրճատմամբ:

Արդյունքները

Անդրադառնանք. Մենք դիտարկել ենք էտման 2 տարբերակ՝ YOLOv3-ի համար (երբ դուք պետք է աշխատեք ձեր ձեռքերով) և ավելի պարզ ճարտարապետությամբ ցանցերի համար: Կարելի է տեսնել, որ երկու դեպքում էլ հնարավոր է հասնել ցանցի չափի կրճատման և արագացման՝ առանց ճշգրտության կորստի: Արդյունքները:

  • Չափի կրճատում
  • Արագացման վազք
  • Նվազեցնելով CUDA բեռը
  • Արդյունքում՝ շրջակա միջավայրի բարեկեցություն (Մենք օպտիմիզացնում ենք հաշվողական ռեսուրսների ապագա օգտագործումը։ Ինչ-որ տեղ երջանիկ է Գրետա Թունբերգ)

Հավելված

  • Էտման քայլից հետո կարող եք ավելացնել քվանտավորում (օրինակ՝ TensorRT-ով)
  • Tensorflow-ը հնարավորություն է տալիս ցածր_մագնիտուդ_էտում. Աշխատանքներ.
  • պահոց Ես ուզում եմ զարգանալ և ուրախ կլինեմ օգնել

Source: www.habr.com

Добавить комментарий