# はじめに
新しくM4 MaxのMacを購入してディープラーニング関連のベンチマークをしていたのですが、どうもGPUの履歴がスカスカだったので、なにが原因か調べてみました。ここでは、原因と対策方法について紹介します。
GPUがサボりまくっている
PytorchのベンチマークのためにResnet18でCIFAR10の学習を行うコードを実行してみたのですが、どうも遅い
GPUの履歴を見ると、GPUが間欠でしか動いていない。下図みたいに、一瞬動作して、その後待ち時間がずっと続く形でした。ちなみに、処理時間は392.62秒。
このような挙動ってWindowsで学習させたときにも経験があって、その時はDataLoaderが問題だったので、とりあえずnum_workers=0
にして実行してみました。すると、処理時間は38.41秒。
原因はプロセスの起動・終了が遅い
Windowsの時は、プロセスの起動・終了が遅いのが原因で、Windowsでは、
persistent_workers=True
という設定で解決していたのでそれを試してみる。
処理時間は35.80秒。結果を見ると1EPOCH目が19秒で、それ移行は4秒程度でEPOCHが終了している。
やはり、プロセスの起動が遅いらしい。
解決策
少し調べてみると、multiprocessing_context
というオプションがあり、デフォルトは"spawn"で、"fork"と"forkserver"を選べるらしい。
とりあえず、"fork"を選んでみる(persistent_workers
は削除)
結果は21.50秒!
GPUの履歴を見てもGPUがずっと動いていることを確認できた。
まとめ
MacOSのPytorchのプロセス起動(spwan)は遅いみたいです。forkを設定すると高速に動作せることができましたので参考になればと思います。
結論は、「multiprocessing_context="falk"
を設定する」ことです。
ちなみに、この速度であればGoogle ColabのGPU(T4)より高速です。