数据缓存系列分享(五):零代码搭建妙鸭相机

本文涉及的产品
无影云电脑企业版,4核8GB 120小时 1个月
资源编排,不限时长
无影云电脑个人版,1个月黄金款+200核时
简介: 本文会解读妙鸭相机的开源项目facechain的基本原理,并演示如何通过阿里云ECI在云上零代码快速搭建一台个人的“妙鸭相机”。

背景

关于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在这个基础上,还使用了多种人像、皮肤相关的模型进行人像优化,生成最终用户满意的照片。大致的流程如下图所示:

83e1b12c-2924-46f8-be5f-0f7bb35b5a04.jpeg

虽然目前开源的版本下载下来稍加配置就可部署使用,但是存在如下几个问题:

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以及版本

bab9be07-91d2-408b-856a-200887932c93.png

{
"repoSource": "ModelScope/Model",
"repoId": "ly261666/cv_portrait_model",
"revision": "v4.0"}

2、创建模型缓存

进入ECI数据缓存 控制台

9bdbd564-d55b-4276-a3ce-6b3ab340630f.png



虽然常用的公共模型已经做了加速,但是可能需要访问模型仓库实时的meta信息,如果选择的vsw没有配置公网访问能力,建议单独配置缓存的公网带宽。如果命中仓库信息的缓存,最终也不会产生额外费用:

43ec8470-3a10-4a98-8284-4004089064d5.png

待缓存状态变成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卡

1f4d738a-5346-4413-8109-11e16ee51c77 (1).png

2、选择facechain容器镜像

容器配置->选择容器镜像->常用镜像

翻到最后一页,找到facechain以及版本:

8c5f633b-18a0-41c8-b5bc-41aea272c7c2.png


如果是非杭州地区,无法通过常用镜像界面直接勾选,手动填入即可,效果是一样的。

镜像:registry.cn-hangzhou.aliyuncs.com/eci_open/facechain

版本:1.0.2

3、模型挂载

数据缓存->缓存Bucket->添加

将前面创建好的模型缓存bucket以及目录挂载进facechain容器的 /mnt/workspace/.cache/modelscope/ly261666/cv_portrait_model/

9253a450-fe6f-4601-a2e4-423c7430bb95.png

ec4c240c-1c21-4df1-9202-c4775c5418eb.png

4、公网配置

如果需要通过公网webui访问妙鸭相机,需要分配公网ip,不需要很高的带宽,默认5M就足够。

fd4c8052-2f35-4ec3-9a5c-059a235526af.png



其他参数全部默认值即可。至此,妙鸭相机就已经部署完成,可以使用了。

5、访问应用

访问方式主要有两种

1、公网ip:端口

541d745a-1b08-46a1-9ae9-8f45d486815d.png

查看eci分配的公网ip地址,然后浏览器输入ip:8888即可访问:

24cbc883-d579-46f9-a332-549875e91fb2.png

2、直接调接口

参考facechain的 官方文档



测试

形象定制

上传1~10张自己的照片,同一个人,当然越多越好,训练越精准。

给人脸打tag,默认可以不打。

上传完成,点击开始训练,大约2~3分钟左右可以训练完成。

形象体验

训练完成后进入形象体验

如果前面训练给人脸打了tag,需要点击下刷新人脸按钮同步最新的人脸记录。

已经内置了部分咒语,可以直接使用也可以自定义。

想要生成高清照片,设置长宽像素即可,注意像素要是8的整倍数,过大可能会导致显存OOM,量力而行。

点击开始生成就可以开始生成照片了。



原图:

4268eb44-13c6-408b-a992-a556fd29d874.png

生成:

截屏2023-08-29 下午1.06.43.png



总结

关于排队:与传统的终端照片处理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端口,参考:

e404496f-a05e-41ea-8d17-1920122e9dc0.png

如果想使用其他端口,前面部署的时候通过设置容器环境变量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

数据缓存系列分享(三):通过 StableDiffusion 扩展插件实现网红爆款文字光影图

数据缓存系列分享(四):开源大语言模型通义千问快速体验

数据缓存系列分享(五):零代码搭建妙鸭相机

数据缓存系列分享(六):通义千问Qwen-14B大模型快速体验

相关实践学习
基于ACK Serverless轻松部署企业级Stable Diffusion
本实验指导您在容器服务Serverless版(以下简称 ACK Serverless )中,通过Knative部署满足企业级弹性需求的Stable Diffusion服务。同时通过对该服务进行压测实验,体验ACK Serverless 弹性能力。
Kubernetes极速入门
Kubernetes(K8S)是Google在2014年发布的一个开源项目,用于自动化容器化应用程序的部署、扩展和管理。Kubernetes通常结合docker容器工作,并且整合多个运行着docker容器的主机集群。 本课程从Kubernetes的简介、功能、架构,集群的概念、工具及部署等各个方面进行了详细的讲解及展示,通过对本课程的学习,可以对Kubernetes有一个较为全面的认识,并初步掌握Kubernetes相关的安装部署及使用技巧。本课程由黑马程序员提供。   相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
1月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(一)
数据的存储--Redis缓存存储(一)
|
1月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(二)
数据的存储--Redis缓存存储(二)
数据的存储--Redis缓存存储(二)
|
9天前
|
存储 缓存 算法
分布式缓存有哪些常用的数据分片算法?
【10月更文挑战第25天】在实际应用中,需要根据具体的业务需求、数据特征以及系统的可扩展性要求等因素综合考虑,选择合适的数据分片算法,以实现分布式缓存的高效运行和数据的合理分布。
|
26天前
|
缓存 监控 前端开发
处理页面缓存中数据不一致的问题
【10月更文挑战第9天】
40 2
|
1月前
|
存储 缓存 分布式计算
大数据-89 Spark 集群 RDD 编程-高阶 编写代码、RDD依赖关系、RDD持久化/缓存
大数据-89 Spark 集群 RDD 编程-高阶 编写代码、RDD依赖关系、RDD持久化/缓存
41 4
|
1月前
|
消息中间件 缓存 NoSQL
大数据-49 Redis 缓存问题中 穿透、雪崩、击穿、数据不一致、HotKey、BigKey
大数据-49 Redis 缓存问题中 穿透、雪崩、击穿、数据不一致、HotKey、BigKey
50 2
|
3月前
|
缓存 NoSQL Linux
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
125 1
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
|
3月前
|
缓存 NoSQL 数据库
go-zero微服务实战系列(五、缓存代码怎么写)
go-zero微服务实战系列(五、缓存代码怎么写)
|
3月前
|
Java 开发者 JavaScript
Struts 2 开发者的秘籍:隐藏的表单标签库功能,能否成为你下个项目的大杀器?
【8月更文挑战第31天】Struts 2表单标签库是提升Web页面交互体验的神器。它提供丰富的标签,如`<s:textfield>`和`<s:select>`,简化表单元素创建与管理,支持数据验证和动态选项展示。结合示例代码,如创建文本输入框并与Action类属性绑定,显著提升开发效率和用户体验。通过自定义按钮样式等功能,Struts 2表单标签库让开发者更专注于业务逻辑实现。
46 0
|
3月前
|
缓存 NoSQL 数据库
【超实用秘籍】FastAPI高手教你如何通过最佳实践构建高效Web应用:从代码组织到异步编程与缓存优化的全方位指南!
【8月更文挑战第31天】FastAPI凭借出色性能和易用性成为现代Web应用的首选框架。本文通过示例代码介绍构建高效FastAPI应用的最佳实践,包括开发环境搭建、代码模块化组织、异步编程及性能优化等。通过模块化设计和异步数据库操作,结合缓存技术,大幅提升应用性能与可维护性,助您轻松应对高并发场景。
179 0
下一篇
无影云桌面