本文以部署ModelScope社区的人物AIGC基础模型(ly261666/cv_portrait_model)搭建类似妙鸭相机的应用为例,演示如何使用数据缓存。通过数据缓存提前拉取模型数据,然后在创建应用实例时直接挂载模型数据,可以免去在实例中拉取模型数据的等待时间,加速应用部署。
背景信息
妙鸭相机是一款基于AIGC的应用,用户在小程序中上传一些个人照片,就能得到个人专属的数字分身,然后再挑选喜欢的风格模板,即可得到一组对应的个人写真。
阿里云达摩院近期推出了开源版“妙鸭相机”,即facechain。facechain的基本原理是典型的SD(Stable Diffusion)+LoRA,流程大致如下:
对已有的几张个人照片(原图)进行训练,得到个人专属的面部LoRA权重。
基于标准的SD基础模型生成各种风格的个人照片(结果图)。
说明facechain会在此基础上,使用多种人像、皮肤相关的模型进行人像优化,从而生成更优效果的照片。
虽然目前开源版本的facechain下载后即可配置使用,但存在以下问题:
训练和推理的过程中会直接从模型Hub下载模型,整个应用涉及多个模型,大小约25 GB,导致整体耗时长,并且直接通过公网下载模型对带宽和网络稳定性要求很高,一旦无法下载就会失败。
不支持人脸记忆,只能基于当前最新的训练结果进行推理,即不能保留历史训练出来的LoRA权重。
如果想换个模型或者更新版本等,需要手动修改代码,维护复杂,配置不灵活。
针对上述问题,ECI推出了优化版本,即eci-facechain。主要优化点如下:
将模型数据放入ECI数据缓存中,应用启动后无需从模型Hub下载模型。
支持人脸记忆,训练流程支持给人脸打标签,推理时支持通过标签选择历史训练过的人脸进行生成。
新增环境变量配置项(详见
env.py
文件),无需修改应用代码即可通过容器的环境变量自定义SD的模型、版本、目录、以及应用端口等。优化Web页面,例如支持设置生成照片的像素等。
前提条件
您使用的VPC已绑定公网NAT网关,并配置SNAT条目允许该VPC或下属交换机的资源可以访问公网。
如果VPC没有绑定公网NAT网关,您需要在创建数据缓存和部署应用时绑定EIP,以便可以拉取公网数据。
准备运行环境
硬件要求
需使用GPU规格。vCPU、内存等无具体要求,建议选择显存高的规格。ECI支持的GPU规格,请参见规格说明。
软件环境
ECI已基于eci-facechain制作了一个公共容器镜像,您可以直接使用该镜像或者将其作为基础镜像进行二次开发。镜像地址为registry.cn-hangzhou.aliyuncs.com/eci_open/facechain:1.0.2。
操作步骤
创建数据缓存
控制台
访问ModelScope,获取模型ID。
本示例使用人物AIGC基础模型(ID为ly261666/cv_portrait_model)的v4.0版本。在ModelScope找到目标模型后,在模型详情页面顶部可以复制模型ID。
登录弹性容器实例控制台。
在顶部菜单栏左上角处选择地域。
在左侧导航栏,单击数据缓存。
创建人物AIGC基础模型的数据缓存。
单击创建数据缓存。
完成数据缓存参数配置。
本文使用的参数示例如下,其中缓存数据源为拉取人物AIGC基础模型的固定配置,其他参数可自定义配置,更多信息,请参见创建数据缓存。
配置项
示例值
缓存所属Bucket
test
缓存所属目录
/model/cv
缓存名
cv
缓存大小
20 GiB
缓存数据源
类型:URL
参数
repoSource:ModelScope/Mode
repoId:ly261666/cv_portrait_model
revision:v4.0
单击确定。
查看数据缓存状态。
在数据缓存页面刷新查看数据缓存状态,当状态为Available时,表示可以使用该数据缓存。
OpenAPI
访问ModelScope,获取模型ID。
本示例使用人物AIGC基础模型(ID为ly261666/cv_portrait_model)的v4.0版本。在ModelScope找到目标模型后,在模型详情页面顶部可以复制模型ID。
创建人物AIGC基础模型的数据缓存。
调用CreateDataCache接口创建数据缓存所采用的参数示例如下,表示从ModelScope拉取指定模型数据,保存到名为test的Bucket的
/model/cv/
目录。数据缓存名为cv,保留时长为1天。重要如果您通过SDK创建数据缓存,DataSource.Options中的各个参数前无需添加参数名的长度,例如
#10#repoSource
直接写成repoSource
,#6#repoId
直接写成repoId
即可。{ "RegionId": "cn-beijing", "VSwitchId": "vsw-2ze23nqzig8inpr******", "SecurityGroupId": "sg-2ze1003ujo0fuv******", "Bucket": "test", "Path": "/model/cv/", "Name": "cv", "DataSource": { "Type": "URL", "Options": { "#6#repoId": "ly261666/cv_portrait_model", "#10#repoSource": "ModelScope/Model", "#8#revision": "v4.0" } }, "RetentionDays": 1 }
查询数据缓存状态。
根据返回的数据缓存ID调用DescribeDataCaches接口查询数据缓存信息,当数据缓存的状态(DataCaches.Status)为Available时,表示可以使用该数据缓存。
搭建“妙鸭相机”
控制台
在弹性容器实例控制台的容器组页面,单击创建弹性容器组。
填写实例相关配置信息,然后单击配置确认。
本文使用的参数示例如下,实例使用GPU规格,并挂载了人物AIGC基础模型的数据缓存。实例内容器使用ECI提供的制作好的facechain镜像,容器启动后会运行一个Web服务,可通过8888端口访问。
说明当VPC已绑定公网NAT网关时,创建ECI实例时可以不绑定EIP。在实例创建完成后,您可以配置DNAT条目实现外部访问ECI实例。
容器默认对外开放8888端口,如果想要修改端口,可通过设置容器环境变量APP_PORT来指定端口。
配置区域
配置项
示例值
容器组配置
指定规格
ecs.gn6i-c4g1.xlarge
名称
cv
容器配置
容器名称
cv
镜像
镜像:registry.cn-hangzhou.aliyuncs.com/eci_open/facechain
版本:1.0.2
数据缓存
缓存Bucket
test
单击添加,挂载人物AIGC基础模型的数据缓存
缓存目录:/model/cv/
目标容器:cv
容器挂载目录:/mnt/workspace/.cache/modelscope/ly261666/cv_portrait_model/
弹性公网IP
弹性公网IP
自动创建
带宽峰值:5 Mbps
确认实例配置信息,阅读并选中服务协议,单击确认订单。
返回容器组页面,确认应用部署状态并查看实例的EIP地址。
在容器组页面可以查看实例状态,单击实例ID进入实例详情页可以查看容器状态。当实例状态和容器状态均为运行中时,表示应用部署成功。您可以在IP地址列获取实例的EIP地址。
OpenAPI
使用数据缓存创建ECI实例,部署“妙鸭相机”应用。
调用CreateContainerGroup接口创建ECI实例所采用的参数示例如下,该实例使用GPU规格,并挂载了人物AIGC基础模型。
说明以下示例中,系统会自动创建并为ECI实例绑定一个EIP。当VPC已绑定公网NAT网关时,创建ECI实例时可以不绑定EIP。在实例创建完成后,您可以配置DNAT条目实现外部访问ECI实例。
容器默认对外开放8888端口,如果想要修改端口,可通过设置容器环境变量APP_PORT来指定端口。
{ "RegionId": "cn-beijing", "SecurityGroupId": "sg-2ze1003ujo0fuv******", "VSwitchId": "vsw-2ze23nqzig8inpr******", "ContainerGroupName": "cv", "InstanceType": "ecs.gn6i-c4g1.xlarge", "DataCacheBucket": "test", "AutoCreateEip": true, "Container": [ { "Image": "registry.cn-hangzhou.aliyuncs.com/eci_open/facechain:1.0.2", "Name": "cv", "VolumeMount": [ { "MountPath": "/mnt/workspace/.cache/modelscope/ly261666/cv_portrait_model/", "Name": "model-cv" } ] } ], "Volume": [ { "Type": "HostPathVolume", "HostPathVolume.Path": "/model/cv/", "Name": "model-cv" } ] }
确认应用部署状态。
根据返回的实例ID调用DescribeContainerGroupStatus查询实例和容器状态。当实例状态(Status)和容器状态(ContainerStatuses.State)为Running,表示实例已经创建成功,容器正在运行。
查询实例的EIP地址。
根据返回的实例ID调用DescribeContainerGroups查询实例详情,在InternetIp中可以获取实例的EIP地址。
测试模型效果
在ECI实例所属安全组中添加入方向规则,开放8888端口。
打开浏览器,访问“妙鸭相机”应用的Web页面。
本文示例的“妙鸭相机”应用已单独绑定了EIP,可以直接输入实例的EIP地址和容器开放的端口进行访问,例如
47.94.XX.XX:8888
。测试人物AIGC基础模型是否可以类似妙鸭相机的效果。
在形象定制页签下,上传人脸照片。
按需给人脸增加标签,然后单击开始训练。
等待训练完成后,单击形象体验页签。
按需选择风格模型、服装风格,配置图片数量和高度宽度等参数,然后单击开始生成。
等待并查看生成结果。
说明如果出现Error报错,可查看容器日志确认报错原因。如果是OOM,建议调小照片的宽度和高度,或者重新使用更大显存的GPU规格来部署应用。