【2025.5】ubuntu×AMD CPU/GPU×dockerでStable Diffusionを動かす

# はじめに

タイトルのとおりで ubuntu×AMD CPU/GPU×dockerでStable Diffusionを一応動かせるようになったので手順をまとめておきます。nVidiaが嫌いとかではないですが市場を寡占してGPUの値段を吊り上げられても困るので、AMDのシェアが広がることを期待して書きます。
この手の記事はいくつかありますがご存じのとおり状況は流動的なので、現時点の最新情報という体で記録します。

## 環境

| Item | Detail | Note |
|---|---|---|
| CPU | AMD Ryzen 7 5700X | 8-core |
| GPU | AMD Radeon RX 7800 XT | gtx1101 |
| OS  | Ubuntu 24.04.2 LTS | Kernel version: 6.11.0-24 |
| ROCm   | 6.4.0 | 最終的に6.2でもいいかもしれないが、普通に入れると最新バージョンしか入らないしあまり気にしなくてもいいかもしれない。 |
| Python | 3.10.16 | |

## おことわり

* 試行錯誤やって環境を作ったことを思い出しながら書いた程度なので正確性とか再現性はあまり期待しないでください
* 現段階でstable diffusionが未だにpython 3.10系にとどまっている（masterブランチが更新されていない）というのが面倒さの一因ですが、もしかしたらこの記事を読む未来の方々は3.12系でstable diffusionを使えるかもしれません。 **そういった状況を確認の上、この記事を読むことを強くお勧めします。**
* ubuntu 22.04を使っている人は割と簡単にできるかもしれません。

# 手順

dockerを使いますがホスト側の設定も最低限必要です。（だからdockerを使う意味があまりない気もしますが……）

## ホストの準備

### ROCmなどのインストール

AMDがだいたいの手順をまとめてくれています。

まず下記をそのまま実行していきます。

1. https://rocm.docs.amd.com/projects/install-on-linux/en/latest/install/quick-start.html
    1. ROCm installation
    1. AMDGPU driver installation
    1. 再起動する
1. https://rocm.docs.amd.com/projects/install-on-linux/en/latest/install/prerequisites.html
    1. Using group membership
    1. Using udev rules

Groupとかの設定は、おそらくある程度は必要ですがどこまでやるべきかいまいちわかりません。とりあえず下記のように設定しました。

```:/etc/adduser.conf
ADD_EXTRA_GROUPS=1
EXTRA_GROUPS=video
EXTRA_GROUPS=render
```

```:/etc/udev/rules.d/70-amdgpu.rules
KERNEL=="kfd", MODE="0660"
SUBSYSTEM=="drm", KERNEL=="renderD*", MODE="0666"

KERNEL=="kfd", GROUP="video", MODE="0660"
SUBSYSTEM=="drm", KERNEL=="renderD*", MODE="0666"

KERNEL=="kfd", GROUP="devteam", MODE="0660"
SUBSYSTEM=="drm", KERNEL=="renderD*", GROUP="devteam", MODE="0660"
```

やらなくても最低限stable diffusionは立ち上がりますがGPUを使う（Heterogeneous-computing Interface for Portability (HIP) APIを使うとかそういうこと）のためには必要なんだと思います。（ベアメタルでやるなら不要かもしれない）

## コンテナ（Docker）の準備

Dockerのインストールについては割愛します。
pytorchを使える環境を作ることが目的ですが、これも公式におおむね書いてあるとおりです。

### コンテナの立ち上げ

imagesは `rocm/pytorch:latest` と `rocm/dev-ubuntu-xx.xx` のどちらがいいかわかりません。結果的には後者が良いかもしれませんが、ひとまず私は前者で初めて pythonなどを入れなおしました。

1. https://rocm.docs.amd.com/projects/install-on-linux/en/latest/install/3rd-party/pytorch-install.html
    1. `docker pull rocm/pytorch:rocm6.4_ubuntu24.04_py3.12_pytorch_release_2.6.0`
    1. `docker run -it --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --device=/dev/kfd --device=/dev/dri --group-add video --ipc=host --shm-size 8G <images name>`

お好みで `-v` オプションで共有フォルダーを作ったり、コンテナ名を付けると良いでしょう。
後のことを考えると `-p 7860:7860` も付けた方が良いかもしれません。
`release_2.6.0` の詳細はサイトのページのとおりですが、torchのバージョンは私はなんだかんだで2.3.1とかになったのでそっちが良いかもしれません。（互換性があるのかどうかわかりませんがなんとなく動いている状態）

### python3.10のインストールなど

（docker runしたらattachされると思いますが）コンテナに乗り込みます。
便利なことにgitとかは入っているのでさっそくstable diffusionを落としてきてwebui.shを試してもいいですが、python3.12なのでおそらく起動しません。
pyenvを使って3.10をインストールします。（この手順は割愛）

そのあとサイトの「Using a wheels package」のoption3あたりの手順を順番に実行します。

このへん: `pip3 install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/rocm6.4/`

しかしここで公式の罠が炸裂します。（現段階では）rocm6.4にtouchaudioが存在しません。必要かわかりませんが……。
さらに次の手順でスクリプトをダウンロードして実行しますが、そのためにGFX_ARCHを指定しますが、これもtorchのversionの縛りがあります。（optinalとか書いてあるのでもしかしたら気にしなくても良いのかもしれませんが）
結論として私の環境では下記を実行しました。

```sh
$ pip3 install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/rocm6.2.4/

$ export GFX_ARCH=gfx1101
$ export ROCM_VERSION=6.2.4
$ wget https://raw.githubusercontent.com/wiki/ROCm/pytorch/files/install_kdb_files_for_pytorch_wheels.sh
```

だいたいこれで準備完了だと思いますが、なんかだめそうなら「ホストの準備」と同じことをコンテナ内でもやってみてください。（udevあたりは失敗すると思いますが）

### stable-diffusionの起動

ここらへんは他の解説ページ・nVidia環境などと同じです。
dockerであればここまでrootアカウントで作業することが多いと思いますが、rootだと起動できなかったりするので以降は適当な一般アカウントを作ってそっちで作業しましょう。

```sh:適当なディレクトリで、一般ユーザーに切り替えてから
$ git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
$ cd stable-diffusion-webui
```

モデルとかチェックポイントとかいうやつを持ってくる必要があるかもしれません。推奨するわけではないですがとりあえず私は下記をダウンロードしました。
https://civitai.com/models/376130/nova-anime-xl

これを`models/Stable-diffusion` に置きます。
そのあと運が良ければwebui.shで起動します。
しかしdocker環境であれば当然ながらホストとかからアクセスする必要があるので下記の環境変数の設定は必要です。

```webui.sh
# スクリプトの冒頭に書き込む
# こいつが何なのかは https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Command-Line-Arguments-and-Settings に書いてある

export COMMANDLINE_ARGS="--listen"
```

さてどうでしょうか。私の環境では `rocBLAS error` とか出ました。
最初にやってたときは `No HIP GPUs are available` だったのでそれよりは前進している感じがありますが……。

ググったら解はありました。
https://github.com/AUTOMATIC1111/stable-diffusion-webui/issues/13534 （Stable Diffusionのissueですね）

`export HSA_OVERRIDE_GFX_VERSION=11.0.0` とすると良いようです。webui.shにCOMMANDLINE_ARGSと一緒に書き足してもう一度やってみます。

```shell
$ ./webui.sh
```

これで`No HIP GPUs are available`もなく、なんかwarningはあれどもスクリプトが終了したりしなければ成功です。
dockerであればたぶんホストからは `http://172.17.0.2:7860` でアクセスできます。

![Screenshot from 2025-04-29 23-06-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227756/ee71dd76-3d50-425c-ac9c-fd01e7d2f0b8.png)

これぐらいであれば7秒で生成できるようです。NovelAIでも通信とかでそれぐらいはかかるので、それを考えるとなかなかいいと思います。

# 所感

* AMDの手順が概ね充実していて助かった
    * 断片的には他のサイトでも言及されているが、それらは副読として見て、公式サイトを中心に見たほうがやりやすい
* StableｰDiffusion側もいちおうAMDの手順を書いてあったりする
    * https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Install-and-Run-on-AMD-GPUs
    * これでpython3.12をサポートしていれば言うことないんですが……
* `--skip-torch-cuda-test` は罠
    * これで起動するよって書いてあるページが散見されますが **起動するだけです。**
    * たぶんモデルによってGPU必須・不要があって、不要なら使える。今回私が持ってきたモデルは必須のようなので「起動するだけ」の状態では使い物にならない。この記事を読んだ人も付けなくていい状態になっていると嬉しいです。