NVIDIAなしのAMD統合GPU(iGPU)で ComfyUI や PyTorch を回していると、次のようなエラーで止まりがちです。
RuntimeError: CUDA out of memory. Tried to allocate 2.50 GiB.
GPU has 8.00 GiB total capacity; 6.20 GiB is already allocated;
0.50 GiB is free.
ここで混乱しやすいのは次の2点です。
- ROCmなのにメッセージが CUDA
- VRAMを増設できないのに「GPUメモリ不足」と言われる
この記事は、選択肢の全体地図ではなく、メモリ不足の切り分けだけに絞ります。検証の背景は Ryzen AI Max+ 395 / Radeon 8060S 系(大容量メモリ+UMA)です。
結論(先に)
| やりたいこと | まず疑うこと |
|---|---|
CUDA out of memory |
UMA(GPU用に予約した枠)が足りないか、解像度・モデルが大きすぎる |
| Windows全体が重い/落ちる | UMAを上げすぎてアプリ用RAMが足りない |
| 両方交互に起きる | モデル・解像度を下げる/同時起動を減らす |
統合GPUでは、GPU用とアプリ用が同じ物理メモリを分け合います。片方を増やせば、もう片方が減ります。
なぜ「CUDA」と出るのか
ROCm環境でも、PyTorch側のエラー表記は歴史的に CUDA out of memory のままのことが多いです。
「CUDA非対応だから失敗した」という意味ではありません。 「GPU用に確保したプールが足りない」と読んでください。
UMAとは(最小限)
システムメモリ(例: 128GB)
├─ GPU用(UMA Frame Buffer)← モデル・テンソル(PyTorchから見える側)
└─ アプリ用 ← Windows・ブラウザ・LM Studio本体など
BIOSの UMA Frame Buffer Size で、GPU側に何GB予約するかを決めます。
専用グラボのVRAMと違い、物理DIMMを差し増しする話ではありません。
不足は3パターン
| パターン | 症状のイメージ | 対処の方向 |
|---|---|---|
| GPU用不足 | CUDA out of memory |
UMAを増やす/モデル・解像度を下げる |
| アプリ用不足 | 全体が重い、クラッシュ、ブラウザが死ぬ | UMAを減らす/他アプリ終了 |
| 両方不足 | 上の症状が交互 | そもそも欲張りすぎ。同時起動をやめる |
「UMAを最大まで上げれば勝ち」ではありません。128GB機でUMAを極端に上げると、アプリ用が枯渇して別の地獄になります。
用途別の目安(出発点)
実機では用途でUMAを切り替える運用が現実的です。数字は出発点であり、機種・同時起動で前後します。
画像生成寄りの例
| 用途 | システムメモリの目安 | UMAの出発点 |
|---|---|---|
| 基本(SD 1.5・512前後) | 64GB〜 | 16GB |
| 高め(SDXL・768前後) | 128GB寄り | 32GB |
| さらに重い | 128GB | 32〜64GB(様子を見る) |
LLM寄りの注意
大きいモデルを載せるときもUMAは効きますが、上げすぎるとロードがハングするケースがあります(「大きいほど良い」ではない)。
「載らないからUMAを上げる」→「上げたら固まる」になったら、一度下げて再試行し、モデルサイズやオフロード設定も疑ってください。
切り分けチェックリスト
エラーが出たら、設定をいじる前にこの順で確認します。
- 他に重いアプリがいないか(ブラウザ大量タブ、別の生成AI、別LLM)
- 解像度・バッチ・モデル規模を一度下げる(まず動かす)
- いまのUMAは何か(BIOSの値をメモ)
- 空きRAMは残っているか(タスクマネージャーの「利用可能」)
- まだGPU側が足りないなら UMAを一段上げる(上げすぎ注意)
- 全体が重いなら UMAを一段下げる
PowerShellで空きメモリ(Available)のざっくり確認例:
Get-Counter '\Memory\Available MBytes'
出てくる数値は MB です。例: 34285 → 約 33.5GB。
UMAを大きく取っていると、この「アプリ用に空いている量」は当然減ります。
PyTorch側(GPUプール内)の確認例:
import torch
print(torch.cuda.is_available())
if torch.cuda.is_available():
print(f"Allocated: {torch.cuda.memory_allocated(0) / 1024**3:.2f} GB")
print(f"Reserved: {torch.cuda.memory_reserved(0) / 1024**3:.2f} GB")
タスクマネージャーの「メモリ」と、ここの Allocated は見ている場所が違います。混同しないこと。
よくある誤解
| 誤解 | 実際 |
|---|---|
| CUDAと出た=NVIDIAが必要 | ROCmでも表記がCUDAのことがある |
| UMA最大=最強 | アプリ用が死ぬ/ロードハングもありうる |
| メモリ総量だけ見ればよい | GPU用とアプリ用の配分が見えないと詰まる |
| 画像とLLMを同時に全力 | 統合GPUでは衝突しやすい。片方可通してから |
次の一歩
-
選択肢の全体地図(ROCm / DirectML、ComfyUI、LM Studioの位置づけ):
AMD統合GPUでローカルAIを動かす選択肢まとめ(Zenn) -
手順・BIOS・トラブル全集を一冊で(有料):
EVO-X2で始めるローカルAI実践ガイド(Zenn本)
この記事は「メモリで止まったときの切り分け」専用です。環境構築の全手順は本編側にあります。
まとめ
- AMD統合GPUの OOM は、まず UMA配分 と 解像度・モデル規模 を疑う
- メッセージの CUDA は、多くの場合 表記の話
- UMAは上げるだけでなく、下げてアプリ用を守る判断も必要
- 同時に全部を最大設定にしない
切り分けができれば、「環境が壊れた」と思っていた事象の半分は、配分の問題に見えてきます。