ControlNet 这东西,本地要是没有一张显存超过 16G 的卡,玩起来是真的难受。我最早在自用工作站上跑 Stable Diffusion WebUI,普通图 30 秒一张还能接受,可一旦挂上 ControlNet 的 OpenPose 或 Canny,显存直接见底,生成一次动辄一两分钟,CUDA out of memory 隔三差五蹦出来。后来我把整套环境搬到了云端的 GPU 服务器上,按需租用,装好 WebUI、ControlNet 插件和常用控制模型,浏览器打开远程页面就能出图,团队成员也能共用一套。这篇就是我复盘整个云端部署 ControlNet 过程的记录,从环境配置、模型选型到性能优化、排障,尽量把能直接抄作业的部分都写出来。
1. 为什么要把 ControlNet 放到云端跑
1.1 本地跑 ControlNet 的天花板
先聊一个很多人没意识到的问题:ControlNet 并不是一个简单的“开关”,它本质上是给扩散模型加一组“外部条件约束”。在原本的文生图大模型之外,它还要加载一组控制分支模型。以 SD1.5 生态为例,ControlNet 的中间层参数通常在 3 到 4 亿之间,加载起来大概要多占 1.5G 到 2G 显存,再加上预处理器(Canny、Depth、OpenPose 这些)在推理时也要吃资源,实际跑下来和纯文生图比,显存占用高出 30% 到 50% 是常态。
如果你的显卡只有 8G 到 12G 显存,开 ControlNet 后 512x512 分辨率勉强能跑,但稍微拉高分辨率或者开启高清修复就直接崩。16G 以上的显卡会好一些,但 24G 显存想同时挂多个 ControlNet 单元(比如 Canny + Depth + OpenPose 三通道一起开)依然容易爆。更麻烦的是本地环境维护成本:一旦要换 SDXL、升级 PyTorch、换显卡驱动,整套依赖互相踩踏,一折腾就是一个下午。
云端 GPU 租赁把“一次性硬件投入”变成“按小时计费”,普通用户省去硬件折旧,团队可以直接共享一台高配服务器。我个人建议:如果你本地显存不足 16G,或者需要多人共用一套环境,又或者需要批量出图跑任务,就直接考虑云端部署,别在本地环境里死磕。
1.2 云端方案能解决哪些实际问题
权限最大的场景是自动化批量出图。比如电商图片优化,需要同一模特姿势、同一构图下批量换背景、换光影,本地一张张跑不是不行,但批量时电费和时间都很难受。云端部署后,可以把任务排队跑,晚上提交一批,早上直接收图,整个过程不占你的个人电脑。
第二个场景是多人协作。团队里其他人不需要任何显卡,浏览器打开页面就能用。服务器上装一次的模型版本是完全一致的,不会再出现“我这边能跑、你那边跑不了”的版本差异问题。做动画原画、游戏立绘、角色设计这类需要同一角色多角度姿势控制的活,配合 OpenPose 的多角度骨骼功能,可以批量生成设定图,这在游戏美术流程中尤其实用。
肯定有人问,云端部署成本高不高?实际上按小时租用一张 24G 显存的卡,价格从几块钱到十几块钱不等,只在真正跑任务时开机,平时关停,比买一张高端显卡便宜得多。当然,前提是你要愿意折腾一下环境,这就是下面要展开的部分。
2. 云端环境准备与基础配置
2.1 GPU 服务器怎么选
不是显存越大越好,而是看你的任务类型。如果只跑 SD1.5 + ControlNet,16G 显存足够;要跑 SDXL 或同时挂 3 个 ControlNet 单元,建议 24G 起步;如果是团队共用的批量任务,48G 更稳。市面上常见的型号有 T4 16G、A10 24G、3090/4090 24G、A100 40G/80G,价格从每小时几块钱到几十块钱不等。预算有限时,3090 或 4090 是性价比很高的选择,显存够大,性能也不差。
存储和带宽容易被忽略。系统盘至少要 50G,数据盘建议给 200G 以上。Stable Diffusion 的 checkpoint 动辄 2G 到 7G,每个 ControlNet 模型又有 1G 到 3G,加上一两个 LoRA 和输出图积累,空间涨得很快。带宽方面,浏览器访问 WebUI 对带宽要求不高,但如果你需要往服务器上传大模型文件,带宽太小会拖很久。操作系统建议直接装 Ubuntu 24.04 LTS,对 Python 生态和常见 GPU 驱动支持都很好。
还有一个细节是安全组和防火墙。云厂商一般有安全组配置,记得放行 WebUI 的端口(默认 7860)或后面要用的 Nginx 反代端口(比如 8080)。不过这事也要慎重:如果只自己用,最稳妥的方案是走 SSH 隧道,不开公网端口;如果一定要开公网访问,顺手配好基本认证,千万别把裸的 WebUI 直接暴露到公网上。
2.2 基础组件安装:Python、Git、Nginx
WebUI 官方推荐 Python 3.10 或 3.11,我习惯用 Miniconda 创建独立环境。原因很简单,系统自带的 Python 会被很多系统服务依赖,直接在全局 pip 装包容易把系统搞坏,conda 环境隔离后就算出问题,删掉重建就行。Git 一般服务器自带,检查一下版本就行。Nginx 用来做反向代理,把 WebUI 的 7860 端口通过自定义端口暴露出去,具体配置放到后面的安全加固章节说。
sudo apt update && sudo apt upgrade -y # 安装 Miniconda wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh source ~/.bashrc # 创建虚拟环境 conda create -n sd python=3.10 -y conda activate sd # 检查 Git git --version # 如果没装 sudo apt install git -y这几步基本都是复制粘贴就能跑通的。如果你是第一次接触 Linux 服务器,建议先熟悉一下 cd、ls、vim 这几个命令,后面操作 WebUI 配置会频繁用到。国内网络环境下,安装依赖速度慢的话,可以考虑把 pip 源和 conda 源换成国内镜像,能省不少时间。
2.3 安装 WebUI 与 ControlNet 插件
目前最成熟的选择是 AUTOMATIC1111 的 stable-diffusion-webui,生态最大、插件最全,ControlNet 插件的兼容性也好。克隆仓库后首次启动会自动创建虚拟环境并安装依赖,这个过程比较长,需要耐心等。
git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git cd stable-diffusion-webui conda activate sd python launch.py --listen --port 7860首次安装依赖如果遇到网络问题,可以配置 pip 国内镜像源。启动后浏览器访问 http://服务器IP:7860 ,能看到界面就算成功了一半。接着安装 ControlNet 插件:
cd stable-diffusion-webui/extensions git clone https://github.com/Mikubill/sd-webui-controlnet.git cd .. python launch.py --restart很多人装完插件后找不到 ControlNet 面板,多半是没重启 WebUI 或者浏览器缓存没刷新。我的习惯是装完扩展后回到 WebUI 的 Settings 页面,确认扩展出现在列表中,再强制刷新浏览器页面。
接下来要下载 ControlNet 模型。v1.1 的模型按控制类型区分:canny、depth、normal、lineart、scribble、mlsd、openpose、seg、tile、inpaint、shuffle。每个 safetensors 文件大概 1G 到 2G,下载后放到 stable-diffusion-webui/models/ControlNet 目录。最常用的是 openpose 和 canny 两个,其他可以按需补齐。模型放好后,在 UI 里如果没看到,点击“刷新模型列表”按钮即可。
刚部署完环境,我建议先跑一张不带 ControlNet 的普通图,确认基础链路正常。然后再开 ControlNet,这样排查问题时能把“WebUI 问题”和“ControlNet 问题”分开。
2.4 ControlNet 代码结构速览
因为原型来自开源项目,搞清楚代码结构对后续调错很有帮助。sd-webui-controlnet 的核心代码在 extensions/sd-webui-controlnet/scripts/ 目录下。controlnet.py 是主逻辑,负责接收前端传入的参数、组织预处理流程、和采样器交互;lib_controlnet.py 里有控制网络的推理核心,实现了模型加载、特征注入等关键操作;external_code.py 则提供对外的 API 接口。理解这个结构后,遇到报错就能快速定位是前端参数问题、预处理问题还是模型推理问题。
整个运行流程可以拆成四步:第一步,预处理器读入参考图,生成“条件图”,比如 OpenPose 输出骨架线条图,Canny 输出边缘线稿;第二步,条件图缩放到与生成图一致的分辨率,输入 ControlNet 模型分支;第三步,每步采样时,ControlNet 的输出会对 UNet 中间层特征做“特征注入”,用条件约束生成方向;第四步,采样完成后正常解码成图。
这里最关键的一点是:ControlNet 并没有改变采样器本身,它只是在采样器每走一步时,往 UNet 里多塞了一份“条件特征”。这就是它能精准控制构图、姿态,但又不会完全抹掉原有画风的底层原因。部署后如果你需要二次开发,比如做批量调用、自定义预处理器,一定要从 external_code.py 这个入口入手,别去改主流程,否则后续升级插件时会很痛苦。
3. ControlNet 模型选型与 OpenPose 实战
3.1 常见控制模型一张表
ControlNet 模型种类很多,选择的关键是“让条件图和最终目标天然匹配”。我把常用的几个整理成一张表:
| 模型 | 条件图 | 适用场景 |
|---|---|---|
| Canny | 边缘线稿 | 线稿上色、结构保真、建筑线稿 |
| Depth | 深度图 | 保持空间透视、室内场景、物体层次 |
| Normal | 法线图 | 物体立体感控制,适合光影研究 |
| Lineart | 线稿 | 漫画线稿、插画风格 |
| Scribble | 涂鸦草图 | 快速草稿精修 |
| MLSD | 直线结构 | 室内设计、建筑透视 |
| OpenPose | 骨骼关键点 | 人物姿态、动作控制 |
| Seg | 语义分割图 | 场景分区控制、职业设定 |
| Tile | 平铺/分块 | 重绘背景、细节增强 |
| Shuffle | 内容打乱 | 风格迁移、构图转移 |
| Inpaint | 蒙版区域 | 局部重绘 |
每个模型都有自己的“脾气”。Canny 的权重开太高,画面容易变成一幅描边图;Depth 权重太高,人物动作会显得特别僵硬。所以模型选择要跟着任务走,不要每个图都堆满控制条件,有时候只挂一个 OpenPose 比挂三个单元更自然。
3.2 OpenPose 姿态控制的原理解读
OpenPose 是检测人体骨骼关键点的算法,ControlNet 集成版本可以输出人体骨架图(body)、手部关键点(hand)、脸部关键点(face)。在预处理器的下拉框里,你能看到 openpose、openpose_face、openpose_hand、openpose_full 等多个选项。原图进入预处理器后,算法输出一组关键点坐标,再绘制成黑白线条骨架图,这组骨架就是控制条件。扩散模型会根据骨架上的关键点位置来确定人物关节朝向。
需要注意,OpenPose 检测非常依赖输入图质量。人物太小、被遮挡、肢体交叉严重时,关键点容易错乱。常见的解决办法是提高预处理分辨率(Detect Resolution)到 1024 甚至更高,让预处理器看得更清楚。多个人物同时出现时,要勾选允许检测多个 pose 的选项。手部动作如果经常崩,就要打开 openpose_hand,让手部关键点单独参与控制。
我实际使用中会先在服务器上把姿态参考图跑一遍预处理,确认骨架没有断手断脚,再正式生成。这个检查步骤能筛掉一大堆废图,尤其是批量任务时非常值得做。骨架图检查没问题后,可以直接把骨架图保存成 PNG 文件,后续以图片形式传入 ControlNet,这样比每次重新检测要稳定得多。
3.3 多角度骨骼批量控制实战
多角度骨骼控制在角色设计里的价值非常直接:同一角色不同角度下,动作结构必须一致。你可以准备一套多角度参考图,比如正面、侧面、背面站立,把每张图通过 OpenPose 预处理器转成骨架图,然后在 ControlNet 面板里把权重、时机、分辨率设置为同一组参数,分批生成。这种方式的优势是“姿势逻辑”统一,比如手的位置、腿的朝向,不会因为提示词变化而乱跑。游戏立绘、漫画角色设定、电商模特图这些场景经常这么用。
具体操作流程是:进入 ControlNet 的 OpenPose 单元,开启“上传独立图像”,传参考图;点击“生成姿势”按钮,预处理器会生成骨架并直接作为条件图;确认骨架线条完整后,把骨架图保存到本地或直接用。批量做的时候,我建议提前把所有参考图提取成骨架图,存到一个目录里,再写个小脚本循环调用 API,比在 UI 里一张张点快得多。
多人骨骼控制则是另一个常见需求。游戏战斗场景里两个角色对打,每个角色的动作分别控制,ControlNet 的 OpenPose 预处理器能同时检测出多人骨骼,生成条件图中会画多套骨架。生成时注意给每个角色写清楚提示词,再搭配 LoRA 或独立 checkpoint,成功率比“一个条件管两个人”高很多。
3.4 关键参数调优:权重、时机、分辨率
ControlNet 面板里最影响出图效果的是三个参数:Control Weight 权重、Starting/Ending Control Step 时机、Preprocessor Res 分辨率。权重越低,模型越“自由”,提示词主导更强,但姿势和结构也容易走样;权重过高,生成图会显得很“死”,人物像被钉在条件图上。常用范围是:OpenPose 0.8 到 1.0,Canny 0.5 到 0.8,Depth 0.6 到 0.9,起步可以先用 1.0 观察效果,再往下微调。
引导时机要区分来看。Starting Control Step 一般保持 0,从第 0 步开始就让 ControlNet 参与,骨架结构最稳。Ending Control Step 控制在 0.8 左右比较合理,给后面 20% 的采样步骤留出细节自由发挥的空间,防止线条生硬。分辨率方面,Preprocessor Res 提高会让检测更精细,但显存占用也会涨,云端如果显存宽裕就放心拉高。
还有一个很多人忽略的细节:多开 ControlNet 单元时,不要每个单元的权重都拉到 1.0,否则多路条件互相打架,输出会非常“拧巴”。我常用的组合是 OpenPose 1.0 + Depth 0.7 + Canny 0.5,构图稳定又有细节发挥空间。参数调优是个反复试错的过程,建议每调一次跑 2 到 4 张对比图,比一次跑 20 张盲猜要高效得多。
4. 云端性能优化与并发加速
4.1 显存与推理速度优化
云端 GPU 也不是无限显存,尤其是同时挂多个 ControlNet 单元或跑 SDXL。启动 WebUI 时可以加参数做优化:--xformers 加速注意力计算,显存紧张时用 --medvram 把部分模型按需加载到 GPU,显存很小再考虑 --lowvram。模型文件建议一律使用 safetensors 格式,默认走半精度加载可以省近一半显存。如果输出图出现明显色偏或噪点,再检查是否需要单独处理 VAE,比如加 --no-half-vae 参数。
我实测下来的经验是:跑 SD1.5 + 单 ControlNet 时不需要 --medvram,性能最稳;一旦同开 3 个控制单元,显存飙到 17G 以上,我就改用 --medvram 并只挂 2 个单元。注意 --medvram 会让第一次推理变慢,因为需要动态加载模型,但相比 OOM 崩掉,这点时间成本完全可以接受。
推理速度方面,影响最大的是采样步数、分辨率和模型选择。步数从 30 降到 20,清晰度变化不大但速度快一倍;分辨率从 1024 降到 768,对比构图影响可控但显存压力明显下降。云端按小时计费,差一个参数可能就是实打实的成本差距。批量任务前,我建议先用小尺寸把参数组合测一遍,统计单张耗时和显存峰值,再跑全量。
python launch.py --listen --port 7860 --xformers --medvram4.2 API 批量调用与并发排队
WebUI 自带 REST API,远程部署时非常适合写脚本批量调用。核心接口是 POST /sdapi/v1/txt2img 和 /sdapi/v1/img2img,请求体里传 prompt、negative_prompt、sampler、steps、width、height 等参数即可。ControlNet 插件接在 alwayson_scripts 里,控制模型名必须和 models/ControlNet 目录下的文件名对应。
import requests import base64 import json url = "http://127.0.0.1:7860/sdapi/v1/txt2img" payload = { "prompt": "masterpiece, a knight holding a sword, dynamic pose", "negative_prompt": "bad anatomy, extra limbs", "width": 768, "height": 768, "steps": 24, "cfg_scale": 7, "sampler_name": "Euler a", "batch_size": 2, "alwayson_scripts": { "ControlNet": { "args": [ { "enabled": True, "module": "openpose", "model": "control_v11p_sd15_openpose [hash]", "input_image": base64.b64encode(image_bytes).decode("utf-8"), "weight": 1.0, "guidance_start": 0.0, "guidance_end": 1.0, "processor_res": 1024, "resize_mode": "Just Resize" } ] } } } response = requests.post(url, json=payload).json() for idx, img_b64 in enumerate(response["images"]): with open(f"output_{idx}.png", "wb") as f: f.write(base64.b64decode(img_b64))注意 base64 编码的图片不要带 data:image/png;base64 前缀,接口解析会直接报错。默认 WebUI 是单任务队列,同时推多个请求会排队执行,不会并行。这其实是合理的,因为并行会爆显存。想要真正并发,要么开多实例(每个实例监听不同端口,分别跑不同批次),要么用 Nginx 做负载均衡。比如机器显存 48G,开两个实例每个占用 24G,吞吐量通常比单实例高不少。
排队久了看不到进度很烦人。建议脚本里自己维护任务队列,记录每个任务的提交时间和完成时间。定位慢任务时,先看采样步数和分辨率是否异常高,再看是不是预处理器在 CPU 上耗时,最后看模型是否在反复重新加载。这一步排查清楚了,大多数性能问题都能解决。
4.3 远程访问与权限安全加固
Nginx 反向代理 + 基本认证是云端部署的必做项。先用 htpasswd 生成密码文件,然后写一个简单的 server 配置,把公网端口转发到本机 WebUI。这样外网访问时必须输入用户名密码,防止别人蹭你的 GPU 跑任务,不然一晚就能烧掉不少钱。我每次部署完都会检查一遍这个配置,因为真的见过有人把裸 WebUI 开到公网,被陌生人刷了几百张图的案例。
sudo apt install nginx apache2-utils -y sudo htpasswd -c /etc/nginx/.htpasswd sd_userserver { listen 8080; server_name _; auth_basic "SD WebUI Access"; auth_basic_user_file /etc/nginx/.htpasswd; location / { proxy_pass http://127.0.0.1:7860; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }配置完成后,访问 http://服务器IP:8080 就能看到登录提示。如果自己有域名,还可以在 server_name 里绑域名,再申请一个证书走 HTTPS。注意 WebUI 有 WebSocket 连接,Nginx 配置里必须把 Upgrade 和 Connection 头带上,否则队列进度条刷新会异常。
个人的场景也可以完全不开公网端口,只用 SSH 隧道:ssh -L 7860:127.0.0.1:7860 user@server,本地浏览器打开 http://127.0.0.1:7860 即可。这种方式最安全,浏览器里看到的页面和本机部署几乎没有区别,延迟也感觉不到。
4.4 提效插件与向量检索集成
云端环境里装几个常用扩展,能明显提高效率。Tag 自动补全就是典型例子,很多插件使用本地数据库或向量索引来加速候选标签检索,效果比纯文本遍历稳定得多,输入几个字母就能快速联想完整标签,批量洗 prompt 时效率翻倍。这类向量检索思路不光可以用在 Tag 上,后续做素材管理、根据历史订单批量匹配图集时也很通用。
电商图片优化是另一个实际业务价值很大的方向。批量处理商品图时,用背景去除插件或 ControlNet + Tile 来重绘背景、换光影,可以大幅减少人工修图时间。云端部署最大的好处是这些脚本任务不用占着本机,提交一批任务后你可以去干别的事,第二天直接收图。
磁盘和备份也在提效范围内。输出目录会快速膨胀,建议定期归档旧生成结果,模型目录做好快照。整体思路就是:把云端环境当作生产环境来运维,而不是实验环境。
5. 常见问题与排查技巧实录
5.1 姿态崩坏与检测失败
现象是生成的人像姿势和参考图完全不一样,或者左右手对调、肢体扭曲。排查顺序:先看条件图是否正确——点击预处理按钮生成的骨架图,是否完整表达了参考图姿态;再看权重是否太低,低于 0.6 时姿态常常撑不住;最后看 Ending Control Step,如果设置成 0.4,后面 60% 的采样步已经不受 ControlNet 约束,姿态很容易崩。我遇到最多的坑是“参考图人物带半身像”,OpenPose 把腿的关键点一笔带过,生成的腿就奇形怪状,解决方法是把参考图裁剪成完整全身。
如果 OpenPose 检测出来的骨架本身就有问题,后面再怎么调权重都没用。建议先在预处理器面板里直接看骨架结果,骨头断了一截就回退调整原图或分辨率。姿态崩坏是 ControlNet 最常见的问题,但大部分都能通过“先看条件图、后调参数”这个顺序解决。
5.2 显存溢出问题
云端也会 OOM,而且很常见。24G 显存开 SDXL + ControlNet + 高清修复,直接爆掉。处理优先级:先关高清修复,其次降低宽度和高度,再次把 batch_size 降为 1,最后才考虑换低版本模型或用 --medvram。如果单张没问题但批量跑着跑着显存越来越少,多半是任务队列里堆积了大量中间结果,建议脚本里定期清理临时目录,尤其注意 ControlNet 的预处理图片要显式释放。
你可能会想,24G 显存跑个 ControlNet 还不够?说实话,SDXL 的 UNet 本身就比 SD1.5 大不少,ControlNet 又额外吃一部分,高清修复还要开第二阶段,三部分叠加,24G 真的捉襟见肘。我的原则是:控制单元最多开 2 个,分辨率控制在 1024 以内,高清修复放到最后一步手动决定开不开。
5.3 模型加载异常
现象是 ControlNet 下拉选择框是空的,或者选了模型后报错 “Model not found”。原因基本只有三个:模型没放到正确路径 models/ControlNet;文件名后缀不是 .safetensors 或者文件下载损坏;WebUI 没刷新模型列表。建议下载后先看文件大小,几百 MB 的模型大多有问题。不要随意改模型文件名,ControlNet 会通过文件名识别功能模块,乱改可能导致预处理器和模型类型匹配不上。
还有一种情况是模型文件明明在,但 UI 里不显示。多数是扩展没重启或浏览器缓存,强制刷新一次。如果还是不行,就去 WebUI 控制台看日志,里面会有模型加载时的具体报错,比瞎猜快得多。日志是排查一切 WebUI 问题的第一入口,很多人忽略了这一点。
5.4 云端服务卡顿与排队
UI 卡顿不一定是 GPU 负载高,也可能是预处理器在 CPU 上跑。OpenPose 的 DWPose 检测、深度估计这类处理器,如果 WebUI 编译不完整,会被丢到 CPU 上计算,速度奇慢。排查方法是看服务器 CPU 占用率,如果某个 python 进程 CPU 持续 90% 以上,先考虑升级到带 CUDA 的预处理器后端,或减少一次提交的任务量。
多人同时用一台服务器时,建议在 Nginx 里限制并发连接数,避免几百个请求把服务打崩。也可以在 WebUI 设置里打开队列显示,让使用者看到自己排到什么位置,减少操作焦虑。排队时间长还有一个容易被忽略的原因:一次 batch_size 太大,当前任务把显存占满了,后续任务只能干等。这种情况下拆成小 batch 反而整体效率更高。
5.5 常见问题速查表
| 现象 | 常见原因 | 快速处理 |
|---|---|---|
| 姿态崩坏 | 条件图本身错误、权重过低、结束步数太小 | 检查骨架图,权重提到 0.8+,Ending 提到 0.8 |
| CUDA out of memory | 分辨率过高、多单元叠加、高清修复未关 | 降分辨率、关高清修复、batch=1、加 --medvram |
| ControlNet 模型不显示 | 路径错误、缓存、未刷新 | 检查 models/ControlNet,强制刷新,看日志 |
| 预处理很慢 | 预处理器跑 CPU | 检查 GPU 利用率,升级 CUDA 后端,降低任务量 |
| 页面卡进度条不更新 | Nginx 未代理 WebSocket | 加 Upgrade 和 Connection 头 |
| 同一姿势生成结果却不同 | 权重偏低、采样步数过少 | 提高权重到 1.0,步数加到 24 以上,固定 seed |
| 多人骨骼只识别到部分人 | 原图人物过小、未勾选多人检测 | 提高分辨率,开启多人模式,裁剪人物区域 |
6. 一些部署心得与建议
云端部署 ControlNet 这一年多,我最深的感触是:它把“显存焦虑”变成了“参数优化”。本地跑图你会反复纠结显卡够不够,云端跑图你只关心每次任务的质量和成本。我现在的习惯是,部署完成后第一件事不是急着出图,而是把一套稳定的 ControlNet 参数组合记录下来,写成配置文件。后面跑电商图、角色设计、批量换装,都是直接抄自己的作业。
最后分享一个小技巧:如果团队共用同一台服务器,建议把 WebUI 配置目录和模型目录做定期备份,或者用云硬盘挂载。这个坑我踩过——有次磁盘损坏,十几个 ControlNet 模型全没了,重新下载加配环境花了整整一个下午。从那以后我学乖了,模型文件单独归档,输出目录定期清理,配置变更都记在 README 里。云端方案本来就是为了省事,别让环境维护重新变成麻烦事。