搭建类似妙鸭相机的应用

本文以使用ModelScope社区的人物AIGC基础模型(ID为ly261666/cv_portrait_model)搭建类似妙鸭相机的应用为例,演示如何使用DataCache。通过DataCache提前拉取模型数据,然后在创建应用实例时直接挂载模型数据,可以免去在实例中拉取模型数据的等待时间,加速应用部署。

背景信息

妙鸭相机是一款基于AIGC的应用,用户在小程序中上传一些个人照片,就能得到个人专属的数字分身,然后再挑选喜欢的风格模板,即可得到一组对应的个人写真。

阿里云达摩院近期推出了开源版“妙鸭相机”,即facechain。facechain的基本原理是典型的SD(Stable Diffusion)+LoRA,流程大致如下:

  1. 对已有的几张个人照片(原图)进行训练,得到个人专属的面部LoRA权重。

  2. 基于标准的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

  1. 访问ModelScope,获取模型ID。

    本示例使用人物AIGC基础模型(ID为ly261666/cv_portrait_model)的v4.0版本。在ModelScope找到目标模型后,在模型详情页面顶部可以复制模型ID。

  2. 编写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的交换机
  3. 查询DataCache状态。

    kubectl get edc

    当数据下载完成,DataCache的状态为Available时,表示可以使用DataCache。示例如下:

    cv-1.png

搭建“妙鸭相机”

  1. 编写应用的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/"    # 挂载模型数据
  2. 确认应用部署状态。

    kubectl get deployment cv
    kubectl get Pod

    示例如下,可以看到应用已经部署成功。

    cv-2.png

  3. 确认模型数据的挂载情况。

    kubectl exec -it <POD_NAME> -- bash
    ls /mnt/workspace/.cache/modelscope/ly261666/cv_portrait_model/

    示例如下,可以看到容器的/mnt/workspace/.cache/modelscope/ly261666/cv_portrait_model/目录下已挂载模型数据。

    cv-3.png

  4. 查看Pod绑定的EIP地址。

    kubectl describe pod <pod_name>

    在返回的Pod详情的Annotations中可以获取Pod绑定的EIP地址。

    cv-4.png

测试模型效果

  1. 在Pod所属安全组中添加入方向规则,开放8888端口。

  2. 打开浏览器,访问“妙鸭相机”应用的Web页面。

    本文示例的“妙鸭相机”应用已单独绑定了EIP,可以直接输入实例的EIP地址和容器开放的端口进行访问,例如60.205.XX.XX:8888

  3. 测试人物AIGC基础模型是否可以类似妙鸭相机的效果。

    1. 形象定制页签下,上传人脸照片。

    2. 按需给人脸增加标签,然后单击开始训练

      妙鸭相机-结果.png

    3. 等待训练完成后,单击形象体验页签。

    4. 按需选择风格模型、服装风格,配置图片数量和高度宽度等参数,然后单击开始生成

    5. 等待并查看生成结果。

      说明

      如果出现Error报错,可查看容器日志确认报错原因。如果是OOM,建议调小照片的宽度和高度,或者重新使用更大显存的GPU规格来部署应用。

      妙鸭相机-结果2.png