Skip to content

Commit 8458f37

Browse files
authored
1 parent 843f05d commit 8458f37

File tree

1,003 files changed

+171602
-40521
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,003 files changed

+171602
-40521
lines changed

.gitignore

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,14 @@ coverage.xml
6363

6464
*.tar
6565
*.pyc
66+
*.pdiparams
67+
*.safetensors
68+
*.bin
6669

6770
.idea/
6871

6972
# NPU meta folder
7073
kernel_meta/
7174

7275
# MAC
73-
*.DS_Store
74-
76+
*.DS_Store

ppdiffusers/README.md

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ pipe = StableDiffusionPipeline.from_pretrained("stabilityai/stable-diffusion-2",
153153
```python
154154
from ppdiffusers import StableDiffusionPipeline
155155
# 可输入网址 或 本地ckpt、safetensors文件
156-
pipe = StableDiffusionPipeline.from_pretrained_original_ckpt("https://paddlenlp.bj.bcebos.com/models/community/junnyu/develop/ppdiffusers/chilloutmix_NiPrunedFp32Fix.safetensors")
156+
pipe = StableDiffusionPipeline.from_single_file("https://paddlenlp.bj.bcebos.com/models/community/junnyu/develop/ppdiffusers/chilloutmix_NiPrunedFp32Fix.safetensors")
157157
```
158158

159159
### 加载HF LoRA权重
@@ -172,7 +172,10 @@ pipe.load_lora_weights("stabilityai/stable-diffusion-xl-base-1.0",
172172
from ppdiffusers import StableDiffusionPipeline
173173
pipe = StableDiffusionPipeline.from_pretrained("TASUKU2023/Chilloutmix")
174174
# 加载lora权重
175-
pipe.apply_lora("https://paddlenlp.bj.bcebos.com/models/community/junnyu/develop/ppdiffusers/Moxin_10.safetensors")
175+
pipe.load_lora_weights("./",
176+
weight_name="Moxin_10.safetensors",
177+
from_diffusers=True)
178+
pipe.fuse_lora()
176179
```
177180

178181
### XFormers加速
@@ -194,7 +197,7 @@ pipe.enable_xformers_memory_efficient_attention()
194197
### ToME + ControlNet
195198
```python
196199
# 安装develop的ppdiffusers
197-
# pip install "ppdiffusers>=0.16.1"
200+
# pip install "ppdiffusers>=0.24.0"
198201
import paddle
199202
from ppdiffusers import ControlNetModel, StableDiffusionControlNetPipeline
200203
from ppdiffusers.utils import load_image
@@ -527,6 +530,7 @@ import paddle
527530
# load both base & refiner
528531
base = DiffusionPipeline.from_pretrained(
529532
"stabilityai/stable-diffusion-xl-base-1.0",
533+
paddle_dtype=paddle.float16,
530534
)
531535
refiner = DiffusionPipeline.from_pretrained(
532536
"stabilityai/stable-diffusion-xl-refiner-1.0",
@@ -846,7 +850,7 @@ pipe = KandinskyV22Img2ImgPipeline.from_pretrained(
846850
)
847851

848852
init_image = load_image(
849-
"https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main" "/kandinsky/frog.png"
853+
"https://hf-mirror.com/datasets/hf-internal-testing/diffusers-images/resolve/main/kandinsky/frog.png"
850854
)
851855
image = pipe(
852856
image=init_image,
@@ -1177,7 +1181,7 @@ image = output.images[0]
11771181

11781182
# 保存音频到本地
11791183
for i, audio in enumerate(audio):
1180-
write(f"audio_diffusion_test{i}.wav", pipe.mel.sample_rate, audio.transpose())
1184+
write(f"audio_diffusion_test{i}.wav", pipe.mel.config.sample_rate, audio.transpose())
11811185

11821186
# 保存图片
11831187
image.save("audio_diffusion_test.png")

ppdiffusers/VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.19.4
1+
0.24.0
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
# FastDeploy ControlNet 模型高性能部署
2+
3+
**目录**
4+
* [部署模型准备](#部署模型准备)
5+
* [环境依赖](#环境依赖)
6+
* [快速体验](#快速体验)
7+
* [ControlNet文图生成(ControlNet-Text-to-Image Generation)](#ControlNet文图生成)
8+
* [ControlNet文本引导的图像变换(ControlNet-Image-to-Image Text-Guided Generation)](#ControlNet文本引导的图像变换)
9+
* [ControlNet文本引导的图像编辑(ControlNet-Text-Guided Image Inpainting)](#ControlNet文本引导的图像编辑)
10+
11+
⚡️[FastDeploy](https://github.com/PaddlePaddle/FastDeploy) 是一款全场景、易用灵活、极致高效的AI推理部署工具,为开发者提供多硬件、多推理引擎后端的部署能力。开发者只需调用一行代码即可随意切换硬件、推理引擎后端。本示例展现如何通过 FastDeploy 将我们 PPDiffusers 训练好的 Stable Diffusion 模型进行多硬件、多推理引擎后端高性能部署。
12+
13+
<a name="部署模型准备"></a>
14+
15+
## 部署模型准备
16+
17+
本示例需要使用训练模型导出后的部署模型,可参考[模型导出文档](https://github.com/PaddlePaddle/PaddleMIX/blob/develop/ppdiffusers/deploy/controlnet/export.md)导出部署模型。
18+
19+
<a name="环境依赖"></a>
20+
21+
## 环境依赖
22+
23+
在示例中使用了 FastDeploy,需要执行以下命令安装依赖。
24+
25+
```shell
26+
pip install fastdeploy-gpu-python -f https://www.paddlepaddle.org.cn/whl/fastdeploy.html
27+
```
28+
29+
<a name="快速体验"></a>
30+
31+
## 快速体验
32+
33+
我们经过部署模型准备,可以开始进行测试。本目录提供采用Canny边缘检测图片作为控制条件生成图片的教程 。
34+
35+
<a name="ControlNet文图生成"></a>
36+
37+
### ControlNet文图生成(ControlNet-Text-to-Image Generation)
38+
39+
下面左图是我们提供的初始图片,右图是经过OpenCV中的Canny算法处理后得到的边缘检测图片。
40+
41+
![bird](https://user-images.githubusercontent.com/50394665/225192117-3ec7a61c-227b-4056-a076-d37759f8411b.png)
42+
![control_bird_canny](https://user-images.githubusercontent.com/50394665/225192606-47ba975f-f6cc-4555-8d85-870dc1327b45.png)
43+
44+
> Tips:为了能够跑出最快的推理速度,如果是使用`A卡GPU`的用户,请保证`低于8.5版本的TRT`不在`LD_LIBRARY_PATH`路径上。
45+
46+
下面将指定模型目录,推理引擎后端,硬件以及 scheduler 类型,运行 `infer.py` 脚本,完成 `Canny to Image` 任务。
47+
48+
```sh
49+
python infer.py --model_dir ./control_sd15_canny --scheduler "ddim" --backend paddle --task text2img_control
50+
```
51+
52+
脚本的输入提示语句为 **"bird"**, 得到的图像文件为 `text2img_control.png`。生成的图片示例如下(每次生成的图片都不相同,示例仅作参考):
53+
54+
![text2img_control](https://github.com/PaddlePaddle/PaddleNLP/assets/50394665/c2f5e7f0-8abf-4a6c-bc38-bcaf8f58cac5)
55+
56+
如果使用 `paddle_tensorrt` 推理引擎后端及开启`半精度推理`,则可执行以下命令完成推理:
57+
58+
```sh
59+
python infer.py --model_dir control_sd15_canny --scheduler "preconfig-euler-ancestral" --backend paddle_tensorrt --device gpu --benchmark_steps 10 --use_fp16 True --task text2img_control
60+
```
61+
62+
经测试,使用上述命令,在 80G A100 机器上能够跑出 `1.111716 s` 的成绩。
63+
64+
同时,我们还提供基于两阶段 HiresFix 的可控文图生成示例。下面将指定模型目录,指定任务名称为 `hiresfix` 后,运行 `infer.py` 脚本,完成`两阶段hiresfix任务`,在第一阶段我们生成了 `512x512分辨率` 的图片,然后在第二阶段我们在一阶段的基础上修复生成了 `768x768分辨率` 图片。
65+
66+
| without hiresfix | with hiresfix |
67+
|:-------------------:|:-------------------:|
68+
|![][without-hiresfix]|![][with-hiresfix]|
69+
70+
[without-hiresfix]: https://github.com/PaddlePaddle/PaddleNLP/assets/50394665/2e3002bc-4a55-4b73-869f-b4e065e62644
71+
[with-hiresfix]: https://github.com/PaddlePaddle/PaddleNLP/assets/50394665/3f80ce29-8854-4877-911a-11da928a0559
72+
73+
在80G A100上,ppdiffusers==0.16.1、fastdeploy==1.0.7、develop paddle、cuda11.7 的环境下,我们测出了如下的速度。
74+
- without hiresfix 的速度为:Mean latency: 2.715479 s, p50 latency: 2.715581 s, p90 latency: 2.717518 s, p95 latency: 2.719844 s.
75+
- with hiresfix 的速度为:Mean latency: 2.027131 s, p50 latency: 2.026837 s, p90 latency: 2.028943 s, p95 latency: 2.032201 s.
76+
77+
<a name="ControlNet文本引导的图像变换"></a>
78+
79+
### ControlNet文本引导的图像变换(ControlNet-Image-to-Image Text-Guided Generation)
80+
81+
```sh
82+
python infer.py --model_dir ./control_sd15_canny --scheduler "euler-ancestral" --backend paddle_tensorrt --use_fp16 True --device gpu --task_name img2img_control
83+
```
84+
85+
脚本输入的提示语句为 **"A fantasy landscape, trending on artstation"**,运行得到的图像文件为 img2img_control.png。生成的图片示例如下(每次生成的图片都不相同,示例仅作参考):
86+
87+
| input image | output image |
88+
|:-------------------:|:-------------------:|
89+
|![][sketch-mountains-input]|![][fantasy_landscape]|
90+
91+
[sketch-mountains-input]: https://user-images.githubusercontent.com/10826371/217207485-09ee54de-4ba2-4cff-9d6c-fd426d4c1831.png
92+
[fantasy_landscape]: https://github.com/PaddlePaddle/PaddleNLP/assets/50394665/c3727ee3-2955-4ae9-9fbd-a434a9613eda
93+
94+
<a name="ControlNet文本引导的图像编辑"></a>
95+
96+
### ControlNet文本引导的图像编辑(ControlNet-Text-Guided Image Inpainting)
97+
98+
```sh
99+
python infer.py ./control_sd15_canny --scheduler "euler-ancestral" --backend paddle_tensorrt --use_fp16 True --device gpu --task_name inpaint_legacy_control
100+
```
101+
102+
脚本输入的提示语为 **"Face of a yellow cat, high resolution, sitting on a park bench"**,运行得到的图像文件为 inpaint_legacy_control.png。生成的图片示例如下(每次生成的图片都不相同,示例仅作参考):
103+
104+
| input image | mask image | output image
105+
|:-------------------:|:-------------------:|:-------------------:|
106+
|![][input]|![][mask]|![][output]|
107+
108+
[input]: https://user-images.githubusercontent.com/10826371/217423470-b2a3f8ac-618b-41ee-93e2-121bddc9fd36.png
109+
[mask]: https://user-images.githubusercontent.com/10826371/217424068-99d0a97d-dbc3-4126-b80c-6409d2fd7ebc.png
110+
[output]: https://github.com/PaddlePaddle/PaddleNLP/assets/50394665/63735f7d-038a-48d0-a688-7c1aa4912ab0
111+
112+
113+
#### 参数说明
114+
115+
`infer.py` 除了以上示例的命令行参数,还支持更多命令行参数的设置。展开可查看各命令行参数的说明。
116+
117+
| 参数 |参数说明 |
118+
|----------|--------------|
119+
| --model_dir | 导出后模型的目录。默认为 `runwayml/stable-diffusion-v1-5-canny@fastdeploy` |
120+
| --backend | 推理引擎后端。默认为 `paddle_tensorrt`,可选列表:`['onnx_runtime', 'paddle', 'paddlelite', 'paddle_tensorrt', 'tensorrt']`|
121+
| --device | 运行设备。默认为 `gpu`,可选列表:`['cpu', 'gpu', 'huawei_ascend_npu', 'kunlunxin_xpu']`|
122+
| --device_id | `gpu` 设备的 id。若 `device_id``-1`,视为使用 `cpu` 推理。 |
123+
| --inference_steps | `UNet` 模型运行的次数,默认为 `50`|
124+
| --benchmark_steps | `Benchmark` 运行的次数,默认为 `1`|
125+
| --use_fp16 | 是否使用 `fp16` 精度。默认为 `False`。使用 `paddle_tensorrt` 后端及 `kunlunxin_xpu` 设备时可以设为 `True` 开启。 |
126+
| --task_name | 任务类型,默认为`text2img`,可选列表:`['text2img_control', 'img2img_control', 'inpaint_legacy_control', 'hiresfix_control', 'all']`|
127+
| --scheduler | 采样器类型。默认为 `'preconfig-euler-ancestral'`。可选列表:`['pndm', 'lms', 'euler', 'euler-ancestral', 'preconfig-euler-ancestral', 'dpm-multi', 'dpm-single', 'unipc-multi', 'ddim', 'ddpm', 'deis-multi', 'heun', 'kdpm2-ancestral', 'kdpm2']`|
128+
| --infer_op | 推理所采用的op,可选列表 `['zero_copy_infer', 'raw', 'all']``zero_copy_infer`推理速度更快,默认值为`zero_copy_infer`|
129+
| --parse_prompt_type | 处理prompt文本所使用的方法,可选列表 `['raw', 'lpw']``lpw`可强调句子中的单词,并且支持更长的文本输入,默认值为`lpw`|
130+
| --low_threshold | Canny算法最后一步中,小于该阈值的像素直接置为0,默认值为 100。 |
131+
| --high_threshold | Canny算法最后一步中,大于该阈值的像素直接置为255,默认值为 200。 |
132+
| --width | 生成图片的宽度,取值范围 512~768。默认值为 512。|
133+
| --height | 生成图片的高度,取值范围 512~768。默认值为 512。|
134+
| --hr_resize_width | hiresfix 所要生成的宽度,取值范围 512~768。默认值为 768。|
135+
| --hr_resize_height | hiresfix 所要生成的高度,取值范围 512~768。默认值为 768。|
136+
| --is_sd2_0 | 是否为sd2.0的模型?默认为 False 。|
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# ControlNet 模型导出教程
2+
3+
4+
[PPDiffusers](https://github.com/PaddlePaddle/PaddleMIX/tree/develop/ppdiffusers) 是一款支持跨模态(如图像与语音)训练和推理的扩散模型(Diffusion Model)工具箱,其借鉴了🤗 Huggingface 团队的 [Diffusers](https://github.com/huggingface/diffusers) 的优秀设计,并且依托 [PaddlePaddle](https://github.com/PaddlePaddle/Paddle) 框架和 [PaddleNLP](https://github.com/PaddlePaddle/PaddleNLP) 自然语言处理库。下面将介绍如何将 PPDiffusers 提供的预训练模型进行模型导出。
5+
6+
### 模型导出
7+
8+
可执行以下命令行完成模型导出。
9+
10+
```shell
11+
python export_model.py --pretrained_model_name_or_path runwayml/stable-diffusion-v1-5 --controlnet_pretrained_model_name_or_path lllyasviel/sd-controlnet-canny --output_path control_sd15_canny --height=512 --width=512
12+
```
13+
注: 上述指令导出固定尺寸的模型,固定尺寸的导出模型有利于优化模型推理性能,但会牺牲一定灵活性。若要导出支持多种推理尺寸的模型,可取消参数--height和--width的设置。
14+
15+
输出的模型目录结构如下:
16+
17+
```shell
18+
control_sd15_canny/
19+
├── model_index.json
20+
├── scheduler
21+
│ └── scheduler_config.json
22+
├── tokenizer
23+
│ ├── tokenizer_config.json
24+
│ ├── merges.txt
25+
│ ├── vocab.json
26+
│ └── special_tokens_map.json
27+
├── text_encoder
28+
│ ├── inference.pdiparams
29+
│ ├── inference.pdiparams.info
30+
│ └── inference.pdmodel
31+
├── unet
32+
│ ├── inference.pdiparams
33+
│ ├── inference.pdiparams.info
34+
│ └── inference.pdmodel
35+
├── vae_decoder
36+
│ ├── inference.pdiparams
37+
│ ├── inference.pdiparams.info
38+
│ └── inference.pdmodel
39+
└── vae_encoder
40+
├── inference.pdiparams
41+
├── inference.pdiparams.info
42+
└── inference.pdmodel
43+
```
44+
45+
46+
`export_model.py` 各命令行参数的说明。
47+
48+
| 参数 |参数说明 |
49+
|----------|--------------|
50+
| <span style="display:inline-block;width: 230pt"> --pretrained_model_name_or_path </span> | ppdiffuers提供的diffusion预训练模型。默认为:"runwayml/stable-diffusion-v1-5"。更多 StableDiffusion 预训练模型可参考 [ppdiffusers 模型列表](../README.md#ppdiffusers模型支持的权重)|
51+
| <span style="display:inline-block;width: 230pt"> --controlnet_pretrained_model_name_or_path </span> | ppdiffuers提供的controlnet预训练模型。默认为:"lllyasviel/sd-controlnet-canny"。更多 ControlNET 预训练模型可参考 [lllyasviel的huggingface hub](https://huggingface.co/lllyasviel)|
52+
| --output_path | 导出的模型目录。 |
53+
| --sample | vae encoder 的输出是否调整为 sample 模式,注意:sample模式会引入随机因素,默认是 False。|
54+
| --height | 如果指定,则会固定导出模型的高度,即,在推理生成图片时只能生成该大小的图片,默认值为None。|
55+
| --width | 如果指定,则会固定导出模型的宽度,即,在推理生成图片时只能生成该大小的图片,默认值为None。|

0 commit comments

Comments
 (0)