本文以使用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。
集群所属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.yamldatacache-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。示例如下:
:~$ kubectl get edc NAME AGE DATACACHEID STATUS PROGRESS BUCKET PATH cv 29s edc-2zeh8b932qut10 Available 100% test /model/cv/
搭建“妙鸭相机”
-
编写应用的YAML配置文件,然后使用该YAML文件部署“妙鸭相机”应用。
kubectl create -f cv.yamlcv.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 get deployment cv NAME READY UP-TO-DATE AVAILABLE AGE cv 1/1 1 1 48s ~$ kubectl get pod NAME READY STATUS RESTARTS AGE cv-864cb79c47-d269j 1/1 Running 0 55s -
确认模型数据的挂载情况。
kubectl exec -it <POD_NAME> -- bash ls /mnt/workspace/.cache/modelscope/ly261666/cv_portrait_model/示例如下,可以看到容器的
/mnt/workspace/.cache/modelscope/ly261666/cv_portrait_model/目录下已挂载模型数据。:~$ kubectl exec -it cv-864cb79c47-d269j -- bash root@cv-864cb79c47-d269j:/mnt/workspace/facechain# ls /mnt/workspace/.cache/modelscope/ly261666/cv_portrait_model/ film lost+found model-resnet_custom_v3.pt README.md realistic -
查看Pod绑定的EIP地址。
kubectl describe pod <pod_name>在返回的Pod详情的Annotations中可以获取Pod绑定的EIP地址。
kubectl describe pod cv-864cb79c47-d269j Name: cv-864cb79c47-d269j Namespace: default Priority: 0 Service Account: default Node: virtual-kubelet-cn-beijing-e/172.16.22.89 Start Time: Mon, 13 Nov 2023 05:56:12 +0000 Labels: alibabacloud.com/eci=true app=cv pod-template-hash=864cb79c47 Annotations: ProviderCreate: done k8s.aliyun.com/allocated-eipAddress: 60.205.xxx.xxx k8s.aliyun.com/allocated-eipInstanceId: eip-2ze4usq18h***
测试模型效果
-
在Pod所属安全组中添加入方向规则,开放8888端口。
-
打开浏览器,访问“妙鸭相机”应用的Web页面。
本文示例的“妙鸭相机”应用已单独绑定了EIP,可以直接输入实例的EIP地址和容器开放的端口进行访问,例如
60.205.XX.XX:8888。 -
测试人物AIGC基础模型是否可以类似妙鸭相机的效果。
-
在形象定制页签下,上传人脸照片。
-
按需给人脸增加标签,然后单击开始训练。
人脸标签(Face tag) 默认值为
default。请等待训练图片加载完成后再单击 开始训练,否则可能导致训练失败。训练约需 15 分钟,完成后切换至 形象体验(Inference) 页签生成风格照片。 -
等待训练完成后,单击形象体验页签。
-
按需选择风格模型、服装风格,配置图片数量和高度宽度等参数,然后单击开始生成。
-
等待并查看生成结果。
说明如果出现Error报错,可查看容器日志确认报错原因。如果是OOM,建议调小照片的宽度和高度,或者重新使用更大显存的GPU规格来部署应用。
在形象体验(Inference)页面,选择模型选择(Model list)为数字身份(Digital Identity),设置人脸标签(Face tag)和风格模型(Style model),选择服装风格(Cloth style)(可选工作服、盔甲风、T恤衫、汉服风、女士晚礼服),在高级选项(Expert)中设置生成图片数量(最多6张)、照片高度和照片宽度,然后单击开始生成(Start!)。生成完毕后,生成结果(Result)区域展示AI生成的写真照片。
-