搭建类似妙鸭相机的应用

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

背景信息

妙鸭相机是一款基于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页面,例如支持设置生成照片的像素等。

前提条件

您使用的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。

操作步骤

创建数据缓存

控制台

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

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

  2. 登录弹性容器实例控制台

  3. 在顶部菜单栏左上角处选择地域。

  4. 在左侧导航栏,单击数据缓存

  5. 创建人物AIGC基础模型的数据缓存。

    1. 单击创建数据缓存

    2. 完成数据缓存参数配置。

      本文使用的参数示例如下,其中缓存数据源为拉取人物AIGC基础模型的固定配置,其他参数可自定义配置,更多信息,请参见创建数据缓存

      配置项

      示例值

      缓存所属Bucket

      test

      缓存所属目录

      /model/cv

      缓存名

      cv

      缓存大小

      20 GiB

      缓存数据源

      • 类型:URL

      • 参数

        • repoSource:ModelScope/Mode

        • repoId:ly261666/cv_portrait_model

        • revision:v4.0

    3. 单击确定

  6. 查看数据缓存状态。

    数据缓存页面刷新查看数据缓存状态,当状态为Available时,表示可以使用该数据缓存。

OpenAPI

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

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

  2. 创建人物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
    }
  3. 查询数据缓存状态。

    根据返回的数据缓存ID调用DescribeDataCaches接口查询数据缓存信息,当数据缓存的状态(DataCaches.Status)为Available时,表示可以使用该数据缓存。

搭建“妙鸭相机”

控制台

  1. 弹性容器实例控制台容器组页面,单击创建弹性容器组

  2. 填写实例相关配置信息,然后单击配置确认

    本文使用的参数示例如下,实例使用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

  3. 确认实例配置信息,阅读并选中服务协议,单击确认订单

  4. 返回容器组页面,确认应用部署状态并查看实例的EIP地址。

    容器组页面可以查看实例状态,单击实例ID进入实例详情页可以查看容器状态。当实例状态和容器状态均为运行中时,表示应用部署成功。您可以在IP地址列获取实例的EIP地址。

    妙鸭相机-控制台-zh.png

OpenAPI

  1. 使用数据缓存创建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"
        }
      ]
    }
  2. 确认应用部署状态。

    根据返回的实例ID调用DescribeContainerGroupStatus查询实例和容器状态。当实例状态(Status)和容器状态(ContainerStatuses.State)为Running,表示实例已经创建成功,容器正在运行。

  3. 查询实例的EIP地址。

    根据返回的实例ID调用DescribeContainerGroups查询实例详情,在InternetIp中可以获取实例的EIP地址。

测试模型效果

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

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

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

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

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

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

      妙鸭相机-结果.png

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

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

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

      说明

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

      妙鸭相机-结果2.png