Stable Diffusion
PR

【RTX50シリーズ】 Stable Diffusionにxformersを導入する方法 【CUDA 12.8対応】

えりる
記事内に商品プロモーションを含む場合があります

この記事では、RTX50シリーズ搭載PC上で動くStable Diffusionにxformersをすることができましたので、その情報共有をします。

RTX 50シリーズでStable Diffusionを動作させる方法は以下の記事で解説しています。
CUDA12.8, PyTorch 2.8 で動作するStable Diffusionの導入方法が知りたい方環境を確認したい方はぜひご覧ください。

あわせて読みたい
【Stable Diffusion】 RTX50シリーズでStable Diffusionを起動する方法 【CUDA 12.8対応】
【Stable Diffusion】 RTX50シリーズでStable Diffusionを起動する方法 【CUDA 12.8対応】

環境

PyTorchの開発は Linux 環境への対応の方が早いという噂を聞いたのでOSは Ubuntu を選択しました。

  • OS  = Ubuntu 24.04.2 LTS
    • CUDA 12.8, cuDNN 9.8.0 導入済み
    • PyTorch 2.8で 動作するStable Diffusionを導入済み
    • WSL(Windows PC上で簡単にLinuxを動かすことができる機能)上で動作
  • CPU = Intel Core Ultra 285k
  • GPU = NVIDIA RTX 5070

この環境は冒頭でも紹介したこちらの記事でStable Diffusionをインストールした後と同じ環境です。
適宜ご参照ください。

あわせて読みたい
【Stable Diffusion】 RTX50シリーズでStable Diffusionを起動する方法 【CUDA 12.8対応】
【Stable Diffusion】 RTX50シリーズでStable Diffusionを起動する方法 【CUDA 12.8対応】

注意点

早速問題点ですが、2025/03/17時点で xformersCUDA12.8 に対応していません。

ならどうやって導入するのかというと、

CUDA 12.8 環境のもと自力でビルドします

自力でビルドして使うので自己責任でお願いします。

xformersのビルドについては以下の記事で解説しています。
しかし、以下の記事で紹介した方法ではStable Diffusionでは動作しませんでした。

あわせて読みたい
【CUDA12.8 対応 xformers】 CUDA12.8でxformersをビルドする方法 【Python】
【CUDA12.8 対応 xformers】 CUDA12.8でxformersをビルドする方法 【Python】

一部xformersのソースコードを編集してからビルドすることで動作するようになりましたので、それを紹介したいと思います。

一つ注意点ですが、

単にStable Diffusionで動くようになっただけ

です。おそらく修正内容は正しいものではないと思います。

実際、LoRA学習であれば先ほどの記事の内容だけで動きました。

完全に自己責任なのでご注意ください。

CUDA 12.8環境下での xformers の導入方法

xformersのビルド環境構築を作る

まず、Ubuntu に必要な開発ツールとライブラリをインストールします。

sudo apt update
sudo apt install python3-dev build-essential cmake

次に、CUDA 12.8 と cuDNN の環境変数を確認します。

環境変数は以下の通りに設定します。

export PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"
export CUDA_HOME=/usr/local/cuda-12.8
export CUDNN_INCLUDE_DIR=/usr/local/cuda/include
export CUDNN_LIB_DIR=/usr/local/cuda/lib64

環境変数設定は.bashrc記載されているので、そのファイルの末尾に上記の内容を追加しました。

変更したので以下のコマンドで有効化。

source ./.bashrc

その後、PyTorchが自分のGPUに適したCUDAバージョンを認識しているかを確認します。

Pythonを起動してtorchをインポート。torch.cuda.is_available() の出力結果で確認することができます。

以下のコマンドで確認します。

python -c "import torch; print(torch.__version__); print(torch.cuda.is_available()); print(torch.cuda.get_arch_list())"

出力例は以下のとおりです。

2.8.0
True
['sm_90']

RTX5070の場合はsm_90が含まれていればよいそうです。

次に、xformersのGitHubリポジトリからソースコードを取得します。

git clone https://github.com/facebookresearch/xformers.git

mainブランチを使用しました。

その後、Python 3.10.6を有効化し、仮想環境を作成して有効化します。

pyenv local 3.10.6
python -m venv venv
source venv/bin/activate

次に必要なPythonパッケージをrequirement.txtからインストールします。

requirement.txtは先ほど取得したソースコード一式が入っているフォルダ(xformers)にあるので、

cd xformers

でディレクトリを移動しておきます。

その後、以下のコマンドでrequirement.txtからパッケージをインストールします。

pip install -r requirements.txt

その後、以下のように追加でパッケージをインストールします。

pip install ninja packaging wheel

最後に以下のコマンドを実行します。(これはクローン直後でもよいかもしれない)

git submodule update --init --recursive

これでxformersのビルド環境ができました。

xformersの修正

ここまでの環境でビルドしたxformers をStable Diffusionの仮想環境にインストールして起動すると以下のようなエラーがでます。

AttributeError: Cannot set attribute 'src' directly. Use '_unsafe_update_src()' and manually clear `.hash` of all callersinstead.

tritonというパッケージまわりのエラーみたいなのですが、tritonのGitHubリポジトリのコミュニティページに同じエラーに関する議論がありました。

議論を追っていくと、修正をすると動いたという報告がありました。

xformersディレクトリからみて、./xformers/triton/vararg_kernel.py の以下の個所に編集を加えるみたいです。

jitted_fn.src = new_src

報告に従って、この部分をコメントアウトして以下のように変更しました。

# もとからあったものをコメントアウト
# jitted_fn.src = new_src

# 追加
jitted_fn._unsafe_update_src(new_src)
jitted_fn.hash = None

ビルドとインストール

一番上のxformersディレクトリにいることを確認して、試しに以下のコマンドでインストールをしてみます。

pip install .

無事成功しました。

ほかの仮想環境で利用するので、以下のコマンドでxformersをビルドします。

python setup.py bdist_wheel

成功すると、dist/ ディレクトリ内に .whl ファイルが生成されます。

このときファイル名を変えるとほかの仮想環境でインストール時にエラーが出ます。

Stable Diffusionがあるディレクトリに .whl ファイルを移動させたあと、

Stable Diffusionの仮想環境を有効化した状態で、

pip install ビルドして生成されたファイル名.whl

を行うことでインストールできます。

Stable Diffusionでxformersを有効化

LinuxのStable Diffusionでxformersを有効化するにはwebui-user.sh に以下の記述を追加します。

export COMMANDLINE_ARGS="--xformers"

export COMMANDLINE_ARGS というのがwebui-user.sh の最初のあたりにコメントアウトされているので、コメントアウトを外したのちに追記しました。

これでStable Diffusionを起動すると無事xformersが適用されて画像生成をすることができました。

コード修正が必要だった理由をちょっと考えてみる

あとあと確認すると、xformers開発環境ではtriton 3.2.0が使用されている一方、Stable Diffusionでは2.1.0になっていました。

このバージョン差がコード修正が必要だった理由なきもしますが、正直よくわかりませんでした。

参考サイト

記事URLをコピーしました