Chapter 12

生产部署 · RunPod · Serverless

把 ComfyUI 拉到线上跑,面临三个问题:GPU 去哪买、冷启动怎么压、钱包怎么省。这一章从 Serverless 三巨头到自建 K8s,给你一张部署决策地图。

一、部署形态一览

形态代表适合成本模型
Serverless 按请求RunPod Serverless / Replicate / Modal / Fal流量波动大、MVP按秒计费,闲时 0
独占云 GPU 实例RunPod Pods / Vast.ai / Lambda Labs稳定流量按小时租,7×24
自建 K8sAWS EKS + G5 / 自有机房大规模、数据合规硬件+电费+运维
SaaS 平台嵌入Leonardo / Civitai Generator / Tensor.Art不想维护每图付费

决策直觉:日请求 < 1 万 → Serverless;1-10 万 → RunPod Pods 固定实例;> 10 万 → 自建 K8s

二、RunPod Serverless(入门最友好)

RunPod 是 2023 年起最火的 GPU Serverless 平台,按秒计费,模型支持最全。

1. 核心概念

Endpoint
一个 HTTP 端点,对应一套"Docker 镜像 + GPU 类型 + 并发策略"。你发 POST 请求过来,RunPod 负责起 worker 跑。
Worker
一个运行中的容器实例,处理请求。冷启动指从 0 到 worker 就绪所需时间。
Min / Max workers
Min=0 完全按需(冷启动),Min=1 永远保留一个(贵但快),Max 控流量峰值。
Network Volume
挂载的网络磁盘——模型放这,多个 worker 共享,不用每次下载。

2. 部署 ComfyUI 最短路径

  1. RunPod 控制台 → Serverless → New Endpoint
  2. 选模板 runpod-worker-comfy(社区镜像)或自己的 Docker 镜像
  3. GPU 类型选 RTX 4090 / A40 / A5000(看模型大小)
  4. 挂 Network Volume(先用 Pod 填进去 SDXL/Flux 模型)
  5. Handler 用 runpod-python SDK 写好后塞进镜像

3. Handler 骨架

# handler.py
import runpod, json, base64, requests, time
from comfy_client import run_workflow   # 前一章那套

WORKFLOW_TEMPLATE = json.load(open("/workflow_api.json"))

def handler(job):
    inp = job["input"]
    wf = build_workflow(WORKFLOW_TEMPLATE,
                        prompt=inp["prompt"],
                        seed=inp.get("seed", int(time.time())),
                        steps=inp.get("steps", 25))
    imgs = run_workflow(wf)     # 本地 ComfyUI 后端
    return {"image_b64": base64.b64encode(imgs[0]).decode()}

runpod.serverless.start({"handler": handler})

Dockerfile 要同时起 ComfyUI 和 handler:

# Dockerfile
FROM runpod/base:0.6.2-cuda12.1.0

WORKDIR /app
RUN git clone https://github.com/comfyanonymous/ComfyUI.git
RUN pip install -r ComfyUI/requirements.txt
RUN pip install runpod websocket-client

COPY workflow_api.json /
COPY handler.py /
COPY start.sh /start.sh
RUN chmod +x /start.sh

CMD ["/start.sh"]
# start.sh:后台起 ComfyUI,前台跑 handler
#   cd /app/ComfyUI && python main.py --listen 127.0.0.1 &
#   sleep 5 && cd / && python handler.py

4. 调用 Endpoint

curl -X POST "https://api.runpod.ai/v2/YOUR_ENDPOINT_ID/run" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input": {"prompt": "a cat wizard, magic sparkles, oil painting"}}'

# 返回 job_id,轮询 /status/{job_id} 拿结果
# 或者用 /runsync 同步调用(短任务)

三、冷启动优化

冷启动 = 容器从 0 启动到第一个请求能处理的时间。SDXL 冷启动典型 20-60 秒,Flux 可能 60-120 秒——用户等不了。优化技巧:

Network Volume 挂模型(必做)
模型存到网络磁盘,容器启动时只挂载不下载。10GB 模型下载 vs 挂载:5 分钟 vs 3 秒。
预热 Min=1
保留一个 worker 待命,永远不冷启动——但每小时都计费,~$0.3/h 起。适合流量稳定时段。
FlashBoot(RunPod 独有)
RunPod 的"容器快照"技术,冷启动能降到 2-5 秒。需要 worker 进入 idle 后 RunPod 打快照。
模型常驻 RAM
ComfyUI 启动后第一次加载 checkpoint 慢(~15s)。Handler 启动时做一次"warmup"——跑一张假图,让所有模型进 VRAM。后续请求无模型加载开销。
Idle Timeout 调大
默认 worker idle 5 分钟自动关。如果 5 分钟内来第二个请求,直接复用热 worker,跳过冷启动。流量稳定时设 10-30 分钟。

四、其他 Serverless 平台对比

平台特点价格(H100 小时单价)
RunPod ServerlessGPU 类型最全,社区镜像丰富~$2.0 + 按秒
ReplicateCog 打包格式,公开模型市场,共享 $按请求,~$0.001-0.01/图
ModalPython 装饰器定义 function,DX 优秀~$4/h H100
Fal.ai专做 ComfyUI/Diffusion,极快冷启动按秒,~$0.5-2/h
Baseten企业友好,可私有部署定制
Beam冷启动快,社区小按秒
Replicate 的独特优势
——把模型发布到 Replicate 后,别人用你的模型,你分钱。有些 ComfyUI 工作流作者把热门工作流(如 AI 写真 pipeline)封成 Cog 上传,月入 $1k-5k。产品方用也方便——调别人发布好的模型,不用自己部署。

五、独占实例(RunPod Pods / Vast.ai)

Serverless 单价高但空闲时不花钱,独占实例反过来——单价低但 24×7 都在烧钱。适合"QPS 稳定在某值以上"的产品。

价格参考(2025 年中位数)

GPUVRAMRunPod PodVast.ai 最低
RTX 309024GB$0.22/h$0.15/h
RTX 409024GB$0.34/h$0.30/h
A4048GB$0.39/h$0.35/h
A100 80GB80GB$1.64/h$1.2/h
H100 SXM80GB$2.79/h$2.0/h
H200141GB$3.29/h

Vast.ai 是"闲置算力市场",价格最低但稳定性参差——适合训 LoRA / 跑 batch,不适合 24×7 生产(主机主可能下线)。

盈亏平衡点

Serverless vs 独占的拐点:worker 平均 utilization ≈ 40-50% 时两者成本接近

假设一张图平均 15 秒(SDXL,含冷启):
  Serverless:$0.00069/s × 15s = $0.01/图
  独占 4090($0.34/h = $0.00009/s):
    连续跑满:$0.00009 × 15 = $0.00135/图(7.5× 便宜)
    利用率 20%:$0.00135 / 0.2 = $0.00675/图(还是便宜)
    利用率 10%:$0.0135/图(比 Serverless 贵)

→ 一天至少 2000+ 图才考虑买独占 4090 Pod

六、自建方案

单机 Docker Compose

小团队 / 企业内网,最简单:

# docker-compose.yml
services:
  comfyui:
    image: yanwk/comfyui-boot:cu124-latest
    ports:
      - "8188:8188"
    volumes:
      - ./models:/root/ComfyUI/models
      - ./custom_nodes:/root/ComfyUI/custom_nodes
      - ./output:/root/ComfyUI/output
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
    restart: unless-stopped

  worker:
    build: ./worker
    environment:
      - COMFYUI_URL=http://comfyui:8188
      - REDIS_URL=redis://redis:6379
    depends_on:
      - comfyui
      - redis

  redis:
    image: redis:7-alpine

Kubernetes 多 GPU

企业级:每张 GPU 一个 Pod,用 Nvidia Device Plugin 分配。

# comfyui-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: comfyui
spec:
  replicas: 4           # 4 张 GPU
  template:
    spec:
      containers:
      - name: comfyui
        image: your-registry/comfyui:latest
        resources:
          limits:
            nvidia.com/gpu: 1
        volumeMounts:
        - name: models
          mountPath: /app/ComfyUI/models
      volumes:
      - name: models
        persistentVolumeClaim:
          claimName: comfyui-models-pvc     # 共享 NAS/EFS
---
apiVersion: v1
kind: Service
metadata:
  name: comfyui-svc
spec:
  type: ClusterIP
  selector:
    app: comfyui
  ports:
  - port: 8188
    targetPort: 8188

配合 HPA(Horizontal Pod Autoscaler)按队列长度 / GPU 利用率自动扩缩容。

七、模型分发与更新

多实例共享模型有几种方案:

方案优点缺点
共享 NAS(NFS/EFS)一份数据多实例读首次读慢,多并发可能瓶颈
镜像内置启动即用,单实例最快镜像巨大(20GB+),推拉慢
启动时下载(S3)镜像小冷启动慢(每次几十秒)
Nvidia NIM / 分层镜像分层,模型层只下载一次工程复杂

模型热更新

新 LoRA 上线不想重启全集群:

八、成本估算模板

做产品前先估算,避免上线一周烧光种子轮:

单图成本 = (GPU $/h ÷ 3600) × 单图秒数
假设 SDXL 一张 10s @ 4090($0.34/h):
  单图 = (0.34/3600) × 10 = $0.00094
  每千图 = $0.94

月流量估算:
  DAU 1000、人均 5 图/天 = 5000 图/天
  月 = 150,000 图
  成本 = 150,000 × $0.00094 = $141/月(纯 GPU)
  + Serverless 溢价 1.5-3× = $210-420/月

Flux / Hunyuan 视频:
  Flux 单图 ~30s,4090 → $0.003/图
  Hunyuan 5s 视频 ~600s(含冷启),H100 → $2.8 × 600/3600 = $0.46/视频

对比产品收入:订阅 $10/月,每用户 200 图成本 = $0.19。毛利 98%——这就是 AI 图生意赚钱的底层算术。视频毛利薄得多。

九、监控与可观测

工具栈:Prometheus + Grafana(K8s 自建)、RunPod Dashboard(Serverless)、Langfuse / Helicone(如果串了 LLM 做 prompt 优化)。

十、合规与安全

  1. 内容审核:所有生成图过 NSFW 分类器(Falconsai/nsfw_image_detection 或阿里/微软云 API),违规不返回
  2. 人脸/身份:涉及人像合成必须有用户授权 + 数据删除机制(GDPR/个保法硬要求)
  3. 水印 / C2PA:2025 起多国要求 AI 生成内容标识,建议输出时加隐水印(invisible-watermark)
  4. 模型许可:Flux.1 dev 非商用;部分 Civitai Checkpoint 禁止商用——上线前把所有用到的模型逐一核查 license
  5. 日志脱敏:prompt 可能含用户 PII,存储前做脱敏/限定保留期
  6. 防 prompt 注入:过滤已知恶意 prompt(绕过 NSFW 过滤/生成违法内容的模板)

十一、上线 checklist

  1. ☑ 核心工作流测过 100+ 随机 prompt,失败率 < 2%
  2. ☑ 冷启动 < 30s(预热 + Network Volume + FlashBoot)
  3. ☑ P95 延迟记录并设告警
  4. ☑ 失败重试机制(最多 3 次,指数退避)
  5. ☑ 队列长度告警(超过某阈值自动扩容或拒流)
  6. ☑ NSFW / 暴力 / 政治敏感检测
  7. ☑ 所有模型 license 合规核查
  8. ☑ 用户数据 / 生成图保留策略明确(默认 30 天?)
  9. ☑ 单图成本监控,月预算告警
  10. ☑ 回滚预案:新版本 workflow/模型可快速切回旧版
  11. ☑ ComfyUI 不对公网;若对外,前面必须有鉴权 + 限流
  12. ☑ 流量高峰演练(同时 100 个请求,系统表现如何)

十二、反模式

  1. 不估算成本直接上线:月底账单 $3000 才发现模型参数没量化。
  2. 冷启动不优化:首张图 60s,用户全跑了。
  3. Serverless Min=0 用于高频产品:每次都冷启,付的每 1 秒里 30% 在加载模型。
  4. 把 ComfyUI 原生 UI 直接给用户:用户可以上传任意文件 / 装任意节点 / 执行任意代码,RCE 风险。
  5. 独占 H100 24×7 跑 MVP:日请求 < 100,$2000/月烧掉,应该用 Serverless。
  6. 模型不 pin 版本:社区 Checkpoint 作者更新 v11,你的产品画风悄悄变了还不知道。
  7. 全部 prompt 存日志:用户 PII 泄露风险 + 存储成本爆炸。
  8. 没跑压测就承诺 SLA:真流量 5× 峰值时才发现 VRAM 不够。

十三、本章小结

记住:
① 部署形态按流量决定:低频用 Serverless(RunPod/Replicate/Fal),中频用独占实例,高频 K8s 自建
② 冷启动优化四件套:Network Volume + FlashBoot + Min=1 + Warmup——能把 60s 压到 3-5s。
③ 单图成本算式:(GPU $/h ÷ 3600) × 单图秒数 × Serverless 溢价系数;SDXL 0.001/图、Flux 0.003/图、Hunyuan 视频 0.5/条。
④ 上线 checklist 少说 12 条(本章十一节),NSFW / 合规 / 水印 / 回滚预案一个都不能漏。
全书终章 · 写给读者
从第 1 章"什么是 Diffusion"到这一章"生产部署",你已经掌握了把 AI 生图从玩具变成产品的完整链路。Diffusion 模型技术日新月异,2025 年的 Flux / Hunyuan / Wan 到 2026 年可能就被超越——但工作流思维 / 参数直觉 / 工程架构这三样东西是跨代际的,掌握了就能跟上任何新模型。

下一步:挑一个你想做的产品场景(AI 写真 / 漫画上色 / 产品图生成 / 视频二创),把本书的工作流模板组合起来,用 ComfyUI 跑通原型,再按第 11-12 章搭成服务。三个月后再回头看,你会发现自己从"调参工"升级成了"AI 产品工程师"。

祝你出好图。