本文以使用ModelScope社区的人物AIGC基础模型(ID为ly261666/cv_portrait_model)搭建类似妙鸭相机的应用为例,演示如何使用DataCache。通过DataCache提前拉取模型数据,然后在创建应用实例时直接挂载模型数据,可以免去在实例中拉取模型数据的等待时间,加速应用部署。
背景信息
妙鸭相机是一款基于AIGC的应用,用户在小程序中上传一些个人照片,就能得到个人专属的数字分身,然后再挑选喜欢的风格模板,即可得到一组对应的个人写真。
阿里云达摩院近期推出了开源版“妙鸭相机”,即facechain。facechain的基本原理是典型的SD(Stable Diffusion)+LoRA,流程大致如下:
对已有的几张个人照片(原图)进行训练,得到个人专属的面部LoRA权重。
基于标准的SD基础模型生成各种风格的个人照片(结果图)。
说明facechain会在此基础上,使用多种人像、皮肤相关的模型进行人像优化,从而生成更优效果的照片。
虽然目前开源版本的facechain下载后即可配置使用,但存在以下问题:
训练和推理的过程中会直接从模型Hub下载模型,整个应用涉及多个模型,大小约25 GB,导致整体耗时长,并且直接通过公网下载模型对带宽和网络稳定性要求很高,一旦无法下载就会失败。
不支持人脸记忆,只能基于当前最新的训练结果进行推理,即不能保留历史训练出来的LoRA权重。
如果想换个模型或者更新版本等,需要手动修改代码,维护复杂,配置不灵活。
针对上述问题,ECI推出了优化版本,即eci-facechain。主要优化点如下:
将模型数据放入ECI数据缓存中,应用启动后无需从模型Hub下载模型。
支持人脸记忆,训练流程支持给人脸打标签,推理时支持通过标签选择历史训练过的人脸进行生成。
新增环境变量配置项(详见
env.py
文件),无需修改应用代码即可通过容器的环境变量自定义SD的模型、版本、目录、以及应用端口等。优化Web页面,例如支持设置生成照片的像素等。
前提条件
集群中已部署DataCache CRD。具体操作,请参见部署DataCache CRD。
集群所属VPC已绑定公网NAT网关,并配置SNAT条目允许该VPC或下属交换机的资源可以访问公网。
说明如果VPC没有绑定公网NAT网关,您需要在创建DataCache和部署应用时绑定EIP,以便可以拉取公网数据。
准备运行环境
硬件要求
需使用GPU规格。vCPU、内存等无具体要求,建议选择显存高的规格。ECI支持的GPU规格,请参见规格说明。
软件环境
ECI已基于eci-facechain制作了一个公共容器镜像,您可以直接使用该镜像或者将其作为基础镜像进行二次开发。镜像地址为registry.cn-hangzhou.aliyuncs.com/eci_open/facechain:1.0.2。
操作步骤
创建DataCache
访问ModelScope,获取模型ID。
本示例使用人物AIGC基础模型(ID为ly261666/cv_portrait_model)的v4.0版本。在ModelScope找到目标模型后,在模型详情页面顶部可以复制模型ID。
编写DataCache的YAML配置文件,然后使用该YAML文件创建DataCache拉取人物AIGC基础模型。
kubectl create -f datacache-test.yaml
datacache-test.yaml的内容示例如下:
apiVersion: eci.aliyun.com/v1alpha1 kind: DataCache metadata: name: cv spec: bucket: test path: /model/cv/ dataSource: type: URL options: repoSource: ModelScope/Model # 指定数据源为ModelScope的模型 repoId: ly261666/cv_portrait_model # 指定模型ID revision: v4.0 # 指定模型版本 retentionDays: 1 netConfig: securityGroupId: sg-2ze63v3jtm8e6s****** vSwitchId: vsw-2ze94pjtfuj9vay****** # 指定已配置SNAT的交换机
查询DataCache状态。
kubectl get edc
当数据下载完成,DataCache的状态为Available时,表示可以使用DataCache。示例如下:
搭建“妙鸭相机”
编写应用的YAML配置文件,然后使用该YAML文件部署“妙鸭相机”应用。
kubectl create -f cv.yaml
cv.yaml的内容示例如下,可以创建一个包含1个Pod副本的Deployment,Pod使用GPU规格,并挂载了人物AIGC基础模型。Pod内容器使用ECI提供的镜像,容器启动后会运行一个Web服务,可通过8888端口访问。
说明以下YAML示例中,系统会自动创建并为Pod绑定一个EIP。如果您的集群所属VPC已绑定公网NAT网关,可去掉该Annotation,在Pod创建成功后,您可以配置DNAT条目实现外部访问Pod。实际业务场景中,建议创建Service来统一提供Pod访问入口。
容器默认对外开放8888端口,如果想要修改端口,可通过设置容器环境变量
APP_PORT
来指定端口。
apiVersion: apps/v1 kind: Deployment metadata: name: cv labels: app: cv spec: replicas: 1 selector: matchLabels: app: cv template: metadata: name: cv labels: app: cv alibabacloud.com/eci: "true" annotations: k8s.aliyun.com/eci-use-specs: "ecs.gn7i-c8g1.2xlarge" # 指定GPU规格 k8s.aliyun.com/eci-data-cache-bucket: "test" # 指定DataCache Bucket k8s.aliyun.com/eci-with-eip: "true" # 自动创建并绑定EIP,以便外部可以访问 spec: containers: - name: cv image: registry.cn-hangzhou.aliyuncs.com/eci_open/facechain:1.0.2 # 使用ECI制作好的镜像 resources: limits: nvidia.com/gpu: "1" # 设置容器所需的GPU数 volumeMounts: - name: "model-cv" mountPath: "/mnt/workspace/.cache/modelscope/ly261666/cv_portrait_model/" # 模型数据在容器内的挂载路径 volumes: - name: "model-cv" hostPath: path: "/model/cv/" # 挂载模型数据
确认应用部署状态。
kubectl get deployment cv kubectl get Pod
示例如下,可以看到应用已经部署成功。
确认模型数据的挂载情况。
kubectl exec -it <POD_NAME> -- bash ls /mnt/workspace/.cache/modelscope/ly261666/cv_portrait_model/
示例如下,可以看到容器的
/mnt/workspace/.cache/modelscope/ly261666/cv_portrait_model/
目录下已挂载模型数据。查看Pod绑定的EIP地址。
kubectl describe pod <pod_name>
在返回的Pod详情的Annotations中可以获取Pod绑定的EIP地址。
测试模型效果
在Pod所属安全组中添加入方向规则,开放8888端口。
打开浏览器,访问“妙鸭相机”应用的Web页面。
本文示例的“妙鸭相机”应用已单独绑定了EIP,可以直接输入实例的EIP地址和容器开放的端口进行访问,例如
60.205.XX.XX:8888
。测试人物AIGC基础模型是否可以类似妙鸭相机的效果。
在形象定制页签下,上传人脸照片。
按需给人脸增加标签,然后单击开始训练。
等待训练完成后,单击形象体验页签。
按需选择风格模型、服装风格,配置图片数量和高度宽度等参数,然后单击开始生成。
等待并查看生成结果。
说明如果出现Error报错,可查看容器日志确认报错原因。如果是OOM,建议调小照片的宽度和高度,或者重新使用更大显存的GPU规格来部署应用。