ComfyUI指定GPU出图配置指南
本文最后更新于 2026年5月27日 凌晨
为什么需要指定 GPU?
在多 GPU 服务器上运行 ComfyUI 时,经常遇到以下场景:
- GPU 资源隔离——GPU 0 被 LM Studio、TensorRT-LLM 等大模型服务占用,ComfyUI 需要跑在另一张卡上
- 显存大小差异——不同型号 GPU 显存不同,大尺寸出图(如 SDXL、1024×1024)需要更大显存的显卡
- 多用户并发——团队共用服务器时,不同服务分配到固定 GPU,避免争抢资源
本文记录三种指定 ComfyUI 使用特定 GPU 的方法,以及实际踩坑经验。
⚡ 方法一:systemd 服务配置(推荐)
如果你的 ComfyUI 通过 systemd 服务启动(这也是最稳定的方式),这是首选方案。
查看当前配置
1 | |
修改 GPU 指定
编辑服务文件,在 [Service] 段添加环境变量:
1 | |
重启并验证
1 | |
优点:配置持久化,重启自动生效,优先级最高。
适用场景:生产环境、长期运行的 ComfyUI 服务。
🔧 方法二:命令行参数 --cuda-device
ComfyUI 原生支持通过命令行指定 GPU:
1 | |
⚠️ 重要陷阱
CUDA_VISIBLE_DEVICES 环境变量的优先级高于 --cuda-device!
如果环境中已设置 CUDA_VISIBLE_DEVICES=0,即使传入 --cuda-device 1,ComfyUI 实际仍使用 GPU 0。排查方法:
1 | |
优点:快速测试、临时切换。
缺点:容易被环境变量覆盖,优先级最低。
适用场景:开发调试、一次性验证。
🌍 方法三:环境变量 CUDA_VISIBLE_DEVICES
启动时通过环境变量限制 ComfyUI 可见的 GPU:
1 | |
GPU 索引重映射机制
CUDA_VISIBLE_DEVICES 有一个容易忽略的特性——它会重新编号 GPU 设备:
| 设置 | 代码中 cuda:0 对应物理卡 |
代码中 cuda:1 对应物理卡 |
|---|---|---|
CUDA_VISIBLE_DEVICES=0 |
GPU 0 | — |
CUDA_VISIBLE_DEVICES=1 |
GPU 1 | — |
CUDA_VISIBLE_DEVICES=0,1 |
GPU 0 | GPU 1 |
CUDA_VISIBLE_DEVICES=1,0 |
GPU 1 | GPU 0 |
示例:CUDA_VISIBLE_DEVICES=1,0 时,CUDA 将物理 GPU 1 映射为逻辑设备 0。代码里写 cuda:0,实际访问的是物理卡 1。这在某些硬编码 cuda:0 的模型加载场景中非常有用——不用改代码就能指定用哪张卡。
优点:灵活、无需修改服务文件。
缺点:需要每次启动时设置,shell 配置中可能意外覆盖。
适用场景:手动启动、脚本化部署、需要重映射的场景。
🕳️ 踩坑记录
坑一:--cuda-device 参数”无效”
现象:用 --cuda-device 1 启动,nvidia-smi 看到进程仍在 GPU 0。
原因:systemd 服务文件中硬编码了 Environment=CUDA_VISIBLE_DEVICES=0,环境变量优先级高于命令行参数。
解决:修改 systemd 服务文件中的 CUDA_VISIBLE_DEVICES 值。
坑二:手动设置的环境变量被覆盖
现象:终端里执行 export CUDA_VISIBLE_DEVICES=1 后启动 ComfyUI,进程实际仍用 GPU 0。
排查清单:
1 | |
🔄 快速切换脚本
经常需要在 GPU 之间切换?一个脚本搞定:
1 | |
使用方式:
1 | |
📊 方法对比总结
| 方法 | 优先级 | 持久化 | 可靠性 | 推荐场景 |
|---|---|---|---|---|
systemd Environment |
⭐⭐⭐ 最高 | ✅ 自动 | ⭐⭐⭐ 最可靠 | 生产环境、长期运行 |
环境变量 CUDA_VISIBLE_DEVICES |
⭐⭐ 中 | ❌ 需每次设置 | ⭐⭐ 需注意覆盖 | 手动启动、脚本部署 |
--cuda-device 参数 |
⭐ 最低 | ❌ 仅本次 | ⭐ 易被覆盖 | 快速测试、临时验证 |
💡 最佳实践建议
- 生产环境统一用 systemd:配置一次,永久生效,重启不丢。
- 多 GPU 服务器做固定分配:LM Studio 占 GPU 0,ComfyUI 占 GPU 1,各跑各的互不干扰。
- 切换前检查环境变量:
--cuda-device不生效时,先查CUDA_VISIBLE_DEVICES有没有捣乱。 - 善用重映射:需要让代码中的
cuda:0指向物理 GPU 1 时,用CUDA_VISIBLE_DEVICES=1,0比改代码方便得多。
本文基于实际多 GPU 服务器部署经验总结。如有其他踩坑经验,欢迎交流。