端の知識の備忘録

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

【セットアップ編】Radeon Instinct MI50を買って機械学習用に使ってみる【ROCm】

まえがき

しばらく大きな買い物をしていなかったが、仕事からの現実逃避をしているとふと思う。「ROCm、試してみたいなー」

ということで、ebayを開きめぼしいGPUを探してみたところ、$200以下のお手頃価格で一応ギリギリ最新のROCm 6.0.2にもメンテナンスサポートされているMI50を発見。

送料も考えて2枚まとめて買ってみたので、数回に分けてROCmのインストールから機械学習用の環境構築、以前に買った同価格帯の中古サーバー用GPUの先輩であるNVIDIA P40との比較までを書いていこうと思う。

今回はセットアップ編ということで、取り付けとROCmインストールでrocm-smiが動くところ、PyTorch上でGPUが認識されるまでを書いていく。

hashicco.hatenablog.com

  • P40の記事

hashicco.hatenablog.com

  • 取り付け時のXポストたち

まとめ

  • ebayでMI50 16GBが1枚$190で買えました。2つ買って送料、消費税込でだいたい70,000円くらい

    • MI25も似たようなスペックですがMI50のほうがアーキテクチャが少し新しく(MI25がgfx900, MI50がgfx906)、メモリバス幅が倍なので、大した金額差ではないしMI50を選択しました。
  • 今回冷却用にArcticの新しいファン(S8038-10K)を買いました。こいつが中々のモンスターで、80mmファンで500~10000rpmのPWM制御が可能、MAX102cfmというスペック。

    • 10000rpmだとノイズもやばいXに動画を上げときましたが、見るときは音量注意
    • 5000rpmくらいに抑えると結構な風量の割に音も耐えられる感じなので、ipmitoolを使ってファンコントロールしました。
    • 1個$16ですが、米アマで4個まとめ買いして大体送料込み12000円くらい
  • ROCmのインストールは拍子抜けするほど簡単!コマンド数行でつつがなく終了したので、下手するとNVIDIAのドライバとCUDAインストールよりも簡単だったかもしれない。

  • 買ってしばらくして気づいたのですが、私の買ったMI50はどうやらRadeon VIIのVBIOSが焼かれているようで、PCからはRadeon VIIとして認識されてるっぽい

    • 購入先はebayのcomputewarehouseというショップ。現在MI50のVBIOSをもらえないか問い合わせ中
    • (20240410 追記) computewarehouseの担当者と連絡が取れ、MI50のVBIOS Flasherをいただくことができた。まだ試せていないが、もしうまくいったらなにか書く予定。
    • MI50をRadeonVIIにする改造は結構広く行われているようなのでまあこのまま使ってもいいのだが、FP64の性能が半分になるらしい。
    • オリジナルをそのまま使いたい気持ちもあるので可能ならVBIOSを書き換えたいのですが、MI50のものはどこを探しても発見できず……。
  • マシンとしては前回作成したEPYCマシンのP40を載せ替え、SSDをサラのに交換したものを使ったのだが、M/BのH11SSL-iでのファン制御は結構苦戦した。

    • 結果的にBMCを最新にアップデートすることでipmitoolによるファンの固定値制御がうまくワークするようになった
  • ちょっとしたトラブルとして、GPU2枚のうち1枚、付いていないはずのGPUファンの表示上の速度が過負荷時に異常に下がって報告されてしまい、システム異常を示すと思われる凄まじいビープ音を発する現象が確認された

    • おそらくRadeonVIIのVBIOSが焼かれていることが原因と思われる。
    • 結局rocm-smiでファン回転数を固定値とすることで問題は解消した。

次から詳しい説明です。興味のある方はどうぞ。

カードの取り付け

  • MI50

今回はアメリカからの発送で受取まで約3週間くらいかかりました。

カードの見た目が中々カッコよくていい感じ。P40と並べて撮影してみても、Radeon Instinct MI50のほうがモダンで高級感があります。

  • S8038-10K

80mm, 38mm厚のマッシブなファンです。まるで120mmファンのような102CFM、強力な51mmH2Oというものすごい静圧ファン。

  • ファンを取り付ける

いつも通り段ボールを使って無理くりブラケットを作ります。カードの上部に出っ張りがあり加工が中々難しかった……。

本当は上部にInfinity fabric connectorの繋ぐ場所があるのですが、肝心のコネクタ自体が買える値段で売ってなかったので使いません。

  • 出来上がったもの

前回作ったEPYCマシンに2枚のMI50を刺します。段ボールの見栄えが悪いし下手すると燃えそうなので真似する場合はあくまで自己責任で!

OS準備とファン制御

今回OSはUbuntu 22.04を使います。ROCm 6.0.2は20.04または22.04対応とのこと。

OSインストールについては、いつも通りEtcherにISOを焼いて新しいSSDをにインストールします。

で、あとはROCmをセットアップ……と行きたいところですが、ファン制御をしないことには10000RPM近くでGPUファンが回るのでとても煩くて作業できません!

ということでファン制御の方法を調べてみるとipmitoolというコマンドで制御できるらしい。

hassiweb.gitlab.io

指定する0x30や0x45などのHexコードの意味はよくわかりませんが、とりあえずファンモードをFullにしたうえで、ファン回転数を手動設定すればいいらしい。

GPU用とその他のファンで制御を分けたかったので、本来の使い方とは違いますがFANA, BコネクタにGPU用のS8038-10Kを接続し、他のファンはFAN1~5に接続します。こうすることで、GPUファンはペリフェラル用のファンゾーン(0x01)で制御できるようになります。

# ファンモードの変更。0x01がFullを意味するらしい
sudo ipmitool raw 0x30 0x45 0x01 0x01

# ファン回転数の手動設定。後ろから2つ目のHexがファンゾーン。今回はペリフェラルの方を制御したいので0x01を指定。
# ファンの回転数は一番うしろのHexで指定。0x00~0xFFの64段階で指定できる。今回は約5000RPMをターゲットにするので0x32を指定
sudo ipmitool raw 0x30 0x70 0x66 0x01 0x01 0x32

……が、何度このコマンドを実行しても一時的にファン回転数が下がるもののまた最大に戻るという挙動が発生。煩すぎてまともに作業できないので一旦電源を落として情報を探したところ、次のフォーラムでBMCのアップデートを行うことが推奨されていた。

forums.servethehome.com

結局こちらの内容がドンピシャで、BMCをアップデートしたらちゃんと上記コマンドでファン回転数を制御できるようになりました

ちなみに、BMCのアップデートファイルはこちらで配布されています。H11SSL-Iで検索したら出てきたv2.09に更新しました。

www.supermicro.com

ROCmのインストールとPyTorchセットアップ

で、ここが本題になるはずだったのだが、あまりにも簡単にインストールできてしまったので取り立てて書くことはなく、基本的に公式ページの内容通りに作業すれば良い

最終的にTransformersのExamplesで性能検証をしていきたいので、huggingfaceのAMDページにあるインストラクションに従って作業していきます。

huggingface.co

1. Confirm you have a supported AMD hardware platform

私の買ったMI50はギリギリサポート中。Deprecated - Support will be removed in a future release.だそうです。

rocm.docs.amd.com

2. Install ROCm driver, libraries and tools

次のページを参考にインストール。

rocm.docs.amd.com

今回はAMDGPU Installerという方法を試します。基本は上記のページのコマンドを利用しますが、特にグラフィック出力は使わないので--usecaserocmのみにしておきます。

sudo apt update
wget https://repo.radeon.com/amdgpu-install/6.0.2/ubuntu/jammy/amdgpu-install_6.0.60002-1_all.deb
sudo apt install ./amdgpu-install_6.0.60002-1_all.deb
sudo amdgpu-install --usecase=rocm

20GBくらいダウンロードが行われますが、特にエラーもなく正常終了。

3. Install Machine Learning Frameworks

pipからのインストールがおすすめされています。

とりあえずvenvで仮想環境を切ったうえで、下記コマンドを実行していきます。

PyTorchは専用の--index-urlを指定し、TensorFlowはtensorflow-rocmという別名パッケージを指定してインストールするだけ。

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/rocm5.7
pip install tensorflow-rocm
pip install transformers

これも特に問題なく実行できました。

4. ユーザーのグループ追加

rocm系のコマンドの実行にはユーザーをrendervideoというグループに参加させる必要があります。

sudo usermod -aG render USER名
sudo usermod -aG video USER名

で、最後にマシンをリブートします。リブートしないとPyTorchからGPUが見えませんでした。

5. rocm-smiの内容確認

で、ここまでやれば普通にrocm-smiというnvidia-smi的なコマンドを実行できるようになります。

表示内容は次のスクショみたいな感じ。GPU使用率、VRAM使用率など確認できます。

6. PyTorchからのGPU認識確認

で、PyTorchからどのようにROCmデバイスを利用するかといえば、基本的には普通にcudaデバイスと同じ扱いで良いようです。つまり、すでにNVIDIA GPUで動いているコードであれば特に変更する必要はなく、modelとデータを全部.to("cuda")で同じデバイス上に送っておけばOK。

ということで、GPU認識の確認もいつもどおりの次のコマンドでOK。次のスクショのような感じで確認できます。

import torch
print(torch.cuda.is_available())
print(torch.cuda.device_count())
print(torch.cuda.get_device_name())

拍子抜けするほど簡単に、なんの問題もなく2枚のMI50(RadeonVII)が認識されました。

ファンスピードを固定する

まとめにも書いたが、RadeonVIIのVBIOSが焼かれているからかもしれないが、高負荷時に存在しないはずの表示上のファンスピードが極端に遅くなり、下限に達したためかけたたましいビープ音を鳴らしたことがありました。

結果、rocm-smiの --setfan でファンスピードを固定値にしたところ問題が解消。どのみちファンはGPUカードに刺さっていないのでそこそこ高め(私はとりあえず100に設定。255段階っぽい。)に設定しておけばOKだろう。

manpages.debian.org

次回予告

次回はP40とガチンコベンチマークバトルの予定!全部データは取ってあり記事を書くだけなので、なるべく早めに上げたいと考えています。

とりあえず簡潔に言うとMI50はP40に対してそんなに性能的優位は示せていない。とはいえ、VRAMいらず単にStableDiffusionを動かすだけとかならもしかしたら最もコスパの良いGPUになるかも?といった感じ。詳細は乞うご期待。