まだタイトルない

アウトプット用です

ローカルマシンでpytorch(cuda)を使った学習を改善したい

こんにちは
ローカルマシンで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

f:id:teyoblog:20200828225600p:plain

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にてインストール成功の確認

f:id:teyoblog:20200828215559p:plain

実験

色々いじると言いつつ今回はdatalorderのnum_workers=2が何かわからずに指定しているのでこれをいじって変化を見てみます

公式ドキュメントに寄ると

torch.utils.data — PyTorch 1.6.0 documentation

num_workers (intoptional) – 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%になりました。

これは読み取り速度がボトルネックじゃなくなったことによる効果なのでしょうか?

f:id:teyoblog:20200829143344p:plain

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