ComfyUI_omost
ComfyUI对Omost的实现,以及关于区域提示的所有内容。
新闻
- [2024-06-10] 增加OmostDenseDiffusion区域提示后端支持(与原始Omost仓库相同) https://github.com/huchenlei/ComfyUI_omost/pull/27
- [2024-06-09] 添加画布编辑器 https://github.com/huchenlei/ComfyUI_omost/pull/28
- [2024-06-09] 添加连接外部LLM服务的选项 https://github.com/huchenlei/ComfyUI_omost/pull/25
待办事项
- 为聊天节点添加进度条
- 实现梯度优化区域提示
- 实现多重扩散区域提示
如何使用
如截图所示,omost包含两个部分:
- LLM聊天
- 区域条件
LLM聊天
LLM聊天允许用户与LLM交互以获得类JSON结构。这个包中有3个节点用于与Omost LLM交互:
Omost LLM加载器
:加载LLMOmost LLM聊天
:与LLM聊天以获取JSON布局提示Omost加载画布条件
:加载先前保存的JSON布局提示
您可以选择使用show-anything节点来显示json文本并保存以供以后使用。 官方LLM的方法运行速度较慢。每次聊天在4090上大约需要3~5分钟。(但现在我们可以使用TGI部署加速推理。详情请参阅加速LLM。)
示例:
- 简单LLM聊天:
- 多轮LLM聊天:
以下是示例中使用的JSON输出样本:
点击展开JSON
```json [ { "rect": [ 0, 90, 0, 90 ], "prefixes": [ "一个亚洲女孩坐在椅子上。" ], "suffixes": [ "这张图片描绘了一个亚洲女孩优雅地坐在椅子上。", "她有长长的飘逸黑发,穿着一件韩国传统服饰韩服,上面装饰着精致的花卉图案。", "她的姿势既放松又优雅,一只手轻轻放在膝盖上,另一只手拿着一把精致的扇子。", "背景是一个简单、中性色调的房间,柔和的自然光从窗户中透进来。", "整体氛围宁静而深思,捕捉了一个安静反思的时刻。", "亚洲女孩,坐姿,椅子,传统服饰,韩服,花卉图案,长黑发,优雅姿势,精致扇子,中性背景,自然光线,宁静氛围,沉思,安静反思,简单房间,优雅,精致图案,飘逸秀发,文化服饰,韩国传统服装,放松姿势。" ], "color": [ 211, 211, 211 ] }, { "color": [ 173, 216, 230 ], "rect": [ 5, 45, 0, 55 ], "prefixes": [ "一个亚洲女孩坐在椅子上。", "窗户。" ], "suffixes": [ "窗户是一个简单的矩形框架,配有透明的玻璃窗格。", "它让自然光线透进房间,在场景上投射出柔和、漫射的光线。", "窗户微微开着,轻柔的微风使窗帘轻轻飘动。", "外面的景色是模糊的,暗示着一个宁静的户外环境。", "窗户增添了开放感和与外界的联系,增强了图像的宁静和沉思氛围。", "窗户,矩形框架,透明玻璃窗格,自然光线,柔和光线,漫射光线,微开的窗户,轻柔微风,飘动的窗帘,模糊景色,宁静户外环境,开放感,与外界联系,宁静氛围,沉思。", "窗户增添了开放感和与外界的联系。", "风格简单自然,注重柔和光线和轻柔微风。", "高质量图像,具有细腻纹理和自然光线。" ] }, { "color": [ 139, 69, 19 ], "rect": [ 25, 85, 5, 45 ], "prefixes": [ "一个亚洲女孩坐在椅子上。", "椅子。" ], "suffixes": [ "女孩坐着的椅子是一把简单优雅的木椅。", "它有光滑的抛光表面和经典设计,带有弯曲的椅腿和高椅背。", "椅子的木材是深棕色的,为整体场景增添了一丝温暖。", "女孩优雅地坐在椅子上,姿势既放松又优雅。", "这把椅子与她的韩国传统服饰相得益彰,增强了图像的文化和优雅氛围。", "椅子,木椅,优雅设计,弯曲椅腿,高椅背,抛光表面,深棕色木材,温暖触感,韩国传统服饰,文化服装,优雅姿势,优雅坐姿,经典设计,简约椅子,高质木材,抛光表面。", "椅子为整体场景增添了一丝温暖和优雅。", "风格经典简约,注重优雅设计和抛光表面。", "高质量图像,具有细腻纹理和自然光线。" ] }, { "color": [ 245, 245, 220 ], "rect": [ 40, 90, 40, 90 ], "prefixes": [ "一个亚洲女孩坐在椅子上。", "精致扇子。" ], "suffixes": [ "女孩手持的精致扇子是一件传统配饰,由精细的竹子制成,带有精致的雕刻。", "扇子上装饰着精美的花卉图案,增添了其美感和文化意义。", "女孩轻轻地持扇,其柔和的动作增强了图像的优雅和雅致氛围。", "扇子是一种精致和传统的象征,为整体场景增添了一丝文化优雅。", "精致扇子,传统配饰,精细竹制,精致雕刻,花卉图案,文化意义,优雅持扇,柔和动作,雅致氛围,精致象征,文化优雅,精致雕刻,精美花卉图案,传统配饰,精湛工艺。", "精致扇子为场景增添了一丝文化优雅和精致。", "风格传统而精致,注重精细雕刻和精美设计。", "高质量图像,具有细腻纹理和自然光线。" ] }, { "color": [ 255, 255, 240 ], "rect": [ 15, 75, 15, 75 ], "prefixes": [ "一个亚洲女孩坐在椅子上。", "亚洲女孩。" ], "suffixes": [ "亚洲女孩是图像的焦点。", "她穿着韩国传统服饰韩服,这是一件由丝绸制成并装饰有精致花卉图案的美丽服装。", "她的黑发又长又飘逸,以柔和的波浪垂落在背后。", "她的表情平静而深思,嘴角带着淡淡的微笑。", "她优雅地坐在椅子上,姿势既放松又端庄。" ] } ] ``` "一只手轻轻放在膝盖上,另一只手握着精致的扇子,为她的形象增添了一丝优雅。""亚洲女孩,焦点,传统韩国服饰,韩服,复杂的花卉图案,长黑发,飘逸的发型,平静的表情,若有所思,微笑,优雅的姿势,放松,优雅,精致的扇子,文化服饰。"
"气氛宁静而沉思,捕捉了一个安静反思的时刻。"
"风格优雅而传统,注重文化服饰和优雅姿态。"
"高质量图像,纹理细腻,自然光线。"
"一个亚洲女孩坐在椅子上。"
"传统韩国服饰。"
"这件传统韩国服饰,被称为韩服,是一件用丝绸制成的美丽服装。"
"它装饰有复杂的花卉图案,色彩鲜艳,包括红色、蓝色和黄色。"
"这件衣服设计优雅流畅,有精致的褶皱和柔和的动感。"
"女孩自豪地穿着这件服装,其文化意义在其优雅的设计和精致的细节中显而易见。"
"韩服与她优雅的姿态相得益彰,为整个场景增添了一丝文化优雅。"
"传统韩国服饰,韩服,美丽服装,丝绸面料,复杂的花卉图案,鲜艳的颜色,红色,蓝色,黄色,优雅流畅,精致褶皱,柔和动感,文化意义,优雅设计,精致细节,优雅姿态,文化优雅。"
"韩服为场景增添了一丝文化优雅和精致美感。"
"风格传统而优雅,注重复杂的花卉图案和鲜艳的色彩。"
"高质量图像,纹理细腻,自然光线。"
区域条件
根据 https://github.com/lllyasviel/Omost#regional-prompter,有6种方法可以执行区域引导扩散。
方法1:多重扩散 / 扩散器混合
这些方法在不同位置运行UNet,然后使用不同区域的权重或掩码合并估计的epsilon或x0。
待实现
方法2:注意力分解
假设注意力类似于y=softmax(q@k)@v,那么可以实现注意力分解,如y=mask_A * softmax(q@k_A)@v_A + mask_B * softmax(q@k_B)@v_B,其中mask_A、k_A、v_A是区域A的掩码、k和v;mask_B、k_B、v_B是区域B的掩码、k和v。这种方法通常比(1)产生的图像质量略好,有些人称之为注意力耦合或区域提示器注意力模式。但这种方法有一个考虑:掩码只是使区域注意力在数值上成为可能,但并不强制UNet真正关注那些区域的激活。换句话说,注意力确实被掩蔽了,但不能保证注意力softmax真的会在掩蔽区域被激活,也不能保证注意力softmax永远不会在掩蔽区域之外被激活。
这是ComfyUI内置的区域提示方法。使用Omost Layout Cond (ComfyUI-Area)
节点来应用此方法。
有两种重叠方法:
- 覆盖:上层完全覆盖下层
- 平均:重叠区域是所有条件的平均值
方法3:注意力分数操作
这是比(2)更高级的方法。它直接操作注意力分数,以确保每个掩码区域内的激活被鼓励,而掩码外的激活被抑制。公式类似于y=softmax(modify(q@k))@v,其中modify()是一个复杂的非线性函数,包含许多归一化和技巧来改变分数的分布。这种方法超越了简单的掩蔽注意力,真正确保那些层获得所需的激活。典型例子是Dense Diffusion。
这是原始Omost仓库使用的方法。要使用此方法:
- 安装 https://github.com/huchenlei/ComfyUI_densediffusion
- 在工作流中包含
Omost Layout Cond (OmostDenseDiffusion)
节点
注意:ComfyUI_densediffusion不与IPAdapter兼容。
方法4:梯度优化
由于注意力可以告诉我们每个部分对应哪些提示,我们可以将提示分割成多个段落,然后获取每个提示段落的注意力激活。然后我们将这些激活与外部掩码进行比较以计算损失函数,并反向传播梯度。这些方法通常质量很高,但VRAM消耗大且速度很慢。典型方法有BoxDiff和Attend-and-Excite。
待实现
方法5:使用外部控制模型如gligen和InstanceDiffusion
这些方法在区域遵循方面提供了最高的基准性能,但也会因为它们是训练参数而引入一些基础模型的风格偏移。此外,这些方法需要将提示转换为向量,通常不支持任意长度的提示(但可以与其他注意力方法结合使用以实现任意长度)。
待实现
方法6:一些更多可能的层选项,如layerdiffuse和mulan
待实现
您还可以选择将Omost画布生成的图像作为初始潜在空间传递,如原始Omost仓库所述:
编辑区域条件
您可以使用Omost Load Canvas Conditioning
节点上的内置区域编辑器自由操作LLM输出。
加速LLM
现在您可以利用TGI部署LLM服务,实现高达6倍的推理速度。如果您需要长期支持您的工作,强烈推荐使用此方法,可以为您节省大量时间。
准备工作:您需要额外20GB的VRAM来部署8B LLM(用空间换时间)。
首先,您可以使用Docker轻松启动服务,步骤如下:
port=8080
modelID=lllyasviel/omost-llama-3-8b
memoryRate=0.9 # 正常运行需要20GB VRAM,根据部署机器的VRAM调整比率
volume=$HOME/.cache/huggingface/hub # 模型缓存文件
docker run --gpus all -p $port:80 \
-v $volume:/data \
ghcr.io/huggingface/text-generation-inference:2.0.4 \
--model-id $modelID --max-total-tokens 9216 --cuda-memory-fraction $memoryRate
服务成功启动后,您将看到Connected日志消息。
(注意:如果在下载模型时遇到卡住的情况,请尝试使用网络代理。) 然后,测试LLM服务是否成功启动。
curl 127.0.0.1:8080/generate \
-X POST \
-d '{"inputs":"What is Deep Omost?","parameters":{"max_new_tokens":20}}' \
-H 'Content-Type: application/json'
接下来,添加一个Omost LLM HTTP Server
节点,并输入LLM的服务地址。
关于TGI的更多信息,请参考官方文档:https://huggingface.co/docs/text-generation-inference/quicktour
使用llama.cpp HTTP服务器
使用量化的GGUF模型也能显著提升性能。
-
下载模型
你可以在这里下载omost-llama-3-8b-Q8_0-GGUF模型。或者,你也可以使用GGUF-my-repo自行量化其他模型。
-
启动HTTP服务器
克隆并编译llama.cpp。然后,使用以下命令启动服务:
./llama-server -m ../model/omost-llama-3-8b-q8_0.gguf -ngl 33 -c 8192 --port 8080
另外,你也可以直接使用llama-cpp-python启动HTTP服务器。
参考:llama-cpp-python OpenAI兼容Web服务器
然而,在我的3090Ti测试中,直接使用llama-server性能更好。生成图像时,使用llama-cpp-python大约需要50-60秒,而使用llama-server只需要30-40秒左右。
-
添加节点
添加一个
Omost LLM HTTP Server
节点,并输入LLM的服务地址。