これはhttp://mitochondrion.jp/に掲載している「医学日記」を 検索用に 1 記事 1 ファイルとして形成し直したものです。 簡単なプログラムで自動生成しているので、体裁の乱れなどが一部にあるかと思われます。 通して読むには、トップページからオリジナルページにアクセスしてください。
PC のベンチマーク情報はインターネット上に溢れているが、大抵は美麗なグラフィックを伴うゲームを念頭においたものであり、我々が行うような数値計算とは事情が異なる。そこで今回、私が実際に研究として計算しているデータを用いたベンチマークを行った。詳細は伏せるが、これは PyTorch を用いた深層学習であり、CPU または GPU でのベンチマーク用にパラメーターを調整したものである。ここで用いた深層学習は単純な多層パーセプトロンモデルで、中間層は 1 層、ノード数は入力層 40, 中間層 16,384 (GPU) または 4,096 (CPU), 出力層 2 である。学習データ数は 300 万、バッチサイズは 8192, エポック数は 30 (GPU) または 20 (CPU) とした。タスクとして 1) CPU のみ, ジョブ 1 個; 2) GPU のみ, ジョブ 1 個;3) CPU のみ, ジョブ 3 個自明並列; 4) GPU のみ, ジョブ 3 個自明並列;5) CPU ジョブ 3 個 + GPU ジョブ 3 個の自明並列; の 5 通りを行い、それぞれの処理完了までに要する時間を 5 回計測し、中央値を採用した。この処理時間には NFS を介するファイル転送なども含まれており、実際の研究における処理を模したものになっている。なお Helsinki, Muscat, Venezia は PyTorch 2.7.1 + CUDA, Hanoi と Dublin は PyTorch 2.8.0 + ROCm 6.4 である。結果を表に示す。
Hotname | CPU 1 ジョブ | GPU 1 ジョブ | CPU 3 ジョブ並列 | GPU 3 ジョブ並列 | CPU + GPU 6 ジョブ並列 |
---|---|---|---|---|---|
Helsinki | 12 分 30 秒 | 4 分 48 秒 | 26 分 4 秒 | 7 分 1 秒 | 28 分 40 秒 |
Muscat | 12 分 24 秒 | 4 分 54 秒 | 24 分 10 秒 | 7 分 9 秒 | 32 分 23 秒 |
Venezia | 20 分 57 秒 | 5 分 8 秒 | 38 分 53 秒 | 7 分 18 秒 | 39 分 49 秒 |
Hanoi | 17 分 53 秒 | 5 分 5 秒 | 22 分 10 秒 | 8 分 12 秒 | 23 分 11 秒 |
Dublin | 23 分 31 秒 | 5 分 32 秒 | 31 分 0 秒 | 9 分 9 秒 | 33 分 11 秒 |
CPU と GPU でジョブの処理に要する時間の差が大きすぎた。GPU のエポック数を 75 程度にすれば良かったのだが、やり直すのは面倒なので、このまま考察する。
まず不可解な点として、Hanoi と Dublin は CPU 1 ジョブの際の処理が異常に遅い。top コマンドで演算中の CPU 使用率をみると Helsinki は 1000% を超えるのに対し、Hanoi 900% 程度、Dublin 450% 程度となっており、CPU コアを使い切っていない。PyTorch が CPU コア数を正しく認識できていないようにみえるのだが、詳細は検討していない。これはソフトウェア的な問題だと思われるので、ハードウェアの性能評価としては今回の CPU 1 ジョブの値は使えない。
RTX 4060 (Helsinki, Muscat, Venezia) と RX 9060 XT (Hanoi, Dublin) の間で著明な差はみられなかった。Dublin がやや遅かったのは、メインメモリ (DDR5-3600) の遅さがが足を引っぱったものと思われる。
面白いのは CPU 3 ジョブ並列の結果である。まず Helsinki と Muscat を比較すると、前者の方が CPU は優れているはずなのに、成績では後者に負けた。この処理時間の比 (1.08) は両者のメモリ速度比 (5200/4800 = 1.08) と一致した。すなわち、この演算の処理速度は CPU ではなくメモリの速度で律速されていたと考えられる。私が PC 自作を始めた中学生や高校生の頃は、PC の演算速度は主に CPU で規定されるものと考えられており、メモリ速度は 1% 以下の差を追求するオーバークロッカーなど一部のマニアだけが気にする問題であったように思う。しかし現代では CPU の速度向上に比してメモリ速度の向上が乏しかったために、CPU ではなくメモリが全体の演算処理速度を規定することが稀ではないのである。このような時代にあって、CPU に過剰な投資をするのは研究費の効率的な使用という観点からは無駄であるから、諸君が研究用 PC を新調する際には構成をよく検討されるべきである。
Venezia は Ryzen 9 とはいえ旧式の AM4 規格であり、当然メモリも低速の DDR4 であることを反映し、CPU での処理はたいへん遅かった。しかし GPU での処理では問題ないのだから、Helsinki や Muscat との価格差を考慮すれば費用対効果は高かったといえる。
Hanoi は CPU 3 ジョブで CPU コアを使い切っている状況では速かったが、Helsinki との速度比は 1.17 であり、メモリの速度比 (6000/4800 = 1.25) よりもやや低かった。また Dublin は遅いものの、Helsinki との速度比は 0.84 であり、メモリの速度比 (3600/4800 = 0.75) よりは高かった。大雑把な近似として、どうやら計算速度はメモリ速度の 2/3 乗ぐらいに比例しているようにみえる。理屈はわからない。
もう一つ、当然といえば当然だが注意すべき結果として、CPU 3 ジョブ自明並列計算を行っているところにGPU 自明並列ジョブを追加しても、全体の計算時間はあまり伸びなかった。これは、GPU ジョブではメインメモリからビデオメモリの間の転送を要するものの、演算の過程ではメインメモリへのアクセスがないために CPU ジョブを妨げない、という理解でよかろう。
結論としていえることは、現代ではメモリアクセスがボトルネックとなるために、私のような数値計算では CPU の性能を使い切るのは難しい、ということである。CPU キャッシュを効率的に使うよう最適化したプログラミングを行っている場合はどうだか知らぬが、私程度の素人では Ryzen 9 9950X のような宝物を使いこなせていないようである。