コンテンツにスキップ

[Advance/NeuralMD Pro] GPUによる高速化のベンチマーク#

GPUに対応したAdvance/NeuralMD Proを使って計算速度のベンチマークを行いました。 本記事では、GPUを用いたニューラルネットワークの学習および分子動力学計算を行い、CPUのみで計算した場合と比較した結果を示します。 計算時間や並列数の目安を掴むための参考としてお使いください。

計算機環境#

  • CPU:Intel Xeon Silver 4310, 12コア 2.1GHz x 2個 (計24コア)
  • メモリ:8GB DDR4-3200 ECC RDIMM x 8枚 (計64 GB)
  • GPU:NVIDIA A30 x 1個
  • OS:AlmaLinux 8.6

ベンチマーク1:ニューラルネットワークの学習#

Advance/NeuralMD Proを使ったニューラルネットワークの学習を実行します。 教師データとして、リチウムイオン伝導体Li7La3Zr2O12 (LLZO)のプリミティブセル(96原子系)を4681構造だけ使用しています。 ニューラルネットワーク力場の計算条件は以下の通りです。

  • 対称関数:Chebyshev多項式
  • 動径成分:50個
  • 角度成分:30個
  • カットオフ半径:6.0 Å
  • ニューラルネットワーク:2層 x 40ノード w/ twisted tanh
  • 最適化アルゴリズム:L-BFGS
  • エポック数:100

CPUに関してはMPIとOpenMPのハイブリッド並列が適用されており、MPI並列数を種々の値として計算しています。 MPI並列数 x OpenMP並列数 = 12または24となるように、OpenMP並列数を調整しています。 また、GPUに関しては、CUDAにおける1ブロック当たりのスレッド数を128 〜 1024の範囲で変化させています。

また、以降の計算結果に用いた評価指標を下表に示します。

sf 対称関数の計算に要する時間
nn 1エポックごとのニューラルネットワークの学習に要した平均時間
walltime 計算に要した合計時間

CPUのみの結果#

GPUを用いずCPUだけで計算する場合、OpenMPでの並列は適用せずにフラットMPIで並列しています。 1CPUのみ(MPI並列数:12)および2CPU(MPI並列数:24)での計算結果は下表の通りです。

全CPUコア数 MPI並列数 OpenMP並列数 sf / s nn / s walltime / s
12 12 1 29.7 3.94 506
24 24 1 17.2 3.05 379

GPUを用いた結果#

CUDAのスレッド数およびMPI並列数を種々に変化させて計算時間を計測しています。 1CPUのみでの計算結果(MPI並列数 x OpenMP並列数 = 12)を左下図、2CPUでの計算結果(MPI並列数 x OpenMP並列数 = 24)を右下図に示します。

MPI並列数が2のときに最も計算時間が短く、MPI並列数を3以上に増やすと逆に計算時間が増大する傾向にあります。 Advance/NeuralMD Proでは複数のプロセスが同一のGPUデバイスにアクセスすることで、GPUの稼働率を保ちつつCPUも無駄なく活用するという設計となっています。 このため、ある程度のMPI並列数は必要ではあるものの、プロセス数が多過ぎると逆にGPUが過負荷となり計算速度が低下することが分かりました。 今回のベンチマークでは、1GPU当たりMPI並列数は2が丁度良いという結果です。

また、1CPUのみで計算するよりも2CPUで計算する方が計算時間がやや短縮される傾向にあります。 GPU化されていない処理についてもある程度の負荷が残っており、GPU搭載マシンを検討する場合にはCPUのスペックも要検討であると言えます。

MPI並列数が2の場合(1GPU当たりのプロセス数が適切に設定されている場合)において、CUDAスレッド数を256に設定すれば十分な計算速度が確保できます。 CUDAスレッド数を256よりも大きく設定しても性能の改善は見られませんでした。 MPI並列数が2、CUDAスレッド数が256のときの計算時間を下表に示します。

全CPU
コア数
MPI
並列数
OpenMP
並列数
CUDA
スレッド数
sf / s nn / s walltime / s
12 2 6 256 6.23 1.11 189
24 2 12 256 5.72 1.11 171

GPUによる高速化#

CPUのみでの計算速度を基準とした、GPUを用いた場合の相対計算速度を下表に示します。 GPUを用いることにより、2〜3倍程度高速化されています。

全CPUコア数 sf (相対計算速度*) nn (相対計算速度*) walltime (相対計算速度*)
12 4.8 3.5 2.7
24 3.0 2.8 2.2

* CPUのみでの計算時間をGPUを用いた場合の計算時間で除したもの

ベンチマーク2:分子動力学計算#

LAMMPS 2Jun2022(アドバンスソフト改修版Advance/NanoLabo Toolに同梱)を使った分子動力学計算を実行します。前項で学習したニューラルネットワークによる力場を使います。 計算対象はLLZOのスーパーセルモデルで、原子数は12960です。 こちらの計算もMPIとOpenMPのハイブリッド並列を適用し、MPI並列数 x OpenMP並列数 = 12または24となる条件を採用しています。

LAMMPSでは対称関数の計算がボトルネックとなります。 対称関数の計算はGPUにて実行されるため、CUDAのスレッド数とブロックサイズのチューニングが重要になります。 スレッド数については前項にて256で十分であることがわかったため、ブロックサイズを種々に変化させて計算時間を計測します。 また、前項と同様にMPI並列数についても可変としています。

CPUのみの結果#

CPUのみで計算した場合の計算結果を下表に示します。

全CPUコア数 MPI並列数 OpenMP並列数 walltime / s
12 12 1 156
12 6 2 152
24 24 1 91.4
24 12 2 92.1

GPUを用いた結果#

CUDAのブロックサイズ(atomBlock)およびMPI並列数を種々に変化させて計算時間を計測しています。 対称関数の計算は原子毎に独立しているため、原子数に関する自由度をCUDAブロックに割り当てています。 1CPUのみでの計算結果(MPI並列数 x OpenMP並列数 = 12)を左下図、2CPUでの計算結果(MPI並列数 x OpenMP並列数 = 24)を右下図に示します。

atomBlockの増加に伴って計算時間が減少することがわかりました。 ただし、atomBlockを大きくし過ぎても高速化の効果は鈍化するため、atomBlock = 4096程度に留めておくのが良さそうです。 また、MPI並列数が1の場合(並列しない場合)にはatomBlockの増大に伴う高速化の影響が小さく、逆に、MPI並列数が2以上の場合にはatomBlockを十分に大きくすると高速化の度合いが大きくなることが確認されました。 GPU1デバイス当たり複数のプロセスがアクセスすることで、GPUおよびCPU双方において十分に高いレベルの稼働率を保持できるものと推測されます。 1デバイス当たりのMPI並列数は、2〜4程度で十分な高速化が期待できます。

以下に、MPI並列数が4のときの計算時間を示します。

全CPUコア数 MPI並列数 OpenMP並列数 atomBlock walltime / s
12 4 3 4096 43.3
24 4 6 4096 42.3

GPUを用いた場合、計算時間はCPUのコア数にさほど依存しないことがわかりました。 ニューラルネットワークの学習ではGPU化されていない処理(CPUでの処理)に要する時間が無視できない程度存在したのですが、 LAMMPSでの分子動力学計算においては比較的にCPUでの処理は低コストであるものと推測されます。

GPUによる高速化#

CPUのみでの計算速度を基準とした、GPUを用いた場合の相対計算速度を下表に示します。 GPUを用いることにより、2〜4倍程度高速化されています。

全CPUコア数 walltime (相対計算速度*)
12 3.5
24 2.2

* CPUのみでの計算時間をGPUを用いた場合の計算時間で除したもの

まとめ#

以上の結果から、ニューラルネットワークの学習・分子動力学計算のいずれも、GPUによる高速化が期待通りに機能していることがわかりました。 また、今回のベンチマークではGPUとしてNVIDIA A30を1つのみ使用しましたが、複数のGPUデバイスが搭載されたマシン and/or GPU搭載マシンが複数ノードある環境での計算にもAdvance/NeuralMD Proは対応しています。

関連ページ#