Diffusion中文文图生成解决方案
Diffusion文图生成解决方案基于阿里云机器学习PAI产品,帮助您快速搭建囊括模型离线训练和在线部署的端到端全链路构建流程,实现从文本生成图像的功能。本文为您介绍Diffusion中文文图生成解决方案的使用流程和操作步骤。
背景信息
阿里云机器学习PAI在文图生成创作领域,提供了端到端、多样化的纯白盒解决方案,目前已支持中文文图生成功能。您可以根据自己的业务场景自定义构建智能文图生成模型,或使用PAI提供的默认模型,进行模型调优和线上部署,针对不同的文本输入生成不同风格的图像。具体解决方案如下。
基于PAI提供的Diffusion模型和算法,根据您自己的文图生成场景,在DSW平台进行模型微调,从而构建具体场景的Diffusion文图生成模型。
您可以将微调生成的模型或PAI默认的Diffusion模型部署为EAS在线服务,然后调用模型服务将输入文本生成对应的图像。
该解决方案支持以下两种使用方式:
直接将PAI默认的模型部署为EAS在线服务,并调用模型服务进行在线调试。
在中文文图生成解决方案中,微调并且部署PAI-Diffusion模型的使用流程如下。
首先准备PAI-Diffusion模型文件,并将模型文件上传到OSS指定的存储路径中。
在DSW平台,使用Diffusion模型微调NoteBook构建中文文图生成模型。
通过模型在线服务EAS,您可以将训练好的中文文图生成模型部署为在线服务,并在实际的生产环境中调用服务,从而实现在线生成图像。
前提条件
在开始执行操作前,请确认您已完成以下准备工作:
已开通PAI(Designer、DSW、EAS)后付费,并创建默认工作空间,详情请参见开通并创建默认工作空间。
已创建OSS存储空间(Bucket),用于存储数据集、训练获得的模型文件和配置文件。关于如何创建存储空间,详情请参见创建存储空间。
已创建DSW实例且运行正常,详情请参见创建及管理DSW实例。
镜像选择:在官方镜像中选择
pytorch:1.12-gpu-py39-cu113-ubuntu20.04
。实例规格选择:ecs.gn6v-c8g1.2xlarge。
方式一:使用PAI-Diffusion模型
步骤一:准备模型文件
进入PAI-DSW开发环境。
登录PAI控制台。
在页面左上方,选择DSW实例所在的地域。
在左侧导航栏单击工作空间列表,在工作空间列表页面中单击默认工作空间名称,进入对应工作空间内。
在左侧导航栏,选择模型开发与训练>交互式建模(DSW)。
单击需要打开的实例操作列下的打开,进入PAI-DSW实例开发环境。
在顶部菜单栏,单击Terminal页签,在欢迎使用DSW Terminal页面中单击创建Terminal。
执行以下命令下载并解压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
将模型文件上传到OSS Bucket存储空间。
在OSS Bucket存储空间中分别创建存储目录
aigc_models/pai-diffusion-art-large-zh/base_model/
和aigc_models/pictures/
。具体操作,请参见管理目录。其中:
base_model
子文件夹下存放模型的基础Checkpoint;pictures
子文件夹下存储模型输出的图像。在DSW中安装ossutil并完成配置。具体操作,请参见安装ossutil。
在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的目录结构如下:
步骤二:部署服务
如果您希望直接部署PAI-Diffusion模型,您可以将PAI默认提供的模型部署为在线服务,具体操作步骤如下。
进入PAI-EAS 模型在线服务页面。
登录PAI控制台。
在左侧导航栏单击工作空间列表,在工作空间列表页面中单击待操作的工作空间名称,进入对应工作空间内。
在工作空间页面的左侧导航栏选择 ,进入PAI-EAS 模型在线服务页面。
在推理服务页签,单击部署服务。
在部署服务页面对应配置编辑区域,单击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 |
use_base64 | 否 | BOOL | 是否返回图像的Base64编码。 | True |
服务返回参数说明如下。
参数名 | 类型 | 说明 |
image_url | LIST | 生成图像的公网可访问链接。仅当OSS Bucket读写权限为公共读写时才有效。 |
images_base64 | LIST | 生成的图像列表,Base64编码。 |
oss_url | LIST | 生成图像的OSS地址。 |
success | INT | 是否成功:
|
seed | STRING | 生成图像的种子。 |
task_id | STRING | 任务ID。 |
error_msg | STRING | 失败原因。只有当success为0时才返回错误信息。 |
服务调用成功后,会在OSS的输出结果路径(oss://examplebucket/aigc_models/pictures/
)中生成图片。您的路径和输出结果以实际为准。
方式二:使用微调的PAI-Diffusion模型
步骤一:准备模型文件
准备PAI-Diffusion模型文件,具体操作,请参见步骤一:准备模型文件。
步骤二:微调PAI-Diffusion模型
进入DSW Gallery,详情请参见功能试用:Gallery。
在DSW Gallery页面中,搜索并找到基于Diffusion模型的中文文图生成教程,单击教程卡片中的在DSW中打开。并按照控制台操作指引构建文图生成模型,即Finetune模型。
将获取的模型文件上传到OSS Bucket存储空间。
步骤三:部署及调用模型服务
部署模型服务。
参照步骤二:部署服务,将以下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/
。
调用模型服务。
使用如下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/
)中生成图片。您的路径和输出结果以实际为准。
附录
在调式模型时,文生图的配置主要包括提示词(prompt)、反向提示词(negative_prompt)等参数。您可以根据业务需要调整这些参数,以获得更好的效果。具体操作,请参见基于PAI产品的虚拟上装解决方案。