文档

Diffusion中文文图生成解决方案

更新时间:

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

背景信息

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

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

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

使用流程

该解决方案的使用流程如下:

image
  1. 步骤一:准备模型文件

    首先在DSW平台,准备PAI-Diffusion模型文件,并将模型文件上传到OSS指定的存储路径中。

  2. 步骤二(可选):微调PAI-Diffusion模型

    DSW平台,使用Diffusion模型微调NoteBook构建中文文图生成模型。

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

    通过模型在线服务EAS,您可以将PAI默认的Diffusion模型或训练好的中文文图生成模型部署为在线服务,并在实际的生产环境中调用服务,从而实现在线生成图像。

前提条件

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

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

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

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

    • 资源规格:选择ecs.gn6v-c8g1.2xlarge

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

步骤一:准备模型文件

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

    1. 登录PAI控制台

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

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

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

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

  2. Notebook页签的Launcher页面,单击快速开始区域Tool下的DSW Gallery,打开DSW Gallery页面。

    image.png

  3. 在DSW Gallery页面中,搜索并找到基于Diffusion模型的中文文图生成教程,单击教程卡片中的在DSW中打开

    单击后即会自动将本教程所需的资源和教程文件下载至DSW实例中,并在下载完成后自动打开教程文件。

    image

  4. 在打开的教程文件diffusion.ipynb中,单击运行image按钮,执行下载模型操作步骤。当左侧为image时,表明成功运行结束。fe0dc6502cac5000b80439dca3aa2ebe

  5. 将模型文件上传到OSS Bucket存储空间。

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

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

    2. 在DSW中,切换到Terminal页签,安装ossutil并完成配置。具体操作,请参见安装ossutil

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

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

      其中:<examplebucket>需要替换为您的实际OSS Bucket存储空间名称。

      模型文件上传到OSS Bucket存储空间的目录结构如下:image

步骤二(可选):微调PAI-Diffusion模型

如果您直接部署PAI提供的默认Diffusion模型来体验其效果,可跳过以下操作步骤。如果您使用微调后的Diffusion模型部署服务,则需要执行以下操作步骤:

  1. 在通过DSW的Notebook打开的教程文件diffusion.ipynb中,直接运行以下操作步骤对应的命令,当成功运行结束一个步骤命令后,再顺次运行下个步骤的命令。

    需要执行的操作步骤如下:

    1. 安装依赖。

    2. 数据下载。

    3. 训练脚本。

    4. 训练微调。

    上述步骤执行成功后,会在./demos/diffusion/mymodel目录下生成模型文件pytorch_lora_weights.bin

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

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

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

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

部署服务

具体操作步骤如下。

  1. 进入模型在线服务(EAS)页面。

    1. 登录PAI控制台

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

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

  2. 模型在线服务(EAS)页面,单击部署服务,在自定义模型部署区域,单击JSON独立部署

  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/"
                },
                "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:配置为服务即将部署的地域。例如:华东1(杭州)配置为hangzhou。

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

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

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

调用服务

  1. 获取服务访问地址和Token。

    1. 模型在线服务(EAS)页面,单击目标服务的服务方式列下的调用信息

    2. 公网地址调用页签获取服务访问地址和Token。

  2. 在终端中,执行如下Python代码调用服务,来验证模型效果。

    • 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)))
          print(data)
      else:
          print(data['error_msg'])

      其中:

      • <service_URL>:需要替换为步骤1获取的服务访问地址。

      • <service_Token>:需要替换为步骤1获取的服务Token。

      • datas传入参数(即服务调用参数)说明如下:

        说明

        仅调用微调的Diffusion模型服务时,需要配置lora_attnlora_path。

        参数名

        是否必填

        类型

        说明

        默认值

        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

        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

    • 代码执行成功后,返回结果示例如下:

      text: 一只小猫咪
      num_images:1
      {'success': 1, 'task_id': '001', 'prompt': '一只小猫咪', 'seed': '7957812204****23925', 'image_url': ['https://examplebucket.oss-cn-hangzhou.aliyuncs.com/aigc_models/pictures/result/001_20240612_020824_55.png'], 'oss_url': ['oss://examplebucket/aigc_models/pictures/result/001_20240612_020824_55.png'], 'is_nsfw': [True], 'images_base64': ['iVBORw0KGgoAAA****gAAAgAAAAIACAIAAAB7GkOtAAADEUlEQVR4nO3BgQAAAADDoPlTX-EAVQEAA****AMBvArQAAVkUTe8AAAAASUVORK5CYII='], 'use_blade': False}

      其中关键参数说明如下:

      参数名

      类型

      说明

      success

      INT

      是否成功:

      • 0:失败 。

      • 1:成功。

      task_id

      STRING

      任务ID。

      seed

      STRING

      生成图像的种子。

      image_url

      LIST

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

      oss_url

      LIST

      生成图像的OSS地址。

      images_base64

      LIST

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

      error_msg

      STRING

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

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

      • 调用PAI默认Diffusion模型服务,返回如下结果:image

      • 调用微调的模型服务,返回如下结果:

        image

相关文档