efficient_densenet_pytorch
1.0.0
GPUメモリを保存するために最適化されたデンセンセットのPytorch> = 1.0の実装。
デンセネットはディープラーニングフレームワークではかなり簡単に実装できますが、ほとんどの実装(オリジナルなど)はメモリに飢えている傾向があります。特に、バッチの正規化と連結操作によって生成される中間機能マップの数は、ネットワークの深さとともに2次に増加します。これは、デンセンセットに固有のプロパティではなく、実装に固有のプロパティであることを強調する価値があります。
この実装では、新しい戦略を使用して、デンセネットのメモリ消費を削減します。チェックポイントを使用して、バッチノルムと連結機能マップを計算します。これらの中間機能マップは、フォワードパス中に破棄され、後方パスのために再計算されます。これにより、トレーニングのためにオーバーヘッドの時間の15〜20%が追加されますが、特徴マップの消費は2次から線形に減少します。
この実装は、このテクニカルレポートに触発されており、メモリ共有を介して効率的なデンセンセットの戦略を概説しています。
既存のプロジェクトでは、 modelsフォルダーに1つのファイルがあります。
models/densenet.pyは、TorchVisionおよびProject Killerの実装に基づいた実装です。速度を気にし、メモリがオプションではない場合は、 efficient=False引数をDenseNetコンストラクターに渡します。それ以外の場合は、 efficient=Trueで渡します。
オプション:
block_configオプションによって制御されますefficient=Trueメモリ効率の高いバージョンを使用しますsmall_inputs=Falseを設定します。 CIFARまたはSVHNの場合、 small_inputs=True設定します。デモの実行:
インストールする必要がある唯一の追加パッケージはPython-Fireです。
pip install fireCUDA_VISIBLE_DEVICES=0 python demo.py --efficient True --data < path_to_folder_with_cifar 10> --save < path_to_save_dir >CUDA_VISIBLE_DEVICES=0,1,2 python demo.py --efficient True --data < path_to_folder_with_cifar 10> --save < path_to_save_dir >オプション:
--depth (int) - ネットワークの深さ(畳み込み層の数)(デフォルト40)--growth_rate (int) - デンセンセネット層ごとに追加される機能の数(デフォルト12)--n_epochs (int) - トレーニング用のエポックの数(デフォルト300)--batch_size (int) - ミニバッチのサイズ(デフォルト256)--seed (int) - ランダムシードを手動で設定します(デフォルトなし) 2つの実装の比較(それぞれが100層のデンセンBCで、バッチサイズ64、Nvidia Pascal Titan-Xでテストされています):
| 実装 | メモリコマプト(GB/GPU) | 速度(SEC/ミニバッチ) |
|---|---|---|
| 素朴です | 2.863 | 0.165 |
| 効率的 | 1.605 | 0.207 |
| 効率的(マルチGPU) | 0.985 | - |
@article{pleiss2017memory,
title={Memory-Efficient Implementation of DenseNets},
author={Pleiss, Geoff and Chen, Danlu and Huang, Gao and Li, Tongcheng and van der Maaten, Laurens and Weinberger, Kilian Q},
journal={arXiv preprint arXiv:1707.06990},
year={2017}
}