ComfyUIでROCm 7.1がSegmentation fault|Radeon 780MでSDXL復旧

MINISFORUM UM790 ProのRadeon 780MでComfyUIを使っていたところ、ある日突然、SDXL画像生成時にSegmentation faultで落ちるようになりました。

ちょうどローカルLLM環境を大きく調整していた時期だったため、最初はROCm環境そのものを壊してしまったのではないかと疑いました。

しかし、ROCm、PyTorch、ComfyUIを順番に切り分けて調べていくと、ROCmそのものは正常に動作していました。

最終的には、Radeon 780Mをgfx1103として利用した場合のGPU演算で問題が再現し、HSA_OVERRIDE_GFX_VERSION=11.0.0を指定することで回避できました。

同じ設定でComfyUIからSDXL画像生成まで復旧できたので、その検証過程をまとめます。

今回の検証環境

  • MINISFORUM UM790 Pro
  • AMD Ryzen 9 7940HS
  • AMD Radeon 780M
  • GPU Architecture:gfx1103
  • ROCm 7.1
  • Python 3.12
  • ComfyUI 0.30.0

ComfyUIはPythonのvenv環境で運用しています。

まずROCm自体が壊れていないか確認

最初にOS側からROCmがRadeon 780Mを認識できているか確認しました。

rocminfo

出力にはRadeon 780MのGPU Architectureであるgfx1103が正常に表示されました。

Name: gfx1103
Marketing Name: AMD Radeon Graphics

KFDとDRMのrenderデバイスも存在し、実行ユーザーがrenderグループへ所属していることも確認しました。

この時点で、Linuxカーネル、amdgpu、KFD、ROCmといったOS側の基本部分は正常に動作しています。

つまり、単純に「ROCmそのものが壊れた」という可能性はかなり低くなりました。

ComfyUIのvenvからPyTorchが消えていた

次にComfyUI側を確認すると、以前venvを作り直した影響でPyTorchが存在しない状態になっていました。

Pythonからtorchを読み込もうとすると、以下のエラーになります。

ModuleNotFoundError: No module named 'torch'

ComfyUIのrequirements.txtを入れ直すだけでは、AMD GPU向けに利用していたROCm版PyTorch環境まで同じ状態へ戻るとは限りません。

そこでROCm 7.1向けPyTorchを明示的にインストールしました。

python -m pip install -U pip wheel setuptools

最初に試したのはPyTorch 2.9.1です。

python -m pip install torch==2.9.1 torchvision==0.24.0 torchaudio==2.9.0 -f https://repo.radeon.com/rocm/manylinux/rocm-rel-7.1/

ROCm 7.1用パッケージの配布先はこちらです。

https://repo.radeon.com/rocm/manylinux/rocm-rel-7.1/

インストール後、PyTorchからRadeon 780Mを認識できるようになりました。

torch: 2.9.1+rocm7.1.0.git351ff442
HIP: 7.1.25424-4179531dcd
GPU available: True
GPU count: 1
GPU: AMD Radeon Graphics

ここだけを見ると、問題なく復旧したように見えます。

ところがComfyUIからSDXL画像生成を実行すると、CLIPモデルを読み込んだあとにSegmentation faultでPythonプロセスが終了しました。

ComfyUIを外してPyTorch単体で検証

ここで、ComfyUI固有の問題なのか、PyTorchとROCm側の問題なのかを切り分けることにしました。

ComfyUIのクラッシュログを確認すると、SDXLのCLIP処理からPyTorchのEmbedding処理へ入った付近でSegmentation faultが発生していました。

そこでComfyUIを使用せず、PyTorch単体でEmbedding演算をGPU上へ配置して実行します。

emb = torch.nn.Embedding(49408, 768).to(device="cuda", dtype=torch.float16)
tokens = torch.randint(0, 49408, (1, 77), device="cuda")
y = emb(tokens)
torch.cuda.synchronize()

Radeon 780Mそのものは正常に認識されています。

しかしEmbeddingをGPUへ配置し、実際のGPU演算へ進んだところでSegmentation faultが発生しました。

これによって、少なくともComfyUIのUIやワークフロー自体が直接の原因ではないことを確認できました。

PyTorch 2.8.0へ変更しても症状は再現

次にPyTorch 2.9.1固有の問題である可能性を疑いました。

PyTorch一式をアンインストールします。

python -m pip uninstall -y torch torchvision torchaudio triton

続いてROCm 7.1向けPyTorch 2.8.0をインストールしました。

python -m pip install torch==2.8.0 torchvision==0.23.0 torchaudio==2.8.0 triton==3.4.0 -f https://repo.radeon.com/rocm/manylinux/rocm-rel-7.1/

変更後の環境は以下です。

torch: 2.8.0+rocm7.1.0.git7a520360
hip: 7.1.25424-4179531dcd
gpu: AMD Radeon Graphics

しかし結果は変わりませんでした。

EmbeddingをGPUへ配置するところまでは成功しますが、その後のGPU処理でSegmentation faultが発生します。

PyTorch 2.8.0と2.9.1の両方で再現したため、今回の症状をPyTorch 2.9.1固有の問題と判断することはできません。

UEFIのUMA Frame Buffer設定も検証

UM790 Proでは、UEFIからRadeon 780Mへ割り当てるUMA Frame Bufferを変更できます。

以前はGAMING_OPTIMIZEDを使用していましたが、その後16GB固定へ変更していました。

Radeon 780MはAPU内蔵GPUなので、CPUとGPUでシステムメモリを共有しています。

そのため、UMA Frame Bufferを16GB固定へ変更したことがROCmのメモリ処理へ影響した可能性も考えました。

そこで設定をGAMING_OPTIMIZEDへ戻し、同じPyTorch単体テストを再実行しました。

しかし症状は変わりません。

EmbeddingのGPU配置は成功するものの、その後のGPU演算でSegmentation faultしました。

少なくとも今回の問題については、UMA Frame Bufferを16GB固定へ変更したことが直接の原因ではありませんでした。

HSA_OVERRIDE_GFX_VERSION=11.0.0を試す

PyTorchのバージョンを変更しても改善せず、UMA Frame Buffer設定を戻しても症状が変わりませんでした。

そこで次に、Radeon 780Mをgfx1103としてそのまま扱うROCm側の実行経路を疑いました。

試したのが以下の環境変数です。

HSA_OVERRIDE_GFX_VERSION=11.0.0

まずComfyUIへ永続設定せず、この環境変数を指定した状態でPyTorch単体のEmbeddingテストを再実行しました。

すると、それまで必ずSegmentation faultしていた処理が正常に完走しました。

1: creating embedding
2: embedding allocated
3: tokens allocated
4: embedding executed
OK: torch.Size([1, 77, 768]) torch.float16

PyTorch 2.8.0でも2.9.1でも失敗し、UMA Frame Buffer設定を戻しても改善しなかったGPU演算が、HSA_OVERRIDE_GFX_VERSION=11.0.0を指定した状態では正常に実行できました。

今回のUM790 ProとRadeon 780M環境では、gfx1103としてそのままGPU演算を実行する経路に何らかの相性問題があり、この設定によって回避できたと考えています。

なお、これは今回の環境で実際に確認できた結果です。すべてのRadeon 780Mやgfx1103環境で同じ結果になるとは限りません。

ComfyUIの起動スクリプトを最小構成へ整理

原因を切り分ける過程で、以前使用していたROCm関連の環境変数やComfyUIの起動オプションはいったんすべて外しました。

以前はTORCH_ROCM_ARCH、HIP_VISIBLE_DEVICES、AMD_SERIALIZE_KERNELなども設定していました。

しかし設定項目が多い状態では、どの設定が問題へ影響しているのか判断しづらくなります。

最終的には必要な設定だけへ絞りました。

#!/bin/bash
cd "$HOME/Apps/ComfyUI"
source venv/bin/activate

export HSA_OVERRIDE_GFX_VERSION=11.0.0

exec python main.py --disable-async-offload --disable-pinned-memory

ComfyUIの配置先が異なる場合は、$HOME以下のパスを自分の環境に合わせて変更してください。

SDXL画像生成まで復旧

HSA_OVERRIDE_GFX_VERSION=11.0.0を設定した状態でComfyUIを起動し、問題が発生していたSDXLワークフローを再び実行しました。

今度はSegmentation faultすることなく、最後まで画像生成が完走しました。

Radeon 780MとROCm 7.1を使ったComfyUI環境で、SDXL画像生成まで復旧できました。

今回確認できたこと

  • ROCmそのものは正常に動作していた
  • Radeon 780Mはgfx1103として認識されていた
  • KFDやrenderデバイスへのアクセスにも問題はなかった
  • ROCm版PyTorchからRadeon 780Mを認識できていた
  • PyTorch 2.9.1ではEmbedding演算時にSegmentation faultした
  • PyTorch 2.8.0でも同じ症状が再現した
  • UMA Frame BufferをGAMING_OPTIMIZEDへ戻しても改善しなかった
  • HSA_OVERRIDE_GFX_VERSION=11.0.0を指定するとEmbedding演算が正常完走した
  • 同じ設定でComfyUIからSDXL画像生成にも成功した

GPUが見えることと正常に演算できることは別

今回特に印象的だったのは、rocminfoやPyTorchからGPUを正常に認識できていても、実際のGPU演算まで正常に動作するとは限らないことです。

今回もGPU availableはTrueになり、AMD Radeon Graphicsというデバイス名まで正常に取得できていました。

それでもEmbedding演算へ入るとSegmentation faultしました。

そのため、ROCm環境でComfyUIがクラッシュする場合は、いきなりComfyUI全体を再インストールするより、ROCm、GPUデバイス、PyTorch、単純なGPU演算、ComfyUIという順番で層を分けて確認した方が原因を絞り込みやすくなります。

まとめ

Radeon 780MとROCm 7.1を使用しているComfyUI環境で発生したSegmentation faultは、今回の環境ではHSA_OVERRIDE_GFX_VERSION=11.0.0を指定することで回避できました。

最初はローカルLLM環境を変更した影響でROCmそのものを壊してしまったのではないかと疑いました。

しかしROCmからGPUを認識するところまでは正常で、問題は実際のGPU演算へ進んだ段階で発生していました。

PyTorch単体まで処理を切り分けたことで、ComfyUIより下のGPU演算レイヤーでも同じSegmentation faultが再現することを確認できました。

最終的にはPyTorchのEmbedding演算が正常完走し、ComfyUIからSDXL画像生成も復旧しています。

UM790 ProやRadeon 780M、gfx1103環境で、ROCmからGPUは認識できるのにComfyUIがSegmentation faultする場合の参考になれば幸いです。

コメント

  1. 十円玉 より:

    RADEON 780MでVAEを使う場合、ComfyUIの起動オプションに”–fp16-vae”つけるとええよ。
    ComfyUI側がBF16演算に切り替わってVAEが動かない問題を解決できる。

  2. 十円玉 より:

    一昨日、ROCmを7.2.4にアプデ+PyTorchをROCm対応のNightly版にアプデしたの。
    PyTorch自体が”gfx1103″に対応してなかったから、”export HSA_OVERRIDE_GFX_VERSION=11.0.0″はまだ必須(´・ω・`)

タイトルとURLをコピーしました
~