まえがき
ROCmを試すためにRadeon Instinct MI50を買ってみて、PyTorchで使えるようにセットアップをしたのが前回。
今回は取ったベンチマークの結果をご紹介!
まとめ
- ROCmは本当にほぼコード変更無しでCUDA用のTensorFlow、PyTorch、Transformerのコードが動く。素晴らしい。
- 1GPUであればMI50のほうがP40よりも速い。特にFP16を利用する場合は4割くらい早く、結構実用的。
- 2GPUだとあまりまともな速度が出ない。処理速度に波があるような挙動を示すため、Gradientの集約に時間がかかっているのかも。
- 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のスペック
ベンチマーク
行ったベンチマークは以下の通り。P40に関しても新しくベンチを取り直し、なるべく公正な比較になるようにしています。
- FP32 画像分類モデルトレーニング(transformers pytorch exampleの
run_image_classification.py
) - FP16 言語モデルトレーニング(transformers pytorch exampleの
run_clm.py
) - SDXL1.0 画像生成
環境
P40, MI50
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でも問題なく実行できました。
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用ガイドを参考にしました。
基本的には前回のセットアップ編で記載した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はアリだと思いました。