Distiller:ニューラルネットワーク圧縮研究の枠組み
DistillerはIntel AI Labによって維持されるPyTorchベースのオープンソースニューラルネットワーク圧縮フレームワークである.主な内容は次のとおりです.は、剪断(pruning)、正規化(regularization)、および量子化(quantization)アルゴリズムを統合するためのフレームワークに使用される. 圧縮性能の分析と評価のためのツール. 従来技術の圧縮アルゴリズムの例示的な実装.
これは現在私が発見した最も完全な圧縮枠組みであり、科学研究に適している.インストールと使用について簡単に説明します.
NervanaSystems/distiller Distiller Documentation
インストール
仮想環境の作成
Distillerはpythonベースのオープンソースフレームワークであり、他の作業と競合しないように仮想環境を事前に作成することが望ましい.公式のチュートリアルはvirtualenvを使用しています.この機能は簡単です.ここにはインストールチュートリアルがあります.現在流行しているpythonパッケージ管理はconda(私も使っています)で、使い勝手がいいです.その後、
注意:-DistillerはUbuntu 16.04 LTSのPython 3.5環境でのみテストされ、デフォルトではGPUが使用されています.GPUコードを使用しない場合は、わずかな調整が必要になる場合があります.
倉庫のクローンとインストール依存
Clone Distillerの倉庫.
必要な依存ライブラリをインストールします.これでDistillerがインストールされます.
データセット
分類データセットの整理は、ドキュメントに与えられた方法(ここで)で行う必要があります.
もちろん、比較的一般的なので、ソフト接続を確立すればいいです.
使用
倉庫には多くの例(
コマンドラインパラメータ
このファイルには圧縮フレームワークが含まれています.パラメータヘルプでは、次のコマンドを呼び出すことができます.
たとえば、次のコマンドを入力します.
具体的には
この例では,事前に訓練したAlexNetネットワークを剪断し,以下のパラメータを用いた. 0.005の学習率 50個のmini-batch毎に1回の情報 が出力. 44コアスレッドを使用してデータをロード(パーソナルサーバに依存) 90個のepoch を訓練する剪断ポリシーは、 を提供する.ログに出力 例
Distillerには、
せん断感度分析
Distillerはelement‐wiseとfilter‐wiseの剪断感度解析をサポートする.どちらの場合も、L 1-normは、トリミングする要素またはフィルタをソートするために使用されます.例えば、filter−wise剪断感度解析を実行すると、各層の重みテンソルのフィルタのL 1ノルムが計算され、ボトムx%がゼロに設定される.分析プロセスは、現在、各重みテンソルの各剪断レベルの正確性を評価するために、テストデータセット全体を使用しているため、長い.結果はCSVファイル(
トレーニング後量子化
Distillerは、トレーニングモジュールのトレーニング後の量子化をサポートし、再トレーニングを必要としない(範囲ベースの線形量子化を使用).したがって、剪断の有無にかかわらず、どのモデルも量子化できます.トレーニング後の量子化を呼び出すには、
以下にresnet 18の量子化例を示す.
量子化されたモデルは、実行ディレクトリにダンプされます.量子化されたモデルパラメータが含まれます(データ型はFP 32のままですが、値は整数になります).計算された量子化パラメータ(スケールおよびゼロ点)も各量子化層に格納される.
まとめ
この論文では,Distillerの実装と使用例を簡単に紹介し,実験のニーズをどのように結びつけるかをさらに深く検討する必要がある.
これは現在私が発見した最も完全な圧縮枠組みであり、科学研究に適している.インストールと使用について簡単に説明します.
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ネットワークを剪断し,以下のパラメータを用いた.
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の実装と使用例を簡単に紹介し,実験のニーズをどのように結びつけるかをさらに深く検討する必要がある.