Technika Jedi na redukciu konvolučných sietí – prerezávanie

Technika Jedi na redukciu konvolučných sietí – prerezávanie

Pred vami je opäť úloha detekcie objektov. Prioritou je rýchlosť prevádzky s prijateľnou presnosťou. Zoberiete architektúru YOLOv3 a ďalej ju trénujete. Presnosť (mAp75) je väčšia ako 0.95. Ale rýchlosť chodu je stále nízka. Sakra.

Dnes obídeme kvantovanie. A pod rezom sa pozrieme Modelové prerezávanie — orezanie nadbytočných častí siete na urýchlenie inferencie bez straty presnosti. Je jasné, kde, koľko a ako rezať. Poďme zistiť, ako to urobiť ručne a kde to môžete automatizovať. Na konci je úložisko na keras.

Úvod

V mojom predchádzajúcom pôsobisku, Macroscop v Perme, som si osvojil jeden zvyk - vždy sledovať čas vykonávania algoritmov. A vždy skontrolujte dobu prevádzky siete cez filter primeranosti. Zvyčajne najmodernejšie vo výrobe týmto filtrom neprejde, čo ma priviedlo k Pruningu.

Prerezávanie je stará téma, o ktorej sa diskutovalo v r Stanfordské prednášky v roku 2017. Hlavnou myšlienkou je zmenšiť veľkosť trénovanej siete bez straty presnosti odstránením rôznych uzlov. Znie to cool, ale o jeho použití počujem len zriedka. Pravdepodobne nie je dostatok implementácií, neexistujú žiadne články v ruskom jazyku, alebo to jednoducho každý považuje za prerezávanie know-how a mlčí.
Ale poďme si to rozobrať

Pohľad do biológie

Milujem, keď sa Deep Learning pozerá na myšlienky, ktoré pochádzajú z biológie. Rovnako ako evolúcii sa im dá dôverovať (vedeli ste, že ReLU je veľmi podobný? funkcia aktivácie neurónov v mozgu?)

Proces Model Pruning je tiež blízky biológii. Reakciu siete tu možno prirovnať k plasticite mozgu. V knihe je pár zaujímavých príkladov. Norman Doidge:

  1. Mozog ženy, ktorá sa narodila len s jednou polovicou, sa preprogramoval tak, aby vykonával funkcie chýbajúcej polovice.
  2. Ten chlap si odstrelil časť mozgu zodpovednú za videnie. Postupom času tieto funkcie prevzali iné časti mozgu. (nesnažíme sa opakovať)

Podobne môžete zo svojho modelu vystrihnúť niektoré slabé konvolúcie. Ako posledná možnosť zostávajúce zväzky pomôžu nahradiť odrezané.

Milujete Transfer Learning alebo sa učíte od nuly?

Možnosť číslo jedna. Používate Transfer Learning na Yolov3. Retina, Mask-RCNN alebo U-Net. Ale väčšinou nepotrebujeme rozpoznať 80 tried objektov ako v COCO. V mojej praxi je všetko obmedzené na ročníky 1-2. Dalo by sa predpokladať, že architektúra pre 80 tried je tu nadbytočná. To naznačuje, že architektúru je potrebné zmenšiť. Navyše by som to chcel urobiť bez straty existujúcich predtrénovaných váh.

Možnosť číslo dva. Možno máte veľa údajov a výpočtových zdrojov, alebo len potrebujete super-vlastnú architektúru. Nevadí. Ale učíte sa sieť od začiatku. Zvyčajný postup je pozrieť sa na dátovú štruktúru, vybrať architektúru, ktorá má NADMERNÝ výkon, a vytlačiť výpadky z preškolenia. Videl som 0.6 výpadkov, Karl.

V oboch prípadoch je možné sieť zredukovať. Motivovaný. Teraz poďme zistiť, aký druh obriezky je prerezávanie

Všeobecný algoritmus

Rozhodli sme sa, že môžeme odstrániť zväzky. Vyzerá to celkom jednoducho:

Technika Jedi na redukciu konvolučných sietí – prerezávanie

Odstránenie akejkoľvek konvolúcie je pre sieť stresujúce, čo zvyčajne vedie k určitému zvýšeniu chybovosti. Na jednej strane je toto zvýšenie chybovosti indikátorom toho, ako správne odstraňujeme konvolúcie (napríklad veľký nárast naznačuje, že niečo robíme zle). Ale malé zvýšenie je celkom prijateľné a často sa eliminuje následným ľahkým doplnkovým tréningom s malým LR. Pridajte ďalší tréningový krok:

Technika Jedi na redukciu konvolučných sietí – prerezávanie

Teraz musíme zistiť, kedy chceme zastaviť cyklus učenia<->prerezávania. Tu môžu existovať exotické možnosti, keď potrebujeme zmenšiť sieť na určitú veľkosť a rýchlosť (napríklad pre mobilné zariadenia). Najbežnejšou možnosťou je však pokračovať v cykle, kým sa chyba nestane vyššou, ako je prijateľné. Pridajte podmienku:

Technika Jedi na redukciu konvolučných sietí – prerezávanie

Algoritmus je teda jasný. Zostáva zistiť, ako určiť vymazané konvolúcie.

Vyhľadajte odstránené balíky

Musíme odstrániť niektoré zákruty. Ponáhľať sa dopredu a „zastreliť“ kohokoľvek je zlý nápad, aj keď to bude fungovať. Ale keďže máte hlavu, môžete premýšľať a pokúsiť sa vybrať „slabé“ konvolúcie na odstránenie. Existuje niekoľko možností:

  1. Najmenšia miera L1 alebo low_magnitude_pruning. Myšlienka, že konvolúcie s malými váhami málo prispievajú ku konečnému rozhodnutiu
  2. Najmenšia miera L1 zohľadňujúca priemer a štandardnú odchýlku. Dopĺňame o posúdenie charakteru distribúcie.
  3. Maskovanie konvolúcií a vylúčenie tých, ktoré najmenej ovplyvňujú konečnú presnosť. Presnejšie určenie nevýznamných konvolúcií, ale veľmi náročné na čas a zdroje.
  4. Ostatné

Každá z možností má právo na život a svoje vlastné implementačné prvky. Tu zvažujeme možnosť s najmenšou mierou L1

Manuálny proces pre YOLOv3

Pôvodná architektúra obsahuje zvyškové bloky. Ale bez ohľadu na to, aké cool sú pre hlboké siete, budú nám trochu prekážať. Problém je v tom, že nemôžete odstrániť vyrovnania s rôznymi indexmi v týchto vrstvách:

Technika Jedi na redukciu konvolučných sietí – prerezávanie

Vyberme si preto vrstvy, z ktorých môžeme vyrovnania voľne odstraňovať:

Technika Jedi na redukciu konvolučných sietí – prerezávanie

Teraz zostavme pracovný cyklus:

  1. Nahrávanie aktivácií
  2. Zistiť, koľko znížiť
  3. Vystrihnúť
  4. Učenie 10 epoch s LR=1e-4
  5. Testovanie

Vykladanie závitov je užitočné na odhadnutie, ktorú časť môžeme v určitom kroku odstrániť. Príklady vykládky:

Technika Jedi na redukciu konvolučných sietí – prerezávanie

Vidíme, že takmer všade má 5 % konvolúcií veľmi nízku normu L1 a môžeme ich odstrániť. Pri každom kroku sa toto vykladanie opakovalo a posudzovalo sa, ktoré vrstvy a koľko je možné vyrezať.

Celý proces bol dokončený v 4 krokoch (čísla tu a všade pre RTX 2060 Super):

Krok map75 Počet parametrov, milión Veľkosť siete, mb Z počiatočného, ​​% Doba chodu, slečna Stav obriezky
0 0.9656 60 241 100 180 -
1 0.9622 55 218 91 175 5 % zo všetkých
2 0.9625 50 197 83 168 5 % zo všetkých
3 0.9633 39 155 64 155 15 % pre vrstvy so 400+ zákrutami
4 0.9555 31 124 51 146 10 % pre vrstvy so 100+ zákrutami

V kroku 2 bol pridaný jeden pozitívny efekt – veľkosť dávky 4 sa zmestila do pamäte, čo značne urýchlilo proces dodatočného tréningu.
V kroku 4 bol proces zastavený, pretože ani dlhodobý dodatočný tréning nezvýšil mAp75 na staré hodnoty.
V dôsledku toho sa nám podarilo urýchliť odvodenie o 15%, zmenšiť veľkosť o 35% a nie stratiť presne.

Automatizácia pre jednoduchšie architektúry

Pre jednoduchšie sieťové architektúry (bez podmieneného pridávania, zreťazenia a reziduálnych blokov) je celkom možné zamerať sa na spracovanie všetkých konvolučných vrstiev a automatizovať proces odstraňovania konvolúcií.

Túto možnosť som implementoval tu.
Je to jednoduché: potrebujete iba stratovú funkciu, optimalizátor a dávkové generátory:

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)

V prípade potreby môžete zmeniť konfiguračné parametre:

{
    "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
}

Okrem toho je implementované obmedzenie založené na štandardnej odchýlke. Cieľom je obmedziť časť, ktorá sa odstraňuje, s vylúčením konvolúcií s už „dostatočnými“ mierami L1:

Technika Jedi na redukciu konvolučných sietí – prerezávanie

Umožňujeme vám teda odstrániť iba slabé konvolúcie z distribúcií podobných tej pravej a neovplyvniť odstránenie z distribúcií podobných tej ľavej:

Technika Jedi na redukciu konvolučných sietí – prerezávanie

Keď sa distribúcia blíži k normálu, koeficient orezania_štandardnej_deviácie_časti možno vybrať z:

Technika Jedi na redukciu konvolučných sietí – prerezávanie
Odporúčam predpoklad 2 sigma. Alebo môžete túto funkciu ignorovať a ponechať hodnotu < 1.0.

Výstupom je graf veľkosti siete, straty a doby prevádzky siete pre celý test, normalizovaný na 1.0. Napríklad tu sa veľkosť siete znížila takmer 2-krát bez straty kvality (malá konvolučná sieť s hmotnosťou 100 XNUMX):

Technika Jedi na redukciu konvolučných sietí – prerezávanie

Rýchlosť chodu podlieha bežným výkyvom a zostáva prakticky nezmenená. Existuje na to vysvetlenie:

  1. Počet závitov sa mení z vhodných (32, 64, 128) na nie najvhodnejšie pre grafické karty - 27, 51 atď. Tu sa môžem mýliť, ale s najväčšou pravdepodobnosťou to má vplyv.
  2. Architektúra nie je široká, ale konzistentná. Zmenšením šírky neovplyvníme hĺbku. Tým pádom znížime záťaž, no rýchlosť nemeníme.

Zlepšenie sa preto prejavilo v znížení zaťaženia CUDA počas behu o 20-30%, ale nie v skrátení času behu

Výsledky

Zamyslime sa. Zvažovali sme 2 možnosti orezania – pre YOLOv3 (keď musíte pracovať rukami) a pre siete s jednoduchšou architektúrou. Je vidieť, že v oboch prípadoch je možné dosiahnuť zmenšenie veľkosti siete a jej zrýchlenie bez straty presnosti. Výsledky:

  • Zmenšenie veľkosti
  • Akceleračný beh
  • Zníženie zaťaženia CUDA
  • Výsledkom je šetrnosť k životnému prostrediu (Optimalizujeme budúce využitie výpočtových zdrojov. Niekde je človek šťastný Greta Thunbergová)

Dodatok

  • Po kroku orezania môžete pridať kvantizáciu (napríklad pomocou TensorRT)
  • Tensorflow poskytuje možnosti pre low_magnitude_pruning. Tvorba.
  • Úložisko Chcem sa rozvíjať a rád pomôžem

Zdroj: hab.com

Pridať komentár