工作流程图
基本原理已经弄通,下一步要开始编码搬砖了。整个自动绘画的流程如下,暂就不整高深U什么L了,写个简单明了能容易看懂的流程图。UI借用了下墨刀里的AI绘画公开原型
部署节点
整个系统的后端服务典型部署需要3类节点
- Aigc Server:用于提供针对用户的查询、显示、充值、扣点等服务
- Aigc Agent:与ComfyUI一一对应,用于获取队列、转发websock通知、返还扣点的业务操作
- ComfyUI Server:提供ComfyUI服务,需要开启API开发模式
流程说明
接下来我对整个流程进行详细描述:
- 为用户建立rabbitmq队列,用于获得进度推送消息。前端界面使用stompjs订阅用户对应的队列;
- 绘画前,如果是图生图,上传蒙版等操作,需要在提交前先存储到公用或临时存储(为什么不直接提交COMFYUI?因为多绘画节点时,不确定最终会落到哪个节点,但是也不能傻傻的等到选择了空闲绘画节点后再去用公网慢吞吞的传);
- 用户点击“立即创作”按钮,此时发起绘画请求,发送给Aigc Server检查用户账户是否够用;
- 如果账户够用,下一步一次轮询所有的绘画Agent,找到空闲或最小队列的节点(Agent会持续更新节点状态到redis,因此只需要查询redis即可);
- 如果所有节点都有队列,返回一个确认消息,提示用户需要排队,是否确定提交。如果确定提交则继续走1的流程,覆盖一个无需重复询问的参数;提交后提示信息建议用户先操作其它功能,稍后在用户图片查看
- 如果有空闲的节点,则执行提交。提交时,先执行账户扣点(还是要先检查一下最新的账户 )。然后异步将OSS(或本地存储)的图片使用/upload/image或/upload/mask推送给ComfyUI节点,并根据流API数据及工作流数据替换参数后推送给COMFYUI
- ComfyUI节点此时开始异步的绘图,(Agent节点从启动后需要实现连接COMFYUI的Websocket的保活机制,如果无法连上时要标记Agent不可用)
- ComfyUI节点绘图过程会不断通过Websocket推送绘画Agent执行Node和状态信息,对于C端客户,我们不需要提供太复杂的信息,只需要将节点别名(记录在数据库)推送给用户,例如“WD姿态分析中”,对于KSampler的节点则推送进度信息前端展示进度条;
- 当出现异常时,系统记录异常,并展示绘画失败的信息通过RabbitMQ推送给用户(这里要推送用户的全局消息),并进行返点(根据任务的点数);
- 当ComfyUI跑到executed消息时,说明已经有输出节点执行。此时可以将输出通过全局消息推送到界面,由于一个流程可能会有多个输出,此时还未最终结束;
- 当ComfyUI给出execution_success消息时,说明该流程已经结束,此时可以推送执行完成消息,提示用户手动或自动关闭进度弹框;
以上是ComfyUI自动绘画核心实现流程,典型的流程例如文生图、图生图、线稿转实景、AI摄影。也可以实现基于ComfyUI的其它流程,例如文本转视频、AI音乐制作等。
记录几个功能点:
1)针对不同等级的用户,提供不同的参数级别,新手模式和专家模式。对于常用的功能,提供较少的参数便捷操作,专家模式提供更多的操作参数。
2)上传后的图片等资源采用唯一HASH,当用户调整参数连续计算时,根据HASH判断是否需要重新上传。也可以作为用户的历史资源区,例如“再画一张”无需重传之前的图片。
4)保护检测算法:为了保护ComfyUI计算资源,不发生OOM,需要实现动态公式计算面积或时长,预测最终需要执行需要的资源。如果超出大小需要提示用户上传较小的资源处理,举个例子,放大算法允许8倍放大,但是8倍时输出图片面积不能超过512x512,这需要动态计算。
5)通用扣点算法:通用的扣点算法需要根据参数以及资源大小(例如图片的面积,或者声音的时长)来进行计算,采用动态计算公式的方式来计算,结果向上取整。
核心流程数据结构:
部分完成界面:
如果开发过程出现变化,会同步更新此文档。有任何疑问请留言