通过Stable Diffusion扩展插件实现文字光影图

本文以部署Stable Diffusion和ControlNet扩展插件实现文字光影效果图为例,演示如何使用数据缓存。通过数据缓存提前拉取Stable Diffusion和ControlNet模型数据,然后在创建Stable Diffusion应用实例时直接挂载模型数据,可以免去在实例中拉取模型数据的等待时间,加速应用部署。

背景信息

Stable Diffusion是一个可以根据文字描述生成和修改图像的模型,支持扩展插件来丰富绘图效果。ControlNet是一个用于控制AI图像生成的插件。在Stable Diffusion上安装ControlNet扩展插件后,可以使用ControlNet来控制生成的图像效果,使得AI生成更贴近需求的图像。

重要
  • 阿里云不对第三方模型的合法性、安全性、准确性进行任何保证,阿里云不对由此引发的任何损害承担责任。

  • 您应自觉遵守第三方模型的用户协议、使用规范和相关法律法规,并就使用第三方模型的合法性、合规性自行承担相关责任。

操作步骤

创建数据缓存

控制台

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

    本文使用以下模型作为示例,在HuggingFace找到目标模型后,在模型详情页面顶部可以复制模型ID。

    • Stable Diffusion模型:hanafuusen2001/BeautyProMix

    • ControlNet模型:ioclab/ioc-controlnet

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

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

    重要

    如果您的业务部署在中国内地地域,可能会因为网络原因导致无法缓存HuggingFace的模型数据,建议您在中国香港地域创建数据缓存,然后拷贝数据缓存到您需要的地域。

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

  5. 创建数据缓存。

    单击创建数据缓存,分别创建hanafuusen2001/BeautyProMix和ioclab/ioc-controlnet的数据缓存。本文使用的参数示例如下,其中缓存数据源为拉取两个模型数据的固定配置,其他参数可自定义配置,更多信息,请参见创建数据缓存

    配置项

    hanafuusen2001/BeautyProMix

    ioclab/ioc-controlnet

    缓存所属Bucket

    test

    test

    缓存所属目录

    /model/beautypromix/

    /model/ioc/

    缓存名

    beautypromix

    ioc

    缓存大小

    20 GiB

    20 GiB

    缓存数据源

    • 类型:URL

    • 参数

      • repoSource:HuggingFace/Model

      • repoId:hanafuusen2001/BeautyProMix

    • 类型:URL

    • 参数

      • repoSource:HuggingFace/Model

      • repoId:ioclab/ioc-controlnet

    弹性公网IP

    • 自动创建

    • 带宽峰值:5 Mbps

    • 自动创建

    • 带宽峰值:5 Mbps

  6. 查看数据缓存状态。

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

  7. 拷贝数据缓存。

    如果当前数据缓存所在地域和您要部署应用的地域不一致,您可以在数据缓存页面单击目标数据缓存的复制,将数据缓存拷贝到需要的地域。

OpenAPI

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

    本文使用以下模型作为示例,在HuggingFace找到目标模型后,在模型详情页面顶部可以复制模型ID。

    • Stable Diffusion模型:hanafuusen2001/BeautyProMix

    • ControlNet模型:ioclab/ioc-controlnet

  2. 调用CreateDataCache接口创建数据缓存。

    重要
    • 如果您的业务部署在中国内地地域,可能会因为网络原因导致无法缓存HuggingFace的模型数据,建议您在中国香港地域创建数据缓存,然后拷贝数据缓存到您需要的地域。

    • 如果您通过SDK创建数据缓存,DataSource.Options中的各个参数前无需添加参数名的长度,例如#10#repoSource直接写成repoSource#6#repoId直接写成repoId即可。

    1. 创建hanafuusen2001/BeautyProMix的数据缓存。

      参数示例如下,表示从HuggingFace拉取指定模型数据,保存到名为test的Bucket的/model/beautypromix/目录。数据缓存名为beautypromix,保留时长为1天。拉取模型数据的过程中,会自动创建并绑定EIP。数据缓存创建完成后,EIP会被自动释放。

      {
        "RegionId": "cn-hongkong",
        "Path": "/model/beautypromix/",
        "Name": "beautypromix",
        "DataSource": {
          "Type": "URL",
          "Options": {
            "#10#repoSource": "HuggingFace/Model",
            "#6#repoId": "hanafuusen2001/BeautyProMix"
          }
        },
        "RetentionDays": 1,
        "EipCreateParam": {
          "Bandwidth": 5
        },
        "Bucket": "test"
      }
    2. 创建ioclab/ioc-controlnet的数据缓存。

      参数示例如下,表示从HuggingFace拉取指定模型数据,保存到名为test的Bucket的/model/ioc/目录。数据缓存名为ioc,保留时长为1天。拉取模型数据的过程中,会自动创建并绑定EIP。数据缓存创建完成后,EIP会被自动释放。

      {
        "RegionId": "cn-hongkong",
        "Path": "/model/ioc/",
        "Name": "ioc",
        "DataSource": {
          "Type": "URL",
          "Options": {
            "#10#repoSource": "HuggingFace/Model",
            "#6#repoId": "ioclab/ioc-controlnet"
          }
        },
        "RetentionDays": 1,
        "EipCreateParam": {
          "Bandwidth": 5
        },
        "Bucket": "test"
      }
  3. 查询数据缓存状态。

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

  4. 拷贝数据缓存。

    如果当前数据缓存所在地域和您要部署应用的地域不一致,您可以调用CopyDataCache接口将数据缓存拷贝到需要的地域。

部署Stable Diffusion应用和插件

控制台

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

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

    本文使用的参数示例如下,实例使用GPU规格,并挂载了hanafuusen2001/BeautyProMix和ioclab/ioc-controlnet的数据缓存。实例内容器使用ECI提供的包含Stable Diffusion应用的镜像,容器启动后会运行python3 launch.py --listen --skip-torch-cuda-test --port 8888 --no-half启动WebUI。

    重要

    当VPC已绑定公网NAT网关时,创建ECI实例时可以不绑定EIP。在实例创建完成后,您可以配置DNAT条目实现外部访问ECI实例。

    配置区域

    配置项

    示例值

    容器组配置

    指定规格

    ecs.gn6i-c16g1.4xlarge

    名称

    sd-webui

    容器配置

    容器名称

    sd

    镜像

    • 镜像:registry.cn-hangzhou.aliyuncs.com/eci_open/stable-diffusion

    • 版本:1.0.1

    可执行命令

    /bin/sh

    参数

    • -c

    • python3 launch.py --listen --skip-torch-cuda-test --port 8888 --no-half

    数据缓存

    缓存Bucket

    test

    单击添加,挂载hanafuusen2001/BeautyProMix的数据缓存

    • 缓存目录:/model/beautypromix/

    • 目标容器:sd

    • 容器挂载目录:/stable-diffusion-webui/models/Stable-diffusion/

    单击添加,挂载ioclab/ioc-controlnet的数据缓存

    • 缓存目录:/model/ioc/

    • 目标容器:sd

    • 容器挂载目录:/stable-diffusion-webui/extensions/sd-webui-controlnet/models/

    开启Burst

    开启

    弹性公网IP

    弹性公网IP

    • 自动创建

    • 带宽峰值:5 Mbps

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

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

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

    sd-1.png

OpenAPI

  1. 使用数据缓存创建ECI实例,部署Stable Diffusion应用和插件。

    调用CreateContainerGroup接口创建ECI实例所采用的参数示例如下,实例使用GPU规格,并挂载了hanafuusen2001/BeautyProMix和ioclab/ioc-controlnet的数据缓存。实例内容器使用ECI提供的包含Stable Diffusion应用的镜像,容器启动后会运行python3 launch.py --listen --skip-torch-cuda-test --port 8888 --no-half启动WebUI。

    说明

    以下示例中,系统会自动创建并为ECI实例绑定一个EIP。当VPC已绑定公网NAT网关时,创建ECI实例时可以不绑定EIP。在实例创建完成后,您可以配置DNAT条目实现外部访问ECI实例。

    {
      "RegionId": "cn-beijing",
      "SecurityGroupId": "sg-2ze7l1o0ql1cbk******",
      "VSwitchId": "vsw-2ze23nqzig8inpr******",
      "ContainerGroupName": "sd-web",
      "InstanceType": "ecs.gn6i-c16g1.4xlarge",
      "DataCacheBucket": "test",
      "Container": [
        {
          "Arg": [
            "-c",
            "python3 launch.py --listen --skip-torch-cuda-test --port 8888 --no-half"
          ],
          "Command": [
            "/bin/sh"
          ],
          "Gpu": 1,
          "Name": "sd",
          "Image": "registry.cn-hangzhou.aliyuncs.com/eci_open/stable-diffusion:1.0.1",
          "VolumeMount": [
            {
              "Name": "model1",
              "MountPath": "/stable-diffusion-webui/models/Stable-diffusion/"
            },
            {
              "MountPath": "/stable-diffusion-webui/extensions/sd-webui-controlnet/models/",
              "Name": "model2"
            }
          ]
        }
      ],
      "Volume": [
        {
          "Type": "HostPathVolume",
          "HostPathVolume.Path": "/model/beautypromix/",
          "Name": "model1"
        },
        {
          "Type": "HostPathVolume",
          "HostPathVolume.Path": "/model/ioc/",
          "Name": "model2"
        }
      ],
      "DataCacheProvisionedIops": 35000,
      "DataCacheBurstingEnabled": true,
      "AutoCreateEip": true
    }
  2. 确认应用部署状态。

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

  3. 查询实例的EIP地址。

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

测试模型和插件效果

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

  2. 打开浏览器,访问Stable Diffusion应用的Web页面。

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

  3. 查看ControlNet扩展插件安装情况。

    Extensions页签下,可以看到插件已自动安装,可以直接使用。

    sd-2.png

  4. 测试插件效果。

    1. 单击img2img页签。

    2. 在页面上方按需输入关于结果图像的文本描述,并上传用于AI绘图的参考图片。

    3. 在页面下方展开ControlNet配置,上传用于控制图像效果的图片并按需配置参数。

      说明
      • 为实现文字光影效果,此处上传的是黑底白字图片。

      • 不同的图和不同的文字光影搭配效果差异很大,请根据实际出图结果对参数进行微调。

      需要注意的参数如下:

      • Model:选择brightness模型。

      • Control Weight:ControlNet影响的权重。

      • Starting Control Step:ControlNet介入开始时间,越早开始AI绘图的自由度越小,文字光影效果越明显。

      • Ending Control Step:ControlNet介入结束时间,越早结束图像和文字融合效果好,但可能文字光影效果不明显。

      sd-测试1.png

    4. 单击Generate生成结果图。

      示例如下:

      sd-测试结果.png