背景
关于AIGC如何落地一直是业界热门的话题,最早也是最成功的应用场景便是微软的Bing、office365炫酷集成自家的GPT。然而,这些应用仅仅只是开始,随着AIGC的门槛逐渐降低,基于AIGC的创新应用会越来越多。最近各种大模型独立APP开始涌现,阿里的秒鸭相机便是其中之一,并一度成为刷屏各种社交网站的网红APP。这类独立应用的火爆,除了AIGC本身已经发展到了一个相当高的水平,以及颠覆传统行业的噱头,还有一个很重要的因素就是让大模型应用真正走近了普通大众,让每个人都可以感受到AIGC的创造力,体验从未有过的参与感。
Facechain
阿里达摩院近期推出了开源版“妙鸭相机”,也就是 facechain。facechain的基本原理是典型的SD + LoRA,其详细介绍可以参考:Using LoRA for Efficient Stable Diffusion Fine-Tuning。大致总结下就是,LoRA最开始是微软为大语言模型调优设计的,后来是Simo Ryu大佬让SD模型也能使用LoRA进行微调,而且获得了不错的效果,现在已经成为了一种标准用法。
要通过SD生成个人照片,首先需要利用有限的几张原图通过在线训练得到个人专属的面部LoRA权重,然后就可以基于标准的SD base模型生成各种风格且具有本人面孔的照片。facechain在这个基础上,还使用了多种人像、皮肤相关的模型进行人像优化,生成最终用户满意的照片。大致的流程如下图所示:
虽然目前开源的版本下载下来稍加配置就可部署使用,但是存在如下几个问题:
1、训练和推理的过程中会直接从模型hub下载模型,整个应用涉及10+模型,大小约25GB,导致整体耗时非常长;直接下载公网模型对带宽以及网络的稳定性要求很高,一旦无法下载就会失败;
2、不支持人脸记忆,只能基于当前最新的训练结果进行推理,即不能保留历史训练出来的lora权重。
3、hard code比较多,如果想换个模型或者更新版本等,需要手动改不少代码,维护复杂,配置不灵活。
针对以上的问题,我们初步做了个优化版本,见:eci-facechain,主要优化总结如下:
1、我们把模型放入ECI数据缓存(放入NAS/OSS 也可以),应用启动后不再从hub下载模型。
2、支持人脸记忆,训练流程支持给人脸打tag,推理流程支持选择历史上所有训练过的人脸进行生成。
3、新增env配置项,无需修改应用代码即可通过容器env动态自定义SD的模型、版本、目录、以及应用端口等。
4、丰富了webui,比如支持设置生成照片的像素等,对于高清照片生成非常重要。
5、我们基于改进版直接出了公共的容器镜像:registry.cn-hangzhou.aliyuncs.com/eci_open/facechain:1.0.2,相关修改正在往社区主线进行pr。
接下来我们就演示如何在ECI控制台轻松部署一台妙鸭相机。
准备模型缓存
本样例使用的模型是 ly261666/cv_portrait_model,用最新的v4.0版本。
1、找到模型id以及版本
{ "repoSource": "ModelScope/Model", "repoId": "ly261666/cv_portrait_model", "revision": "v4.0"}
2、创建模型缓存
进入ECI数据缓存 控制台
虽然常用的公共模型已经做了加速,但是可能需要访问模型仓库实时的meta信息,如果选择的vsw没有配置公网访问能力,建议单独配置缓存的公网带宽。如果命中仓库信息的缓存,最终也不会产生额外费用:
待缓存状态变成Available之后,这个缓存就永久地存在了。要记住这个自定义bucket名字以及模型存放目录,后面部署应用会用到。比如本样例:
bucket名:modelScope-model
cache存放目录:/models/modelScope-model/ly261666/cv_portrait_model/v4.0
更多关于ECI数据缓存的介绍可以参考:
openAPI:https://help.aliyun.com/document_detail/2391452.html
k8s API:https://help.aliyun.com/document_detail/2412299.html
部署ECI容器
进入ECI 创建页面
1、选择GPU规格
容器组配置 -> 指定规格 -> GPU
选择最低GPU配置即可,不需要很高的配置,本样例使用的是 ecs.gn7i-c8g1.2xlarge
注:推荐使用抢占型实例,选择更便宜的GPU卡
2、选择facechain容器镜像
容器配置->选择容器镜像->常用镜像
翻到最后一页,找到facechain以及版本:
如果是非杭州地区,无法通过常用镜像界面直接勾选,手动填入即可,效果是一样的。
镜像:registry.cn-hangzhou.aliyuncs.com/eci_open/facechain
版本:1.0.2
3、模型挂载
数据缓存->缓存Bucket->添加
将前面创建好的模型缓存bucket以及目录挂载进facechain容器的 /mnt/workspace/.cache/modelscope/ly261666/cv_portrait_model/
4、公网配置
如果需要通过公网webui访问妙鸭相机,需要分配公网ip,不需要很高的带宽,默认5M就足够。
其他参数全部默认值即可。至此,妙鸭相机就已经部署完成,可以使用了。
5、访问应用
访问方式主要有两种
1、公网ip:端口
查看eci分配的公网ip地址,然后浏览器输入ip:8888即可访问:
2、直接调接口
参考facechain的 官方文档
测试
形象定制
上传1~10张自己的照片,同一个人,当然越多越好,训练越精准。
给人脸打tag,默认可以不打。
上传完成,点击开始训练,大约2~3分钟左右可以训练完成。
形象体验
训练完成后进入形象体验。
如果前面训练给人脸打了tag,需要点击下刷新人脸按钮同步最新的人脸记录。
已经内置了部分咒语,可以直接使用也可以自定义。
想要生成高清照片,设置长宽像素即可,注意像素要是8的整倍数,过大可能会导致显存OOM,量力而行。
点击开始生成就可以开始生成照片了。
原图:
生成:
总结
关于排队:与传统的终端照片处理APP不同,AIGC的在线训练和推理都是要在服务端计算节点的GPU卡上进行,无法在用户本地完成,单个需求的处理耗时都是按分钟计算的,因此妙鸭上线后经常高峰要排队几个小时才能出图。借助阿里云足够大的算力池子,目前可以很好地缓解这个问题。
关于费用:妙鸭相机的一组写真的价格是9块9,外面影楼一组写真价格至少200块起步+各种套路,而ECI的费用是(训练+推理+所有用户操作合计耗时按5分钟计算):计算费用0.795+临时存储费用0.00219=0.797,即使跑满1小时无限出图费用也只需9块5,而这还没有考虑使用抢占型实例的折扣,比如如果选择抢占型的T4的卡,可以低至10%。
随着AIGC的界面不断上移,底层大模型的差异对于终端用户感知越来越不明显,可以预见未来独立大模型应用重点优化的方向依然是成本和用户体验,其实就是用户能感知的排队时间以及价格。谁能用更短的排队时间、更低的价格满足用户的需求,谁就能占据这个应用市场。然而这两者实际很难兼得,低的排队时间的背后必然是更多的算力成本投入,云的弹性会在这中间起到非常关键的作用。
QA
1、模型缓存制作失败
1、是否打开了公网,获取仓库meta数据的时候可能没有缓存,需要通过公网获取。
2、options参数拷贝是否错误。
2、公网无法访问应用
1、创建ECI实例时没有配置公网(自动、手动eip)
2、安全组是否打开8888端口,参考:
如果想使用其他端口,前面部署的时候通过设置容器环境变量APP_PORT来指定端口即可。
3、应用是否正常启动,是不是配置错了启动命令(默认无需任何设置),查看容器日志看启动输出。
3、训练、推理Error
1、控制台查看容器日志,一般运行错误会有详细地标准错误输出。
2、如果是OOM,建议照片改小的像素,或者重新用更大的GPU显存规格部署应用。
3、照片长宽像素不是8的整倍数。
4、各版本之间的差异
1.0.0 |
最基础的版本 |
1.0.1 |
支持更自由的图片生成咒语、支持设置图片像素等 |
1.0.2 |
支持人脸记忆,也是功能相对齐全、操作流程清晰的版本,推荐的版本 |
1.0.3 |
引入controlNet,支持自定义照片pose等,配置更多,而且部分模型还没正式开源 |
由于facechain才刚开源不久,迭代比较快,但是我们制作的镜像版本间差异很小,模型也是独立出来的,部署上没有任何区别。
附录
数据缓存系列分享(二):23秒完成从零开始搭建StableDiffusion