こんにちは
ローカルマシンでDeepLearningの学習を回せるようになりたいと思って環境の整備をしました。(クラウドは次のステップと思っている)
実際に動かしてみるとどうやらマシンスペックを使いこなせていないように感じ、もっと早く学習させられるのではと思いました。感想でしかないですが...
本記事ではpytorchのパラメータを調べたり調整しながらより早く学習できるように試行錯誤をしていきます。
下記、注意事項です。
- 筆者は初学者であること
- 使用コードやデータについての詳細は現状記載なし
- 知見ある方に意見をもらえたらうれしい
環境
マシンスペック
- [CPU]Ryzen5 3600(6コア12スレッド)
- [GPU]MSI GeForce GTX 1070(メモリ8ギガ)
- [memory]Corsair DDR4-2666 (8GB×2)
- [ストレージ]HDD
今回はHDDで実験してますが写真などの大切なデータが吹っ飛ぶと怖いので学習用データ専用のSSDを購入します。速度改善されるかは不明です。
詳細は以下記事
python周りの環境
- python3.7.7
- pytorch1.6.0
- cuda10.1
- cudnn 7.6.5 for cuda10.1
- tensorflow 未導入
- NVIDIAドライババージョン452.06
gpuメモリーの関係でtrain batchsize=24でiteration/epoch=712
ことの発端
ネット上のコードを参考にローカルでプログラムを書いて実行したらこの様になりました。
GPUもCPUも活躍していない・・・。今回はここから色々設定を変えていきます。
2020/8/29追記
タスクバーの見る部分が違っていました。上画像で[3D][Copy]となっているところからcudaを選ぶと見れるとのことで、確認した所cudaでの演算は出来ていました。
学習速度が早くなったわけではないので引き続き少し調べていきます。
蛇足にはなりますが・・・
cudaのバージョンを調べてたら入ってないことが判明して、この記事を書いてる段階でインストールしました。
conda install pytorch torchvision cudatoolkit=10.1 -c pytorch
pytorch公式のこのコードではcudatoolkitインストールされないのでしょうか
cmdにてインストール成功の確認
実験
色々いじると言いつつ今回はdatalorderのnum_workers=2が何かわからずに指定しているのでこれをいじって変化を見てみます
公式ドキュメントに寄ると
torch.utils.data — PyTorch 1.6.0 documentation
num_workers (int, optional) – how many subprocesses to use for data loading.
0
means that the data will be loaded in the main process. (default:0
)
データ読み込みに使用するサブプロセスの数、日本語ブログなども見てみると、コア数の指定と書いてありますが今ひとつしっくりこないです。
実験は1epochの学習(val/loss出すまで)の時間とタスクマネージャーの様子を見て行います。
実験①num_workersのパラメータを変えて比較
1.まずはそのままnum_workers=2
1226.6205415s/epoch
発端と比べて、cuda toolkitをインストールしたもののGPU,CPUは活用されることなく、ディスクのアクティブ時間はかなり高いままでした。
2.デフォルト値であるnum_workers=0にしてみる。
1088.0282635 s/epoch
CPUGPUはかわらず、ディスクのアクティブ時間が減少し実行時間が少し短くなりました。
3.num_workers=1
3以上はあまり良さそうでなかったので1を試してみます
1523.9104492000001s/epoch
なんだか微妙ですね・・・
cuDNNを導入
cuda10.1に対応したcuDNNをインストールしましたがむしろ学習速度が遅くなりました。
インプットデータをSSDから読み取るようにする【8/29追記】
早速ポチったSSDを増設して、動かしてみました。
HDDのときはディスクが90-100%でCudaが60%前後だった所、Cudaが100%になりました。
これは読み取り速度がボトルネックじゃなくなったことによる効果なのでしょうか?
num_workersを変えることの変化を見てみる
num_worker | 10 | 2 | 1 | 0 |
s/epoch | 525 | 539 | 567 | 757 |
cpu使用率 | 30 | 30 | 20 | 60 |
cuda使用率 | 100 | 100 | 90 | 70 |
cpu温度 | 70 | 50 | 65 | 75 |
gpu温度 | 65 | 75 | 70 | 70 |
結果を見る限り0よりは1のほうが負荷と時間のバランスが良さそうです
最後に
落とし所や実験の方法もなんとも言えないですが
・Cudaはタスクバーの項目を選択しないと使用率が見えない
・HDDからSSDに帰ることでcuda使用率を上げて学習速度をあげれた
・cuDNNの効果は比較実験してないので不明
・num_workerを調整することでcpu,gpuの負荷を変化させられることがわかった
・コード上でGPUに渡すコードを書いてる部分は下記2箇所
追記:cudaで演算できてることは確認できたのでコードは残しておきます
モデルの所
model = model.to(device)
データローダから取得したデータ
data, target = data.to(device), target.to(device)
・pytorch本にあった使用デバイス表示するコードの実行結果
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print("使用デバイス:", device)使用デバイス: cuda:0