用一张 Radeon 吃下大模型与视觉创作:RDNA 3 消费卡一机多用实战指南
·
目标读者:AI/ML 开发者 · Ubuntu 24.04 LTS · RX 7900 XTX(24 GB)/ RX 7900 XT(20 GB)
目录
- 为什么是 RDNA 3:被低估的 24 GB 显存优势
- ROCm 6.x 安装与显存基线验证
- LLM 推理:Ollama + vLLM 双引擎
- 视觉创作:ComfyUI + SD.Next 双前端
- 显存调度:LLM 常驻 + 视觉按需
- 一键编排:systemd + 反向代理 + 自动回收
- 性能调优清单与常见坑
1. 为什么是 RDNA 3:被低估的 24 GB 显存优势
| 维度 | RX 7900 XTX | 同价位竞品 | 体感差异 |
|---|---|---|---|
| 显存容量 | 24 GB GDDR6 | 12–16 GB | 决定能塞进多大的 QLoRA 与 SDXL+ControlNet |
| 显存带宽 | 960 GB/s | ~600–700 GB/s | 决定 prefetch 阶段的 token/s |
| FP16 算力 | 123 TFLOPS | ~90 TFLOPS | 训练/微调时反向传播更舒服 |
| ROCm 支持 | 官方 tier-1 | 民间 ZLUDA | 框架兼容矩阵更广 |
对 LLM 而言,容量 > 算力。70B 量化模型 fp16 需要 ~40 GB(拆卡或上 4-bit 量化),13B 4-bit 量化只要 ~8 GB——而一张 24 GB 消费卡恰好能在 13B 4-bit + ComfyUI SDXL(峰值约 6–8 GB)之间做冷热切换。
2. ROCm 6.x 安装与显存基线验证
2.1 一键安装(Ubuntu 24.04)
sudo apt update && sudo apt install -y wget gnupg2
wget -qO- https://repo.radeon.com/rocm/rocm.gpg.key \
| sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/rocm.gpg
echo "deb [arch=amd64] https://repo.radeon.com/rocm/apt/6.2 noble main" \
| sudo tee /etc/apt/sources.list.d/rocm.list
sudo apt update && sudo apt install -y rocm-dev rocm-libs miopen-hip
echo "export PATH=/opt/rocm/bin:\$PATH" | sudo tee -a /etc/profile.d/rocm.sh
echo "export HSA_OVERRIDE_GFX_VERSION=11.0.0" | sudo tee -a /etc/profile.d/rocm.sh
# 7900 XTX / 7900 XT 对应 gfx1100;上方覆盖让 vLLM 识别
sudo usermod -aG video,render $USER
2.2 验证
rocm-smi
# +-----------------------------+---------+--------+-------+
# | 0 Radeon RX 7900 XTX | 24°C | 56W | 24 GB|
import torch
print(torch.cuda.is_available()) # 1
print(torch.cuda.get_device_name(0)) # 'AMD Radeon RX 7900 XTX'
print(torch.cuda.get_device_properties(0).total_memory / 1e9, "GB")
3. LLM 推理:Ollama + vLLM 双引擎
3.1 Ollama 适合「聊天 + 嵌入」常驻
curl -fsSL https://ollama.com/install.sh | sh
# HIP 路径自动识别,RX 7900 XTX 会走 Vulkan/ROCm 后端
ollama pull qwen2.5:14b-instruct-q4_K_M # 24 GB 卡可塞 14B 4-bit
ollama pull nomic-embed-text
ollama serve # 监听 127.0.0.1:11434
调用:
import ollama
r = ollama.chat(
model="qwen2.5:14b-instruct-q4_K_M",
messages=[{"role": "user", "content": "用三句话解释 KV-cache。"}],
options={"num_ctx": 8192, "num_gpu": 99},
)
print(r["message"]["content"])
3.2 vLLM 适合「高并发 + 编程接口」
pip install --break-system-packages \
vllm==0.6.6 --extra-index-url https://download.pytorch.org/whl/rocm6.2
# serve_openai.py —— 启动 OpenAI 兼容服务
from vllm import LLM, SamplingParams
from vllm.entrypoints.openai.api_server import run_server
llm = LLM(
model="Qwen/Qwen2.5-14B-Instruct-AWQ",
quantization="awq_marlin",
dtype="float16",
max_model_len=8192,
gpu_memory_utilization=0.78, # 留 22% 给视觉侧
tensor_parallel_size=1,
)
run_server(llm, host="0.0.0.0", port=8000)
关键点:
gpu_memory_utilization不要写到 0.9+,否则 ComfyUI 启动时会 OOM。0.75–0.80 是 24 GB 卡的甜点。
4. 视觉创作:ComfyUI + SD.Next 双前端
4.1 ComfyUI 启动(ROCm)
git clone https://github.com/comfyanonymous/ComfyUI.git
cd ComfyUI && pip install --break-system-packages -r requirements.txt \
--extra-index-url https://download.pytorch.org/whl/rocm6.2
# 让 ROCm 把 7900 XTX 当 gfx1100 识别
HSA_OVERRIDE_GFX_VERSION=11.0.0 python main.py \
--lowvram --preview-method auto --listen 0.0.0.0 --port 8188
最小化 SDXL 工作流(保存为 sdxl_basic.json):
{
"4": {"class_type": "CheckpointLoaderSimple",
"inputs": {"ckpt_name": "sd_xl_base_1.0.safetensors"}},
"5": {"class_type": "CLIPTextEncode",
"inputs": {"text": "a cyberpunk cat, neon, 8k", "clip": ["4", 1]}},
"6": {"class_type": "CLIPTextEncode",
"inputs": {"text": "blurry, low quality", "clip": ["4", 1]}},
"10":{"class_type": "EmptyLatentImage",
"inputs": {"width": 1024, "height": 1024, "batch_size": 1}},
"3": {"class_type": "KSampler",
"inputs": {"seed": 42, "steps": 28, "cfg": 6.5,
"sampler_name": "euler_ancestral",
"scheduler": "normal",
"denoise": 1.0,
"model": ["4", 0], "positive": ["5", 0],
"negative": ["6", 0], "latent_image": ["10", 0]}},
"8": {"class_type": "VAEDecode",
"inputs": {"samples": ["3", 0], "vae": ["4", 2]}},
"9": {"class_type": "SaveImage",
"inputs": {"filename_prefix": "rx7900xtx", "images": ["8", 0]}}
}
通过 API 远程触发:
import json, requests, websocket
with open("sdxl_basic.json") as f: wf = json.load(f)
r = requests.post("http://127.0.0.1:8188/prompt",
json={"prompt": wf})
prompt_id = r.json()["prompt_id"]
# 订阅进度 / 下载产物
ws = websocket.create_connection("ws://127.0.0.1:8188/ws")
# … 略
4.2 Flux.1-dev 在 24 GB 卡上的取舍
Flux.1-dev fp16 ≈ 24 GB,会与 LLM 抢显存。三种方案:
- 量化 Flux.1-dev NF4:约 12 GB,可与 7B LLM 4-bit 并存。
- Flux.1-schnell NF4:约 11 GB,4 步出图,更适合一机多用。
- SDXL + Hires + ControlNet:单卡上限 6–8 GB,强烈推荐作为常驻。
5. 显存调度:LLM 常驻 + 视觉按需
24 GB 卡的典型分配:
| 场景 | LLM 占用 | 视觉占用 | 剩余 |
|---|---|---|---|
| 仅 LLM 14B 4-bit | 10 GB | 0 | 14 GB |
| 仅 ComfyUI SDXL | 0 | 8 GB | 16 GB |
| 并存:7B 4-bit + SDXL | 6 GB | 8 GB | 10 GB |
| 并存:14B 4-bit + Flux Schnell NF4 | 10 GB | 11 GB | 3 GB |
策略:
- 常驻 LLM(小模型) —— Ollama 启动 7B/14B 4-bit 量化,保留 0.7 显存利用率。
- 视觉侧按需排队 —— 提交任务前调用
rocm-smi --showmeminfo vram检查剩余;不足时降级到 SDXL 或把 LLM 切到 CPU/卸载。 - 冷热切换脚本(见下节)—— 用户主动选择「现在跑图」时自动卸载 LLM。
6. 一键编排:systemd + 反向代理 + 自动回收
6.1 systemd unit
/etc/systemd/system/ollama.service.d/override.conf:
[Service]
Environment="HSA_OVERRIDE_GFX_VERSION=11.0.0"
Environment="OLLAMA_NUM_GPU=99"
Environment="OLLAMA_MAX_LOADED_MODELS=1"
/etc/systemd/system/comfyui.service:
[Unit]
Description=ComfyUI on Radeon
After=ollama.service
ConditionPathExists=/dev/dri/renderD128
[Service]
User=stu
WorkingDirectory=/home/stu/ComfyUI
Environment="HSA_OVERRIDE_GFX_VERSION=11.0.0"
ExecStart=/usr/bin/python3 main.py --lowvram --listen 127.0.0.1 --port 8188
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now ollama comfyui
6.2 Caddy 反向代理
api.local {
reverse_proxy 127.0.0.1:11434 # ollama
reverse_proxy 127.0.0.1:8000 # vllm
reverse_proxy 127.0.0.1:8188 # comfyui
encode zstd gzip
}
6.3 显存看门狗
#!/usr/bin/env python3
# vram_watchdog.py —— 剩 < 4 GB 时 SIGTERM ComfyUI
import subprocess, time, re, signal, os
def free_gb():
out = subprocess.check_output(["rocm-smi", "--showmeminfo", "vram"]).decode()
used = int(re.search(r"Used Memory:\s+(\d+)", out).group(1))
total = int(re.search(r"Total Memory:\s+(\d+)", out).group(1))
return (total - used) / 1024**3
while True:
f = free_gb()
print(f"free={f:.2f} GB")
if f < 4.0:
subprocess.run(["sudo", "systemctl", "stop", "comfyui"])
elif f > 14.0:
subprocess.run(["sudo", "systemctl", "start", "comfyui"])
time.sleep(15)
7. 性能调优清单与常见坑
| 症状 | 根因 | 解决 |
|---|---|---|
RuntimeError: HIP out of memory |
vLLM/ComfyUI 双重占用 | 调低 gpu_memory_utilization 或升级看门狗 |
comfyui 启动报 gfx1100 找不到 |
缺 HSA_OVERRIDE_GFX_VERSION |
在 systemd unit 与 shell 都导出 |
| Ollama 走 CPU | 没识别到 AMD GPU | ollama serve 启动日志中查 BLAS=hip |
| LLM 速度慢 | 显存带宽 < 800 GB/s | 优先用 AWQ/GPTQ 而非 fp16 量化 |
| Flux fp16 OOM | 24 GB 满载 | 改用 NF4 或 SDXL |
调优三板斧:
- 量化优先:AWQ > GPTQ > GGUF(ROCm 上 AWQ Marlin 后端最快)。
- 上下文剪裁:把
num_ctx调到 4096 而不是 32768,KV-cache 占用近似线性。 - 图生图分离:把 T2I 与 SDEdit/CtrlNet 拆成两条流水线,按需切换。
结语
RDNA 3 消费卡的 24 GB 显存不是「刚好够用」,而是「够做 LLM 也够做 SDXL」的关键解。当一张卡的预算只够买一张时,把容量放在算力前面就是这张卡的正确打开方式。配合 Ollama + ComfyUI + systemd 的轻编排,你完全可以把工作站的最后一点显存榨干,再让那颗功耗墙下的 RDNA 安静地跑一晚上。
加入AMD AI开发者计划,领取200小时免费云算力
https://s.csdn.cn/ik9E3m
更多推荐



所有评论(0)