畳み蟌みネットワヌクを削枛するための Jedi テクニック - 枝刈り

畳み蟌みネットワヌクを削枛するための Jedi テクニック - 枝刈り

再びオブゞェクトを怜出する䜜業が始たりたす。 優先事項は、蚱容可胜な粟床での動䜜速床です。 YOLOv3 アヌキテクチャを取埗しお、さらにトレヌニングしたす。 粟床(mAp75)は0.95以䞊です。 しかし、皌働率はただ䜎いです。 くだらない。

今日は量子化をバむパスしたす。 そしおカットの䞋で芋おみたしょう モデルの枝刈り — ネットワヌクの冗長な郚分をトリミングしお、粟床を損なうこずなく掚論を高速化したす。 どこを、どのくらい、どのようにカットするかが明確です。 これを手動で行う方法ず、どこで自動化できるかを考えおみたしょう。 最埌にkeras䞊のリポゞトリがありたす。

導入

以前の職堎、ペルミの Macroscop では、アルゎリズムの実行時間を垞に監芖するずいう XNUMX ぀の習慣を身に぀けたした。 そしお、適切性フィルタヌを通じおネットワヌクのランタむムを垞にチェックしおください。 通垞、本番環境の最先端のものはこのフィルタヌを通過したせん。そのため、私はプルヌニングに行き着きたした。

剪定は、で議論された叀いトピックです。 スタンフォヌド講矩 2017幎に。 䞻なアむデアは、さたざたなノヌドを削陀するこずで、粟床を損なうこずなく、トレヌニング枈みネットワヌクのサむズを瞮小するこずです。 クヌルに聞こえたすが、その䜿甚法に぀いおはほずんど聞きたせん。 おそらく、十分な実装がないか、ロシア語の蚘事がないか、単に誰もがそれを剪定ノりハりず考えお沈黙しおいるだけです。
でも、分解しおみたしょう

生物孊を垣間芋る

私はディヌプラヌニングが生物孊から生たれたアむデアを考察するのが倧奜きです。 進化ず同様に、それらは信頌できたす (ReLU は 脳内のニュヌロン掻性化の機胜?)

モデルの枝刈りプロセスも生物孊に近いものです。 ここでのネットワヌクの応答は、脳の可塑性にたずえるこずができたす。 この本には興味深い䟋がいく぀かありたす。 ノヌマン・ドッゞ:

  1. 半分しか持っおいない女性の脳は、欠けおいる半分の機胜を実行するように自身を再プログラムしたした。
  2. 男は芖芚を叞る脳の郚分を撃ち萜ずした。 時間が経぀に぀れお、脳の他の郚分がこれらの機胜を匕き継ぎたした。 (繰り返す぀もりはありたせん)

同様に、モデルから匱い畳み蟌みの䞀郚を切り取るこずができたす。 最埌の手段ずしお、残りのバンドルをカットしたバンドルず眮き換えるのに圹立ちたす。

転移孊習が奜きですか、それずもれロから孊習しおいたすか?

オプションその XNUMX。 Yolov3 で転移孊習を䜿甚したす。 Retina、Mask-RCNN、たたは U-Net。 しかし、ほずんどの堎合、COCO のように 80 個のオブゞェクト クラスを認識する必芁はありたせん。 私の緎習では、すべおはグレヌド 1  2 に限定されたす。 ここでは、80 クラスのアヌキテクチャが冗長であるず考える人もいるかもしれたせん。 これは、アヌキテクチャをより小さくする必芁があるこずを瀺唆しおいたす。 さらに、既存の事前トレヌニング枈みの重みを倱わずにこれを実行したいず考えおいたす。

オプション番号XNUMX。 おそらく、倧量のデヌタずコンピュヌティング リ゜ヌスがあるか、あるいはスヌパヌカスタム アヌキテクチャが必芁なだけかもしれたせん。 関係ない。 ただし、ネットワヌクをれロから孊習するこずになりたす。 通垞の手順は、デヌタ構造を調べ、過剰な胜力を持぀アヌキテクチャを遞択し、脱萜者を再トレヌニングから远い出すこずです。 0.6 人の脱萜者を芋たした、カヌル。

どちらの堎合も、ネットワヌクを削枛できたす。 やる気が出る。 それでは、割瀌剪定ずはどのようなものかを芋おみたしょう

䞀般的なアルゎリズム

私たちはバンドルを削陀しおもよいず刀断したした。 ずおもシンプルに芋えたす:

畳み蟌みネットワヌクを削枛するための Jedi テクニック - 枝刈り

畳み蟌みを陀去するずネットワヌクにストレスがかかり、通垞ぱラヌが倚少増加したす。 䞀方で、この誀差の増加は、たたみ蟌みをどの皋床正しく陀去できおいるかを瀺す指暙ずなりたす (たずえば、倧幅な増加は、䜕か間違ったこずを行っおいるこずを瀺したす)。 ただし、わずかな増加はたったく蚱容でき、その埌の小さな LR による軜い远加トレヌニングによっお解消されるこずがよくありたす。 远加のトレヌニング ステップを远加したす。

畳み蟌みネットワヌクを削枛するための Jedi テクニック - 枝刈り

次に、孊習<->枝刈りルヌプをい぀停止するかを刀断する必芁がありたす。 ネットワヌクを特定のサむズず速床に削枛する必芁がある堎合 (モバむル デバむスなど)、珍しいオプションが存圚する可胜性がありたす。 ただし、最も䞀般的なオプションは、誀差が蚱容範囲を超えるたでサむクルを継続するこずです。 条件を远加したす。

畳み蟌みネットワヌクを削枛するための Jedi テクニック - 枝刈り

したがっお、アルゎリズムが明らかになりたす。 削陀された畳み蟌みを決定する方法を理解する必芁がありたす。

削陀されたバンドルを怜玢する

いく぀かの畳み蟌みを取り陀く必芁がありたす。 先を急いで誰かを「撃぀」こずは、うたくいきたすが、悪い考えです。 しかし、あなたには頭があるので、削陀する「匱い」畳み蟌みを考えお遞択するこずができたす。 いく぀かのオプションがありたす。

  1. 最小の L1 メゞャヌたたは low_magnitude_pruning。 重みの小さい畳み蟌みは最終的な決定にほずんど寄䞎しないずいう考え
  2. 平均ず暙準偏差を考慮した最小の L1 枬定倀。 分垃の性質の評䟡を補足したす。
  3. 畳み蟌みをマスキングし、最終的な粟床に最も圱響を䞎えない畳み蟌みを陀倖する。 重芁ではない畳み蟌みをより正確に刀断できたすが、非垞に時間ずリ゜ヌスが消費されたす。
  4. 他人

各オプションには生存暩ず独自の実装機胜がありたす。 ここでは、L1 枬定倀が最小のオプションを怜蚎したす。

YOLOv3 の手動プロセス

元のアヌキテクチャには残留ブロックが含たれおいたす。 しかし、ディヌプネットワヌクにずっおどれほど優れたものであっおも、倚少の劚げにはなりたす。 問題は、次のレむダヌでは異なるむンデックスを持぀調敎を削陀できないこずです。

畳み蟌みネットワヌクを削枛するための Jedi テクニック - 枝刈り

したがっお、調敎を自由に削陀できるレむダヌを遞択したしょう。

畳み蟌みネットワヌクを削枛するための Jedi テクニック - 枝刈り

次に、䜜業サむクルを構築したしょう。

  1. アクティベヌションのアップロヌド
  2. どれくらいカットするかを考える
  3. いい加枛にしお
  4. LR=10e-1 で 4 ゚ポックを孊習
  5. テスト

畳み蟌みのアンロヌドは、特定のステップでどれだけの郚分を削陀できるかを芋積もるのに圹立ちたす。 アンロヌドの䟋:

畳み蟌みネットワヌクを削枛するための Jedi テクニック - 枝刈り

ほがどこでも、畳み蟌みの 5% の L1 ノルムが非垞に䜎く、それらを削陀できるこずがわかりたす。 各ステップで、この降ろしを繰り返し、どの局を䜕局切り出すこずができるかを評䟡したした。

プロセス党䜓は 4 ぀のステップで完了したした (RTX 2060 Super の堎合は、ここず随所に数字が衚瀺されたす)。

手順 マップ75 パラメヌタの数、癟䞇 ネットワヌクサむズ、メガバむト 初期倀から% 実行時間、ミリ秒 割瀌の状態
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 がメモリに収たるずいうプラスの効果が XNUMX ぀远加され、远加のトレヌニングのプロセスが倧幅に加速されたした。
ステップ 4 で、プロセスが停止されたした。 長期にわたる远加トレヌニングでも、mAp75 は叀い倀たで䞊昇したせんでした。
その結果、次のようにしお掚論を高速化するこずができたした。 芖聎者の%が、サむズを小さくしたす 芖聎者の%が そしお正確には負けたせん。

より単玔なアヌキテクチャのための自動化

より単玔なネットワヌク アヌキテクチャ (条件付き加算、連結ブロック、残差ブロックなし) の堎合、すべおの畳み蟌み局の凊理に集䞭し、畳み蟌みを陀去するプロセスを自動化するこずがかなり可胜です。

このオプションを実装したした ここで.
それは簡単です。必芁なのは損倱関数、オプティマむザヌ、バッチ ゞェネレヌタヌだけです。

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 枬床を持぀畳み蟌みを陀倖し、削陀される郚分を制限するこずです。

畳み蟌みネットワヌクを削枛するための Jedi テクニック - 枝刈り

したがっお、右偎の分垃に類䌌した分垃からは匱い畳み蟌みのみを削陀し、巊偎の分垃に類䌌した分垃からの陀去には圱響を䞎えないようにするこずができたす。

畳み蟌みネットワヌクを削枛するための Jedi テクニック - 枝刈り

分垃が正芏に近づくず、pruning_standart_deviation_part 係数は次から遞択できたす。

畳み蟌みネットワヌクを削枛するための Jedi テクニック - 枝刈り
2 シグマの仮定をお勧めしたす。 たたは、この機胜を無芖しお、倀を 1.0 未満のたたにするこずもできたす。

出力は、テスト党䜓のネットワヌク サむズ、損倱、ネットワヌク ランタむムを 1.0 に正芏化したグラフです。 たずえば、ここでは、品質を損なうこずなくネットワヌク サむズがほが 2 倍に削枛されたした (重み 100k の小芏暡な畳み蟌みネットワヌク)。

畳み蟌みネットワヌクを削枛するための Jedi テクニック - 枝刈り

走行速床は通垞倉動したすが、実質的には倉化したせん。 これに぀いおは次のような説明がありたす。

  1. 畳み蟌み数は、ビデオ カヌドにずっお䟿利な (32、64、128) から、最も䞍䟿な (27、51 など) たで倉化したす。 ここで私は間違っおいる可胜性がありたすが、おそらく圱響はありたす。
  2. アヌキテクチャは広範囲ではありたせんが、䞀貫しおいたす。 幅を小さくしおも奥行きには圱響したせん。 したがっお、負荷は軜枛されたすが、速床は倉わりたせん。

したがっお、改善は実行䞭の CUDA 負荷の 20  30% の枛少ずしお衚されたすが、実行時間の短瞮ずしおは衚されたせん。

結果

反省したしょう。 プルヌニングには、YOLOv2 (手を䜿っお䜜業する必芁がある堎合) ず、より単玔なアヌキテクチャのネットワヌクの 3 ぀のオプションを怜蚎したした。 どちらの堎合でも、粟床を損なうこずなくネットワヌク サむズの削枛ず高速化を達成できるこずがわかりたす。 結果

  • サむズを小さくする
  • 加速走行
  • CUDA負荷の軜枛
  • その結果、環境に優しい将来のコンピュヌティングリ゜ヌスの䜿甚を最適化したす。どこかで幞せになりたす グレタ・タンバヌグ)

付録

  • 枝刈りステップの埌、量子化を远加できたす (たずえば、TensorRT を䜿甚)
  • Tensorflow は以䞋の機胜を提䟛したす low_magnitude_pruning。 動䜜したす。
  • リポゞトリ 開発したいので喜んでお手䌝いしたす

出所 habr.com

コメントを远加したす