Distiller:ニューラルネットワーク圧縮研究の枠組み


DistillerはIntel AI Labによって維持されるPyTorchベースのオープンソースニューラルネットワーク圧縮フレームワークである.主な内容は次のとおりです.
  • は、剪断(pruning)、正規化(regularization)、および量子化(quantization)アルゴリズムを統合するためのフレームワークに使用される.
  • 圧縮性能の分析と評価のためのツール.
  • 従来技術の圧縮アルゴリズムの例示的な実装.

  • これは現在私が発見した最も完全な圧縮枠組みであり、科学研究に適している.インストールと使用について簡単に説明します.
    NervanaSystems/distiller Distiller Documentation
    インストール
    仮想環境の作成
    Distillerはpythonベースのオープンソースフレームワークであり、他の作業と競合しないように仮想環境を事前に作成することが望ましい.公式のチュートリアルはvirtualenvを使用しています.この機能は簡単です.ここにはインストールチュートリアルがあります.現在流行しているpythonパッケージ管理はconda(私も使っています)で、使い勝手がいいです.その後、activateが作成された環境に移行します.
    注意:-DistillerはUbuntu 16.04 LTSのPython 3.5環境でのみテストされ、デフォルトではGPUが使用されています.GPUコードを使用しない場合は、わずかな調整が必要になる場合があります.
    倉庫のクローンとインストール依存
    $ git clone https://github.com/NervanaSystems/distiller.git
    

    Clone Distillerの倉庫.
    $ pip3 install -r requirements.txt
    

    必要な依存ライブラリをインストールします.これでDistillerがインストールされます.
    データセット
    分類データセットの整理は、ドキュメントに与えられた方法(ここで)で行う必要があります.
    distiller
      examples
        classifier_compression
    data.imagenet/
        train/
        val/
    data.cifar10/
        cifar-10-batches-py/
            batches.meta
            data_batch_1
            data_batch_2
            data_batch_3
            data_batch_4
            data_batch_5
            readme.html
            test_batch
    

    もちろん、比較的一般的なので、ソフト接続を確立すればいいです.
    使用
    倉庫には多くの例(distiller/examples/)が提供され、本明細書ではdistiller/examples/classifier_compression/compress_classifier.pyを例に挙げる.
    コマンドラインパラメータ
    このファイルには圧縮フレームワークが含まれています.パラメータヘルプでは、次のコマンドを呼び出すことができます.
    $ python3 compress_classifier.py --help
    

    たとえば、次のコマンドを入力します.
    $ time python3 compress_classifier.py -a alexnet --lr 0.005 -p 50 ../../../data.imagenet -j 44 --epochs 90 --pretrained --compress=../sensitivity-pruning/alexnet.schedule_sensitivity.yaml
    
    Parameters:
     +----+---------------------------+------------------+---------------+----------------+------------+------------+----------+----------+----------+------------+---------+----------+------------+
     |    | Name                      | Shape            |   NNZ (dense) |   NNZ (sparse) |   Cols (%) |   Rows (%) |   Ch (%) |   2D (%) |   3D (%) |   Fine (%) |     Std |     Mean |   Abs-Mean |
     |----+---------------------------+------------------+---------------+----------------+------------+------------+----------+----------+----------+------------+---------+----------+------------|
     |  0 | features.module.0.weight  | (64, 3, 11, 11)  |         23232 |          13411 |    0.00000 |    0.00000 |  0.00000 |  0.00000 |  0.00000 |   42.27359 | 0.14391 | -0.00002 |    0.08805 |
     |  1 | features.module.3.weight  | (192, 64, 5, 5)  |        307200 |         115560 |    0.00000 |    0.00000 |  0.00000 |  1.91243 |  0.00000 |   62.38281 | 0.04703 | -0.00250 |    0.02289 |
     |  2 | features.module.6.weight  | (384, 192, 3, 3) |        663552 |         256565 |    0.00000 |    0.00000 |  0.00000 |  6.18490 |  0.00000 |   61.33445 | 0.03354 | -0.00184 |    0.01803 |
     |  3 | features.module.8.weight  | (256, 384, 3, 3) |        884736 |         315065 |    0.00000 |    0.00000 |  0.00000 |  6.96411 |  0.00000 |   64.38881 | 0.02646 | -0.00168 |    0.01422 |
     |  4 | features.module.10.weight | (256, 256, 3, 3) |        589824 |         186938 |    0.00000 |    0.00000 |  0.00000 | 15.49225 |  0.00000 |   68.30614 | 0.02714 | -0.00246 |    0.01409 |
     |  5 | classifier.1.weight       | (4096, 9216)     |      37748736 |        3398881 |    0.00000 |    0.21973 |  0.00000 |  0.21973 |  0.00000 |   90.99604 | 0.00589 | -0.00020 |    0.00168 |
     |  6 | classifier.4.weight       | (4096, 4096)     |      16777216 |        1782769 |    0.21973 |    3.46680 |  0.00000 |  3.46680 |  0.00000 |   89.37387 | 0.00849 | -0.00066 |    0.00263 |
     |  7 | classifier.6.weight       | (1000, 4096)     |       4096000 |         994738 |    3.36914 |    0.00000 |  0.00000 |  0.00000 |  0.00000 |   75.71440 | 0.01718 |  0.00030 |    0.00778 |
     |  8 | Total sparsity:           | -                |      61090496 |        7063928 |    0.00000 |    0.00000 |  0.00000 |  0.00000 |  0.00000 |   88.43694 | 0.00000 |  0.00000 |    0.00000 |
     +----+---------------------------+------------------+---------------+----------------+------------+------------+----------+----------+----------+------------+---------+----------+------------+
     2018-04-04 21:30:52,499 - Total sparsity: 88.44
    
     2018-04-04 21:30:52,499 - --- validate (epoch=89)-----------
     2018-04-04 21:30:52,499 - 128116 samples (256 per mini-batch)
     2018-04-04 21:31:04,646 - Epoch: [89][   50/  500]    Loss 2.175988    Top1 51.289063    Top5 74.023438
     2018-04-04 21:31:06,427 - Epoch: [89][  100/  500]    Loss 2.171564    Top1 51.175781    Top5 74.308594
     2018-04-04 21:31:11,432 - Epoch: [89][  150/  500]    Loss 2.159347    Top1 51.546875    Top5 74.473958
     2018-04-04 21:31:14,364 - Epoch: [89][  200/  500]    Loss 2.156857    Top1 51.585938    Top5 74.568359
     2018-04-04 21:31:18,381 - Epoch: [89][  250/  500]    Loss 2.152790    Top1 51.707813    Top5 74.681250
     2018-04-04 21:31:22,195 - Epoch: [89][  300/  500]    Loss 2.149962    Top1 51.791667    Top5 74.755208
     2018-04-04 21:31:25,508 - Epoch: [89][  350/  500]    Loss 2.150936    Top1 51.827009    Top5 74.767857
     2018-04-04 21:31:29,538 - Epoch: [89][  400/  500]    Loss 2.150853    Top1 51.781250    Top5 74.763672
     2018-04-04 21:31:32,842 - Epoch: [89][  450/  500]    Loss 2.150156    Top1 51.828125    Top5 74.821181
     2018-04-04 21:31:35,338 - Epoch: [89][  500/  500]    Loss 2.150417    Top1 51.833594    Top5 74.817187
     2018-04-04 21:31:35,357 - ==> Top1: 51.838    Top5: 74.817    Loss: 2.150
    
     2018-04-04 21:31:35,364 - Saving checkpoint
     2018-04-04 21:31:39,251 - --- test ---------------------
     2018-04-04 21:31:39,252 - 50000 samples (256 per mini-batch)
     2018-04-04 21:31:51,512 - Test: [   50/  195]    Loss 1.487607    Top1 63.273438    Top5 85.695312
     2018-04-04 21:31:55,015 - Test: [  100/  195]    Loss 1.638043    Top1 60.636719    Top5 83.664062
     2018-04-04 21:31:58,732 - Test: [  150/  195]    Loss 1.833214    Top1 57.619792    Top5 80.447917
     2018-04-04 21:32:01,274 - ==> Top1: 56.606    Top5: 79.446    Loss: 1.893
    

    具体的には
    $ time python3 compress_classifier.py -a alexnet --lr 0.005 -p 50 ../../../data.imagenet -j 44 --epochs 90 --pretrained --compress=../sensitivity-pruning/alexnet.schedule_sensitivity.yaml
    

    この例では,事前に訓練したAlexNetネットワークを剪断し,以下のパラメータを用いた.
  • 0.005の学習率
  • 50個のmini-batch毎に1回の情報
  • が出力.
  • 44コアスレッドを使用してデータをロード(パーソナルサーバに依存)
  • 90個のepoch
  • を訓練する
  • 剪断ポリシーは、alexnet.schedule_sensitivity.yamlにおいて
  • を提供する.
  • ログに出力logs

  • Distillerには、compress_classifier.pyを使用するいくつかの例が付属しており、構成は比較的簡単であり、プロファイル(YAML)をコマンドラインcompressパラメータとして直接入力することができる.具体的には、examplesフォルダを参照できます.同時にネット上にはいくつかの訓練されたモデルが付属しているが、大部分は剪定面だ.
    せん断感度分析
    Distillerはelement‐wiseとfilter‐wiseの剪断感度解析をサポートする.どちらの場合も、L 1-normは、トリミングする要素またはフィルタをソートするために使用されます.例えば、filter−wise剪断感度解析を実行すると、各層の重みテンソルのフィルタのL 1ノルムが計算され、ボトムx%がゼロに設定される.分析プロセスは、現在、各重みテンソルの各剪断レベルの正確性を評価するために、テストデータセット全体を使用しているため、長い.結果はCSVファイル(sensitivity.csv)とPNGファイル(sensitivity.png)として出力される.インプリメンテーションはdistiller/sensitivity.pyにある.ここにもjupyterのnotebookがあります.
    トレーニング後量子化
    Distillerは、トレーニングモジュールのトレーニング後の量子化をサポートし、再トレーニングを必要としない(範囲ベースの線形量子化を使用).したがって、剪断の有無にかかわらず、どのモデルも量子化できます.トレーニング後の量子化を呼び出すには、--quantize-evalおよび--evaluateを使用します.その他のパラメータは、量子化パラメータを制御するために使用できます.
    Arguments controlling quantization at evaluation time("post-training quantization"):
      --quantize-eval, --qe
                            
                            Applicable only if --evaluate is also set
      --qe-mode QE_MODE, --qem QE_MODE
                            Linear quantization mode. Choices: asym_s | asym_u |
                            sym
      --qe-bits-acts NUM_BITS, --qeba NUM_BITS
                            Number of bits for quantization of activations
      --qe-bits-wts NUM_BITS, --qebw NUM_BITS
                            Number of bits for quantization of weights
      --qe-bits-accum NUM_BITS
                            Number of bits for quantization of the accumulator
      --qe-clip-acts, --qeca
                            Enable clipping of activations using min/max values
                            averaging over batch
      --qe-no-clip-layers LAYER_NAME [LAYER_NAME ...], --qencl LAYER_NAME [LAYER_NAME ...]
                            List of fully-qualified layer names for which not to
                            clip activations. Applicable only if --qe-clip-acts is
                            also set
      --qe-per-channel, --qepc
                            Enable per-channel quantization of weights (per output channel)
    
    

    以下にresnet 18の量子化例を示す.
    $ python3 compress_classifier.py -a resnet18 ../../../data.imagenet  --pretrained --quantize-eval --evaluate
    

    量子化されたモデルは、実行ディレクトリにダンプされます.量子化されたモデルパラメータが含まれます(データ型はFP 32のままですが、値は整数になります).計算された量子化パラメータ(スケールおよびゼロ点)も各量子化層に格納される.
    まとめ
    この論文では,Distillerの実装と使用例を簡単に紹介し,実験のニーズをどのように結びつけるかをさらに深く検討する必要がある.