文档

Diffusion中文文图生成解决方案

更新时间:

Diffusion文图生成解决方案基于阿里云PAI产品,帮助您快速搭建囊括模型离线训练和在线部署的端到端全链路构建流程,实现从文本生成图像的功能。本文为您介绍Diffusion中文文图生成解决方案的使用流程和操作步骤。

背景信息

阿里云PAI在文图生成创作领域,提供了端到端、多样化的纯白盒解决方案,目前已支持中文文图生成功能。您可以根据自己的业务场景自定义构建智能文图生成模型,或使用PAI提供的默认模型,进行模型调优和线上部署,针对不同的文本输入生成不同风格的图像。具体解决方案如下。

  1. 基于PAI提供的Diffusion模型和算法,根据您自己的文图生成场景,在DSW平台进行模型微调,从而构建具体场景的Diffusion文图生成模型。

  2. 您可以将微调生成的模型或PAI默认的Diffusion模型部署为EAS在线服务,然后调用模型服务将输入文本生成对应的图像。

该解决方案支持以下两种使用方式:

前提条件

在开始执行操作前,请确认您已完成以下准备工作:

  • 已开通PAI(DSW、EAS)后付费,并创建默认工作空间,详情请参见开通并创建默认工作空间

  • 已创建OSS存储空间(Bucket),用于存储数据集、训练获得的模型文件和配置文件。关于如何创建存储空间,详情请参见创建存储空间

  • 已创建DSW实例且运行正常,详情请参见创建及管理DSW实例

    • 实例规格选择:ecs.gn6v-c8g1.2xlarge

    • 镜像选择:在官方镜像中选择pytorch-develop:1.12-gpu-py39-cu113-ubuntu20.04

方式一:使用PAI-Diffusion模型

步骤一:准备模型文件

  1. 进入PAI-DSW开发环境。

    1. 登录PAI控制台

    2. 在页面左上方,选择DSW实例所在的地域。

    3. 在左侧导航栏单击工作空间列表,在工作空间列表页面中单击默认工作空间名称,进入对应工作空间内。

    4. 在左侧导航栏,选择模型开发与训练>交互式建模(DSW)

    5. 单击需要打开的实例操作列下的打开,进入PAI-DSW实例开发环境。

  2. 在顶部菜单栏,单击Terminal页签,在欢迎使用DSW Terminal页面中单击创建Terminal

  3. 执行以下命令下载并解压PAI-Diffusion模型文件。

    wget https://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/pai_diffusion_model_zoo/pai-diffusion-artist-large-zh.tar.gz
    tar -zxvf pai-diffusion-artist-large-zh.tar.gz
  4. 将模型文件上传到OSS Bucket存储空间。

    1. 在OSS Bucket存储空间中分别创建存储目录aigc_models/pai-diffusion-art-large-zh/base_model/aigc_models/pictures/。具体操作,请参见管理目录

      其中:base_model子文件夹下存放模型的基础Checkpoint;pictures子文件夹下存储模型输出的图像。

    2. 在DSW中安装ossutil并完成配置。具体操作,请参见安装ossutil

    3. 在DSW的Terminal中,执行以下命令将模型文件上传到OSS Bucket存储空间,更多详细内容,请参见命令行工具ossutil快速入门

      cd /mnt/workspace
      ossutil64 cp -r pai-diffusion-artist-large-zh/ oss://<examplebucket>/aigc_models/pai-diffusion-art-large-zh/base_model/

      其中:<examplebucket>需要替换为您的实际Bucket名称。

      模型文件上传到OSS Bucket的目录结构如下:8a27fcd0a50ea391661fa7f2cf00c736.png

步骤二:部署服务

如果您希望直接部署PAI-Diffusion模型,您可以将PAI默认提供的模型部署为在线服务,具体操作步骤如下。

  1. 进入PAI-EAS 模型在线服务页面。

    1. 登录PAI控制台

    2. 在左侧导航栏单击工作空间列表,在工作空间列表页面中单击待操作的工作空间名称,进入对应工作空间内。

    3. 在工作空间页面的左侧导航栏选择模型部署 > 模型在线服务(EAS),进入PAI-EAS 模型在线服务页面。

  2. PAI-EAS 模型在线服务页面,单击部署服务,在弹出对话框中,选择自定义部署,然后单击确定

  3. 部署服务页面对应配置编辑区域,单击JSON独立部署,将以下JSON文件内容粘贴到编辑框中。

    {
        "cloud": {
            "computing": {
                "instance_type": "ecs.gn7i-c16g1.4xlarge"
            }
        },
        "containers": [
            {
                "command": "python /home/pai/app.py --oss_save_dir oss://examplebucket/aigc_models/pictures/ --region hangzhou --func_name base",
                "image": "eas-registry-vpc.<RegionID>.cr.aliyuncs.com/pai-eas/diffuser-inference:2.2.1-py38-cu113-unbuntu2004-blade-public-zh",
                "port": 8000
            }
        ],
        "features": {
            "eas.aliyun.com/extra-ephemeral-storage": "100Gi"
        },
        "metadata": {
            "cpu": 16,
            "gpu": 1,
            "instance": 1,
            "memory": 60000,
            "name": "sd_chinese",
            "rpc": {
                "keepalive": 500000
            }
        },
        "name": "sd_chinese",
        "storage": [
            {
                "mount_path": "/oss",
                "oss": {
                    "path": "oss://examplebucket/aigc_models/pai-diffusion-art-large-zh/base_model/"
                },
                "properties": {
                    "resource_type": "code"
                }
            },
            {
                "mount_path": "/result",
                "oss": {
                    "path": "oss://examplebucket/aigc_models/pictures/"
                },
                "properties": {
                    "resource_type": "code"
                }
            }
        ]
    } 

    其中:

    • containers.command

      • --oss_save_dir:配置为您实际的输出结果路径。本方案使用的示例路径为oss://examplebucket/aigc_models/pictures/

      • --region:配置为服务即将部署的地域。例如:华东2(上海)配置为shanghai。

    • containers.image:将镜像地址中的<RegionID>替换为服务即将部署的地域。例如:华东2(上海)配置为cn-shanghai。更多详细内容,请参见地域和可用区

    • name:需要替换为您自己的服务名称。

    • storage.oss.path:分别替换为步骤一中创建的OSS Bucket路径。包括模型存储路径和输出结果路径。本方案中使用的路径示例为:oss://examplebucket/aigc_models/pai-diffusion-art-large-zh/base_model/oss://examplebucket/aigc_models/pictures/

步骤三:调用服务

服务提供RESTful API,具体的Python调用示例如下。

import json
import requests

import base64
from io import BytesIO
from PIL import Image

hosts = '<service_URL>'
head = {"Authorization": "<service_Token>"}

datas = json.dumps({
        "task_id" : "001",
        "prompt": "一只小猫咪",
        "negative_prompt": "",
        "cfg_scale": 7,
        "steps": 25,
        "image_num": 1,
        "width": 512,
        "height": 512,
        "use_base64": True
    })

r = requests.post(hosts, data=datas, headers=head)
data = json.loads(r.content.decode('utf-8'))

if data['success']:
    images_base64 = data["images_base64"]
    print("text: " + data["prompt"])
    print("num_images:" + str(len(images_base64)))
else:
    print(data['error_msg'])

其中:

  • <service_URL>:需要替换为服务访问地址。您可以单击服务方式下的调用信息,在公网地址调用页签获取。

  • <service_Token>:需要替换为服务Token。您可以单击服务方式下的调用信息,在公网地址调用页签获取。

服务调用参数配置说明如下。

参数名

是否必填

类型

说明

默认值

task_id

STRING

任务ID。

prompt

STRING

用户输入的正向提示词。

negative_prompt

STRING

用户输入的反向提示词。

默认为空

steps

INT

用户输入的步数。

25

cfg_scale

INT

引导强度。

7

width

INT

生成图片宽度。

512

height

INT

生成图片高度。

512

image_num

INT

生成的图片数量。

1

resize_mode

INT

调整生成图片的缩放方式:

  • 0:拉伸。

  • 1:裁剪。

  • 2:填充。

0

use_base64

BOOL

是否返回图像的Base64编码。

True

服务返回参数说明如下。

参数名

类型

说明

image_url

LIST

生成图像的公网可访问链接。仅当OSS Bucket读写权限为公共读写时才有效。

images_base64

LIST

生成的图像列表,Base64编码。

oss_url

LIST

生成图像的OSS地址。

success

INT

是否成功:

  • 0:失败 。

  • 1:成功。

seed

STRING

生成图像的种子。

task_id

STRING

任务ID。

error_msg

STRING

失败原因。只有当success为0时才返回错误信息。

服务调用成功后,会在OSS的输出结果路径(oss://examplebucket/aigc_models/pictures/)中生成图片。您的路径和输出结果以实际为准。image.png

方式二:使用微调的PAI-Diffusion模型

步骤一:准备模型文件

准备PAI-Diffusion模型文件,具体操作,请参见步骤一:准备模型文件

步骤二:微调PAI-Diffusion模型

  1. 进入DSW Gallery,详情请参见功能试用:Gallery

  2. 在DSW Gallery页面中,搜索并找到基于Diffusion模型的中文文图生成教程,单击教程卡片中的在阿里云DSW打开。并按照控制台操作指引构建文图生成模型,即Finetune模型。image

  3. 将获取的模型文件上传到OSS Bucket存储空间。

    1. 在OSS的pai-diffusion-art-large-zh目录下创建lora_model目录。具体操作,请参见管理目录

    2. 将训练好的./mymodel目录下的模型文件pytorch_lora_weights.bin下载到本地,然后上传到已创建的OSS目录lora_model下。关于如何在DSW中下载文件以及上传文件到OSS,详情请参见上传下载数据文件控制台上传文件

步骤三:部署及调用模型服务

  1. 部署模型服务。

    参照步骤二:部署服务,将以下JSON文件内容粘贴到编辑框中,部署lora微调的PAI-Diffusion模型服务。

    {
        "cloud": {
            "computing": {
                "instance_type": "ecs.gn7i-c16g1.4xlarge"
            }
        },
        "containers": [
            {
                "command": "python /home/pai/app.py --oss_save_dir oss://pai-easy-hz/aigc_models/pictures --region hangzhou --func_name base",
                "image": "eas-registry-vpc.<RegionID>.cr.aliyuncs.com/pai-eas/diffuser-inference:2.2.1-py38-cu113-unbuntu2004-blade-public-zh",
                "port": 8000
            }
        ],
        "features": {
            "eas.aliyun.com/extra-ephemeral-storage": "100Gi"
        },
        "metadata": {
            "cpu": 16,
            "gpu": 1,
            "instance": 1,
            "memory": 60000,
            "name": "sd_chinese",
            "rpc": {
                "keepalive": 500000
            }
        },
        "name": "sd_chinese",
        "storage": [
            {
                "mount_path": "/oss",
                "oss": {
                    "path": "oss://pai-easy-hz/aigc_models/pai-diffusion-art-large-zh"
                },
                "properties": {
                    "resource_type": "code"
                }
            },
            {
                "mount_path": "/result",
                "oss": {
                    "path": "oss://pai-easy-hz/aigc_models/pictures"
                },
                "properties": {
                    "resource_type": "code"
                }
            }
        ]
    } 

    其中:

    • containers.command

      • --oss_save_dir:配置为您实际的输出结果路径。本方案使用的示例路径为oss://examplebucket/aigc_models/pictures/

      • --region:配置为服务即将部署的地域。例如:华东2(上海)配置为shanghai。

    • metadata.name:需要替换为您自己的服务名称。

    • containers.image:将镜像地址中的<RegionID>替换为服务即将部署的地域。例如:华东2(上海)配置为cn-shanghai。更多详细内容,请参见地域和可用区

    • storage.oss.path:分别替换为您实际的模型存储路径和输出结果路径。本方案使用的路径示例为:oss://examplebucket/aigc_models/pai-diffusion-art-large-zh/oss://examplebucket/aigc_models/pictures/

  2. 调用模型服务。

    使用如下Python代码调用模型服务:

    import json
    import requests
    
    import base64
    from io import BytesIO
    from PIL import Image
    
    hosts = '<service_URL>'
    head = {"Authorization": "<service_Token>"}
    
    datas = json.dumps({
            "task_id" : "001",
            "prompt": "一只小猫咪",
            "negative_prompt": "",
            "cfg_scale": 7,
            "steps": 25,
            "image_num": 1,
            "width": 512,
            "height": 512,
            "use_base64": True,
          	"lora_attn": 0.75,
      			"lora_path": 'lora_model/pytorch_lora_weights.bin'
        })
    
    r = requests.post(hosts, data=datas, headers=head)
    data = json.loads(r.content.decode('utf-8'))
    
    if data['success']:
        images_base64 = data["images_base64"]
        print("text: " + data["prompt"])
        print("num_images:" + str(len(images_base64)))
    else:
        print(data['error_msg'])

    其中:

    • <service_URL>:需要替换为服务访问地址。您可以单击服务方式下的调用信息,在公网地址调用页签获取。

    • <service_Token>:需要替换为服务Token。您可以单击服务方式下的调用信息,在公网地址调用页签获取。

    步骤三:调用服务中使用的调用代码的区别是新增了以下两个调用参数:

    参数名

    是否必选

    类型

    说明

    默认值

    lora_attn

    FLOAT

    Lora使用的比例。

    0.75

    lora_path

    STRING

    需要更新的Lora模型在OSS挂载路径的相对位置。

    在示例代码中,因为已将Lora权重上传到OSS Bucket存储空间,路径为oss://examplebucket/aigc_models/pai-diffusion-art-large-zh/lora_model/pytorch_lora_weights.bin。由于在EAS部署过程中已经挂载了OSS模型路径oss://examplebucket/aigc_models/pai-diffusion-art-large-zh,则Lora权重的相对路径为lora_model/pytorch_lora_weights.bin

    服务调用成功后,会在OSS的输出结果路径(oss://examplebucket/aigc_models/pictures/)中生成图片。您的路径和输出结果以实际为准。image.png

相关文档

  • 本页导读 (1)
文档反馈