目标读者:AI/ML 开发者 · Ubuntu 24.04 LTS · RX 7900 XTX(24 GB)/ RX 7900 XT(20 GB)

目录

  1. 为什么是 RDNA 3:被低估的 24 GB 显存优势
  2. ROCm 6.x 安装与显存基线验证
  3. LLM 推理:Ollama + vLLM 双引擎
  4. 视觉创作:ComfyUI + SD.Next 双前端
  5. 显存调度:LLM 常驻 + 视觉按需
  6. 一键编排:systemd + 反向代理 + 自动回收
  7. 性能调优清单与常见坑

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

策略:

  1. 常驻 LLM(小模型) —— Ollama 启动 7B/14B 4-bit 量化,保留 0.7 显存利用率。
  2. 视觉侧按需排队 —— 提交任务前调用 rocm-smi --showmeminfo vram 检查剩余;不足时降级到 SDXL 或把 LLM 切到 CPU/卸载。
  3. 冷热切换脚本(见下节)—— 用户主动选择「现在跑图」时自动卸载 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

调优三板斧

  1. 量化优先:AWQ > GPTQ > GGUF(ROCm 上 AWQ Marlin 后端最快)。
  2. 上下文剪裁:把 num_ctx 调到 4096 而不是 32768,KV-cache 占用近似线性。
  3. 图生图分离:把 T2I 与 SDEdit/CtrlNet 拆成两条流水线,按需切换。

结语

RDNA 3 消费卡的 24 GB 显存不是「刚好够用」,而是「够做 LLM 也够做 SDXL」的关键解。当一张卡的预算只够买一张时,把容量放在算力前面就是这张卡的正确打开方式。配合 Ollama + ComfyUI + systemd 的轻编排,你完全可以把工作站的最后一点显存榨干,再让那颗功耗墙下的 RDNA 安静地跑一晚上。

加入AMD AI开发者计划,领取200小时免费云算力
https://s.csdn.cn/ik9E3m

更多推荐