ComfyUI指定GPU出图配置指南
本文最后更新于 2026年7月12日 晚上
为什么需要指定 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 服务器部署经验总结。如有其他踩坑经验,欢迎交流。