ゲームもAIも両立！ROCm対応進化でRadeon GPUでもLLMライフを捗らせる！

この記事は、[Ateam LifeDesign Advent Calendar 2024](https://qiita.com/advent-calendar/2024/ateam-life-design) の 25日最終記事になります。

## はじめに

[Ryzen 7 9800X3D](https://www.amd.com/ja/products/processors/desktops/ryzen/9000-series/amd-ryzen-7-9800x3d.html) が 11月15日(金) AM11:00 に日本国内で発売された瞬間品切れになり中々入手できない中、偶然手に入れることができたので、20数年ぶりに自作PCをした@kopugです。

どうせならGPUもAMDの[Radeon 7900XTX](https://www.amd.com/ja/products/graphics/desktops/radeon/7000-series/amd-radeon-rx-7900xtx.html)にし、年末年始はゲーム三昧！と思っていたのですが、個人開発でもAIやLLMを触ることがあるので、Radeonで今どれくらい動くのか？というのを検証した記事になります。

ゲーム側の対応に関係なくフレームレートを約2倍程向上させられる[AFMF2(AMD Fluid Motion Frames)](https://www.amd.com/ja/products/software/adrenalin/afmf.html)は魅力的だけど、AIやLLMの機能面/パフォーマンスはどうなの？と気になっている方に少しでも参考になれば幸いです。

## ROCm: AMDのGPUコンピューティングソリューション

ROCm（Radeon Open Compute）は、AMDが開発した並列コンピューティング用のオープンソースソフトウェアスタックです。NVIDIAのCUDAに相当し、GPUコンピューティングのために設計されています。

### 主な特徴

- **オープンソース**: 開発者の柔軟性とアクセシビリティを向上
- **マルチGPUサポート**: 複数のRadeon RXおよびRadeon PRO GPUの構成をサポート（構成によって性能が変動）
- **WSL 2対応（ベータ版）**: Windows環境でのAI開発が可能。ただし一部機能に制限あり（例: `rocm-smi`非対応）
- **機械学習フレームワーク対応**: TensorFlow、PyTorch、ONNX Runtimeを公式サポート

### CUDAとの比較

| 特性         | CUDA                         | ROCm                           |
|--------------|------------------------------|--------------------------------|
| エコシステム | 広範なライブラリとツール     | 一部主要フレームワークをサポート |
| 互換性       | 業界標準                     | CUDAとの互換性に課題           |
| パフォーマンス | 最適化が進んでいる           | 特定のAMD GPUで最適化         |
| 学習曲線     | 広く普及している             | 開発者による調整が必要          |


ROCmは、ハイパフォーマンスコンピューティング（HPC）、AI、科学計算、CADなど、様々な分野でAMD GPUを効果的に活用することを目指しています。RDNA 3アーキテクチャなどの新世代ハードウェアでのパフォーマンス向上が報告されており、オープンソースの特性を活かし、今後さらなる発展が期待されています。

今回はROCmを用いて、WSL2でAUTOMATIC1111/Stable Diffusion WebUIを構築し、どれくらいの生成速度なのか、またNVIDIA GeForce RTX4070 Tiと比較してどうなのかを検証していきます。


## 構築環境
- OS: Windows 11 + WSL2 Ubuntu 22.04
- CPU: Ryzen 7 9800X3D
- GPU: Radeon RX 7900 XTX
- MEM: DDR5 32GB x 2

## 1. ROCmと関連ソフトウェアのインストール
```bash:bash
sudo apt update
wget https://repo.radeon.com/amdgpu-install/6.2.3/ubuntu/jammy/amdgpu-install_6.2.60203-1_all.deb
sudo apt install -y ./amdgpu-install_6.2.60203-1_all.deb
sudo amdgpu-install -y --usecase=wsl,rocm --no-dkms
sudo usermod -a -G render,video $LOGNAME
```

:::note warn
--no-dkms オプションについて
Dynamic Kernel Module Support (DKMS) モジュールのインストールを省略するためのものです。WSL2ではカーネルモジュールをカスタマイズできないため、このオプションを指定することで、不要なモジュールのビルドエラーを回避します。特にWSL環境でのROCmのセットアップ時に推奨されます。
:::

ROCmを認識させるためにWSLをshutdownさせた後に再度WSLに接続をしてください
```PowerShell:PowerShell
wsl --shutdown
```

`rocminfo` コマンドをWSL内で実行し、RPCmが正しくインストールされていることを確認してください。

```bash:bash
rocminfo

  :        :          :          :
  Name:                    gfx1100
  Marketing Name:          AMD Radeon RX 7900 XTX
  Vendor Name:             AMD
  Feature:                 KERNEL_DISPATCH
  Profile:                 BASE_PROFILE
  :        :          :          :
```

## 2. PyTorch ROCm対応バージョンのインストール

必要なPythonパッケージをインストール
```bash:bash
sudo apt install python3-pip -y
pip3 install --upgrade pip wheel
```

```bash:bash
wget https://repo.radeon.com/rocm/manylinux/rocm-rel-6.2.3/torch-2.3.0%2Brocm6.2.3-cp310-cp310-linux_x86_64.whl
wget https://repo.radeon.com/rocm/manylinux/rocm-rel-6.2.3/torchvision-0.18.0%2Brocm6.2.3-cp310-cp310-linux_x86_64.whl
wget https://repo.radeon.com/rocm/manylinux/rocm-rel-6.2.3/pytorch_triton_rocm-2.3.0%2Brocm6.2.3.5a02332983-cp310-cp310-linux_x86_64.whl

pip3 uninstall torch torchvision pytorch-triton-rocm numpy
pip3 install *.whl numpy==1.26.4
```

PyTorchのROCm版が、正しいlibhsa-runtime64.soを使用できるようにライブラリを差し替え
```bash:bash
pushd .
location=`pip show torch | grep Location | awk -F ": " '{print $2}'`
cd ${location}/torch/lib/
rm libhsa-runtime64.so*
cp /opt/rocm/lib/libhsa-runtime64.so.1.2 libhsa-runtime64.so
popd
```

動作確認
```bash:bash
python3 -c 'import torch; print(torch.cuda.is_available())'
```
`True` と返ってくれば成功です。

## 3. Stable Diffusion Web UI のインストール

```bash:bash
git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
cd stable-diffusion-webui
```

モデルファイルを入れるディレクトリを作成し、今回は以下のモデルファイルを利用させて頂きます。
[Stable Diffusion v1-5-pruned.ckpt](https://huggingface.co/stable-diffusion-v1-5/stable-diffusion-v1-5)
```bash:bash
mkdir -p models/Stable-diffusion
wget -O models/Stable-diffusion/v1-5-pruned.ckpt https://huggingface.co/stable-diffusion-v1-5/stable-diffusion-v1-5/resolve/main/v1-5-pruned.ckpt?download=true
```

必要なPythonパッケージをインストール
```bash:bash
pip3 install --upgrade pip
pip3 install -r requirements.txt
```

Web UI の起動
```bash:bash
python3 launch.py --precision full --no-half
```

起動ができたら ブラウザで http://127.0.0.1:7860/ にアクセスできれば成功です。

:::note warn
`venv`を利用する場合は、venv内にPyTorchを同様にインストールする必要があります。
:::

## 4. 画像を生成してみる

今回は試しに以下のプロンプトで画像を生成してみます。

```prompt:Prompt
cute cat, realistic, high quality, masterpiece, HD
```
```prompt:Negative prompt
(worst quality, low quality:1.4), (zombie, sketch, interlocked fingers,comic), nsfw
```

実際に生成された画像は以下のようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34731/065ae91b-1aa3-a1ee-4817-3d0279d414c2.png)

生成にかかった時間は 5.8秒のようですね。
1秒あたりの処理数は以下になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34731/b3ed54fa-f4f2-6834-beb2-4cbe4dbab6fc.png)

これくらいであれば十分に耐えられる速度になって来ているのではないでしょうか！

## 5. NVIDIA GeForce RTX4070 Ti との比較

同様のプロンプトで画像生成してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34731/83328791-8185-2746-994f-68761bade7f1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34731/040834ce-1182-212f-c9b8-5ea7d3742bda.png)

4070 Tiは最新のCUDA最適化が施されており、ROCm対応のAMD環境に比べて計算効率が非常に高いため、処理速度で2倍程度の差が生じています。

ただROCm環境でも安定的に動作できており、日々速度向上もされていっているので今後に期待ですね！

## まとめ

今回はゲームもAIも両立！という名目で簡単な比較検証を行ってみましたが如何でしたでしょうか。

AMD ROCm環境でも十分に実用的ですが、高速な画像生成を求める場合はNVIDIA GPU（特に最新世代のRTXシリーズ）が優れた選択肢にはなります。
ただし、AMD GPUは価格性能比に優れるため、コストを抑えてゲームパフォーマンスも求めるなら選択肢に入ってくるかもしれませんね！


## 参考資料

- https://rocm.docs.amd.com/en/latest/
- https://www.amd.com/en/resources/support-articles/release-notes/RN-RAD-WIN-24-10-21-01-WSL-2.html
- https://rocm.docs.amd.com/projects/radeon/en/latest/docs/install/wsl/install-radeon.html