随着Stable Diffusion模型在AI圈的爆火,AI生成内容(AI Generated Content,AIGC)的应用呈现出井喷式的增长趋势。其中,文图生成(Text-to-image Generation)任务是最流行的AIGC任务之一,旨在生成与给定文本对应的图像。在先前的工作中,阿里云机器学习PAI团队开源了PAI-Diffusion系列模型(看这里),包括一系列通用场景和特定场景的文图生成模型,例如古诗配图、二次元动漫、魔幻现实等。这些模型的Pipeline除了包括标准的Latent Diffusion Model,还集成了PAI团队先前提出的中文CLIP跨模态对齐模型(看这里),及图像超分模型,使得模型可以生成符合中文文本描述的、各种场景下的高清大图。由于在特定场景下,用户往往有对这些中文Diffusion模型调优(Fine-tune)的需求,而且在线上部署方面,由于Diffusion模型推理速度比较慢,而且需要耗费较多的硬件资源。在本次的工作中,我们在EasyNLP算法框架中,对先前提出的PAI-Diffusion模型功能进行升级,全链路支持模型调优。在模型推理方面,结合由PAI自主研发的编译优化工具 PAI-Blade,支持对PAI-Diffusion模型的端到端的导出和推理加速,在A10机器下做到了1s内的中文大图生成。
本⽂首先介绍如何体验PAI-Diffusion模型以及其在线部署、加速推理能力。其次,我们简单回顾了PAI-Diffusion模型的架构,之后详细介绍了在EasyNLP算法框架中对上述模型进行调优的全链路支持。
首先让我们轻松体验PAI-Diffusion模型。
PAI-Diffusion模型可以用于各种风格的艺术画的生成。这个模型的参数量仅10亿,使用一张P100 GPU显卡,就可以生成1024*1024的高清大图,示例如下。
我们在AI模型开源社区ModelScope的创空间上线了我们的一个PAI-Diffusion模型(体验链接),欢迎广大用户体验。
我们简单回顾一下PAI-Diffusion模型的技术架构。简单的说,PAI-Diffusion模型是面向中文的、基于隐式扩散模型(Latent Diffusion Model, LDM)的文图生成模型。因为中英文在文化和表达上具有很大的差异性,产出的模型通常无法建模中文特有的现象。PAI-Diffusion模型由阿里云机器学习(PAI)团队发布并开源,除了可以用于通用文图生成场景,还具有一系列特定场景的定制化中文Diffusion模型,包括古诗配图、二次元动漫、魔幻现实等。PAI-Diffusion的模型Pipeline架构,包括中文CLIP模型、Diffusion模型、图像超分模型等:
具体地说,中文CLIP模型把中文文本输入转化成 Embedding 向量,我们采用EasyNLP中文CLIP跨模态对齐模型(看这里)的Text Transformer作为Text Encoder。我们把中文CLIP模型的输出作为LDM的输入,训练模型生成文本对应的图片。可选地,PAI-Diffusion模型链路中还集成了ESRGAN作为图像超分模型,提升图片的分辨率。
PAI-Blade 采用多种模型编译优化技术,可以对基于Tensorflow/Pytorch 训练的模型进行推理优化加速。
针对基于PAI-EasyNLP的 PAI-Diffusion模型 和社区的Stable-Diffusion模型的推理进行测速分析,针对推理的主要部分,引入了编译优化和flashattention的推理加速技术,成功将整个推理链路平均提速75%以上,具体加速比视推理步数略有不同,详细可以参考下表(测试推理机器 Nvidia-A10,输出图片分辨率 512x512):
pai-diffusion原版 | pai-blade 加速后 | 加速比 | 采样步数 |
---|---|---|---|
1.61s | 0.97s | 66% | 20 |
3.02s | 1.62s | 86% | 50 |
综上可以看到, 引入PAI自主研发的模型推理加速工具Blade 能大幅度提升DiffusionModel的推理速度,降低服务延迟,节省计算资源。
在本次更新中,我们在PAI-EasyNLP算法框架对PAI-Diffusion模型的调优做了全面支持。我们介绍如何在PAI-Diffusion模型的训练流程,以及如何在PAI的产品中部署上述微调后的模型用于在线服务。
用户可以直接参考链接的说明安装EasyNLP算法框架。
首先准备训练数据与验证数据,为tsv文件。这⼀⽂件包含以制表符\t分隔的三列(idx, text, imgbase64),第一列是文本编号,第二列是文本,第三列是对应图片的base64编码。样例如下:
64b4109e34a0c3e7310588c00fc9e157 韩国可爱日系袜子女中筒袜春秋薄款纯棉学院风街头卡通兔子长袜潮 iVBORw0KGgoAAAAN...MAAAAASUVORK5CYII=
为了方便开发者,我们也提供了转换图片到base64编码的示例代码:
import base64
from io import BytesIO
from PIL import Image
img = Image.open(fn)
img_buffer = BytesIO()
img.save(img_buffer, format=img.format)
byte_data = img_buffer.getvalue()
base64_str = base64.b64encode(byte_data) # bytes
下列文件已经完成预处理,可用于测试:
# train
https://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/painter_text2image/T2I_train.tsv
# valid
https://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/painter_text2image/T2I_val.tsv
# test
https://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/painter_text2image/T2I_test.tsv
我们采用以下命令对PAI-Diffusion模型进行fine-tune:
easynlp \
--mode=train \
--worker_gpu=1 \
--tables=T2I_train.tsv,T2I_val.tsv \
--input_schema=idx:str:1,text:str:1,imgbase64:str:1 \
--first_sequence=text \
--second_sequence=imgbase64 \
--checkpoint_dir=./finetuned_model \
--learning_rate=4e-5 \
--epoch_num=3 \
--random_seed=42 \
--logging_steps=100 \
--save_checkpoint_steps=1000 \
--sequence_length=288 \
--micro_batch_size=16 \
--app_name=latent_diffusion \
--user_defined_parameters='
pretrain_model_name_or_path=alibaba-pai/pai-diffusion-general-large-zh
reset_model_state_flag=True
'
训练完成后模型被保存到./finetune_model/。
模型训练完毕后,我们可以将其用于图片的生成,示例如下:
easynlp \
--mode=predict \
--worker_gpu=1 \
--tables=T2I_test.tsv \
--input_schema=idx:str:1,text:str:1 \
--output_schema=text \
--outputs=./output.tsv \
--first_sequence=text \
--checkpoint_dir=./finetuned_model \
--random_seed=42 \
--logging_steps=100 \
--save_checkpoint_steps=500 \
--sequence_length=32 \
--micro_batch_size=16 \
--app_name=latent_diffusion \
--user_defined_parameters='
n_samples=2
write_image=True
image_prefix=./output/
'
用户可以使用PAI-EAS自定义服务部署方式,使用如下config部署我们已经打包好的相关processor进行服务部署即可。我们提供了一个测试模型以供体验模型的推理速度,部署在A10/T4/V100 GPU的config参考如下,您需要将resource字段替换成自己的资源组:
{
"baseimage": "registry.cn-shanghai.aliyuncs.com/eas/eas-worker-amd64:0.6.8",
"data_image": "registry.cn-shanghai.aliyuncs.com/pai-ai-test/eas-service:ch_ldm_v100",
"metadata": {
"cpu": 15,
"gpu": 1,
"instance": 1,
"memory": 50000,
"name": "ch_ldm_easynlp",
"resource": "请替换成自己的资源组",
"rpc": {
"keepalive": 50000,
"worker_threads": 5
}
},
"model_path": "http://pai-vision-exp.oss-cn-zhangjiakou.aliyuncs.com/wzh-zhoulou/dl_eas_processor/ch_ldm/ch_ldm_blade_220206/eas_model_20230206_noblade.tar.gz",
"processor_entry": "./app.py",
"processor_path": "http://pai-vision-exp.oss-cn-zhangjiakou.aliyuncs.com/wzh-zhoulou/dl_eas_processor/ch_ldm/ch_ldm_blade_220206/eas_processor_20230206.tar.gz",
"processor_type": "python",
"name": "ch_ldm_easynlp"
}
如果您需要体验Blade优化后的推理速度,可以在A10 GPU中进行部署,用户需要将上述model_path的值替换为http://pai-vision-exp.oss-cn-zhangjiakou.aliyuncs.com/wzh-zhoulou/dl_eas_processor/ch_ldm/ch_ldm_blade_220206/eas_model_20230206.tar.gz。
当服务部署成功后,可以使用如下格式的request body进行测试:
{
"text": "测试文本",
"num_inference_steps": 20,
"num_images": 1
}
在线服务返回示例如下:
{
"text": "测试文本",
"images_base64": ["...", "...", ...]
}
images_base64字段返回生成图像的base64编码,生成图像数量由request body中的参数指定。
用户也可以使用EasyNLP进行微调训练后部署,需要将如下训练后的ckpt 打包替换上面json中的model_path字段:
打包命令示例如下:
cd finetuned_model/
tar czf finetuned_model.tar.gz config.json pytorch_model.bin RRDB_ESRGAN_x4.pth vocab.txt
然后,采用前述config 将模型部署到PAI-EAS,建议使用的GPU型号为A10/T4/V100。
如果用户需要使用Blade 加速,支持使用A10/A100 GPU机器资源进行部署,请联系我们获取Blade相关教程。
在这一期的工作中,我们对PAI-Diffusion模型的功能进行重大升级,在EasyNLP框架中(https://github.com/alibaba/EasyNLP)支持全链路模型的调优和在线部署,使得用户能一键实现模型的调优,并且在阿里云PAI平台上便捷部署在线服务。此外,阿里云机器学习PAI团队也在持续推进中文多模态模型的自研工作,欢迎用户持续关注我们,也欢迎加入我们的开源社区,共建中文NLP和多模态算法库!
Github地址:https://github.com/alibaba/EasyNLP
EasyNLP是阿里云机器学习PAI 团队基于 PyTorch 开发的易用且丰富的中文NLP算法框架,支持常用的中文预训练模型和大模型落地技术,并且提供了从训练到部署的一站式 NLP 开发体验。EasyNLP 提供了简洁的接口供用户开发 NLP 模型,包括NLP应用 AppZoo 和预训练 ModelZoo,同时提供技术帮助用户高效的落地超大预训练模型到业务。由于跨模态理解需求的不断增加,EasyNLP也将支持各种跨模态模型,特别是中文领域的跨模态模型,推向开源社区,希望能够服务更多的 NLP 和多模态算法开发者和研究者,也希望和社区一起推动 NLP /多模态技术的发展和模型落地。
|