端の知識の備忘録

技術メモになりきれない、なにものか達の供養先

【ベンチマーク編】 Radeon Instinct MI50を買って機械学習用に使ってみる【ROCm】

まえがき

ROCmを試すためにRadeon Instinct MI50を買ってみて、PyTorchで使えるようにセットアップをしたのが前回。

hashicco.hatenablog.com

今回は取ったベンチマークの結果をご紹介!

まとめ

  • ROCmは本当にほぼコード変更無しでCUDA用のTensorFlow、PyTorch、Transformerのコードが動く。素晴らしい。
  • 1GPUであればMI50のほうがP40よりも速い。特にFP16を利用する場合は4割くらい早く、結構実用的。
  • 2GPUだとあまりまともな速度が出ない。処理速度に波があるような挙動を示すため、Gradientの集約に時間がかかっているのかも。
    • Infinity fabric connectorをつけるとか、PCIe4であればもう少しマシになるのかも。
    • 2GPUをうまく使うならDDPでトレーニングするよりも、別プロセスで別のモデルを同時に2つトレーニングするように使うほうが実用的と思われる。
  • SDXL1.0でも512x512で7.3 sec/枚(FP16)の画像生成速度と、P40の10.9 sec/枚よりも4割以上速い。画像生成で遊ぶならMI50は悪くないと思う。

ということで、MI50は結構使えるGPUと言える。ただ、2GPUでDDPトレーニングをするような場合はあまり速度が出ないので買うなら1枚がオススメ。

P40と比べると、MI50のほうが速度は速いがVRAMが少ない。LLMで遊ぶ用ならメモリ量が第一なのでP40、Diffusion系の画像生成なら必要VRAMも比較的少ないモデルも多いし原理的に計算が重いと思うのでMI50のが良いかもしれません。

ROCm起因のトラブルもないわけではないのでちょっと玄人向けかもしれませんが、性能も3万円とは思えないほどなので、MI50は機械学習で遊ぶ用としてお家に1枚あっても損はないGPUかもしれない。

VRAM 32GB版が安く買えるなら間違いなくコスパ最強と言えると思うが、入手しやすい16GBに関しては必要なVRAM量を考えてP40とMI50のどちらか選ぶのが悩ましいところである。

ちなみに、Redditに「MI50機械学習用にどうよ?」的なスレッドもあったので、購入検討時にはこちらも確認するといいだろう(私は読まずに買ってしまいましたが)

https://www.reddit.com/r/LocalLLaMA/comments/1b5ie1t/interesting_cheap_gpu_option_instinct_mi50/

P40とMI50のスペック

www.techpowerup.com

www.techpowerup.com

ベンチマーク

行ったベンチマークは以下の通り。P40に関しても新しくベンチを取り直し、なるべく公正な比較になるようにしています。

  • FP32 画像分類モデルトレーニング(transformers pytorch exampleのrun_image_classification.py)
  • FP16 言語モデルレーニング(transformers pytorch exampleのrun_clm.py)
  • SDXL1.0 画像生成

環境

P40, MI50

  • CPU: EPYC 7551P 32Cores
  • MEM: DDR4 2133 256GB
  • M/B: H11SSL-i
  • SSD: SATA 1TB
  • OS: Ubuntu22.04

RTX4090

  • CPU: R9 7950X3D 16Cores
  • MEM: DDR5 4800 64GB
  • M/B: MSI X670-P WIFI
  • SSD: M.2 PCIe4 2TB
  • OS: Win11 Pro(WSL2 Ubuntu 22.04)

FP32 画像分類モデルトレーニン

transformersをGitHubからクローンしてくることで利用可能なexamplesを実行します。とりあえずROCmでも問題なく実行できました。

https://github.com/huggingface/transformers/blob/main/examples/pytorch/image-classification/run_image_classification.py

GPU train_samples_per_second eval_samples_per_second train ratio(MI50x1=1) eval ratio(MI50x1=1)
MI50x1 35.686 90.745 1 1
MI50x2 33.933 69.598 0.9509 0.7000
P40x1 31.508 76.755 0.8829 0.8458
P40x2 37.566 74.594 1.0532 0.8219
RTX4090 101.406 197.71 2.8416 2.1787

結果、MI50は1枚のほうが速いという結果に。

1枚勝負ならP40よりもTrainでもEvalでも速いことがわかった。P40x2のTrainでは流石に負けるがその差は僅か。

FP16 言語モデルレーニン

使ったExampleは次のURLのもの。VRAM量の関係からBatch sizeを4に落として実行しました。

https://github.com/huggingface/transformers/blob/main/examples/pytorch/language-modeling/run_clm.py

GPU train_samples_per_second eval_samples_per_second train ratio(MI50x1=1) eval ratio(MI50x1=1)
MI50x1 7.015 19.792 1 1
MI50x2 5.595 11.597 0.7976 0.5859
P40x1 4.582 12.63 0.6532 0.6381
P40x2 6.485 12.787 0.9244 0.6461
RTX4090 19.049 52.211 2.7155 2.6380

結果、1枚のMI50がP40x2よりも速いことがわかった。

レーニングのベンチマーク結果からは、少なくともMI50 1枚は同価格帯のP40よりも性能が高く、VRAM量を気にしなければコスパが高いと言えるだろう。

なんなら30万するRTX4090の1/3~1/2くらいの性能は出ているので、コンペなどでも意外と使えなくもないかもしれない。

SDXL1.0 画像生成

automatic1111のWebUIから、sd_xl_base_1.0による512x512の画像を1枚生成するときの速度を比較。5回生成したときの実行時間の平均を取りました。

P40におけるセットアップは前回ブログでも紹介した次の記事を参照。

https://pc.watch.impress.co.jp/docs/column/ubuntu/1493536.html

ROCmにおけるセットアップは公式のAMD用ガイドを参考にしました。

https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Install-and-Run-on-AMD-GPUs#running-natively

基本的には前回のセットアップ編で記載したvenv環境で./webui.sh --precision full --no-half --listenまたは./webui.sh --upcast-sampling --listenのどちらかのコマンドを実行すれば良いです。

  • MI50(--precision full --no-half): 8.4s
  • MI50(--upcast-sampling): 7.3s
  • P40(オプション無し): 10.9s

いずれにおいてもP40よりも早く推論できています。VRAMの使用量は--precision full --no-halfで88%、--upcast-samplingで47%と、SDXLをなんのオプションも付けずに動かす分にはFP32でもメモリは足りています。

よく画像生成用に買われているRTX3060よりも安く、メモリも多く、しかも結構速いということで、冷却の問題を解決できるパワーユーザーならMI50はアリだと思いました