こんにちは、モリカトロンでプログラマおじさんをやってる岡島です。
会社で購入した新しい ノートPC を Windows10 と Ubuntu Linux のデュアルブートにしたので、 かねてより気になっていた、OS の違いによる Python の速度比較をしてみました。
CPU や GPU の違いによる速度比較は沢山見かけますが、同じ PC で異なる OS、異なる Python バージョンでの速度比較というのは見かけなかったので、皆様の参考になればいいなと思い測定結果を共有します。
ついでに、Python 3.7 の What's New を見ると、色々と最適化がされているようなので、Python3.6 と Python3.7 も比較したので、 Python のバージョンをなかなか更新できない方もご覧いただくと良いかもしれません。
テスト環境
PC
テストに使用したのは eX.computer さんの G-GEAR N1588J です。
スペック:
- CPU: Intel Core i7-9750H
- コア数(物理/論理): 6/12
- GPU: NVIDIA GeForce RTX 2070 Mobile (Mem:8GB)
- メモリ: DDR4 SODIMM 64GB (32GBからカスタマイズ)
OS と Python
Python 環境は Anaconda を使って構築しました。
Python の実行速度はビルドに使用したコンパイラの違いに影響される可能性がありますので、メモしておきます。
- Windows10: Windows-10-10.0.17763-SP0
- グラフィックドライバ: 429.72
- Python 3.6
- Version: 3.6.10
- 実装: Cpython (コンパイラ: MSC v.1916 64 bit (AMD64) )
- Build: Jan 7 2020 15:18:16
- Python 3.7
- Version: 3.7.6
- 実装: Cpython (コンパイラ: MSC v.1916 64 bit (AMD64) )
- Build: Jan 8 2020 20:23:39
- Ubuntu 18: Ubuntu 18.04.3 LTS
- Python 3.6
- Version: 3.6.10
- 実装: Cpython (コンパイラ: GCC 7.3.0)
- Build: Jan 7 2020 21:14:29
- Python 3.7
- Version: 3.7.6
- 実装: Cpython (コンパイラ: GCC 7.3.0)
- Build: Jan 8 2020 19:59:22
- Python 3.6
- その他
- NumPy: 1.18.1
- PyTorch: 1.14
- cudatoolkit: 10.1
速度比較
Python の速度比較
比較に用いたプログラム
OS や Python のバージョンによる違いを実感したかったのもあり、いくつかの単純なプログラムを作成して、それの速度を比較しました。
実行結果
Ubuntu/3.6 | Ubuntu/3.7 | Win10/3.6 | Win10/3.7 | |
---|---|---|---|---|
空ループを1000万回 | 121.928ms | 113.710ms | 129.241ms | 137.990ms |
関数を100万回呼出し | 60.324ms | 57.115ms | 70.861ms | 64.045ms |
print を10万回 | 4368.358ms | 4516.610ms | 4081.143ms | 4027.401ms |
ジュリア集合の計算 | 2196.116ms | 2117.604ms | 3048.247ms | 2846.768ms |
スレッド生成10万回 | 3003.542ms | 546.747ms | 4257.522ms | 852.919ms |
プロセス生成10万回 | 13347.779ms | 10316.873ms | 37916.688ms | 44173.236ms |
NumPy の速度比較
数値計算には NumPy をよく使いますので、これを使った場合の速度比較もしました。
NumPy の数値計算は C/C++ と Fortran で記述され、また複数ある CPU コアを有効利用して計算するようになっているため、Python と同じ傾向にはならないはずです
比較に用いたプログラム
比較は Github で公開されている以下のベンチマークプログラムで行いました。
A short Python script to benchmark NumPy and show your BLAS setup · GitHub
実行結果
実行結果は以下のようになりました。
試行回数は5回で、その平均値を記載しています。
Ubuntu/3.6 | Ubuntu/3.7 | Win10/3.6 | Win10/3.7 | |
---|---|---|---|---|
Dotted two matrices | 0.676sec | 0.680sec | 0.598sec | 0.590sec |
Dotted two vectors of length | 0.054sec | 0.052sec | 0.046sec | 0.054sec |
SVD of a matrix | 0.32sec | 0.32sec | 0.34sec | 0.34sec |
Cholesky decomposition | 0.09sec | 0.09sec | 0.10sec | 0.11sec |
Eigendecomposition | 3.30sec | 3.27sec | 3.48sec | 3.48sec |
機械学習の速度比較
弊社が実行する Python プログラムの大半は機械学習です。 ということで、GPU を使うような機械学習のプログラムでの速度比較をしてみます。
比較に用いたプログラム
PyTorch の Github リポジトリにある example を使い、MNIST の学習 100エポックにかかった時間を測定しました。
python example/main.py --epochs=100
実行結果
上記プログラムの、学習とテストを繰り返す処理の時間だけ測定した結果は以下のようになりました。
これについては時間がかかるため、試行回数は1回です。
Ubuntu | Win10 | |
---|---|---|
Python3.6 | 686.635sec | 1176.503sec |
Python3.7 | 686.389sec | 1160.323sec |
Windows の実行結果が明らかに遅い
今までの比較結果は「まぁ OS が違うんだし、多少の違いはあるよね」という結果でしたが、 MNIST の結果は明らかに Windows で実行した方が Linux で実行するよりが遅くなっていたので、なぜこんなに速度差が出ているのか少し調べてみました。
Python のプロファイラ (cProfile) で処理時間を見てみると、AdaDelta の計算 ( AdaDelta.step() ) 処理時間に大きな違いがありました。 ( AdaDelta.step() は100エポックで合計10万回くらい実行されます。 )
OS | cumtime per call |
---|---|
Ubuntu18 | 0.79ms |
Windows10 | 3.74ms |
どうやら、この関数内で繰り返し実行される GPU での計算に時間がかかっているようです。
これ以外にも GPU で処理している部分が軒並み遅くなっており、その結果 上記の速度差が生まれているようです。
結論
Python そのものや NumPy については 「実行環境によって処理速度が異なるという事を覚えておこう」 という程度で良いと思います。
確かに差異はありますが、だからと言って使用する OS を切り替える必要はないでしょう。
しかし、GPU を使ってディープラーニングをするというのであれば Windows より Linux を選んだ方が良い みたいです。
特に学習に時間のかかるケースでは、Windows で頑張るよりデュアルブートで Linux も動くようにした方が結果として低コストという事になりかねません。
「ローカルにある Windows マシンで学習させてます」という方は一度検討してみてはいかがでしょうか?
最後に
「これは違うんじゃないの?」というご指摘、「これを測定してみたら?」というご提案がありましたら教えていただけると幸いです。
VirtualBox や Hyper-V のような仮想化システム上に構築した環境はどうなるのか興味があるので、誰か調べていただけるととても助かります!