ComfyUI02 一文搞透Workflow

Contra
2023-10-25
ComfyUI02 一文搞透Workflow

什么是ComfyUI的Workflow

Workflow是ComfyUI的精髓。所谓Workflow工作流,在ComfyUI这里就是它的节点结构及数据流运转过程。

上图,从最左边加载模型开始,经过中间的CLIP Text Encode对关键词Prompt做处理,加入一个初始的Latent Image,然后是采样器,VAE解码,最后得到生成的图像。

通过节点的方式,除了类似webui那样去填写参数,还可以观察处理过程,这是ComfyUI设计巧妙之处。每次生成的时候,当程序运行到某个环节时,该环节对应的节点就会自动高亮。各节点按当前运行状态依次高亮,非常有利于理解生成式AI模型(Stable Diffusion)的基本原理。

如上图,当运行到采样器在工作时,采样器KSampler节点的绿色框高亮,此时正对应着命令行窗口中的生成进度。

类比webui的使用体验:

  1. 调好参数
  2. 点击生成
  3. 等待结果

除了观察命令行窗口能获得一些生成进度中的信息,在webui界面上,基本还是传统软件的使用思维:

Workflow的快速”复现“

webui中的png info

先回忆一下webui,当想要复现一张图像的生成参数时,可以把这张图拖到png info中进行查看。

例如在C站中查看这张AI聊斋的图:

可以直接右键保存它,然后拖到webui的PNG Info里,即可查看包含关键词在内的所有参数。

SD webui是把这些信息存在了PNG文件的chunk里,可以简单理解:PNG文件里某个数据块,是可以存储额外的文本信息的。

现在最新的webui似乎对存放的字段做了更新,直接右键点击图片,打开”属性“,在”详细信息“的”备注“里就可以查看:

当然很多通用的图像软件都可以查看,例如XnView,在其自带的Exif Tools里就可以看:

额外知识:这些信息也可以从图片中抹去,详见去年写的这一篇:

关键词保护!如何从StableDiffusion(webui)生成图片中抹去prompt信息

ComfyUI中的Workflow

回到ComfyUI,每次生成的这些参数,在ComfyUI里也可以用类似的方式保存和读取。

用ComfyUI生成一张图:

同样用右键查看属性:

没有找到相关信息,没关系,这只能说明Windows资源管理器能读取的字段里没有。用XnView MP打开它:

这就能看到了,它分了两个字段,一个是Prompt,里面包含类似png info的信息:

Prompt   {"3": {"inputs": {"seed": 1234, "steps": 20, "cfg": 7.0, "sampler_name": "dpmpp_sde_gpu", "scheduler": "normal", "denoise": 1.0, "model": ["10", 0], "positive": ["6", 0], "negative": ["7", 0], "latent_image": ["5", 0]}, "class_type": "KSampler"}, "4": {"inputs": {"ckpt_name": "sd_xl_base_1.0_0.9vae.safetensors"}, "class_type": "CheckpointLoaderSimple"}, "5": {"inputs": {"width": 1024, "height": 1024, "batch_size": 1}, "class_type": "EmptyLatentImage"}, "6": {"inputs": {"text": "A red-haired and black-faced evil spirit captured a woman in front of a group of soldiers armed with spears, by Chinese Meticulous painting style, Liaozhai art", "clip": ["10", 1]}, "class_type": "CLIPTextEncode"}, "7": {"inputs": {"text": "text, watermark", "clip": ["10", 1]}, "class_type": "CLIPTextEncode"}, "8": {"inputs": {"samples": ["3", 0], "vae": ["4", 2]}, "class_type": "VAEDecode"}, "9": {"inputs": {"filename_prefix": "ComfyUI", "images": ["8", 0]}, "class_type": "SaveImage"}, "10": {"inputs": {"lora_name": "Liaozhai_xl_v1.0.safetensors", "strength_model": 0.9500000000000001, "strength_clip": 0.8, "model": ["4", 0], "clip": ["4", 1]}, "class_type": "LoraLoader"}}   

还多了一个字段是Workflow:

Workflow     {"last_node_id": 10, "last_link_id": 14, "nodes": [{"id": 8, "type": "VAEDecode", "pos": [1209, 188], "size": {"0": 210, "1": 46}, "flags": {}, "order": 6, "mode": 0, "inputs": [{"name": "samples", "type": "LATENT", "link": 7}, {"name": "vae", "type": "VAE", "link": 8}], "outputs": [{"name": "IMAGE", "type": "IMAGE", "links": [9], "slot_index": 0}], 
...

太长删掉了一些。能看出来里面存放的就是那些节点信息,例如编号id、位置坐标pos等。当ComfyUI加载这些信息时,就能完美”复现“所有的节点结构,以及每个节点中的各项参数。

ComfyUI加载生成图片中的Workflow

webui通过png info来反查参数,那么在ComfyUI中呢,更简单了,直接把生成的图拖到网页窗口中即可。

拖进窗口放手可得:

提醒:拖进去前如果需要的话记得备份之前的Workflow。

另外,ComfyUI也可以专门保存Workflow文件,点击侧边栏中的Save和Load,进行保存与加载:

保存后得到的文件默认是workflow.json,可以用文本编辑器打开查看:

把Workflow信息与工作界面截图存在一起

Workflow信息除了能单独存成json文件,或者存在生成的图片中,还能存在工作界面截图中,这样更加直观:

安装这个插件即可:ComfyUI-Custom-Scripts https://github.com/pythongosssss/ComfyUI-Custom-Scripts

该插件有很多脚手架功能,保存Workflow Images是其中一项。 https://github.com/pythongosssss/ComfyUI-Custom-Scripts/tree/main#workflow-images

ComfyUI插件的安装方法,放在下一课中。

Workflow资源

在这个网站里有大量ComfyUI Workflow,可以直接下载,然后用本课的方法打开。 https://comfyworkflows.com/

Workflow与data driving

多说两句,webui的png info,存的是data,是静态的,更像是web2.0时代的数据驱动。在使用webui时,关注点是生成的图片结果,以及相应的关键词与各项参数。如传统软件一样,还是相对黑盒。

而ComfyUI对Workflow的存取方式,在关注数据的基础上多了一层工作流,即除了结果,还关注内部过程。这可能用多了就会有体会,会引导你下意识的去想着如何优化或改造工作流,带来更多的灵活可能性。

另,节点式与dataflow或workflow也不是新事物,我2005年开始接触的节点式编程环境MaxMSP,从其诞生距今已经三十多年了。

图自Wiki,上古版本的MaxMSP界面。 https://en.wikipedia.org/wiki/Max_(software)


公众号/B站/小红书/抖音/知乎:实验编程

实验编程社群资源、公开课: https://ghc.h5.xeknow.com/s/hzkMX

实验编程情报中心(会员): https://ghc.h5.xeknow.com/s/2BCFuJ

Cheers🍻

Contra