Convolutional тармактарды азайтуу үчүн Jedi техникасы - бутоо

Convolutional тармактарды азайтуу үчүн Jedi техникасы - бутоо

Сиздин алдыңызда дагы объекттерди аныктоо милдети турат. Приоритет - алгылыктуу тактык менен иштөө ылдамдыгы. Сиз YOLOv3 архитектурасын алып, андан ары үйрөтөсүз. Тактык (mAp75) 0.95тен жогору. Бирок чуркоо көрсөткүчү дагы эле төмөн. Crap.

Бүгүн биз квантташтыруудан өтөбүз. Ал эми кесилген астынан карап чыгабыз Үлгү кесүү — тактыкты жоготпостон корутундуну тездетүү үчүн тармактын ашыкча бөлүктөрүн кесүү. Кайда, канча жана кантип кесүү керектиги түшүнүктүү. Келгиле, муну кол менен кантип жасоону жана аны кайда автоматташтырууга болорун карап көрөлү. Аягында керас боюнча репозиторий бар.

тааныштыруу

Мурунку иштеген жеримде, Пермдеги Макроскопто мен бир адатка ээ болдум - алгоритмдердин аткарылуу убактысын ар дайым көзөмөлдөө. Жана ар дайым тармактын иштөө убактысын адекваттуулук чыпкасы аркылуу текшериңиз. Адатта өндүрүштө заманбап бул чыпкадан өтпөйт, бул мени Бутоого алып келди.

Бутоо - бул талкууланган эски тема Стэнфорд лекциялары 2017-жылы. Негизги идея - ар кандай түйүндөрдү алып салуу менен тактыкты жоготпостон, үйрөтүлгөн тармактын көлөмүн азайтуу. Бул сонун угулат, бирок мен аны колдонуу жөнүндө сейрек угам. Мүмкүн, ишке ашыруулар жетишсиз, орус тилдүү макалалар жок, же жөн эле бардыгы муну «ноу-хау» деп эсептеп, унчукпай отурушат.
Бирок аны бөлүп алалы

Биологияга бир көз караш

Deep Learning биологиядан келген идеяларды караганы мага жагат. Алар, эволюция сыяктуу эле, ишенсе болот (сиз ReLU абдан окшош экенин билесизби мээдеги нейрондорду активдештирүү функциясы?)

Үлгү кесүү процесси да биологияга жакын. Тармактын бул жердеги жообун мээнин пластикасы менен салыштырууга болот. Китепте бир нече кызыктуу мисалдар бар. Норман Доидж:

  1. Бир жарымы менен төрөлгөн аялдын мээси жетишпеген жарымынын функцияларын аткаруу үчүн өзүн кайра программалаган.
  2. Жигит мээсинин көрүү үчүн жооптуу бөлүгүн атып салган. Убакыттын өтүшү менен мээнин башка бөлүктөрү бул функцияларды аткарышкан. (биз кайталаганга аракет кылбайбыз)

Ошо сыяктуу эле, сиз моделиңизден кээ бир алсыз бурмаларды кесип салсаңыз болот. Акыркы чара катары, калган байламдар кесилгендерди алмаштырууга жардам берет.

Сиз Transfer Learningди жакшы көрөсүзбү же нөлдөн баштап үйрөнүп жатасызбы?

Биринчи вариант. Сиз Yolov3 боюнча Transfer Learning колдоносуз. Retina, Mask-RCNN же U-Net. Бирок көбүнчө COCO сыяктуу 80 объект классын таануунун кереги жок. Менин практикамда баары 1-2-класстар менен чектелет. Бул жерде 80 класс үчүн архитектура ашыкча деп божомолдоого болот. Бул архитектураны кичирейтүү керек экенин көрсөтүп турат. Болгондо да алдын ала даярдалган салмактарды жоготпой муну жасагым келет.

Экинчи вариант. Балким, сизде көптөгөн маалыматтар жана эсептөө ресурстары бар же жөн гана супер-көнүмүш архитектура керек. Маанилүү эмес. Бирок сиз тармакты нөлдөн баштап үйрөнүп жатасыз. Кадимки жол-жобосу маалымат түзүмүн карап, кубаттуулугу АШЫК архитектураны тандоо жана кайра окутуудан четтеп калгандарды түртүү. Мен 0.6 окуучуну көрдүм, Карл.

Эки учурда тең тармакты кыскартууга болот. Мотивацияланган. Эми сүннөт кесүү кандай экенин аныктап көрөлү

Жалпы алгоритм

Биз таңгактарды алып салууну чечтик. Бул абдан жөнөкөй көрүнөт:

Convolutional тармактарды азайтуу үчүн Jedi техникасы - бутоо

Кандайдыр бир конволюцияны алып салуу тармак үчүн стресс болуп саналат, бул адатта катанын бир аз көбөйүшүнө алып келет. Бир жагынан алганда, катанын бул көбөйүшү конволюцияларды канчалык туура алып салганыбыздын көрсөткүчү (мисалы, чоң өсүү биз туура эмес кылып жатканыбызды көрсөтүп турат). Бирок бир аз өсүш абдан алгылыктуу болуп саналат жана көп учурда кичинекей LR менен кийинки жарык кошумча окутуу менен жок кылынат. Кошумча окутуу кадамын кошуу:

Convolutional тармактарды азайтуу үчүн Jedi техникасы - бутоо

Эми биз Learning<->Pruning циклибизди качан токтоткубуз келгенин аныкташыбыз керек. Тармакты белгилүү бир өлчөмдө жана ылдамдыкта (мисалы, мобилдик түзмөктөр үчүн) азайтуу керек болгондо, бул жерде экзотикалык варианттар болушу мүмкүн. Бирок, эң кеңири таралган вариант - ката алгылыктуудан жогору болгонго чейин циклди улантуу. Шарт кошуу:

Convolutional тармактарды азайтуу үчүн Jedi техникасы - бутоо

Ошентип, алгоритм айкын болуп калат. Жок кылынган конволюцияларды кантип аныктоо керек.

Жок кылынган таңгактарды издөө

Биз кээ бир бурмалоолорду алып салышыбыз керек. Алдыга умтулуу жана кимдир-бирөөнү "атуу" жаман идея, бирок ал ишке ашат. Бирок башыңыз бар болгондуктан, сиз ойлонуп, алып салуу үчүн "алсыз" конволюцияларды тандап алууга аракет кылсаңыз болот. Бир нече варианттар бар:

  1. Эң кичине L1-өлчөм же төмөнкү_магнитуда_бутоо. Кичинекей салмактагы конволюциялар акыркы чечимге аз салым кошот деген идея
  2. Эң кичине L1-өлчөм орточо жана стандарттык четтөөнү эске алуу менен. Биз бөлүштүрүүнүн мүнөзүнө баа берүү менен толуктайбыз.
  3. Ийгиликтерди маскалоо жана акыркы тактыкка эң аз таасир этүүчүлөрдү кошпогондо. Маанисиз конволюцияларды так аныктоо, бирок абдан көп убакытты жана ресурстарды талап кылат.
  4. башка

Варианттардын ар бири жашоого укуктуу жана өзүнүн ишке ашыруу өзгөчөлүктөрүнө ээ. Бул жерде биз эң кичине L1-өлчөмү бар вариантты карап чыгабыз

YOLOv3 үчүн кол процесси

Баштапкы архитектура калдык блокторду камтыйт. Бирок алар терең тармактар ​​үчүн канчалык салкын болбосун, алар бизге кандайдыр бир деңгээлде тоскоол болот. Кыйынчылык - бул катмарлардагы ар кандай индекстер менен элдештирүүлөрдү жок кыла албайсыз:

Convolutional тармактарды азайтуу үчүн Jedi техникасы - бутоо

Ошондуктан, келгиле, жарашууларды эркин жок кыла турган катмарларды тандап алалы:

Convolutional тармактарды азайтуу үчүн Jedi техникасы - бутоо

Эми жумуш циклин түзөлү:

  1. Жүктөлүп жаткан активдештирүүлөр
  2. Канча кесүү керек экенин аныктоо
  3. Аны кесип
  4. LR=10e-1 менен 4 доорду үйрөнүү
  5. Сыноо

Конволюцияларды түшүрүү биз белгилүү бир кадамда канча бөлүгүн алып салууга болорун эсептөө үчүн пайдалуу. Жүктөө мисалдары:

Convolutional тармактарды азайтуу үчүн Jedi техникасы - бутоо

Биз дээрлик бардык жерде конволюциялардын 5% өтө төмөн L1-норма бар экенин көрүп жатабыз жана биз аларды жок кыла алабыз. Ар бир кадамда бул түшүрүү кайталанып, кайсы катмарды жана канчасын кесип салууга боло тургандыгы бааланган.

Бүт процесс 4 кадам менен аяктады (бул жерде жана бардык жерде RTX 2060 Super үчүн сандар):

кадам mAp75 Параметрлердин саны, миллион Тармактын өлчөмү, мб Баштапкыдан, % Иштөө убактысы, мс Сүннөткө отургузуу шарты
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 чаралары менен конволюцияларды кошпогондо, алынып салынган бөлүгүн чектөө:

Convolutional тармактарды азайтуу үчүн Jedi техникасы - бутоо

Ошентип, биз сизге оңго окшош бөлүштүрүүдөн алсыз конволяцияларды гана алып салууга уруксат беребиз жана солго окшош бөлүштүрүүдөн алып салууга таасирин тийгизбейбиз:

Convolutional тармактарды азайтуу үчүн Jedi техникасы - бутоо

Бөлүштүрүү нормалдуу жакындаганда, кесүү_стандартты_четтөө_бөлүгүнүн коэффициентин төмөнкүдөн тандоого болот:

Convolutional тармактарды азайтуу үчүн Jedi техникасы - бутоо
Мен 2 сигманын божомолун сунуштайм. Же <1.0 маанисин калтырып, бул функцияны этибарга албай койсоңуз болот.

Чыгуу 1.0 нормага келтирилген бүткүл сыноо үчүн тармактын өлчөмү, жоготуу жана тармактын иштөө убактысынын графиги. Мисалы, бул жерде тармактын көлөмү сапатты жоготпостон дээрлик 2 эсеге кыскарган (100 миң салмактагы кичинекей конволюциялык тармак):

Convolutional тармактарды азайтуу үчүн Jedi техникасы - бутоо

Чуркоонун ылдамдыгы кадимки термелүүлөргө дуушар болот жана дээрлик өзгөрүүсүз калат. Бул үчүн түшүндүрмө бар:

  1. Конволюциялардын саны ыңгайлуу (32, 64, 128) видеокарталар үчүн эң ыңгайлуу эмес - 27, 51 ж.б. Мен бул жерде жаңылышы мүмкүн, бирок, балким, анын таасири бар.
  2. Архитектура кенен эмес, бирок ырааттуу. Туурасын кыскартуу менен биз тереңдикке таасирин тийгизбейбиз. Ошентип, жүктү азайтабыз, бирок ылдамдыкты өзгөртпөйбүз.

Ошентип, жакшыртуу CUDA жүктөмүнүн 20-30% га кыскарышынан байкалган, бирок иштөө убактысынын кыскарышынан эмес.

натыйжалары

ой жүгүртүп көрөлү. Биз кыркуунун 2 вариантын карап чыктык - YOLOv3 үчүн (колуңуз менен иштөө керек болгондо) жана жөнөкөй архитектурасы бар тармактар ​​үчүн. Эки учурда тең тактыкты жоготпостон, тармактын көлөмүн кыскартууга жана ылдамдатууга жетишүүгө мүмкүн экенин көрүүгө болот. Натыйжалар:

  • Өлчөмүн азайтуу
  • Ылдамдатуу чуркоо
  • CUDA жүктөмүн азайтуу
  • Натыйжада экологиялык тазалык (Эсептөө ресурстарын келечектеги пайдаланууну оптималдаштырабыз. Кайсы бир жерде бактылуу Грета Тунберг)

аппендикс

  • Бутоо кадамынан кийин, сиз квантизацияны кошо аласыз (мисалы, TensorRT менен)
  • Tensorflow үчүн мүмкүнчүлүктөрдү камсыз кылат аз_магнитудалуу_бутоо. Works.
  • репозиторий Мен өнүктүргүм келет жана жардам берүүгө кубанычта болом

Source: www.habr.com

Комментарий кошуу