Convolutional Networks අඩු කිරීම සඳහා Jedi තාක්ෂණය - කප්පාදු කිරීම

Convolutional Networks අඩු කිරීම සඳහා Jedi තාක්ෂණය - කප්පාදු කිරීම

ඔබට පෙර නැවතත් වස්තූන් හඳුනාගැනීමේ කාර්යය වේ. ප්රමුඛත්වය - පිළිගත හැකි නිරවද්යතාවකින් වැඩ කිරීමේ වේගය. ඔබ YOLOv3 ගෘහ නිර්මාණ ශිල්පය ගෙන එය තවදුරටත් පුහුණු කරන්න. නිරවද්‍යතාවය(mAp75) 0.95ට වඩා වැඩිය. නමුත් ධාවන වේගය තවමත් අඩුයි. ජරාව.

අද අපි ප්‍රමාණකරණය මඟ හරිමු. සහ කප්පාදුව යටතේ, සලකා බලන්න ආදර්ශ කප්පාදුව - නිරවද්‍යතාවය නැති නොවී අනුමානය වේගවත් කිරීම සඳහා ජාලයේ අතිරික්ත කොටස් කපා හැරීම. පැහැදිලිවම - කොහෙද, කොපමණ සහ කෙසේද කපා. එය අතින් කරන්නේ කෙසේද සහ ඔබට ස්වයංක්‍රීය කළ හැක්කේ කොතැනදැයි සොයා බලමු. අවසානයේ කෙරස් මත ගබඩාවක් ඇත.

හැඳින්වීම

මගේ අවසාන සේවා ස්ථානය වන පර්ම් හි මැක්‍රොස්කොප් හි මම එක් පුරුද්දක් ලබා ගත්තෙමි - ඇල්ගොරිතම ක්‍රියාත්මක වන කාලය සැමවිටම නිරීක්ෂණය කිරීම. තවද ජාල ධාවන කාලය සෑම විටම ප්‍රමාණවත් පෙරහන හරහා පරීක්ෂා කළ යුතුය. සාමාන්‍යයෙන් නිෂ්පාදනයේ නවීනතම මෙම පෙරහන පසුකර නොයන අතර, එය මා කප්පාදුවට ගෙන ගියේය.

කප්පාදුව යනු සාකච්ඡා කරන ලද පැරණි මාතෘකාවකි ස්ටැන්ෆර්ඩ් දේශන 2017 දී. ප්රධාන අදහස වන්නේ විවිධ නෝඩ් ඉවත් කිරීමෙන් නිරවද්යතාව අහිමි නොවී පුහුණු කළ ජාලයේ ප්රමාණය අඩු කිරීමයි. එය සිසිල් බව පෙනේ, නමුත් එහි භාවිතය ගැන මට ඇසෙන්නේ කලාතුරකිනි. බොහෝ විට, ප්රමාණවත් ක්රියාත්මක කිරීම් නොමැත, රුසියානු භාෂා ලිපි නොමැත, නැතහොත් සරලව සෑම දෙනාම කප්පාදු දැනුම සලකා බලන අතර නිහඬව සිටිති.
නමුත් විසුරුවා හැරීමට

ජීව විද්යාව පිළිබඳ සොයා බැලීමක්

ජීව විද්‍යාවෙන් එන අදහස් ගැඹුරු ඉගෙනීම දෙස බලන විට මම එයට කැමතියි. පරිණාමය වැනි ඒවා විශ්වාස කළ හැකිය (ReLU බොහෝ දුරට සමාන බව ඔබ දන්නවාද? මොළයේ නියුරෝන සක්රිය කිරීමේ කාර්යය?)

ආදර්ශ කප්පාදු කිරීමේ ක්‍රියාවලිය ජීව විද්‍යාවට ද සමීප වේ. මෙහි ඇති ජාලයේ ප්රතික්රියාව මොළයේ ප්ලාස්ටික් සමග සැසඳිය හැක. පොතේ රසවත් උදාහරණ කිහිපයක් තිබේ. නෝමන් ඩොයිඩ්ජ්:

  1. එක් භාගයක් පමණක් සමඟ උපත ලැබූ කාන්තාවකගේ මොළය අතුරුදහන් වූ අර්ධයේ කාර්යයන් ඉටු කිරීම සඳහා ප්‍රතිනිර්මාණය විය.
  2. මිනිහා දර්ශනය සඳහා වගකිව යුතු ඔහුගේ මොළයේ කොටස කපා දැමීය. කාලයත් සමඟ මොළයේ අනෙකුත් කොටස් මෙම කාර්යයන් භාර ගත්තේය. (නැවත කිරීමට උත්සාහ නොකරන්න)

එබැවින් ඔබේ ආකෘතියෙන්, ඔබට දුර්වල කැටයම් කිහිපයක් කපා ගත හැකිය. ආන්තික අවස්ථාවන්හිදී, ඉතිරි මිටි කපන ලද ඒවා වෙනුවට උපකාර කරනු ඇත.

ඔබ ස්ථාන මාරු ඉගෙනීමට ආදරය කරනවාද නැතිනම් මුල සිටම ඉගෙන ගන්නවාද?

විකල්ප අංක එක. ඔබ Yolov3 හි ස්ථාන මාරු ඉගෙනීම භාවිතා කරයි. Retina, Mask-RCNN හෝ U-Net. නමුත් ගොඩක් වෙලාවට අපිට COCO වල වගේ object class 80ක් හඳුනාගන්න අවශ්‍ය නැහැ. මගේ ප්රායෝගිකව, සෑම දෙයක්ම පන්ති 1-2 කට සීමා වේ. පන්ති 80 සඳහා ගෘහ නිර්මාණ ශිල්පය මෙහි අතිරික්ත බව උපකල්පනය කළ හැකිය. වාස්තු ශාස් ත් රය අඩු කරන්න ඕන කියන සිතිවිල්ල මතු වෙනවා. එපමණක් නොව, දැනට පවතින පූර්ව පුහුණු බර අඩු නොකර මෙය කිරීමට මම කැමතියි.

විකල්ප අංක දෙක. සමහර විට ඔබ සතුව දත්ත සහ පරිගණක සම්පත් විශාල ප්‍රමාණයක් ඇත, නැතහොත් ඔබට සුපිරි අභිරුචි ගෘහ නිර්මාණ ශිල්පයක් අවශ්‍ය වේ. කමක් නෑ. නමුත් ඔබ මුල සිටම ජාලය ඉගෙන ගන්නවා. සාමාන්‍ය අනුපිළිවෙල - අපි දත්ත ව්‍යුහය දෙස බලමින්, බලය අනුව අතිවිශාල ගෘහනිර්මාණයක් තෝරාගෙන නැවත පුහුණුවීම් වලින් ඉවත් වූවන් තල්ලු කරමු. මම දැක්කා 0.6 ඩ්‍රොප්වුට්, කාල්.

අවස්ථා දෙකේදීම, ජාලය අඩු කළ හැකිය. උසස් කළා. දැන් අපි චර්මච්ඡේදනය කප්පාදුව කුමක්දැයි සොයා බලමු

සාමාන්ය ඇල්ගොරිතම

අපි කැළඹීම් ඉවත් කළ හැකි බව අපි තීරණය කළා. එය ඉතා සරල බව පෙනේ:

Convolutional Networks අඩු කිරීම සඳහා Jedi තාක්ෂණය - කප්පාදු කිරීම

කිසියම් කැළඹීමක් ඉවත් කිරීම ජාලයට ආතතියකි, එය සාමාන්‍යයෙන් දෝෂයේ යම් වැඩි වීමක් ඇති කරයි. එක් අතකින්, මෙම දෝෂය වැඩි වීම යනු අප සංකෝචන ඉවත් කරන ආකාරය පිළිබඳ දර්ශකයකි (උදාහරණයක් ලෙස, විශාල වැඩිවීමක් පෙන්නුම් කරන්නේ අප වැරදි දෙයක් කරන බවයි). නමුත් කුඩා වැඩි වීමක් බෙහෙවින් පිළිගත හැකි අතර කුඩා LR සමඟ පසුව ආලෝකය නැවත පුහුණු කිරීම මගින් බොහෝ විට ඉවත් කරනු ලැබේ. නැවත පුහුණු කිරීමේ පියවරක් එකතු කිරීම:

Convolutional Networks අඩු කිරීම සඳහා Jedi තාක්ෂණය - කප්පාදු කිරීම

දැන් අපි අපේ Learning<->Pruning loop එක නතර කිරීමට අවශ්‍ය වන්නේ කවදාදැයි සොයා බැලිය යුතුයි. අපට ජාලය යම් ප්‍රමාණයකට අඩු කිරීමට සහ ධාවන වේගය (උදාහරණයක් ලෙස, ජංගම උපාංග සඳහා) අවශ්‍ය වූ විට මෙහි විදේශීය විකල්ප තිබිය හැකිය. කෙසේ වෙතත්, වඩාත් පොදු විකල්පය වන්නේ දෝෂය අවසර ලත් එකට වඩා විශාල වන තුරු ලූපය දිගටම කරගෙන යාමයි. කොන්දේසියක් එකතු කිරීම:

Convolutional Networks අඩු කිරීම සඳහා Jedi තාක්ෂණය - කප්පාදු කිරීම

එබැවින්, ඇල්ගොරිතම පැහැදිලි වේ. ඉවත් කළ යුතු කැළඹීම් තීරණය කරන්නේ කෙසේදැයි සොයා ගැනීමට එය ඉතිරිව ඇත.

ඉවත් කළ මිටි සොයා ගැනීම

අපි සමහර කම්පන ඉවත් කළ යුතුයි. ඕනෑම දෙයක් ඉදිරියට ගෙන ගොස් "වෙඩි තැබීම" නරක අදහසකි, නමුත් එය සාර්ථක වනු ඇත. නමුත් හිසක් ඇති බැවින්, මකාදැමීම සඳහා "දුර්වල" කැටි ගැසීම් තෝරා ගැනීමට ඔබට සිතා බැලිය හැකිය. විකල්ප කිහිපයක් තිබේ:

  1. අඩුම L1-මිනුම් හෝ අඩු_විශාල_ කප්පාදුව. කුඩා බර සහිත කැටි ගැසීම් අවසාන තීරණයට දායක වන්නේ අල්ප වශයෙනි
  2. මධ්යන්ය සහ සම්මත අපගමනය ලබා දී ඇති කුඩාම L1 මිනුම. බෙදා හැරීමේ ස්වභාවය පිළිබඳ ඇස්තමේන්තුවක් සමඟ අපි අතිරේක කරමු.
  3. අවසාන නිරවද්‍යතාවයට අවම බලපෑමක් ඇති කරන ඒවා Convolution ආවරණ සහ බැහැර කිරීම. නොවැදගත් කැළඹීම් පිළිබඳ වඩාත් නිවැරදි අර්ථ දැක්වීම, නමුත් ඉතා කාලය සහ සම්පත් පරිභෝජනය.
  4. වෙනත්

සෑම විකල්පයකටම ජීවත්වීමේ අයිතිය සහ එහි ක්රියාත්මක කිරීමේ ලක්ෂණ ඇත. මෙහිදී අපි කුඩාම L1-මිනුම් සහිත ප්රභේදය සලකා බලමු

YOLov3 සඳහා අතින් ක්‍රියාවලිය

මුල් ගෘහ නිර්මාණ ශිල්පයේ අවශේෂ කොටස් අඩංගු වේ. නමුත් ගැඹුරු ජාල සඳහා ඔවුන් කොතරම් සිසිල් වුවත්, ඔවුන් අපට ටිකක් බාධා කරයි. දුෂ්කරතාවය නම් ඔබට මෙම ස්ථරවල විවිධ දර්ශක සමඟ ප්‍රතිසන්ධාන මකා දැමිය නොහැකි වීමයි:

Convolutional Networks අඩු කිරීම සඳහා Jedi තාක්ෂණය - කප්පාදු කිරීම

එබැවින්, අපි නිදහසේ ප්රතිසන්ධාන ඉවත් කළ හැකි ස්ථර තෝරා ගනිමු:

Convolutional Networks අඩු කිරීම සඳහා Jedi තාක්ෂණය - කප්පාදු කිරීම

දැන් අපි වැඩ චක්රයක් ගොඩනඟමු:

  1. සක්‍රිය කිරීම් උඩුගත කිරීම
  2. කොපමණ කපා ගත යුතුද යන්න සොයා බැලීම
  3. කපා දමනවා
  4. LR=10e-1 සමඟ යුග 4ක් ඉගෙනීම
  5. පරීක්ෂා කිරීම

කිසියම් පියවරකදී අපට කොපමණ ප්‍රමාණයක් ඉවත් කළ හැකිද යන්න තක්සේරු කිරීමට රෝල්අප් බෑම ප්‍රයෝජනවත් වේ. උදාහරණ උඩුගත කරන්න:

Convolutional Networks අඩු කිරීම සඳහා Jedi තාක්ෂණය - කප්පාදු කිරීම

සෑම තැනකම පාහේ 5% කැළඹීම් ඉතා අඩු L1-සම්මතයක් ඇති බව අපට පෙනෙන අතර අපට ඒවා ඉවත් කළ හැකිය. සෑම පියවරකදීම, එවැනි බෑමක් නැවත නැවතත් සිදු කරන ලද අතර කුමන ස්ථර සහ කොපමණ කපා ගත හැකිද යන්න තක්සේරු කිරීම සිදු කරන ලදී.

සම්පූර්ණ ක්‍රියාවලිය පියවර 4කට ගැලපේ (මෙහි සහ සෑම තැනකම RTX 2060 Super සඳහා අංක):

පියවර සිතියම75 පරාමිති ගණන, මිලියන ජාල ප්‍රමාණය, 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-මිනුම් සහිත කැළඹීම් හැර ඉවත් කරන ලද කොටස සීමා කිරීමයි:

Convolutional Networks අඩු කිරීම සඳහා Jedi තාක්ෂණය - කප්පාදු කිරීම

මේ අනුව, අපි දකුණට සමාන බෙදාහැරීම් වලින් දුර්වල කැළඹීම් පමණක් ඉවත් කිරීමට ඉඩ දෙන අතර වමට සමාන බෙදාහැරීම් වලින් ඉවත් කිරීමට බලපාන්නේ නැත:

Convolutional Networks අඩු කිරීම සඳහා Jedi තාක්ෂණය - කප්පාදු කිරීම

බෙදා හැරීම සාමාන්‍ය මට්ටමට ළඟා වන විට, කප්පාදු_සම්මත_අපගමනය_කොටස සංගුණකය තෝරා ගත හැක:

Convolutional Networks අඩු කිරීම සඳහා Jedi තාක්ෂණය - කප්පාදු කිරීම
මම 2 සිග්මා උපකල්පනයක් නිර්දේශ කරමි. නැතහොත් ඔබට < 1.0 අගය හැර මෙම විශේෂාංගය නොසලකා හැරිය හැක.

ප්‍රතිදානය යනු 1.0 දක්වා සාමාන්‍යකරණය කරන ලද සම්පූර්ණ පරීක්ෂණය පුරාවටම ජාල ප්‍රමාණය, අලාභය සහ ජාල ධාවන කාලය පිළිබඳ ප්‍රස්ථාරයකි. උදාහරණයක් ලෙස, මෙහි ජාලයේ ප්‍රමාණය ගුණාත්මක බවින් තොරව 2 ගුණයකින් පමණ අඩු කර ඇත (බර 100k සඳහා කුඩා පරිවර්තන ජාලයක්):

Convolutional Networks අඩු කිරීම සඳහා Jedi තාක්ෂණය - කප්පාදු කිරීම

ධාවන වේගය සාමාන්‍ය උච්චාවචනයන්ට යටත් වන අතර බොහෝ වෙනස් වී නොමැත. මේ සඳහා පැහැදිලි කිරීමක් තිබේ:

  1. කැටි ගැසීම් ගණන පහසු (32, 64, 128) සිට වීඩියෝ කාඩ්පත් සඳහා වඩාත් පහසු නොවන බවට වෙනස් වේ - 27, 51, ආදිය. මම මෙහි වැරදි විය හැක, නමුත් එය බොහෝ විට සිදු වේ.
  2. ගෘහ නිර්මාණ ශිල්පය පුළුල් නොවේ, නමුත් ස්ථාවරයි. පළල අඩු කිරීමෙන්, අපි ගැඹුර ස්පර්ශ නොකරමු. මේ අනුව, අපි බර අඩු කරන්නෙමු, නමුත් වේගය වෙනස් නොකරන්න.

එබැවින්, ධාවන කාලය තුළ CUDA හි බර 20-30% කින් අඩුවීමකින් වැඩි දියුණුවක් ප්‍රකාශ විය, නමුත් ධාවන කාලයෙහි අඩු වීමක් නොවේ.

ප්රතිඵල

අපි පරාවර්තනය කරමු. අපි කප්පාදු විකල්ප 2 ක් සලකා බැලුවෙමු - YOLOv3 සඳහා (ඔබේ දෑතින් වැඩ කිරීමට සිදු වූ විට) සහ සරල ගෘහ නිර්මාණ ශිල්පය සහිත ජාල සඳහා. අවස්ථා දෙකේදීම ජාලයේ ප්‍රමාණයේ අඩුවීමක් සහ නිරවද්‍යතාව නැතිවීමකින් තොරව ත්වරණය ලබා ගත හැකි බව දැකගත හැකිය. ප්රතිපල:

  • ප්රමාණය අඩු කිරීම
  • ත්වරණය ධාවනය කරන්න
  • CUDA බර අඩු කිරීම
  • එහි ප්‍රතිඵලයක් වශයෙන්, පරිසර හිතකාමීත්වය (පරිගණක සම්පත් අනාගත භාවිතය අපි ප්‍රශස්ත කරමු. කොහේ හරි කෙනෙක් ප්‍රීති වේ ග්‍රේටා තුන්බර්ග්)

උපග්රන්ථය

  • කප්පාදු කිරීමේ පියවරෙන් පසු, ඔබට ප්‍රමාණකරණය ද වෙනස් කළ හැකිය (උදාහරණයක් ලෙස, TensorRT සමඟ)
  • Tensorflow පහසුකම් සපයයි අඩු_විශාල_කප්පාදුව. කටයුතු.
  • ගබඩාව මට සංවර්ධනය කිරීමට අවශ්‍ය වන අතර උදව් කිරීමට මම සතුටු වෙමි

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න