Convolutional тармактарды азайтуу үчүн Jedi техникасы - бутоо
Сиздин алдыңызда дагы объекттерди аныктоо милдети турат. Приоритет - алгылыктуу тактык менен иштөө ылдамдыгы. Сиз YOLOv3 архитектурасын алып, андан ары үйрөтөсүз. Тактык (mAp75) 0.95тен жогору. Бирок чуркоо көрсөткүчү дагы эле төмөн. Crap.
Бүгүн биз квантташтыруудан өтөбүз. Ал эми кесилген астынан карап чыгабыз Үлгү кесүү — тактыкты жоготпостон корутундуну тездетүү үчүн тармактын ашыкча бөлүктөрүн кесүү. Кайда, канча жана кантип кесүү керектиги түшүнүктүү. Келгиле, муну кол менен кантип жасоону жана аны кайда автоматташтырууга болорун карап көрөлү. Аягында керас боюнча репозиторий бар.
тааныштыруу
Мурунку иштеген жеримде, Пермдеги Макроскопто мен бир адатка ээ болдум - алгоритмдердин аткарылуу убактысын ар дайым көзөмөлдөө. Жана ар дайым тармактын иштөө убактысын адекваттуулук чыпкасы аркылуу текшериңиз. Адатта өндүрүштө заманбап бул чыпкадан өтпөйт, бул мени Бутоого алып келди.
Бутоо - бул талкууланган эски тема Стэнфорд лекциялары 2017-жылы. Негизги идея - ар кандай түйүндөрдү алып салуу менен тактыкты жоготпостон, үйрөтүлгөн тармактын көлөмүн азайтуу. Бул сонун угулат, бирок мен аны колдонуу жөнүндө сейрек угам. Мүмкүн, ишке ашыруулар жетишсиз, орус тилдүү макалалар жок, же жөн эле бардыгы муну «ноу-хау» деп эсептеп, унчукпай отурушат.
Бирок аны бөлүп алалы
Биологияга бир көз караш
Deep Learning биологиядан келген идеяларды караганы мага жагат. Алар, эволюция сыяктуу эле, ишенсе болот (сиз ReLU абдан окшош экенин билесизби мээдеги нейрондорду активдештирүү функциясы?)
Үлгү кесүү процесси да биологияга жакын. Тармактын бул жердеги жообун мээнин пластикасы менен салыштырууга болот. Китепте бир нече кызыктуу мисалдар бар. Норман Доидж:
Бир жарымы менен төрөлгөн аялдын мээси жетишпеген жарымынын функцияларын аткаруу үчүн өзүн кайра программалаган.
Жигит мээсинин көрүү үчүн жооптуу бөлүгүн атып салган. Убакыттын өтүшү менен мээнин башка бөлүктөрү бул функцияларды аткарышкан. (биз кайталаганга аракет кылбайбыз)
Ошо сыяктуу эле, сиз моделиңизден кээ бир алсыз бурмаларды кесип салсаңыз болот. Акыркы чара катары, калган байламдар кесилгендерди алмаштырууга жардам берет.
Сиз Transfer Learningди жакшы көрөсүзбү же нөлдөн баштап үйрөнүп жатасызбы?
Биринчи вариант. Сиз Yolov3 боюнча Transfer Learning колдоносуз. Retina, Mask-RCNN же U-Net. Бирок көбүнчө COCO сыяктуу 80 объект классын таануунун кереги жок. Менин практикамда баары 1-2-класстар менен чектелет. Бул жерде 80 класс үчүн архитектура ашыкча деп божомолдоого болот. Бул архитектураны кичирейтүү керек экенин көрсөтүп турат. Болгондо да алдын ала даярдалган салмактарды жоготпой муну жасагым келет.
Экинчи вариант. Балким, сизде көптөгөн маалыматтар жана эсептөө ресурстары бар же жөн гана супер-көнүмүш архитектура керек. Маанилүү эмес. Бирок сиз тармакты нөлдөн баштап үйрөнүп жатасыз. Кадимки жол-жобосу маалымат түзүмүн карап, кубаттуулугу АШЫК архитектураны тандоо жана кайра окутуудан четтеп калгандарды түртүү. Мен 0.6 окуучуну көрдүм, Карл.
Эки учурда тең тармакты кыскартууга болот. Мотивацияланган. Эми сүннөт кесүү кандай экенин аныктап көрөлү
Жалпы алгоритм
Биз таңгактарды алып салууну чечтик. Бул абдан жөнөкөй көрүнөт:
Кандайдыр бир конволюцияны алып салуу тармак үчүн стресс болуп саналат, бул адатта катанын бир аз көбөйүшүнө алып келет. Бир жагынан алганда, катанын бул көбөйүшү конволюцияларды канчалык туура алып салганыбыздын көрсөткүчү (мисалы, чоң өсүү биз туура эмес кылып жатканыбызды көрсөтүп турат). Бирок бир аз өсүш абдан алгылыктуу болуп саналат жана көп учурда кичинекей LR менен кийинки жарык кошумча окутуу менен жок кылынат. Кошумча окутуу кадамын кошуу:
Эми биз Learning<->Pruning циклибизди качан токтоткубуз келгенин аныкташыбыз керек. Тармакты белгилүү бир өлчөмдө жана ылдамдыкта (мисалы, мобилдик түзмөктөр үчүн) азайтуу керек болгондо, бул жерде экзотикалык варианттар болушу мүмкүн. Бирок, эң кеңири таралган вариант - ката алгылыктуудан жогору болгонго чейин циклди улантуу. Шарт кошуу:
Ошентип, алгоритм айкын болуп калат. Жок кылынган конволюцияларды кантип аныктоо керек.
Жок кылынган таңгактарды издөө
Биз кээ бир бурмалоолорду алып салышыбыз керек. Алдыга умтулуу жана кимдир-бирөөнү "атуу" жаман идея, бирок ал ишке ашат. Бирок башыңыз бар болгондуктан, сиз ойлонуп, алып салуу үчүн "алсыз" конволюцияларды тандап алууга аракет кылсаңыз болот. Бир нече варианттар бар:
Варианттардын ар бири жашоого укуктуу жана өзүнүн ишке ашыруу өзгөчөлүктөрүнө ээ. Бул жерде биз эң кичине L1-өлчөмү бар вариантты карап чыгабыз
YOLOv3 үчүн кол процесси
Баштапкы архитектура калдык блокторду камтыйт. Бирок алар терең тармактар үчүн канчалык салкын болбосун, алар бизге кандайдыр бир деңгээлде тоскоол болот. Кыйынчылык - бул катмарлардагы ар кандай индекстер менен элдештирүүлөрдү жок кыла албайсыз:
Ошондуктан, келгиле, жарашууларды эркин жок кыла турган катмарларды тандап алалы:
Эми жумуш циклин түзөлү:
Жүктөлүп жаткан активдештирүүлөр
Канча кесүү керек экенин аныктоо
Аны кесип
LR=10e-1 менен 4 доорду үйрөнүү
Сыноо
Конволюцияларды түшүрүү биз белгилүү бир кадамда канча бөлүгүн алып салууга болорун эсептөө үчүн пайдалуу. Жүктөө мисалдары:
Биз дээрлик бардык жерде конволюциялардын 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 чаралары менен конволюцияларды кошпогондо, алынып салынган бөлүгүн чектөө:
Ошентип, биз сизге оңго окшош бөлүштүрүүдөн алсыз конволяцияларды гана алып салууга уруксат беребиз жана солго окшош бөлүштүрүүдөн алып салууга таасирин тийгизбейбиз:
Мен 2 сигманын божомолун сунуштайм. Же <1.0 маанисин калтырып, бул функцияны этибарга албай койсоңуз болот.
Чыгуу 1.0 нормага келтирилген бүткүл сыноо үчүн тармактын өлчөмү, жоготуу жана тармактын иштөө убактысынын графиги. Мисалы, бул жерде тармактын көлөмү сапатты жоготпостон дээрлик 2 эсеге кыскарган (100 миң салмактагы кичинекей конволюциялык тармак):
Чуркоонун ылдамдыгы кадимки термелүүлөргө дуушар болот жана дээрлик өзгөрүүсүз калат. Бул үчүн түшүндүрмө бар:
Конволюциялардын саны ыңгайлуу (32, 64, 128) видеокарталар үчүн эң ыңгайлуу эмес - 27, 51 ж.б. Мен бул жерде жаңылышы мүмкүн, бирок, балким, анын таасири бар.
Архитектура кенен эмес, бирок ырааттуу. Туурасын кыскартуу менен биз тереңдикке таасирин тийгизбейбиз. Ошентип, жүктү азайтабыз, бирок ылдамдыкты өзгөртпөйбүз.
Ошентип, жакшыртуу CUDA жүктөмүнүн 20-30% га кыскарышынан байкалган, бирок иштөө убактысынын кыскарышынан эмес.
натыйжалары
ой жүгүртүп көрөлү. Биз кыркуунун 2 вариантын карап чыктык - YOLOv3 үчүн (колуңуз менен иштөө керек болгондо) жана жөнөкөй архитектурасы бар тармактар үчүн. Эки учурда тең тактыкты жоготпостон, тармактын көлөмүн кыскартууга жана ылдамдатууга жетишүүгө мүмкүн экенин көрүүгө болот. Натыйжалар:
Өлчөмүн азайтуу
Ылдамдатуу чуркоо
CUDA жүктөмүн азайтуу
Натыйжада экологиялык тазалык (Эсептөө ресурстарын келечектеги пайдаланууну оптималдаштырабыз. Кайсы бир жерде бактылуу Грета Тунберг)
аппендикс
Бутоо кадамынан кийин, сиз квантизацияны кошо аласыз (мисалы, TensorRT менен)