先说结论:在 ComfyUI 里做模型替换,不是把新模型文件拖进目录就完事。很多人换完模型发现出图崩、风格不对、人物糊,问题通常不在模型本身,而在替换链路里还有 Checkpoint 切换、提示词适配、VAE 配套、采样参数、批量验证这些环节没有一起跟上。
这次我们看一个很具体的替换场景:把出图模型从“死神遗镰”切成“大狗叫”。这两个名字你可以先理解成两套不同的本地模型文件,“大狗叫”是目标模型,“死神遗镰”是当前在用的模型。整篇文章会按本地模型替换的完整流程展开,包含模型文件准备、ComfyUI 节点切换、参数调整、批量出图、API 调用和常见问题排查。即使你手上不是这两个模型,换成任意两个 Checkpoint 或 LoRA,这套流程同样能复用。
文章适合已经在用 ComfyUI、想换模型风格但不想重新搭工作流的用户,也适合刚开始接触本地出图、想搞清楚 Checkpoint、LoRA、VAE 之间关系的读者。全文不涉及复杂的训练环节,只讲替换和验证这件事怎么落地。
1. 核心能力速览
这是一个以模型替换为核心流程的操作型教程。先把手头要准备的东西和能实现的能力列成一张表,方便对照检查。
| 能力项 | 说明 |
|---|---|
| 项目类型 | ComfyUI 本地模型替换与出图流程改造 |
| 涉及模型 | 示例为“大狗叫”模型与“死神遗镰”模型,实际以本地模型文件为准 |
| 主要功能 | Checkpoint 切换、提示词适配、参数调整、批量出图、API 调用 |
| 启动方式 | ComfyUI 本地启动,或启动 API 服务后脚本调用 |
| 推荐硬件 | 建议使用 N 卡 + CUDA 环境,具体显存需求以模型版本为准 |
| 是否支持批量任务 | 支持,可通过 WebUI 排队或脚本批量提交生成任务 |
| 是否开放 API | ComfyUI 自带 API,默认监听 8188 端口 |
| 输出格式 | PNG/WebP/JPEG,具体取决于保存节点配置 |
| 适合场景 | 本地绘图、风格切换、批量出图、二次开发集成 |
这里需要先说明一点:本文不会把两个模型的出图效果写成固定结论,因为模型版本、提示词、采样参数不同,真实表现差异很大。更稳妥的判断方式是直接跑几组对比图,用结果判断现有工作流是否适合新模型。
2. 适用场景与使用边界
2.1 这个流程适合谁
如果你满足下面任意一条,这个替换流程值得完整走一遍。
- 想切换本地绘图模型,但不希望从零重写 ComfyUI 工作流。
- 想比较两个 Checkpoint 在相同提示词下的风格差异,需要批量生成对比图。
- 想把旧的手动出图流程改成 API 批量调用,方便接入自己的管理脚本。
- 想理解模型文件、VAE、LoRA 之间如何配合,减少换模型后的返工。
2.2 不适合什么场景
- 如果你需要完全不同的工作流结构,比如从文生图切到图像编辑,单纯换 Checkpoint 不够,要改节点链路。
- 如果你希望新模型能 100% 复现旧模型的提示词效果,这通常很难做到,因为模型训练语料、风格倾向都不一样。
- 如果你要处理的是别人训练且未授权使用的模型文件,先确认授权再使用,不要直接拿来做商用。
2.3 合规与安全边界
本地模型替换涉及模型文件下载、图像生成和可能的 API 服务,使用时要关注以下几点。
- 确认模型文件来源合法,尽量使用作者允许下载、允许本地使用的版本。
- 如果模型基于某个角色形象、真实人物或受版权保护的素材训练,不要用于仿冒、造谣、规避审核等场景。
- 用 API 批量生成时,建议只在本地或受控网络内开放服务,避免未授权的公网访问。
- 涉及人脸生成、声音克隆或数字人相关能力时,必须先获得当事人授权,并在测试环境验证边界。
3. 环境准备与前置条件
3.1 操作系统与硬件
ComfyUI 官方对 Windows、Linux 都有较好的支持。通常来说,显卡驱动和 CUDA 环境要先装好,N 卡体验最顺畅。如果没有独立显卡,也能用 CPU 跑,但出图速度会慢很多,适合小尺寸简单测试。
显存方面,不同模型差异很大。老一点的 SD1.5 系列模型占用相对低,SDXL 系列需要更高显存和更大磁盘空间。这里的判断标准是:以本地实际运行时的显存占用为准。不要只看模型文件大小,要看加载进显存后的实际占用。
3.2 Python 与依赖
ComfyUI 基于 Python 开发,建议使用 Python 3.10 或更高版本。安装 PyTorch 时要注意 CUDA 版本匹配,否则启动时会报 Torch 相关错误。
通用检查清单如下。
- Python 版本符合项目要求。
- 显卡驱动已更新,
nvidia-smi能看到正常输出。 - PyTorch 安装的是 GPU 版本,
torch.cuda.is_available()返回 True。 - ComfyUI 依赖已完整安装,
requirements.txt已执行。
3.3 模型目录结构
ComfyUI 默认通过目录结构区分模型类型。换模型时,大部分文件只需要放到对应目录里。
ComfyUI/ ├── models/ │ ├── checkpoints/ # 完整模型文件,如大狗叫模型 │ ├── loras/ # LoRA 文件 │ ├── vae/ # 独立 VAE 文件 │ ├── controlnet/ # ControlNet 模型 │ └── ... ├── input/ # 图生图输入素材 ├── output/ # 出图结果 └── main.py # 启动入口“死神遗镰”模型如果暂时不用,可以先备份到别处或保留在 checkpoints 目录里,不一定要马上删除。保留旧模型的好处是方便做对比测试,缺点是多占磁盘空间。
磁盘空间按模型体积预留。一个较大模型往往有几 GB,如果目录里还保留了多个版本,建议至少预留几十 GB 空间。
4. 安装部署与启动方式
4.1 使用一键包或源码启动
ComfyUI 有两种常见启动方式:一种是解压即可用的整合包,一种是源码拉取后手动安装依赖。无论哪种,最终都是执行main.py启动服务。
如果使用整合包,通常自带 Python 环境和依赖,直接运行启动脚本即可。如果使用源码,先安装依赖再启动。
cd ComfyUI pip install -r requirements.txt python main.py启动成功后,浏览器访问默认地址即可打开 WebUI。
http://127.0.0.1:8188如果 8188 端口被占用,可以手动指定端口。
python main.py --port 8189 --listen 127.0.0.1这里需要提醒:--listen 127.0.0.1表示只允许本机访问。如果要让局域网内其他设备访问,可以把 IP 换成0.0.0.0,但要注意访问权限,不要随意暴露到公网。
4.2 放置“大狗叫”模型文件
拿到“大狗叫”模型文件后,先确认文件格式。常见的有.safetensors和.ckpt,推荐优先使用.safetensors,安全性更高。
文件放入对应目录:
# 完整模型放入 checkpoints 目录 ComfyUI/models/checkpoints/dagoujiao_v1.safetensors如果是 LoRA 形式的模型,则放入 loras 目录:
ComfyUI/models/loras/dagoujiao_lora_v1.safetensors放入后回到 ComfyUI 页面刷新,正常情况下“大狗叫”会出现在 Checkpoint 加载器或 LoRA 加载器的模型下拉列表里。如果列表里没有,优先检查目录路径和文件名,然后重新启动 ComfyUI。
模型下载完成后建议做一次哈希校验,防止文件损坏导致加载报错。
sha256sum dagoujiao_v1.safetensors把计算结果与来源页面提供的哈希值对比。如果一致,文件完整性没问题。
4.3 “死神遗镰”模型是否需要删除
不强制删除。稳妥的做法是先在当前工作流里确认所有引用“死神遗镰”的节点,把它们替换成“大狗叫”,再决定是否移除旧文件。
很多人在这个步骤踩坑:新模型文件放进了目录,但工作流里 Checkpoint 加载器仍然指向旧模型名,结果生成出来的图还是旧模型效果。排查时先看节点里的模型名称,不要只看目录里的文件。
5. 功能测试与效果验证
5.1 第一次单图测试
启动 ComfyUI 后,先不要直接跑批量任务,用最小的参数跑一张图验证链路是否通畅。
操作步骤:
- 在 Checkpoint 加载器中把 ckpt_name 切换为“大狗叫”模型。
- 正向提示词填一句简单描述,比如
a small dog sitting on the grass, soft light。 - 负向提示词保持原有内容不变,或者从最简开始。
- 采样步数先用 20,CFG 先用 7。
- 分辨率先用 512x512 或模型对应的小尺寸,跑通后再放大。
预期结果是:任务能正常执行,图像能保存到 output 目录,WebUI 页面能看到生成缩略图。如果执行过程报错或输出空白图,先看控制台日志和节点状态。
这个阶段判断链路的三个标准:
- 模型加载没有报错。
- 采样过程正常走完。
- 最终图片文件和预览图都存在。
5.2 对比测试
对比测试的目的是看“大狗叫”和“死神遗镰”在相同提示词下差异有多大。操作方式是在 Checkpoint 加载器里切换模型名,保持其他节点参数不变,分别生成一张图。
建议把两张图的种子固定成同一个数值,这样更容易看出模型差异,而不是随机噪声差异。种子相同、提示词相同、参数相同,只换模型,得到的风格差异基本就是模型本身的倾向。
对比时重点观察:
- 色彩倾向是否有明显变化。
- 人物或主体的面部、结构是否稳定。
- 背景细节和光影风格差异。
- 是否出现旧模型没有的伪影或滤镜感。
如果差异太大,说明旧提示词不完全适配新模型,需要调整提示词。
5.3 提示词适配调整
“大狗叫”和“死神遗镰”在相同提示词下效果不同是正常的。新模型可能对某些词更敏感,也可能对某些风格词反应弱。
调整建议:
- 保留正向提示词里的主体描述,比如场景、动作、光线。
- 如果效果偏暗,增加
bright lighting, high contrast之类的正向词。 - 如果效果偏平板,可以增加
detailed, intricate details。 - 如果风格不对,先删掉旧模型专用的风格词,再逐步加回测试。
- 负向提示词不要照搬旧模型,注意是否包含旧模型特有的负面 tag。
提示词调整是一个逐步逼近的过程。建议每次只改一个变量,记录下出图效果,几次之后就能找到当前模型相对稳定的提示词组合。
5.4 图生图与局部调整测试
如果工作流里有图生图或局部重绘节点,换模型后也要验证。
图生图测试步骤如下:
- 准备一张测试图片,放入 ComfyUI 的 input 目录。
- 在图生图节点中加载该图片。
- 切换 Checkpoint 为“大狗叫”。
- 设置合适的重绘幅度,比如 0.4 到 0.6。
- 生成并检查输出是否保留了原图结构。
局部重绘测试时,重点看蒙版区域的边缘过渡是否自然。换模型后,新模型对蒙版边缘的处理可能不同,如果重绘痕迹过重,需要调整蒙版羽化值或重绘幅度。
5.5 判断标准
功能测试完成的标准不是“图好看”,而是“流程稳定可重复”。
- 相同参数重复生成,不会出现任务中断。
- 模型切换后,出图风格符合预期基础方向。
- 提示词、种子、分辨率等参数都能正常工作。
- API 调用能拿到和 WebUI 一致的结果。
如果以上都满足,再进入批量任务阶段。
6. 接口 API 与批量任务
6.1 开启 API 服务
ComfyUI 启动后本身就带有 API 服务,不需要额外开启。默认情况下,http://127.0.0.1:8188就是 API 服务地址。
WebUI 里的任何一张工作流图,都可以通过页面上的 API 格式按钮导出为 JSON。这个 JSON 就是提交给 API 的请求体。
如果要把工作流导出为 API 格式,在 ComfyUI WebUI 界面中找到保存/加载工作流的按钮,选择导出为 API 格式,保存下来的 json 文件可以直接用于后续脚本调用。
6.2 提交生成任务
以下代码把 API 工作流 json 读入,替换 Checkpoint 名称,并提交生成任务。
import json import time import requests server = "http://127.0.0.1:8188" with open("workflow_api.json", encoding="utf-8") as f: workflow = json.load(f) # 替换模型名 for node_id, node in workflow.items(): if node["class_type"] == "CheckpointLoaderSimple": node["inputs"]["ckpt_name"] = "dagoujiao_v1.safetensors" # 提交任务 resp = requests.post( f"{server}/prompt", json={"prompt": workflow} ) resp.raise_for_status() prompt_id = resp.json()["prompt_id"] print("prompt_id:", prompt_id) # 轮询任务状态 for _ in range(120): history = requests.get(f"{server}/history/{prompt_id}").json() if prompt_id in history: outputs = history[prompt_id]["outputs"] print("outputs:", outputs) break time.sleep(2)这里的workflow_api.json是导出的 API 格式工作流文件,节点 ID 和节点类型需要以实际工作流为准。如果提示词节点是CLIPTextEncode,可以在脚本里找到它再替换文本内容。
替换提示词的示例:
# 假设节点 ID 为 6 的是正向提示词节点 if "6" in workflow: workflow["6"]["inputs"]["text"] = "a cute puppy in a fantasy forest"实际项目中,先打开导出的 json 文件,确认正向提示词节点的 ID,再写进脚本,避免改错节点。
6.3 批量提交任务
批量任务的核心思路是:循环修改工作流中的提示词、种子、模型参数,然后逐个提交到/prompt接口。ComfyUI 内部有任务队列,可以连续接收多个任务。
import json import time import requests server = "http://127.0.0.1:8188" with open("workflow_api.json", encoding="utf-8") as f: base_workflow = json.load(f) prompt_list = [ "a puppy playing on grass, photo style", "a puppy sleeping in a basket, soft light", "a puppy running in snow, dynamic pose", ] for idx, prompt_text in enumerate(prompt_list): workflow = json.loads(json.dumps(base_workflow)) # 替换正向提示词节点 for node in workflow.values(): if node["class_type"] == "CLIPTextEncode" and node["inputs"].get("text"): # 根据实际工作流决定正向和负向节点 node["inputs"]["text"] = prompt_text break resp = requests.post( f"{server}/prompt", json={"prompt": workflow} ) if resp.status_code != 200: print(f"task {idx} failed:", resp.text) else: print(f"task {idx} submitted:", resp.json()["prompt_id"])批量任务要注意几个问题:
- 保存图片时,工作流里的 SaveImage 节点会自动写入 output 目录。
- 如果任务之间互相影响,建议每个任务用一个独立 client_id。
- 如果批量任务量很大,本地生成会依次排队,不要一次性提交上千个任务,先跑几十个验证稳定性。
- 任务失败时记录失败原因,不要静默跳过。
6.4 下载结果图
ComfyUI 历史接口返回的 outputs 中会包含图片文件名,通过/view接口可以下载。
for node_id, node_outputs in outputs.items(): if "images" in node_outputs: for image in node_outputs["images"]: filename = image["filename"] subfolder = image.get("subfolder", "") img_resp = requests.get( f"{server}/view", params={"filename": filename, "subfolder": subfolder, "type": "output"} ) with open(f"download_{filename}", "wb") as f: f.write(img_resp.content)实际使用时,把download_{filename}改成有意义的命名规则,比如包含种子、提示词索引,方便批量整理。
7. 资源占用与性能观察
7.1 显存占用怎么看
模型加载到显卡后,显存占用会明显上升。最常用的观察命令是nvidia-smi。
在任务执行期间,开一个终端执行:
nvidia-smi -l 1这样每秒刷新一次显存状态。重点看图中对应 Python 进程的显存占用数值。
如果任务执行完,显存没有立刻释放,通常是进程还没退出或缓存未清理。可以等几秒,或者重启 ComfyUI 进程。如果持续占用很高,检查是否有其他任务堆积在队列里。
7.2 哪些参数影响资源和速度
- 分辨率:分辨率越大,显存占用和耗时越高。建议先在模型对应的小分辨率下测试,再放大。
- 采样步数:步数越多,耗时越长。20 步和 30 步在视觉上不一定差很多,但耗时明显不同。
- 批量大小:一次生成多张图会大幅提高显存占用,容易爆显存。先用 batch_size 1 跑通。
- 放大模型:如果加载了额外的放大模型,显存和内存都会增加。
- 局部重绘区域:蒙版区域越大,计算量越大。
比较典型的降显存方法:
- 降低分辨率。
- 减少批量大小。
- 关掉不必要的预览或切换为低显存优化。
- 清理 ComfyUI 队列里积压的任务。
- 如果显存紧张,优先用轻量模型,而不是一味调低参数。
7.3 CPU 与 GPU 差异
如果机器没有可用的 GPU,ComfyUI 会退回到 CPU 推理,速度会慢很多。如果 GPU 可用但速度还是慢,检查 PyTorch 是否真的使用 CUDA。
在 Python 环境里确认:
import torch print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0) if torch.cuda.is_available() else "CPU only")如果返回 False,大概率是 PyTorch 版本与 CUDA 不匹配,需要重新安装对应版本的 PyTorch。
7.4 端口冲突与进程残留
ComfyUI 默认端口是 8188。如果启动时提示端口被占用,可以查看占用情况:
netstat -ano | findstr 8188Windows 下找到对应 PID 后,可以结束进程,也可以直接换端口启动。更推荐换端口:
python main.py --port 8190进程残留问题多见于强制关闭服务后,模型文件仍被占用。此时需要结束对应 Python 进程,或者等待系统释放文件后再删除模型。
8. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 模型列表里没有“大狗叫” | 模型放错目录或未刷新 | 检查 checkpoints/loras 目录,重启 ComfyUI | 移到正确目录,重新加载页面 |
| 加载模型报 “model not found” | 工作流 JSON 中的模型名与文件名不一致 | 查看节点里的 ckpt_name 参数 | 修改节点名或重命名模型文件 |
| 启动后页面打不开 | 端口被占用或服务未启动 | 查看启动日志,检查 8188 端口 | 更换端口或重启服务 |
| 出图效果仍然像旧模型 | Checkpoint 节点没有切换 | 打开工作流,逐个检查模型加载节点 | 确认所有引用点都已替换 |
| 显存不足 | 分辨率、批量大小或模型体积过大 | 观察 nvidia-smi 显存变化 | 降低分辨率,减少批量,换小模型 |
| API 提交失败 | JSON 格式错误或节点 ID 不对 | 打印提交响应的报错信息 | 检查导出的 workflow_api.json |
| 任务一直排队不执行 | 队列里积压大量任务或显存被占满 | 查看 /queue 接口状态 | 清空队列,重启服务 |
| 批量任务中途卡住 | 某个任务参数异常或本地资源不足 | 查看控制台日志和失败任务 ID | 增加日志,失败后重试 |
| 图片保存失败 | output 目录无写入权限或磁盘空间不足 | 检查磁盘空间和目录权限 | 释放空间,修复目录权限 |
| 换模型后人物结构崩坏 | 提示词或采样器参数不匹配 | 对比新旧模型同参数出图 | 调整提示词、步数、CFG 或采样器 |
这里有一个常见误解:模型文件放到目录里不等于任务里自动生效。ComfyUI 工作流中,模型是通过节点加载的,不是自动全局替换。排查时按“文件目录检查 -> 节点参数检查 -> 输出结果检查”的顺序来,效率更高。
9. 最佳实践与使用建议
9.1 先小后大,先单后批
第一次切换模型,不要直接跑大规模批量任务。先单张测试,再 4 张对比,再小批量 10 到 20 张,确认稳定后再扩大。
批量任务建议加日志和失败重试机制。在脚本里记录每个任务的 prompt_id、提交时间、结果文件名、失败原因,这样后续排查和维护会轻松很多。
9.2 模型与素材分目录管理
建议按下面结构组织本地文件:
ComfyUI/ ├── models/ │ ├── checkpoints/ │ │ ├── dagoujiao_v1.safetensors │ │ └── sishenyilian_v1.safetensors ├── input/ │ └── comparison/ # 对比测试素材 ├── output/ │ ├── dagoujiao/ │ └── sishenyilian/ └── workflow_backup/ # 工作流 JSON 备份工作流 JSON 是易丢失的部分。改完参数、确认稳定之后,第一时间导出并备份,避免后面改乱时无法回退。
9.3 保留最小可运行配置
当找到一个能稳定出图的参数组合后,单独保存一份最小工作流。这份工作流不包含多余的放大节点、ControlNet 节点,只保留模型加载、提示词、采样、保存图。之后需要排查问题时,先用最小工作流跑,能快速区分是模型问题、参数问题还是节点链路问题。
9.4 API 服务安全建议
如果启动了 API 服务用于批量任务,建议只在本地使用。不要让服务监听在公网地址上,否则任何能访问该端口的人都可以向你的显卡提交生成任务。更稳妥的方式是搭配反向代理和访问认证,或者只在需要时才临时打开服务。
9.5 合规与版权提示
- “大狗叫”“死神遗镰”作为示例模型名,实际使用前确认模型本身允许本地使用和再加工。
- 不要把模型用在冒名、诈骗、伪造内容等场景。
- 如果生成结果用于公开或商用,检查模型授权协议,必要时标注模型来源。
- 图片中如果涉及可识别人物,发布和商用前需要获得授权。
10. 总结与下一步
这次模型替换的核心思路,可以压缩成三个动作:放对文件、换对节点、跑通验证。
最先要验证的功能是 Checkpoint 切换后单张出图是否正常。最容易踩的坑是文件已经放进目录,但工作流节点仍然指向旧模型,导致生成结果没有变化。其次要留意的是提示词适配,直接照搬旧模型提示词很可能会出现风格偏移。
如果这篇文章里的流程你已经跑通,下一步可以从这几个方向继续扩展。一是把批量脚本改成带失败重试和定时任务的形式,提升出图效率。二是尝试在替换 Checkpoint 的同时配合 LoRA,让风格控制更精准。三是把 ComfyUI 的 API 接到自己的管理系统里,实现任务提交、结果回传、素材管理一体化。
模型替换看起来只是换一个文件名,但真正稳定落地,需要把环境、节点、提示词、批量任务和排查能力都准备好。把这套流程保存下来,以后再换其他模型,只需要替换对应文件和分析新模型的输出差异。