Hugging Face 团队用 gr.Workflow 把 AUTOMATIC1111 的十一条媒体管线重写成 73 个节点的一张画布:没有循环、四类算子把本地 Python 与远端调用分开、36 个节点里 22 个完全在进程里跑。这不是又一个 ComfyUI 分身,而是对扩散工作流「怎么组织」这个老问题的一次结构化回答,中文工程师值得看一遍它做对了什么。
本文基于 Hugging Face 官方博客 2026 年 9 月发布的《Rebuilding AUTOMATIC1111 with Gradio Workflow》(原文)梳理与延伸。原文是产品公告偏工程实录,我这里换一个视角:不再介绍 Workflow1111「能做什么」,而是把它当成对「节点式扩散工作流应该怎么设计」的一份工程主张,跟中文社区熟悉的 A1111、ComfyUI 放在一起对比,看它到底松开了哪几个结。
国内做 Stable Diffusion 生产环境的团队,路径基本是两条:一条是 A1111,插件生态最厚、上手最快,但只要跑起来一个像样的 pipeline,就得在若干个 tab、若干个扩展、若干条不透明的 hook 之间来回跳;另一条是 ComfyUI,节点式画布把 A1111 拆开摊平了,可复用性大幅上升,代价是每个真正有用的节点几乎都由第三方 custom node 提供,画布一旦复杂就变成 Python 插件包版本控制地狱。
这两条路的共同点是:把「模型调用」「本地计算」「另一段程序」全部塞进同一种节点抽象里。你不看代码,光看画布分不出哪个节点是一次 HTTP 请求、哪个是本地 CPU 上的 NumPy、哪个是别人写的扩展。Workflow1111 给出的答案,是在算子层面把这四件事显式分开——这才是它区别于 ComfyUI 的关键,不是画布好看。
gr.Workflow 只有四种 operator:
InferenceClient 调用 Hugging Face Hub 上的模型,等价于一次远端推理;这四类的分法看起来平淡,但落到工程语义上有几个非常硬的后果。第一,只有 model 和 space 会走网络,读一眼节点类型就知道这一步会不会踩到限流、鉴权、超时;A1111 里的一个扩展、ComfyUI 里的一个 custom node,你只能进代码里查 import 才能确定。第二,fn 节点是纯函数,脱离画布可以直接 pytest;这一点在长期维护里的价值远超过任何画布界面的美化。第三,把「另一个应用」抽象成 space 节点,等于承认「原子」的粒度可以是一个完整 Space,而不是必须切碎到函数级别——这直接解决了 ComfyUI 里「上游作者把自己写成一个 300 行的巨型 custom node」的问题:那本来就应该是一个独立的 Space,通过网络边界隔离,而不是被强塞进你的画布进程。
原文里给出的实测数字很有说服力:整张画布 36 个 operator 节点,其中 32 个是 fn 节点,32 个 fn 里又有 22 个「完全在进程内跑,不发起任何网络调用」。也就是说,画布上大约三分之二的节点,在你断网、在你上游 API 挂掉、在 Hub 维护窗口期间,仍然可以正常工作。这个「优雅降级」不是宣传语,是可以从节点类型统计里直接读出来的架构性质。
gr.Workflow 里没有 loop operator。第一次听到这个设计约束,很多人的反应是「那怎么做批处理」;但原文举的 prompt matrix 例子说得很清楚:一个基础 prompt「a lone oak tree」搭配四个后缀(sunrise / thunderstorm / Milky Way / autumn fog),画布上是四个并排的 text-to-image 节点,最后由一个 fn 节点把四张图拼成 contact sheet。
没有循环、四个节点在同一依赖深度,运行时的行为就是默认并行。四张图同时开始生成,总耗时约等于最慢那一张。而在 ComfyUI 里,同样的效果要么手动铺四条链路,要么依赖某个特定 custom node 提供的循环节点,二者在语义上都不如「你想同时跑就把节点并排画出来」这么直接。
这背后的设计取舍值得单独点出:把循环从算子集里拿掉,意味着画布本身变成一张纯粹的 DAG(有向无环图)。DAG 的调度问题在过去二十年里已经被数据工程界打磨得非常成熟——Airflow、Prefect、Dagster、包括各家 CI/CD 系统本质都在做同一件事。把扩散工作流也约束成 DAG,等于让它接管这一套现成的心智模型:拓扑排序、并行调度、失败重试、局部重放,全部有现成参考答案。相反,一旦画布容许循环和条件跳转,它就退化成一门「图灵完备但难以推理」的可视化编程语言,ComfyUI 的部分复杂工作流已经开始遇到这类问题。
看一眼原文里 txt2img 的组织方式,能直接感受到这种分层的好处:
A1111 的 txt2img tab 里,同样这三件事是绑死在一个 Python 类里的:你想换 prompt 拼装策略,得看懂它的 ;你想改元数据写法,得改另一处;你想接入不同的推理后端,得读源码找 hook。Workflow1111 把这三步拆成三个节点后,任何一步都可以被替换、被单测、被并入其它管线。同样的 prompt-builder 节点可以被 hi-res fix、img2img、prompt matrix 复用,这就是 A1111 里那个「怎么让每个 tab 用同样的样式模板」的老问题最自然的解法:让它变成一个节点。
免费获取企业 AI 成熟度诊断报告,发现转型机会
modules/processing.py更漂亮的是 PNG Info 的闭环:post-process 节点把参数写进 PNG parameters 文本块,PNG Info 管线里的一个 fn 节点再把它读出来。这条闭环全部在本地完成,即使 Hub 全挂了也不影响你回看自己历史生成参数。原文没强调这一点,但对追求可复现的团队来说,这才是「工作流工程化」的核心——生成物本身携带足够多的元数据,让每一次运行都可以被反演。
A1111 里 hi-res fix 是先上采再二次去噪,img2img 是另一个独立 tab。Workflow1111 把两者合并到 FLUX.1-Kontext 的同一个 model 节点上:hi-res 版给 Kontext 一条 enhance fine detail and micro-texture, keep the composition identical 的 refine 指令;img2img 版让用户直接描述想改什么,Kontext 返回编辑后的图。
这里的重点不是 Kontext 本身多强,而是一旦模型能力足够通用,UI 上「上采」「编辑」这类历史遗留 tab 就可以合并成同一个节点的两种调用方式。A1111 的 tab 结构是十几年前 Stable Diffusion 生态形成时的产物,那时候每个能力都要专用管线;今天生成模型的能力大幅扩张,还硬把它们摆成十几个 tab 就是在维护考古。
把 Qwen3-4B 用作 prompt 生成器,把 Qwen2.5-VL 用作图片 interrogator,在 Workflow1111 里是两个普通的 model 节点,没有专门的 LLM 扩展、没有专门的 VLM 插件。这个「没有扩展」是关键:ComfyUI 里想接入一个 VLM,你得找到一个(可能已经不再维护的)custom node;A1111 里 CLIP interrogator 是官方内置的独立按钮。Workflow1111 的答案是:既然 Qwen3-4B 已经是 Hub 上的模型,那它就应该跟扩散模型走同一条 InferenceClient 通路,同一种节点类型。
更值得注意的是原文提到 ViT 分类器和 VLM 在同一张图上并行运行——两个节点共享同一个 image 输入,画布调度器识别到它们在同一深度、无依赖,就会自动并行。这是 DAG 调度器的免费红利,画布作者一行调度代码都不用写。
A1111 里 inpaint 蒙版要用户拿画笔在图上手绘。Workflow1111 的做法:DETR 检测出图里的物体(原文的例子是街景里三个人、一只狗、一辆自行车和一辆汽车),画布分叉——一个分支把检测框画在原图上给用户预览,另一个分支把框转成一张二值蒙版供下游 inpaint 节点使用。
原文特意点出:画框和造蒙版都在本地用 Pillow 和 NumPy 完成,只有 DETR 那一次检测出网。这就是四类算子分工的直接收益:如果画蒙版这一步也走远端,一张图往往需要几十上百次调用,成本和延迟都不可接受;把它固定为 fn 节点,就把「本可以本地做的事」从网络路径上拿掉了。这跟前端页面里「表单校验一定要在客户端也做一份」是同一种工程直觉。
Extras 里两个 upscaler 走了不同路:一个是 fn 节点里的本地 Lanczos 重采样,快到只受 Pillow 速度限制;另一个是 space 节点 AuraSR ×4,把一个完整的超分辨率 Space 当作原子调用。同样,背景去除也是一个 space 节点(BRIA RMBG-2.0),整个模型住在自己的 Space 里,画布这边只是发起调用。
Annotators 那五个 ControlNet 风格的预处理器——Canny、line art、sketch、luma-depth、posterize——每一个都是纯 NumPy 写的 fn 节点,背后没有模型,CPU 上跑一张图大约 0.5 秒。这一段特别值得中文工程师注意:很多我们习惯当作「模型能力」的东西,其实是可以用几行 NumPy 干掉的经典图像处理。ComfyUI 里 ControlNet preprocessor 常被打包成一个巨型 custom node(依赖一大堆权重下载),Workflow1111 提示我们,这类工作大部分根本不需要走模型路径。
把三者放在一起看:
第三条的代价并非虚指:如果你需要在扩散工作流里跑循环、条件跳转、动态节点,Workflow1111 目前的表达力不如 ComfyUI。但对绝大多数生产化的扩散管线来说,你要的是 DAG 而不是编程语言;把控制流留给外部编排(Airflow / Temporal / 前端),把画布留给「怎么把这次生成一步一步做出来」,反而是更清晰的分工。
如果团队正在做几件事之一,Workflow1111 这套架构值得作为参考模板:
一,正在把 A1111 / ComfyUI 从个人使用推向生产化。生产化里第一个撞上的问题永远是「怎么测」——一个 250 节点的 ComfyUI 工作流,本地跑通一次和线上稳定跑通一百次是两回事。Workflow1111 的 fn 节点是普通 Python,可以脱离画布单测;这一条约束往前推,逼你把「能纯 Python 的部分」和「必须走模型的部分」在设计阶段就分开。
二,正在做私有部署或离线部署。国内不少企业客户对「必须能断网工作」有硬要求,Workflow1111 的 22/36 本地节点占比给出一个非常具体的目标:你能不能让自己的画布里有三分之二以上的节点在断网时仍可用?做不到就意味着一旦上游被限流或被封锁,整条管线立即瘫痪。
三,正在设计新的扩散工作流平台。四类算子的分法比「一切皆插件」清晰得多,也比「一切皆函数」严谨得多。它承认了不同调用形态(本地 / 远端模型 / 远端应用 / 数据)本质上不是同一种东西,直接把这个事实反映在类型系统里,是好设计的一贯做法。
四,想把扩散 pipeline 复用起来做产品。把 BRIA RMBG-2.0、AuraSR 这样的开源能力封装成 Space,然后在自己的画布里作为 space 节点调用,比复制一堆 Python 依赖到本地更符合微服务时代的分工。Hugging Face Spaces 的免费额度和 ZeroGPU 政策让这种「能力即服务」的分发方式变得可承担,Workflow1111 只是把它做到了画布层面。
最后留一个值得继续观察的问题:node graph 类工具的宿命,是「简单场景用起来爽、复杂场景变成意面」。ComfyUI 在这条曲线上已经走了几年,社区里已经出现「工作流复杂到没人敢改」的抱怨。Workflow1111 的四类算子和 DAG-only 约束能不能延缓这条曲线,取决于它未来会不会为了迎合复杂场景而引入循环、条件、动态节点。原文没有回答这个问题,值得盯着看 Hugging Face 后续几个版本会不会守住「no loop」这条硬边界——守住了就是范式革新,破防了就是又一个 ComfyUI。
对写代码的人来说,这套架构最大的启发不在扩散工作流本身,而在于它示范了「用类型系统承载运行边界」这件事:当一个抽象里塞了太多本质不同的东西(本地函数 / 远端模型 / 远端应用),把它们拆成不同的类型,比在文档里写「注意某些节点会走网络」要有效一万倍。类型系统能守住的边界,注释永远守不住。








关注公众号

扫码关注,获取最新 AI 资讯
3 步完成企业诊断,获取专属转型建议
已有 200+ 企业完成诊断