作者:鸥弋、筱姜
2023年下半年,ComfyUI 以其快速、流通的图像生成能力,联合多样的自界说节点,敏捷在创作者中盛行起来。ComfyUI 的亮点就是能够批量化生成图像,一键加载大量工作流,让用户可以轻松实现人像生成、背景替换、风格迁移和图像动画化等功能。越来越多的企业及个人开发者希望借助 ComfyUI 能力进行 AI 绘画领域创业或者业务上新,获得高流量及贸易代价,但使用原生的 ComfyUI 仍然存在一些问题:
1.显卡资源昂贵且难以购买:GPU 卡池管理技术门槛高:高性能的 GPU 资源不仅价格昂贵,而且往往难以大规模采购。此外,GPU 卡池的有效管理和维护必要复杂的技术支持,也带来了额外的挑战。
2.难以应对高并发:原生的 ComfyUI 出图必要排队,并发处理能力有限。在面临高并发场景时,尤其是并发请求具有大的波动性时,资源配置难以精确猜测,从而可能导致体系错误和业务中断。
3.门槛高,难以对外透出:ComfyUI 拥有一定的门槛,对于普通的创作者而言几乎无法使用,必要对其进行二次包装才能让更多用户享受到 AI 的便捷。
为了资助用户高效率、低成本应对企业级复杂场景,以下介绍 ComfyUI API Serverless 版解决方案,通过使用该方案,用户可以充实使用 ComfyUI + Serverless 技术优势快速开发上线 AI 绘画应用,等待为广大开发者 AI 绘画创业及变现提供思路。
相干文章:AI 绘画平台难开发,难变现?试试 Stable Diffusion API Serverless 版解决方案
阿里云X优酷联名发起的「Creat@AI江湖创作大赛」使用本文章中的解决方案,基于函数盘算FC 一键摆设 AI 绘图平台,1分钟实现 “破次元壁合照”、5分钟实现 Stable Diffusion、ComfyUI 摆设,生成以“少年江湖“为主题的画作赢万元奖金。
活动链接:https://developer.aliyun.com/plan/create/snbm
方案优势
在以往的活动中,我们也面临了很多非技术相干的用户期望享受 AI 的魅力。联合现实必要我们给出了 Serverless 化的 ComfyUI 实践案例,解决了上述问题。
- 摆设简单:提供基础 ComfyUI 镜像,不必要修改时一键即可拉起出图,必要修改时也只必要修改 ComfyUI 镜像地址即可
- 弹性 GPU:函数盘算提供了 GPU 弹性的能力,根据现实请求控制实例个数,有突发流量时自动弹新实例承接请求,完全不必要增加额外的关注
- 按量付费:函数盘算的按量实例为毫秒级粒度的计费策略,用多久就收多少钱,确保每分钱都花在刀刃上
- ComfyUI Serverless 化改造:对原本不适应 Serverless 弹性能力的 ComfyUI 改造,使其可以支持异步、并发、弹性等各种 Serverless 能力
- 前后端联动:活动开源了一个支持自界说参数,而且并发出图的前端页面,可直接提供给客户使用
应用场景
ComfyUI 提供了非常高的自由度和灵活性,支持定制化工作流,而且可以重复使用,批量出图,特殊适用于必要创意图像生成场景:
- 艺术创作与设计:艺术家和设计师可以使用 ComfyUI 生成独特的艺术作品,包括概念艺术、插画、海报设计等。通过 ComfyUI,他们可以根据自己的创意想法生成初步的图像草稿,然后再进一步细化和完善。
- 内容制作与营销:在交际媒体、广告和营销领域,ComfyUI 可用于快速生成符合品牌风格的视觉素材,用于交际媒体内容、广告横幅、海报等
- 游戏开发:游戏开发者可能使用 ComfyUI 自动生成游戏内的景观或修建物的纹理,减少手工制作这些元素所需的时间和成本。
- 视觉殊效与影视后期:影戏和电视行业的视觉殊效团队可以使用 ComfyUI 来辅助创建逼真的背景、特殊效果或修复旧影片中的画面缺陷。
通过 API 接口调用 ComfyUI 解决方案
通例的 ComfyUI 出图的流程大致如下
- 调用 /prompt 接口,发起出图使命
- 通过 WebSocket 获取出图进度
由于在 Serverless 场景下,无请求的时候实例会被冻结,因此 WebSocket 请求是必须要存在的,且必要保持毗连到出图完成。
在并发请求数比较大的情况下,我们往往期望可以使用 Serverless 的弹性,动态创建多个函数实例处理出图使命。但由于 ComfyUI 本身是“有状态”的,难以确保出图的请求和获取状态的请求固定打到同一个实例上,这可能会导致接口的调用不符合预期。
为了让 ComfyUI 更加适配 Serverless 模式,必要针对 ComfyUI 进行一定的改造。
参考 fc-comfyui/src/images/agent 的代码,在 ComfyUI 镜像里内置 agent 程序,负责转换 ComfyUI 请求而且拉起 ComfyUI。
注意!
我们提供的代码仅用于运营活动使用,作为 Serverless 方式调用的实践参考。
功能未经过严格测试,请根据现实的业务必要开发或调解相干的代码,并构建 ComfyUI 镜像。
目前提供的 Agent 能力介绍
开启 Agent 能力,必要增加环境变量
当通过 Agent 的 API 调用时,发起您调解单实例并发度为 1 ~ 5,确保并发请求尽量使用单独的实例,提高出图效率
数据类型
出图 Prompt
与 ComfyUI 在 Dev Mode 导出的文件一致- type TPromptNode struct {
- Inputs map[string]any `json:"inputs"`
- ClassType string `json:"class_type"`
- Meta map[string]any `json:"_meta"`
- }
- type TPrompt map[string]TPromptNode
复制代码 LoadImage 节点的参数做了特殊处理,如果内容为 base64 或 http 地址,会自动将对应的文件上传,并转换为 ComfyUI 可辨认的形式
进度
- // key 为 node id 的 map 对象
- type TProgress map[string]TProgressNode
- type TProgressNode struct {
- Max int `json:"max"` // 进度的最大值
- Value int `json:"value"` // 当前进度
- Start int64 `json:"start"` // 开始时间
- LastUpdated int64 `json:"last_updated"` // 最后一次更新时间
- Images []TProgressNodeImage `json:"images"` // 当前节点输出的图片信息(路径)
- Results []string `json:"results,omitempty"` // 当前节点输出的图片 base64
- }
复制代码 接口
出图请求(HTTP 同步)
路径:/api/run
Body:json 格式的 prompt 数据
返回值:最后一次的进度(包罗图片信息)
当必要异步请求时,必要增加 X-Fc-Invocation-Type 和 task-id,前者告知 FC 异步形式调用,后者用于记录当前使命的唯一 id,方便后续获取状态
[code]curl http://xxxxx/api/run -v \ -H 'X-Fc-Invocation-Type: Async' \ -H "task-id: abcdefg" \ -XPOST \ -d '{ "3": { "inputs": { "seed": 1586995582004891, "steps": 17, "cfg": 6, "sampler_name": "dpm_2", "scheduler": "karras", "denoise": 1, "model": [ "33", 0 ], "positive": [ "31", 0 ], "negative": [ "32", 0 ], "latent_image": [ "5", 0 ] }, "class_type": "KSampler", "_meta": { "title": "KSampler" } }, "4": { "inputs": { "ckpt_name": "majicMIX realistic_v7.safetensors" }, "class_type": "CheckpointLoaderSimple", "_meta": { "title": "Load Checkpoint" } }, "5": { "inputs": { "width": 1024, "height": 784, "batch_size": 1 }, "class_type": "EmptyLatentImage", "_meta": { "title": "Empty Latent Image" } }, "6": { "inputs": { "text": "2 human\nhi quality,detailed", "clip": [ "4", 1 ] }, "class_type": "CLIPTextEncode", "_meta": { "title": "CLIP Text Encode (Prompt)" } }, "8": { "inputs": { "samples": [ "3", 0 ], "vae": [ "4", 2 ] }, "class_type": "VAEDecode", "_meta": { "title": "VAE Decode" } }, "9": { "inputs": { "filename_prefix": "ComfyUI", "images": [ "8", 0 ] }, "class_type": "SaveImage", "_meta": { "title": "Save Image" } }, "10": { "inputs": { "image": "https://serverless-tool-images.oss-cn-hangzhou.aliyuncs.com/aigc/json/couple/default.png", "upload": "image" }, "class_type": "LoadImage", "_meta": { "title": "Load Image" } }, "11": { "inputs": { "image": "https://serverless-tool-images.oss-cn-hangzhou.aliyuncs.com/aigc/json/couple/百里东君.png", "upload": "image" }, "class_type": "LoadImage", "_meta": { "title": "Load Image", "edit": [] } }, "12": { "inputs": { "image": "https://serverless-tool-images.oss-cn-hangzhou.aliyuncs.com/aigc/json/couple/background.png", "upload": "image" }, "class_type": "LoadImage", "_meta": { "title": "Load Image" } }, "13": { "inputs": { "image": "https://serverless-tool-images.oss-cn-hangzhou.aliyuncs.com/aigc/json/couple/mask.png", "upload": "image" }, "class_type": "LoadImage", "_meta": { "title": "Load Image" } }, "15": { "inputs": { "threshold_r": 0.15, "threshold_g": 0.15, "threshold_b": 0.15, "remove_isolated_pixels": 0, "fill_holes": false, "image": [ "13", 0 ] }, "class_type": "MaskFromRGBCMYBW+", "_meta": { "title": "
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |