ディープラーニングのモデル軽量化ライブラリDistiller

## はじめに

※このライブラリはGPUの使用を前提としているのでご注意ください※
主はディープラーニングに関してド素人ですので, 誤りがある場合は優しく教えて頂けると幸いです。

## Distillerとは

Distillerとは, DeepLearningのモデルを軽量化するアルゴリズムを備えたintelがPyTorchベースで作成したライブラリです。モデルの軽量化の主な例としては, 量子化(Quantization), 枝刈り(Pruning), 蒸留(Distillation)など様々なものがあり, これらを簡単に使えるのがDistillerです。
さらに, チュートリアルではTensorBoardと連帯して学習の状況を確認できる機能までついていた(感謝感激)

モデル軽量化について詳しく書かれたサイトがこちら
https://laboro.ai/column/%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%82%92%E8%BB%BD%E9%87%8F%E5%8C%96%E3%81%99%E3%82%8B%E3%83%A2%E3%83%87%E3%83%AB%E5%9C%A7%E7%B8%AE/

## 環境開発

```shell
$ git clone https://github.com/NervanaSystems/distiller.git
$ cd distiller
$ pip install -r requirements.txt
$ pip install -e .
```

```python
$ python
>>> import distiller
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/mnt/PytorchIntro/distiller/distiller/__init__.py", line 20, in <module>
    from .config import file_config, dict_config, config_component_from_file_by_class

...

  File "/root/local/python-3.7.1/lib/python3.7/site-packages/git/exc.py", line 9, in <module>
    from git.compat import UnicodeMixin, safe_decode, string_types
  File "/root/local/python-3.7.1/lib/python3.7/site-packages/git/compat.py", line 16, in <module>
    from gitdb.utils.compat import (
ModuleNotFoundError: No module named 'gitdb.utils.compat'
```

自分の場合はライブラリに追加したDistillerをインポートしようとしたらgitのライブラリ関連でエラーがでたので, 悪さをしていたgitdb2をダウングレードしたら直りました。(自分のインストールしたバージョンは4.0.2)

```shell
$ pip uninstall gitdb2
$ pip install gitdb2==2.0.6
```

いざ確認

```shell
$ cd distiller/examples/classifier_compression/
$ python3 compress_classifier.py --arch simplenet_cifar ../../../data.cifar10 -p 30 -j=1 --lr=0.01

--------------------------------------------------------
Logging to TensorBoard - remember to execute the server:
> tensorboard --logdir='./logs'

=> created a simplenet_cifar model with the cifar10 dataset
Downloading https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz to ../../../data.cifar10/cifar-10-python.tar.gz
 99%|█████████████████████████████████████████████████████████████████████████████▌| 169582592/170498071 [00:18<00:00, 11451969.71it/s]Extracting ../../../data.cifar10/cifar-10-python.tar.gz to ../../../data.cifar10
Files already downloaded and verified
Dataset sizes:
        training=45000
        validation=5000
        test=10000


Training epoch: 45000 samples (256 per mini-batch)
170500096it [00:30, 11451969.71it/s]                                                                                                   Epoch: [0][   30/  176]    Overall Loss 2.303411    Objective Loss 2.303411    Top1 10.299479    Top5 50.104167    LR 0.010000    Time 0.038285
Epoch: [0][   60/  176]    Overall Loss 2.301507    Objective Loss 2.301507    Top1 10.774740    Top5 51.328125    LR 0.010000    Time 0.037495
Epoch: [0][   90/  176]    Overall Loss 2.299031    Objective Loss 2.299031    Top1 12.335069    Top5 54.973958    LR 0.010000    Time 0.037465
Epoch: [0][  120/  176]    Overall Loss 2.293749    Objective Loss 2.293749    Top1 13.424479    Top5 57.542318    LR 0.010000    Time 0.037429
Epoch: [0][  150/  176]    Overall Loss 2.278429    Objective Loss 2.278429    Top1 14.692708    Top5 59.864583    LR 0.010000    Time 0.037407

Parameters:
+----+---------------------+---------------+---------------+----------------+------------+------------+----------+----------+----------+------------+---------+----------+------------+
|    | Name                | Shape         |   NNZ (dense) |   NNZ (sparse) |   Cols (%) |   Rows (%) |   Ch (%) |   2D (%) |   3D (%) |   Fine (%) |     Std |     Mean |   Abs-Mean |
|----+---------------------+---------------+---------------+----------------+------------+------------+----------+----------+----------+------------+---------+----------+------------|
|  0 | module.conv1.weight | (6, 3, 5, 5)  |           450 |            450 |    0.00000 |    0.00000 |  0.00000 |  0.00000 |  0.00000 |    0.00000 | 0.07800 | -0.01404 |    0.06724 |
|  1 | module.conv2.weight | (16, 6, 5, 5) |          2400 |           2400 |    0.00000 |    0.00000 |  0.00000 |  0.00000 |  0.00000 |    0.00000 | 0.04952 |  0.00678 |    0.04246 |
|  2 | module.fc1.weight   | (120, 400)    |         48000 |          48000 |    0.00000 |    0.00000 |  0.00000 |  0.00000 |  0.00000 |    0.00000 | 0.02906 |  0.00082 |    0.02511 |
|  3 | module.fc2.weight   | (84, 120)     |         10080 |          10080 |    0.00000 |    0.00000 |  0.00000 |  0.00000 |  0.00000 |    0.00000 | 0.05328 |  0.00084 |    0.04607 |
|  4 | module.fc3.weight   | (10, 84)      |           840 |            840 |    0.00000 |    0.00000 |  0.00000 |  0.00000 |  0.00000 |    0.00000 | 0.06967 | -0.00275 |    0.06040 |
|  5 | Total sparsity:     | -             |         61770 |          61770 |    0.00000 |    0.00000 |  0.00000 |  0.00000 |  0.00000 |    0.00000 | 0.00000 |  0.00000 |    0.00000 |
+----+---------------------+---------------+---------------+----------------+------------+------------+----------+----------+----------+------------+---------+----------+------------+
Total sparsity: 0.00

--- validate (epoch=0)-----------
5000 samples (256 per mini-batch)
==> Top1: 25.240    Top5: 75.520    Loss: 2.060

==> Best [Top1: 25.240   Top5: 75.520   Sparsity:0.00   NNZ-Params: 61770 on epoch: 0]
Saving checkpoint to: logs/2020.05.02-235616/checkpoint.pth.tar

...
```

とりあえず, 動いたので一安心 ε-(´∀｀*)ﾎｯ
何か発見があり次第追記していこうと思います。

## 参考サイト

https://github.com/NervanaSystems/distiller