mirror of
https://github.com/huggingface/diffusers.git
synced 2025-12-18 18:34:37 +08:00
Compare commits
8 Commits
quanto-tes
...
move-testi
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
215af1a602 | ||
|
|
1a917d3ac5 | ||
|
|
65efbcead5 | ||
|
|
2a52a25b9a | ||
|
|
0137a16ed5 | ||
|
|
ce12925a23 | ||
|
|
80b06b0d5f | ||
|
|
42c19fdd0d |
@@ -120,12 +120,6 @@ The `guidance_scale` parameter in the pipeline is there to support future guidan
|
|||||||
- all
|
- all
|
||||||
- __call__
|
- __call__
|
||||||
|
|
||||||
## QwenImageEditInpaintPipeline
|
|
||||||
|
|
||||||
[[autodoc]] QwenImageEditInpaintPipeline
|
|
||||||
- all
|
|
||||||
- __call__
|
|
||||||
|
|
||||||
## QwenImaggeControlNetPipeline
|
## QwenImaggeControlNetPipeline
|
||||||
- all
|
- all
|
||||||
- __call__
|
- __call__
|
||||||
|
|||||||
@@ -51,10 +51,10 @@ t2i_pipeline = t2i_blocks.init_pipeline(modular_repo_id, components_manager=comp
|
|||||||
</hfoption>
|
</hfoption>
|
||||||
</hfoptions>
|
</hfoptions>
|
||||||
|
|
||||||
Components are only loaded and registered when using [`~ModularPipeline.load_components`] or [`~ModularPipeline.load_components`]. The example below uses [`~ModularPipeline.load_components`] to create a second pipeline that reuses all the components from the first one, and assigns it to a different collection
|
Components are only loaded and registered when using [`~ModularPipeline.load_components`] or [`~ModularPipeline.load_default_components`]. The example below uses [`~ModularPipeline.load_default_components`] to create a second pipeline that reuses all the components from the first one, and assigns it to a different collection
|
||||||
|
|
||||||
```py
|
```py
|
||||||
pipe.load_components()
|
pipe.load_default_components()
|
||||||
pipe2 = ModularPipeline.from_pretrained("YiYiXu/modular-demo-auto", components_manager=comp, collection="test2")
|
pipe2 = ModularPipeline.from_pretrained("YiYiXu/modular-demo-auto", components_manager=comp, collection="test2")
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -75,13 +75,13 @@ Guiders that are already saved on the Hub with a `modular_model_index.json` file
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
The guider is only created after calling [`~ModularPipeline.load_components`] based on the loading specification in `modular_model_index.json`.
|
The guider is only created after calling [`~ModularPipeline.load_default_components`] based on the loading specification in `modular_model_index.json`.
|
||||||
|
|
||||||
```py
|
```py
|
||||||
t2i_pipeline = t2i_blocks.init_pipeline("YiYiXu/modular-doc-guider")
|
t2i_pipeline = t2i_blocks.init_pipeline("YiYiXu/modular-doc-guider")
|
||||||
# not created during init
|
# not created during init
|
||||||
assert t2i_pipeline.guider is None
|
assert t2i_pipeline.guider is None
|
||||||
t2i_pipeline.load_components()
|
t2i_pipeline.load_default_components()
|
||||||
# loaded as PAG guider
|
# loaded as PAG guider
|
||||||
t2i_pipeline.guider
|
t2i_pipeline.guider
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ blocks = SequentialPipelineBlocks.from_blocks_dict(TEXT2IMAGE_BLOCKS)
|
|||||||
modular_repo_id = "YiYiXu/modular-loader-t2i-0704"
|
modular_repo_id = "YiYiXu/modular-loader-t2i-0704"
|
||||||
pipeline = blocks.init_pipeline(modular_repo_id)
|
pipeline = blocks.init_pipeline(modular_repo_id)
|
||||||
|
|
||||||
pipeline.load_components(torch_dtype=torch.float16)
|
pipeline.load_default_components(torch_dtype=torch.float16)
|
||||||
pipeline.to("cuda")
|
pipeline.to("cuda")
|
||||||
|
|
||||||
image = pipeline(prompt="Astronaut in a jungle, cold color palette, muted colors, detailed, 8k", output="images")[0]
|
image = pipeline(prompt="Astronaut in a jungle, cold color palette, muted colors, detailed, 8k", output="images")[0]
|
||||||
@@ -49,7 +49,7 @@ blocks = SequentialPipelineBlocks.from_blocks_dict(IMAGE2IMAGE_BLOCKS)
|
|||||||
modular_repo_id = "YiYiXu/modular-loader-t2i-0704"
|
modular_repo_id = "YiYiXu/modular-loader-t2i-0704"
|
||||||
pipeline = blocks.init_pipeline(modular_repo_id)
|
pipeline = blocks.init_pipeline(modular_repo_id)
|
||||||
|
|
||||||
pipeline.load_components(torch_dtype=torch.float16)
|
pipeline.load_default_components(torch_dtype=torch.float16)
|
||||||
pipeline.to("cuda")
|
pipeline.to("cuda")
|
||||||
|
|
||||||
url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/sdxl-text2img.png"
|
url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/sdxl-text2img.png"
|
||||||
@@ -73,7 +73,7 @@ blocks = SequentialPipelineBlocks.from_blocks_dict(INPAINT_BLOCKS)
|
|||||||
modular_repo_id = "YiYiXu/modular-loader-t2i-0704"
|
modular_repo_id = "YiYiXu/modular-loader-t2i-0704"
|
||||||
pipeline = blocks.init_pipeline(modular_repo_id)
|
pipeline = blocks.init_pipeline(modular_repo_id)
|
||||||
|
|
||||||
pipeline.load_components(torch_dtype=torch.float16)
|
pipeline.load_default_components(torch_dtype=torch.float16)
|
||||||
pipeline.to("cuda")
|
pipeline.to("cuda")
|
||||||
|
|
||||||
img_url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/sdxl-text2img.png"
|
img_url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/sdxl-text2img.png"
|
||||||
@@ -176,15 +176,15 @@ diffdiff_pipeline = ModularPipeline.from_pretrained(modular_repo_id, trust_remot
|
|||||||
|
|
||||||
## Loading components
|
## Loading components
|
||||||
|
|
||||||
A [`ModularPipeline`] doesn't automatically instantiate with components. It only loads the configuration and component specifications. You can load all components with [`~ModularPipeline.load_components`] or only load specific components with [`~ModularPipeline.load_components`].
|
A [`ModularPipeline`] doesn't automatically instantiate with components. It only loads the configuration and component specifications. You can load all components with [`~ModularPipeline.load_default_components`] or only load specific components with [`~ModularPipeline.load_components`].
|
||||||
|
|
||||||
<hfoptions id="load">
|
<hfoptions id="load">
|
||||||
<hfoption id="load_components">
|
<hfoption id="load_default_components">
|
||||||
|
|
||||||
```py
|
```py
|
||||||
import torch
|
import torch
|
||||||
|
|
||||||
t2i_pipeline.load_components(torch_dtype=torch.float16)
|
t2i_pipeline.load_default_components(torch_dtype=torch.float16)
|
||||||
t2i_pipeline.to("cuda")
|
t2i_pipeline.to("cuda")
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -173,9 +173,9 @@ print(dd_blocks)
|
|||||||
|
|
||||||
## ModularPipeline
|
## ModularPipeline
|
||||||
|
|
||||||
Convert the [`SequentialPipelineBlocks`] into a [`ModularPipeline`] with the [`ModularPipeline.init_pipeline`] method. This initializes the expected components to load from a `modular_model_index.json` file. Explicitly load the components by calling [`ModularPipeline.load_components`].
|
Convert the [`SequentialPipelineBlocks`] into a [`ModularPipeline`] with the [`ModularPipeline.init_pipeline`] method. This initializes the expected components to load from a `modular_model_index.json` file. Explicitly load the components by calling [`ModularPipeline.load_default_components`].
|
||||||
|
|
||||||
It is a good idea to initialize the [`ComponentManager`] with the pipeline to help manage the different components. Once you call [`~ModularPipeline.load_components`], the components are registered to the [`ComponentManager`] and can be shared between workflows. The example below uses the `collection` argument to assign the components a `"diffdiff"` label for better organization.
|
It is a good idea to initialize the [`ComponentManager`] with the pipeline to help manage the different components. Once you call [`~ModularPipeline.load_default_components`], the components are registered to the [`ComponentManager`] and can be shared between workflows. The example below uses the `collection` argument to assign the components a `"diffdiff"` label for better organization.
|
||||||
|
|
||||||
```py
|
```py
|
||||||
from diffusers.modular_pipelines import ComponentsManager
|
from diffusers.modular_pipelines import ComponentsManager
|
||||||
@@ -209,11 +209,11 @@ Use the [`sub_blocks.insert`] method to insert it into the [`ModularPipeline`].
|
|||||||
dd_blocks.sub_blocks.insert("ip_adapter", ip_adapter_block, 0)
|
dd_blocks.sub_blocks.insert("ip_adapter", ip_adapter_block, 0)
|
||||||
```
|
```
|
||||||
|
|
||||||
Call [`~ModularPipeline.init_pipeline`] to initialize a [`ModularPipeline`] and use [`~ModularPipeline.load_components`] to load the model components. Load and set the IP-Adapter to run the pipeline.
|
Call [`~ModularPipeline.init_pipeline`] to initialize a [`ModularPipeline`] and use [`~ModularPipeline.load_default_components`] to load the model components. Load and set the IP-Adapter to run the pipeline.
|
||||||
|
|
||||||
```py
|
```py
|
||||||
dd_pipeline = dd_blocks.init_pipeline("YiYiXu/modular-demo-auto", collection="diffdiff")
|
dd_pipeline = dd_blocks.init_pipeline("YiYiXu/modular-demo-auto", collection="diffdiff")
|
||||||
dd_pipeline.load_components(torch_dtype=torch.float16)
|
dd_pipeline.load_default_components(torch_dtype=torch.float16)
|
||||||
dd_pipeline.loader.load_ip_adapter("h94/IP-Adapter", subfolder="sdxl_models", weight_name="ip-adapter_sdxl.bin")
|
dd_pipeline.loader.load_ip_adapter("h94/IP-Adapter", subfolder="sdxl_models", weight_name="ip-adapter_sdxl.bin")
|
||||||
dd_pipeline.loader.set_ip_adapter_scale(0.6)
|
dd_pipeline.loader.set_ip_adapter_scale(0.6)
|
||||||
dd_pipeline = dd_pipeline.to(device)
|
dd_pipeline = dd_pipeline.to(device)
|
||||||
@@ -260,14 +260,14 @@ class SDXLDiffDiffControlNetDenoiseStep(StableDiffusionXLDenoiseLoopWrapper):
|
|||||||
controlnet_denoise_block = SDXLDiffDiffControlNetDenoiseStep()
|
controlnet_denoise_block = SDXLDiffDiffControlNetDenoiseStep()
|
||||||
```
|
```
|
||||||
|
|
||||||
Insert the `controlnet_input` block and replace the `denoise` block with the new `controlnet_denoise_block`. Initialize a [`ModularPipeline`] and [`~ModularPipeline.load_components`] into it.
|
Insert the `controlnet_input` block and replace the `denoise` block with the new `controlnet_denoise_block`. Initialize a [`ModularPipeline`] and [`~ModularPipeline.load_default_components`] into it.
|
||||||
|
|
||||||
```py
|
```py
|
||||||
dd_blocks.sub_blocks.insert("controlnet_input", control_input_block, 7)
|
dd_blocks.sub_blocks.insert("controlnet_input", control_input_block, 7)
|
||||||
dd_blocks.sub_blocks["denoise"] = controlnet_denoise_block
|
dd_blocks.sub_blocks["denoise"] = controlnet_denoise_block
|
||||||
|
|
||||||
dd_pipeline = dd_blocks.init_pipeline("YiYiXu/modular-demo-auto", collection="diffdiff")
|
dd_pipeline = dd_blocks.init_pipeline("YiYiXu/modular-demo-auto", collection="diffdiff")
|
||||||
dd_pipeline.load_components(torch_dtype=torch.float16)
|
dd_pipeline.load_default_components(torch_dtype=torch.float16)
|
||||||
dd_pipeline = dd_pipeline.to(device)
|
dd_pipeline = dd_pipeline.to(device)
|
||||||
|
|
||||||
control_image = load_image("https://huggingface.co/datasets/YiYiXu/testing-images/resolve/main/diffdiff_tomato_canny.jpeg")
|
control_image = load_image("https://huggingface.co/datasets/YiYiXu/testing-images/resolve/main/diffdiff_tomato_canny.jpeg")
|
||||||
@@ -320,7 +320,7 @@ Call [`SequentialPipelineBlocks.from_blocks_dict`] to create a [`SequentialPipel
|
|||||||
```py
|
```py
|
||||||
dd_auto_blocks = SequentialPipelineBlocks.from_blocks_dict(DIFFDIFF_AUTO_BLOCKS)
|
dd_auto_blocks = SequentialPipelineBlocks.from_blocks_dict(DIFFDIFF_AUTO_BLOCKS)
|
||||||
dd_pipeline = dd_auto_blocks.init_pipeline("YiYiXu/modular-demo-auto", collection="diffdiff")
|
dd_pipeline = dd_auto_blocks.init_pipeline("YiYiXu/modular-demo-auto", collection="diffdiff")
|
||||||
dd_pipeline.load_components(torch_dtype=torch.float16)
|
dd_pipeline.load_default_components(torch_dtype=torch.float16)
|
||||||
```
|
```
|
||||||
|
|
||||||
## Share
|
## Share
|
||||||
@@ -340,5 +340,5 @@ from diffusers.modular_pipelines import ModularPipeline, ComponentsManager
|
|||||||
components = ComponentsManager()
|
components = ComponentsManager()
|
||||||
|
|
||||||
diffdiff_pipeline = ModularPipeline.from_pretrained("YiYiXu/modular-diffdiff-0704", trust_remote_code=True, components_manager=components, collection="diffdiff")
|
diffdiff_pipeline = ModularPipeline.from_pretrained("YiYiXu/modular-diffdiff-0704", trust_remote_code=True, components_manager=components, collection="diffdiff")
|
||||||
diffdiff_pipeline.load_components(torch_dtype=torch.float16)
|
diffdiff_pipeline.load_default_components(torch_dtype=torch.float16)
|
||||||
```
|
```
|
||||||
@@ -223,7 +223,7 @@ from diffusers.image_processor import VaeImageProcessor
|
|||||||
import torch
|
import torch
|
||||||
|
|
||||||
vae = AutoencoderKL.from_pretrained(ckpt_id, subfolder="vae", torch_dtype=torch.bfloat16).to("cuda")
|
vae = AutoencoderKL.from_pretrained(ckpt_id, subfolder="vae", torch_dtype=torch.bfloat16).to("cuda")
|
||||||
vae_scale_factor = 2 ** (len(vae.config.block_out_channels) - 1)
|
vae_scale_factor = 2 ** (len(vae.config.block_out_channels))
|
||||||
image_processor = VaeImageProcessor(vae_scale_factor=vae_scale_factor)
|
image_processor = VaeImageProcessor(vae_scale_factor=vae_scale_factor)
|
||||||
|
|
||||||
with torch.no_grad():
|
with torch.no_grad():
|
||||||
|
|||||||
@@ -48,10 +48,10 @@ t2i_pipeline = t2i_blocks.init_pipeline(modular_repo_id, components_manager=comp
|
|||||||
</hfoption>
|
</hfoption>
|
||||||
</hfoptions>
|
</hfoptions>
|
||||||
|
|
||||||
组件仅在调用 [`~ModularPipeline.load_components`] 或 [`~ModularPipeline.load_components`] 时加载和注册。以下示例使用 [`~ModularPipeline.load_components`] 创建第二个管道,重用第一个管道的所有组件,并将其分配到不同的集合。
|
组件仅在调用 [`~ModularPipeline.load_components`] 或 [`~ModularPipeline.load_default_components`] 时加载和注册。以下示例使用 [`~ModularPipeline.load_default_components`] 创建第二个管道,重用第一个管道的所有组件,并将其分配到不同的集合。
|
||||||
|
|
||||||
```py
|
```py
|
||||||
pipe.load_components()
|
pipe.load_default_components()
|
||||||
pipe2 = ModularPipeline.from_pretrained("YiYiXu/modular-demo-auto", components_manager=comp, collection="test2")
|
pipe2 = ModularPipeline.from_pretrained("YiYiXu/modular-demo-auto", components_manager=comp, collection="test2")
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -73,13 +73,13 @@ ComponentSpec(name='guider', type_hint=<class 'diffusers.guiders.perturbed_atten
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
引导器只有在调用 [`~ModularPipeline.load_components`] 之后才会创建,基于 `modular_model_index.json` 中的加载规范。
|
引导器只有在调用 [`~ModularPipeline.load_default_components`] 之后才会创建,基于 `modular_model_index.json` 中的加载规范。
|
||||||
|
|
||||||
```py
|
```py
|
||||||
t2i_pipeline = t2i_blocks.init_pipeline("YiYiXu/modular-doc-guider")
|
t2i_pipeline = t2i_blocks.init_pipeline("YiYiXu/modular-doc-guider")
|
||||||
# 在初始化时未创建
|
# 在初始化时未创建
|
||||||
assert t2i_pipeline.guider is None
|
assert t2i_pipeline.guider is None
|
||||||
t2i_pipeline.load_components()
|
t2i_pipeline.load_default_components()
|
||||||
# 加载为 PAG 引导器
|
# 加载为 PAG 引导器
|
||||||
t2i_pipeline.guider
|
t2i_pipeline.guider
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ blocks = SequentialPipelineBlocks.from_blocks_dict(TEXT2IMAGE_BLOCKS)
|
|||||||
modular_repo_id = "YiYiXu/modular-loader-t2i-0704"
|
modular_repo_id = "YiYiXu/modular-loader-t2i-0704"
|
||||||
pipeline = blocks.init_pipeline(modular_repo_id)
|
pipeline = blocks.init_pipeline(modular_repo_id)
|
||||||
|
|
||||||
pipeline.load_components(torch_dtype=torch.float16)
|
pipeline.load_default_components(torch_dtype=torch.float16)
|
||||||
pipeline.to("cuda")
|
pipeline.to("cuda")
|
||||||
|
|
||||||
image = pipeline(prompt="Astronaut in a jungle, cold color palette, muted colors, detailed, 8k", output="images")[0]
|
image = pipeline(prompt="Astronaut in a jungle, cold color palette, muted colors, detailed, 8k", output="images")[0]
|
||||||
@@ -48,7 +48,7 @@ blocks = SequentialPipelineBlocks.from_blocks_dict(IMAGE2IMAGE_BLOCKS)
|
|||||||
modular_repo_id = "YiYiXu/modular-loader-t2i-0704"
|
modular_repo_id = "YiYiXu/modular-loader-t2i-0704"
|
||||||
pipeline = blocks.init_pipeline(modular_repo_id)
|
pipeline = blocks.init_pipeline(modular_repo_id)
|
||||||
|
|
||||||
pipeline.load_components(torch_dtype=torch.float16)
|
pipeline.load_default_components(torch_dtype=torch.float16)
|
||||||
pipeline.to("cuda")
|
pipeline.to("cuda")
|
||||||
|
|
||||||
url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/sdxl-text2img.png"
|
url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/sdxl-text2img.png"
|
||||||
@@ -72,7 +72,7 @@ blocks = SequentialPipelineBlocks.from_blocks_dict(INPAINT_BLOCKS)
|
|||||||
modular_repo_id = "YiYiXu/modular-loader-t2i-0704"
|
modular_repo_id = "YiYiXu/modular-loader-t2i-0704"
|
||||||
pipeline = blocks.init_pipeline(modular_repo_id)
|
pipeline = blocks.init_pipeline(modular_repo_id)
|
||||||
|
|
||||||
pipeline.load_components(torch_dtype=torch.float16)
|
pipeline.load_default_components(torch_dtype=torch.float16)
|
||||||
pipeline.to("cuda")
|
pipeline.to("cuda")
|
||||||
|
|
||||||
img_url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/sdxl-text2img.png"
|
img_url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/sdxl-text2img.png"
|
||||||
@@ -176,15 +176,15 @@ diffdiff_pipeline = ModularPipeline.from_pretrained(modular_repo_id, trust_remot
|
|||||||
|
|
||||||
## 加载组件
|
## 加载组件
|
||||||
|
|
||||||
一个[`ModularPipeline`]不会自动实例化组件。它只加载配置和组件规范。您可以使用[`~ModularPipeline.load_components`]加载所有组件,或仅使用[`~ModularPipeline.load_components`]加载特定组件。
|
一个[`ModularPipeline`]不会自动实例化组件。它只加载配置和组件规范。您可以使用[`~ModularPipeline.load_default_components`]加载所有组件,或仅使用[`~ModularPipeline.load_components`]加载特定组件。
|
||||||
|
|
||||||
<hfoptions id="load">
|
<hfoptions id="load">
|
||||||
<hfoption id="load_components">
|
<hfoption id="load_default_components">
|
||||||
|
|
||||||
```py
|
```py
|
||||||
import torch
|
import torch
|
||||||
|
|
||||||
t2i_pipeline.load_components(torch_dtype=torch.float16)
|
t2i_pipeline.load_default_components(torch_dtype=torch.float16)
|
||||||
t2i_pipeline.to("cuda")
|
t2i_pipeline.to("cuda")
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -175,7 +175,7 @@ print(dd_blocks)
|
|||||||
将 [`SequentialPipelineBlocks`] 转换为 [`ModularPipeline`],使用 [`ModularPipeline.init_pipeline`] 方法。这会初始化从 `modular_model_index.json` 文件加载的预期组件。通过调用 [`ModularPipeline.load_defau
|
将 [`SequentialPipelineBlocks`] 转换为 [`ModularPipeline`],使用 [`ModularPipeline.init_pipeline`] 方法。这会初始化从 `modular_model_index.json` 文件加载的预期组件。通过调用 [`ModularPipeline.load_defau
|
||||||
lt_components`]。
|
lt_components`]。
|
||||||
|
|
||||||
初始化[`ComponentManager`]时传入pipeline是一个好主意,以帮助管理不同的组件。一旦调用[`~ModularPipeline.load_components`],组件就会被注册到[`ComponentManager`]中,并且可以在工作流之间共享。下面的例子使用`collection`参数为组件分配了一个`"diffdiff"`标签,以便更好地组织。
|
初始化[`ComponentManager`]时传入pipeline是一个好主意,以帮助管理不同的组件。一旦调用[`~ModularPipeline.load_default_components`],组件就会被注册到[`ComponentManager`]中,并且可以在工作流之间共享。下面的例子使用`collection`参数为组件分配了一个`"diffdiff"`标签,以便更好地组织。
|
||||||
|
|
||||||
```py
|
```py
|
||||||
from diffusers.modular_pipelines import ComponentsManager
|
from diffusers.modular_pipelines import ComponentsManager
|
||||||
@@ -209,11 +209,11 @@ ip_adapter_block = StableDiffusionXLAutoIPAdapterStep()
|
|||||||
dd_blocks.sub_blocks.insert("ip_adapter", ip_adapter_block, 0)
|
dd_blocks.sub_blocks.insert("ip_adapter", ip_adapter_block, 0)
|
||||||
```
|
```
|
||||||
|
|
||||||
调用[`~ModularPipeline.init_pipeline`]来初始化一个[`ModularPipeline`],并使用[`~ModularPipeline.load_components`]加载模型组件。加载并设置IP-Adapter以运行pipeline。
|
调用[`~ModularPipeline.init_pipeline`]来初始化一个[`ModularPipeline`],并使用[`~ModularPipeline.load_default_components`]加载模型组件。加载并设置IP-Adapter以运行pipeline。
|
||||||
|
|
||||||
```py
|
```py
|
||||||
dd_pipeline = dd_blocks.init_pipeline("YiYiXu/modular-demo-auto", collection="diffdiff")
|
dd_pipeline = dd_blocks.init_pipeline("YiYiXu/modular-demo-auto", collection="diffdiff")
|
||||||
dd_pipeline.load_components(torch_dtype=torch.float16)
|
dd_pipeline.load_default_components(torch_dtype=torch.float16)
|
||||||
dd_pipeline.loader.load_ip_adapter("h94/IP-Adapter", subfolder="sdxl_models", weight_name="ip-adapter_sdxl.bin")
|
dd_pipeline.loader.load_ip_adapter("h94/IP-Adapter", subfolder="sdxl_models", weight_name="ip-adapter_sdxl.bin")
|
||||||
dd_pipeline.loader.set_ip_adapter_scale(0.6)
|
dd_pipeline.loader.set_ip_adapter_scale(0.6)
|
||||||
dd_pipeline = dd_pipeline.to(device)
|
dd_pipeline = dd_pipeline.to(device)
|
||||||
@@ -261,14 +261,14 @@ class SDXLDiffDiffControlNetDenoiseStep(StableDiffusionXLDenoiseLoopWrapper):
|
|||||||
controlnet_denoise_block = SDXLDiffDiffControlNetDenoiseStep()
|
controlnet_denoise_block = SDXLDiffDiffControlNetDenoiseStep()
|
||||||
```
|
```
|
||||||
|
|
||||||
插入 `controlnet_input` 块并用新的 `controlnet_denoise_block` 替换 `denoise` 块。初始化一个 [`ModularPipeline`] 并将 [`~ModularPipeline.load_components`] 加载到其中。
|
插入 `controlnet_input` 块并用新的 `controlnet_denoise_block` 替换 `denoise` 块。初始化一个 [`ModularPipeline`] 并将 [`~ModularPipeline.load_default_components`] 加载到其中。
|
||||||
|
|
||||||
```py
|
```py
|
||||||
dd_blocks.sub_blocks.insert("controlnet_input", control_input_block, 7)
|
dd_blocks.sub_blocks.insert("controlnet_input", control_input_block, 7)
|
||||||
dd_blocks.sub_blocks["denoise"] = controlnet_denoise_block
|
dd_blocks.sub_blocks["denoise"] = controlnet_denoise_block
|
||||||
|
|
||||||
dd_pipeline = dd_blocks.init_pipeline("YiYiXu/modular-demo-auto", collection="diffdiff")
|
dd_pipeline = dd_blocks.init_pipeline("YiYiXu/modular-demo-auto", collection="diffdiff")
|
||||||
dd_pipeline.load_components(torch_dtype=torch.float16)
|
dd_pipeline.load_default_components(torch_dtype=torch.float16)
|
||||||
dd_pipeline = dd_pipeline.to(device)
|
dd_pipeline = dd_pipeline.to(device)
|
||||||
|
|
||||||
control_image = load_image("https://huggingface.co/datasets/YiYiXu/testing-images/resolve/main/diffdiff_tomato_canny.jpeg")
|
control_image = load_image("https://huggingface.co/datasets/YiYiXu/testing-images/resolve/main/diffdiff_tomato_canny.jpeg")
|
||||||
@@ -322,7 +322,7 @@ DIFFDIFF_AUTO_BLOCKS.insert("controlnet_input",StableDiffusionXLControlNetAutoIn
|
|||||||
```py
|
```py
|
||||||
dd_auto_blocks = SequentialPipelineBlocks.from_blocks_dict(DIFFDIFF_AUTO_BLOCKS)
|
dd_auto_blocks = SequentialPipelineBlocks.from_blocks_dict(DIFFDIFF_AUTO_BLOCKS)
|
||||||
dd_pipeline = dd_auto_blocks.init_pipeline("YiYiXu/modular-demo-auto", collection="diffdiff")
|
dd_pipeline = dd_auto_blocks.init_pipeline("YiYiXu/modular-demo-auto", collection="diffdiff")
|
||||||
dd_pipeline.load_components(torch_dtype=torch.float16)
|
dd_pipeline.load_default_components(torch_dtype=torch.float16)
|
||||||
```
|
```
|
||||||
|
|
||||||
## 分享
|
## 分享
|
||||||
@@ -342,5 +342,5 @@ from diffusers.modular_pipelines import ModularPipeline, ComponentsManager
|
|||||||
components = ComponentsManager()
|
components = ComponentsManager()
|
||||||
|
|
||||||
diffdiff_pipeline = ModularPipeline.from_pretrained("YiYiXu/modular-diffdiff-0704", trust_remote_code=True, components_manager=components, collection="diffdiff")
|
diffdiff_pipeline = ModularPipeline.from_pretrained("YiYiXu/modular-diffdiff-0704", trust_remote_code=True, components_manager=components, collection="diffdiff")
|
||||||
diffdiff_pipeline.load_components(torch_dtype=torch.float16)
|
diffdiff_pipeline.load_default_components(torch_dtype=torch.float16)
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -223,7 +223,7 @@ from diffusers.image_processor import VaeImageProcessor
|
|||||||
import torch
|
import torch
|
||||||
|
|
||||||
vae = AutoencoderKL.from_pretrained(ckpt_id, subfolder="vae", torch_dtype=torch.bfloat16).to("cuda")
|
vae = AutoencoderKL.from_pretrained(ckpt_id, subfolder="vae", torch_dtype=torch.bfloat16).to("cuda")
|
||||||
vae_scale_factor = 2 ** (len(vae.config.block_out_channels) - 1)
|
vae_scale_factor = 2 ** (len(vae.config.block_out_channels))
|
||||||
image_processor = VaeImageProcessor(vae_scale_factor=vae_scale_factor)
|
image_processor = VaeImageProcessor(vae_scale_factor=vae_scale_factor)
|
||||||
|
|
||||||
with torch.no_grad():
|
with torch.no_grad():
|
||||||
|
|||||||
@@ -1270,7 +1270,6 @@ def main(args):
|
|||||||
subfolder="transformer",
|
subfolder="transformer",
|
||||||
revision=args.revision,
|
revision=args.revision,
|
||||||
variant=args.variant,
|
variant=args.variant,
|
||||||
torch_dtype=torch_dtype,
|
|
||||||
)
|
)
|
||||||
pipeline = FluxKontextPipeline.from_pretrained(
|
pipeline = FluxKontextPipeline.from_pretrained(
|
||||||
args.pretrained_model_name_or_path,
|
args.pretrained_model_name_or_path,
|
||||||
@@ -1293,8 +1292,7 @@ def main(args):
|
|||||||
for example in tqdm(
|
for example in tqdm(
|
||||||
sample_dataloader, desc="Generating class images", disable=not accelerator.is_local_main_process
|
sample_dataloader, desc="Generating class images", disable=not accelerator.is_local_main_process
|
||||||
):
|
):
|
||||||
with torch.autocast(device_type=accelerator.device.type, dtype=torch_dtype):
|
images = pipeline(example["prompt"]).images
|
||||||
images = pipeline(prompt=example["prompt"]).images
|
|
||||||
|
|
||||||
for i, image in enumerate(images):
|
for i, image in enumerate(images):
|
||||||
hash_image = insecure_hashlib.sha1(image.tobytes()).hexdigest()
|
hash_image = insecure_hashlib.sha1(image.tobytes()).hexdigest()
|
||||||
@@ -1901,10 +1899,6 @@ def main(args):
|
|||||||
device=accelerator.device,
|
device=accelerator.device,
|
||||||
prompt=args.instance_prompt,
|
prompt=args.instance_prompt,
|
||||||
)
|
)
|
||||||
else:
|
|
||||||
prompt_embeds, pooled_prompt_embeds, text_ids = compute_text_embeddings(
|
|
||||||
prompts, text_encoders, tokenizers
|
|
||||||
)
|
|
||||||
|
|
||||||
# Convert images to latent space
|
# Convert images to latent space
|
||||||
if args.cache_latents:
|
if args.cache_latents:
|
||||||
|
|||||||
@@ -494,7 +494,6 @@ else:
|
|||||||
"PixArtSigmaPAGPipeline",
|
"PixArtSigmaPAGPipeline",
|
||||||
"PixArtSigmaPipeline",
|
"PixArtSigmaPipeline",
|
||||||
"QwenImageControlNetPipeline",
|
"QwenImageControlNetPipeline",
|
||||||
"QwenImageEditInpaintPipeline",
|
|
||||||
"QwenImageEditPipeline",
|
"QwenImageEditPipeline",
|
||||||
"QwenImageImg2ImgPipeline",
|
"QwenImageImg2ImgPipeline",
|
||||||
"QwenImageInpaintPipeline",
|
"QwenImageInpaintPipeline",
|
||||||
@@ -1135,7 +1134,6 @@ if TYPE_CHECKING or DIFFUSERS_SLOW_IMPORT:
|
|||||||
PixArtSigmaPAGPipeline,
|
PixArtSigmaPAGPipeline,
|
||||||
PixArtSigmaPipeline,
|
PixArtSigmaPipeline,
|
||||||
QwenImageControlNetPipeline,
|
QwenImageControlNetPipeline,
|
||||||
QwenImageEditInpaintPipeline,
|
|
||||||
QwenImageEditPipeline,
|
QwenImageEditPipeline,
|
||||||
QwenImageImg2ImgPipeline,
|
QwenImageImg2ImgPipeline,
|
||||||
QwenImageInpaintPipeline,
|
QwenImageInpaintPipeline,
|
||||||
|
|||||||
@@ -82,15 +82,15 @@ class AutoGuidance(BaseGuidance):
|
|||||||
self.guidance_rescale = guidance_rescale
|
self.guidance_rescale = guidance_rescale
|
||||||
self.use_original_formulation = use_original_formulation
|
self.use_original_formulation = use_original_formulation
|
||||||
|
|
||||||
is_layer_or_config_provided = auto_guidance_layers is not None or auto_guidance_config is not None
|
if auto_guidance_layers is None and auto_guidance_config is None:
|
||||||
is_layer_and_config_provided = auto_guidance_layers is not None and auto_guidance_config is not None
|
|
||||||
if not is_layer_or_config_provided:
|
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
"Either `auto_guidance_layers` or `auto_guidance_config` must be provided to enable AutoGuidance."
|
"Either `auto_guidance_layers` or `auto_guidance_config` must be provided to enable Skip Layer Guidance."
|
||||||
)
|
)
|
||||||
if is_layer_and_config_provided:
|
if auto_guidance_layers is not None and auto_guidance_config is not None:
|
||||||
raise ValueError("Only one of `auto_guidance_layers` or `auto_guidance_config` can be provided.")
|
raise ValueError("Only one of `auto_guidance_layers` or `auto_guidance_config` can be provided.")
|
||||||
if auto_guidance_config is None and dropout is None:
|
if (dropout is None and auto_guidance_layers is not None) or (
|
||||||
|
dropout is not None and auto_guidance_layers is None
|
||||||
|
):
|
||||||
raise ValueError("`dropout` must be provided if `auto_guidance_layers` is provided.")
|
raise ValueError("`dropout` must be provided if `auto_guidance_layers` is provided.")
|
||||||
|
|
||||||
if auto_guidance_layers is not None:
|
if auto_guidance_layers is not None:
|
||||||
|
|||||||
@@ -2129,10 +2129,6 @@ def _convert_non_diffusers_ltxv_lora_to_diffusers(state_dict, non_diffusers_pref
|
|||||||
|
|
||||||
|
|
||||||
def _convert_non_diffusers_qwen_lora_to_diffusers(state_dict):
|
def _convert_non_diffusers_qwen_lora_to_diffusers(state_dict):
|
||||||
has_diffusion_model = any(k.startswith("diffusion_model.") for k in state_dict)
|
|
||||||
if has_diffusion_model:
|
|
||||||
state_dict = {k.removeprefix("diffusion_model."): v for k, v in state_dict.items()}
|
|
||||||
|
|
||||||
has_lora_unet = any(k.startswith("lora_unet_") for k in state_dict)
|
has_lora_unet = any(k.startswith("lora_unet_") for k in state_dict)
|
||||||
if has_lora_unet:
|
if has_lora_unet:
|
||||||
state_dict = {k.removeprefix("lora_unet_"): v for k, v in state_dict.items()}
|
state_dict = {k.removeprefix("lora_unet_"): v for k, v in state_dict.items()}
|
||||||
@@ -2205,13 +2201,6 @@ def _convert_non_diffusers_qwen_lora_to_diffusers(state_dict):
|
|||||||
all_keys = list(state_dict.keys())
|
all_keys = list(state_dict.keys())
|
||||||
down_key = ".lora_down.weight"
|
down_key = ".lora_down.weight"
|
||||||
up_key = ".lora_up.weight"
|
up_key = ".lora_up.weight"
|
||||||
a_key = ".lora_A.weight"
|
|
||||||
b_key = ".lora_B.weight"
|
|
||||||
|
|
||||||
has_non_diffusers_lora_id = any(down_key in k or up_key in k for k in all_keys)
|
|
||||||
has_diffusers_lora_id = any(a_key in k or b_key in k for k in all_keys)
|
|
||||||
|
|
||||||
if has_non_diffusers_lora_id:
|
|
||||||
|
|
||||||
def get_alpha_scales(down_weight, alpha_key):
|
def get_alpha_scales(down_weight, alpha_key):
|
||||||
rank = down_weight.shape[0]
|
rank = down_weight.shape[0]
|
||||||
@@ -2236,14 +2225,6 @@ def _convert_non_diffusers_qwen_lora_to_diffusers(state_dict):
|
|||||||
converted_state_dict[diffusers_down_key] = down_weight * scale_down
|
converted_state_dict[diffusers_down_key] = down_weight * scale_down
|
||||||
converted_state_dict[diffusers_up_key] = up_weight * scale_up
|
converted_state_dict[diffusers_up_key] = up_weight * scale_up
|
||||||
|
|
||||||
# Already in diffusers format (lora_A/lora_B), just pop
|
|
||||||
elif has_diffusers_lora_id:
|
|
||||||
for k in all_keys:
|
|
||||||
if a_key in k or b_key in k:
|
|
||||||
converted_state_dict[k] = state_dict.pop(k)
|
|
||||||
elif ".alpha" in k:
|
|
||||||
state_dict.pop(k)
|
|
||||||
|
|
||||||
if len(state_dict) > 0:
|
if len(state_dict) > 0:
|
||||||
raise ValueError(f"`state_dict` should be empty at this point but has {state_dict.keys()=}")
|
raise ValueError(f"`state_dict` should be empty at this point but has {state_dict.keys()=}")
|
||||||
|
|
||||||
|
|||||||
@@ -6684,8 +6684,7 @@ class QwenImageLoraLoaderMixin(LoraBaseMixin):
|
|||||||
|
|
||||||
has_alphas_in_sd = any(k.endswith(".alpha") for k in state_dict)
|
has_alphas_in_sd = any(k.endswith(".alpha") for k in state_dict)
|
||||||
has_lora_unet = any(k.startswith("lora_unet_") for k in state_dict)
|
has_lora_unet = any(k.startswith("lora_unet_") for k in state_dict)
|
||||||
has_diffusion_model = any(k.startswith("diffusion_model.") for k in state_dict)
|
if has_alphas_in_sd or has_lora_unet:
|
||||||
if has_alphas_in_sd or has_lora_unet or has_diffusion_model:
|
|
||||||
state_dict = _convert_non_diffusers_qwen_lora_to_diffusers(state_dict)
|
state_dict = _convert_non_diffusers_qwen_lora_to_diffusers(state_dict)
|
||||||
|
|
||||||
out = (state_dict, metadata) if return_lora_metadata else state_dict
|
out = (state_dict, metadata) if return_lora_metadata else state_dict
|
||||||
|
|||||||
@@ -955,13 +955,12 @@ def _native_npu_attention(
|
|||||||
dropout_p: float = 0.0,
|
dropout_p: float = 0.0,
|
||||||
scale: Optional[float] = None,
|
scale: Optional[float] = None,
|
||||||
) -> torch.Tensor:
|
) -> torch.Tensor:
|
||||||
query, key, value = (x.transpose(1, 2).contiguous() for x in (query, key, value))
|
return npu_fusion_attention(
|
||||||
out = npu_fusion_attention(
|
|
||||||
query,
|
query,
|
||||||
key,
|
key,
|
||||||
value,
|
value,
|
||||||
query.size(1), # num_heads
|
query.size(2), # num_heads
|
||||||
input_layout="BNSD",
|
input_layout="BSND",
|
||||||
pse=None,
|
pse=None,
|
||||||
scale=1.0 / math.sqrt(query.shape[-1]) if scale is None else scale,
|
scale=1.0 / math.sqrt(query.shape[-1]) if scale is None else scale,
|
||||||
pre_tockens=65536,
|
pre_tockens=65536,
|
||||||
@@ -970,8 +969,6 @@ def _native_npu_attention(
|
|||||||
sync=False,
|
sync=False,
|
||||||
inner_precise=0,
|
inner_precise=0,
|
||||||
)[0]
|
)[0]
|
||||||
out = out.transpose(1, 2).contiguous()
|
|
||||||
return out
|
|
||||||
|
|
||||||
|
|
||||||
# Reference: https://github.com/pytorch/xla/blob/06c5533de6588f6b90aa1655d9850bcf733b90b4/torch_xla/experimental/custom_kernel.py#L853
|
# Reference: https://github.com/pytorch/xla/blob/06c5533de6588f6b90aa1655d9850bcf733b90b4/torch_xla/experimental/custom_kernel.py#L853
|
||||||
|
|||||||
@@ -299,7 +299,7 @@ class ModularPipelineBlocks(ConfigMixin, PushToHubMixin):
|
|||||||
def from_pretrained(
|
def from_pretrained(
|
||||||
cls,
|
cls,
|
||||||
pretrained_model_name_or_path: str,
|
pretrained_model_name_or_path: str,
|
||||||
trust_remote_code: bool = False,
|
trust_remote_code: Optional[bool] = None,
|
||||||
**kwargs,
|
**kwargs,
|
||||||
):
|
):
|
||||||
hub_kwargs_names = [
|
hub_kwargs_names = [
|
||||||
@@ -1418,7 +1418,7 @@ class LoopSequentialPipelineBlocks(ModularPipelineBlocks):
|
|||||||
# YiYi TODO:
|
# YiYi TODO:
|
||||||
# 1. look into the serialization of modular_model_index.json, make sure the items are properly ordered like model_index.json (currently a mess)
|
# 1. look into the serialization of modular_model_index.json, make sure the items are properly ordered like model_index.json (currently a mess)
|
||||||
# 2. do we need ConfigSpec? the are basically just key/val kwargs
|
# 2. do we need ConfigSpec? the are basically just key/val kwargs
|
||||||
# 3. imnprove docstring and potentially add validator for methods where we accpet kwargs to be passed to from_pretrained/save_pretrained/load_components()
|
# 3. imnprove docstring and potentially add validator for methods where we accpet kwargs to be passed to from_pretrained/save_pretrained/load_default_components(), load_components()
|
||||||
class ModularPipeline(ConfigMixin, PushToHubMixin):
|
class ModularPipeline(ConfigMixin, PushToHubMixin):
|
||||||
"""
|
"""
|
||||||
Base class for all Modular pipelines.
|
Base class for all Modular pipelines.
|
||||||
@@ -1488,7 +1488,7 @@ class ModularPipeline(ConfigMixin, PushToHubMixin):
|
|||||||
- Components with default_creation_method="from_config" are created immediately, its specs are not included
|
- Components with default_creation_method="from_config" are created immediately, its specs are not included
|
||||||
in config dict and will not be saved in `modular_model_index.json`
|
in config dict and will not be saved in `modular_model_index.json`
|
||||||
- Components with default_creation_method="from_pretrained" are set to None and can be loaded later with
|
- Components with default_creation_method="from_pretrained" are set to None and can be loaded later with
|
||||||
`load_components()` (with or without specific component names)
|
`load_default_components()`/`load_components()`
|
||||||
- The pipeline's config dict is populated with component specs (only for from_pretrained components) and
|
- The pipeline's config dict is populated with component specs (only for from_pretrained components) and
|
||||||
config values, which will be saved as `modular_model_index.json` during `save_pretrained`
|
config values, which will be saved as `modular_model_index.json` during `save_pretrained`
|
||||||
- The pipeline's config dict is also used to store the pipeline blocks's class name, which will be saved as
|
- The pipeline's config dict is also used to store the pipeline blocks's class name, which will be saved as
|
||||||
@@ -1603,6 +1603,20 @@ class ModularPipeline(ConfigMixin, PushToHubMixin):
|
|||||||
params[input_param.name] = input_param.default
|
params[input_param.name] = input_param.default
|
||||||
return params
|
return params
|
||||||
|
|
||||||
|
def load_default_components(self, **kwargs):
|
||||||
|
"""
|
||||||
|
Load from_pretrained components using the loading specs in the config dict.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
**kwargs: Additional arguments passed to `from_pretrained` method, e.g. torch_dtype, cache_dir, etc.
|
||||||
|
"""
|
||||||
|
names = [
|
||||||
|
name
|
||||||
|
for name in self._component_specs.keys()
|
||||||
|
if self._component_specs[name].default_creation_method == "from_pretrained"
|
||||||
|
]
|
||||||
|
self.load_components(names=names, **kwargs)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@validate_hf_hub_args
|
@validate_hf_hub_args
|
||||||
def from_pretrained(
|
def from_pretrained(
|
||||||
@@ -1756,8 +1770,8 @@ class ModularPipeline(ConfigMixin, PushToHubMixin):
|
|||||||
- non from_pretrained components are created during __init__ and registered as the object itself
|
- non from_pretrained components are created during __init__ and registered as the object itself
|
||||||
- Components are updated with the `update_components()` method: e.g. loader.update_components(unet=unet) or
|
- Components are updated with the `update_components()` method: e.g. loader.update_components(unet=unet) or
|
||||||
loader.update_components(guider=guider_spec)
|
loader.update_components(guider=guider_spec)
|
||||||
- (from_pretrained) Components are loaded with the `load_components()` method: e.g.
|
- (from_pretrained) Components are loaded with the `load_default_components()` method: e.g.
|
||||||
loader.load_components(names=["unet"]) or loader.load_components() to load all default components
|
loader.load_default_components(names=["unet"])
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
**kwargs: Keyword arguments where keys are component names and values are component objects.
|
**kwargs: Keyword arguments where keys are component names and values are component objects.
|
||||||
@@ -2083,14 +2097,13 @@ class ModularPipeline(ConfigMixin, PushToHubMixin):
|
|||||||
self.register_to_config(**config_to_register)
|
self.register_to_config(**config_to_register)
|
||||||
|
|
||||||
# YiYi TODO: support map for additional from_pretrained kwargs
|
# YiYi TODO: support map for additional from_pretrained kwargs
|
||||||
def load_components(self, names: Optional[Union[List[str], str]] = None, **kwargs):
|
# YiYi/Dhruv TODO: consolidate load_components and load_default_components?
|
||||||
|
def load_components(self, names: Union[List[str], str], **kwargs):
|
||||||
"""
|
"""
|
||||||
Load selected components from specs.
|
Load selected components from specs.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
names: List of component names to load. If None, will load all components with
|
names: List of component names to load; by default will not load any components
|
||||||
default_creation_method == "from_pretrained". If provided as a list or string, will load only the
|
|
||||||
specified components.
|
|
||||||
**kwargs: additional kwargs to be passed to `from_pretrained()`.Can be:
|
**kwargs: additional kwargs to be passed to `from_pretrained()`.Can be:
|
||||||
- a single value to be applied to all components to be loaded, e.g. torch_dtype=torch.bfloat16
|
- a single value to be applied to all components to be loaded, e.g. torch_dtype=torch.bfloat16
|
||||||
- a dict, e.g. torch_dtype={"unet": torch.bfloat16, "default": torch.float32}
|
- a dict, e.g. torch_dtype={"unet": torch.bfloat16, "default": torch.float32}
|
||||||
@@ -2098,13 +2111,7 @@ class ModularPipeline(ConfigMixin, PushToHubMixin):
|
|||||||
`variant`, `revision`, etc.
|
`variant`, `revision`, etc.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if names is None:
|
if isinstance(names, str):
|
||||||
names = [
|
|
||||||
name
|
|
||||||
for name in self._component_specs.keys()
|
|
||||||
if self._component_specs[name].default_creation_method == "from_pretrained"
|
|
||||||
]
|
|
||||||
elif isinstance(names, str):
|
|
||||||
names = [names]
|
names = [names]
|
||||||
elif not isinstance(names, list):
|
elif not isinstance(names, list):
|
||||||
raise ValueError(f"Invalid type for names: {type(names)}")
|
raise ValueError(f"Invalid type for names: {type(names)}")
|
||||||
|
|||||||
@@ -393,7 +393,6 @@ else:
|
|||||||
"QwenImageImg2ImgPipeline",
|
"QwenImageImg2ImgPipeline",
|
||||||
"QwenImageInpaintPipeline",
|
"QwenImageInpaintPipeline",
|
||||||
"QwenImageEditPipeline",
|
"QwenImageEditPipeline",
|
||||||
"QwenImageEditInpaintPipeline",
|
|
||||||
"QwenImageControlNetPipeline",
|
"QwenImageControlNetPipeline",
|
||||||
]
|
]
|
||||||
try:
|
try:
|
||||||
@@ -715,7 +714,6 @@ if TYPE_CHECKING or DIFFUSERS_SLOW_IMPORT:
|
|||||||
from .pixart_alpha import PixArtAlphaPipeline, PixArtSigmaPipeline
|
from .pixart_alpha import PixArtAlphaPipeline, PixArtSigmaPipeline
|
||||||
from .qwenimage import (
|
from .qwenimage import (
|
||||||
QwenImageControlNetPipeline,
|
QwenImageControlNetPipeline,
|
||||||
QwenImageEditInpaintPipeline,
|
|
||||||
QwenImageEditPipeline,
|
QwenImageEditPipeline,
|
||||||
QwenImageImg2ImgPipeline,
|
QwenImageImg2ImgPipeline,
|
||||||
QwenImageInpaintPipeline,
|
QwenImageInpaintPipeline,
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ else:
|
|||||||
_import_structure["pipeline_qwenimage"] = ["QwenImagePipeline"]
|
_import_structure["pipeline_qwenimage"] = ["QwenImagePipeline"]
|
||||||
_import_structure["pipeline_qwenimage_controlnet"] = ["QwenImageControlNetPipeline"]
|
_import_structure["pipeline_qwenimage_controlnet"] = ["QwenImageControlNetPipeline"]
|
||||||
_import_structure["pipeline_qwenimage_edit"] = ["QwenImageEditPipeline"]
|
_import_structure["pipeline_qwenimage_edit"] = ["QwenImageEditPipeline"]
|
||||||
_import_structure["pipeline_qwenimage_edit_inpaint"] = ["QwenImageEditInpaintPipeline"]
|
|
||||||
_import_structure["pipeline_qwenimage_img2img"] = ["QwenImageImg2ImgPipeline"]
|
_import_structure["pipeline_qwenimage_img2img"] = ["QwenImageImg2ImgPipeline"]
|
||||||
_import_structure["pipeline_qwenimage_inpaint"] = ["QwenImageInpaintPipeline"]
|
_import_structure["pipeline_qwenimage_inpaint"] = ["QwenImageInpaintPipeline"]
|
||||||
|
|
||||||
@@ -40,7 +39,6 @@ if TYPE_CHECKING or DIFFUSERS_SLOW_IMPORT:
|
|||||||
from .pipeline_qwenimage import QwenImagePipeline
|
from .pipeline_qwenimage import QwenImagePipeline
|
||||||
from .pipeline_qwenimage_controlnet import QwenImageControlNetPipeline
|
from .pipeline_qwenimage_controlnet import QwenImageControlNetPipeline
|
||||||
from .pipeline_qwenimage_edit import QwenImageEditPipeline
|
from .pipeline_qwenimage_edit import QwenImageEditPipeline
|
||||||
from .pipeline_qwenimage_edit_inpaint import QwenImageEditInpaintPipeline
|
|
||||||
from .pipeline_qwenimage_img2img import QwenImageImg2ImgPipeline
|
from .pipeline_qwenimage_img2img import QwenImageImg2ImgPipeline
|
||||||
from .pipeline_qwenimage_inpaint import QwenImageInpaintPipeline
|
from .pipeline_qwenimage_inpaint import QwenImageInpaintPipeline
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -551,12 +551,6 @@ class QwenImageEditPipeline(DiffusionPipeline, QwenImageLoraLoaderMixin):
|
|||||||
Function invoked when calling the pipeline for generation.
|
Function invoked when calling the pipeline for generation.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
image (`torch.Tensor`, `PIL.Image.Image`, `np.ndarray`, `List[torch.Tensor]`, `List[PIL.Image.Image]`, or `List[np.ndarray]`):
|
|
||||||
`Image`, numpy array or tensor representing an image batch to be used as the starting point. For both
|
|
||||||
numpy array and pytorch tensor, the expected value range is between `[0, 1]` If it's a tensor or a list
|
|
||||||
or tensors, the expected shape should be `(B, C, H, W)` or `(C, H, W)`. If it is a numpy array or a
|
|
||||||
list of arrays, the expected shape should be `(B, H, W, C)` or `(H, W, C)` It can also accept image
|
|
||||||
latents as `image`, but if passing latents directly it is not encoded again.
|
|
||||||
prompt (`str` or `List[str]`, *optional*):
|
prompt (`str` or `List[str]`, *optional*):
|
||||||
The prompt or prompts to guide the image generation. If not defined, one has to pass `prompt_embeds`.
|
The prompt or prompts to guide the image generation. If not defined, one has to pass `prompt_embeds`.
|
||||||
instead.
|
instead.
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -45,7 +45,6 @@ DIFFUSERS_ATTN_BACKEND = os.getenv("DIFFUSERS_ATTN_BACKEND", "native")
|
|||||||
DIFFUSERS_ATTN_CHECKS = os.getenv("DIFFUSERS_ATTN_CHECKS", "0") in ENV_VARS_TRUE_VALUES
|
DIFFUSERS_ATTN_CHECKS = os.getenv("DIFFUSERS_ATTN_CHECKS", "0") in ENV_VARS_TRUE_VALUES
|
||||||
DEFAULT_HF_PARALLEL_LOADING_WORKERS = 8
|
DEFAULT_HF_PARALLEL_LOADING_WORKERS = 8
|
||||||
HF_ENABLE_PARALLEL_LOADING = os.environ.get("HF_ENABLE_PARALLEL_LOADING", "").upper() in ENV_VARS_TRUE_VALUES
|
HF_ENABLE_PARALLEL_LOADING = os.environ.get("HF_ENABLE_PARALLEL_LOADING", "").upper() in ENV_VARS_TRUE_VALUES
|
||||||
DIFFUSERS_DISABLE_REMOTE_CODE = os.getenv("DIFFUSERS_DISABLE_REMOTE_CODE", "false").lower() in ENV_VARS_TRUE_VALUES
|
|
||||||
|
|
||||||
# Below should be `True` if the current version of `peft` and `transformers` are compatible with
|
# Below should be `True` if the current version of `peft` and `transformers` are compatible with
|
||||||
# PEFT backend. Will automatically fall back to PEFT backend if the correct versions of the libraries are
|
# PEFT backend. Will automatically fall back to PEFT backend if the correct versions of the libraries are
|
||||||
|
|||||||
@@ -1772,21 +1772,6 @@ class QwenImageControlNetPipeline(metaclass=DummyObject):
|
|||||||
requires_backends(cls, ["torch", "transformers"])
|
requires_backends(cls, ["torch", "transformers"])
|
||||||
|
|
||||||
|
|
||||||
class QwenImageEditInpaintPipeline(metaclass=DummyObject):
|
|
||||||
_backends = ["torch", "transformers"]
|
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
requires_backends(self, ["torch", "transformers"])
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def from_config(cls, *args, **kwargs):
|
|
||||||
requires_backends(cls, ["torch", "transformers"])
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def from_pretrained(cls, *args, **kwargs):
|
|
||||||
requires_backends(cls, ["torch", "transformers"])
|
|
||||||
|
|
||||||
|
|
||||||
class QwenImageEditPipeline(metaclass=DummyObject):
|
class QwenImageEditPipeline(metaclass=DummyObject):
|
||||||
_backends = ["torch", "transformers"]
|
_backends = ["torch", "transformers"]
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import json
|
|||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import shutil
|
import shutil
|
||||||
|
import signal
|
||||||
import sys
|
import sys
|
||||||
import threading
|
import threading
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
@@ -33,7 +34,6 @@ from packaging import version
|
|||||||
|
|
||||||
from .. import __version__
|
from .. import __version__
|
||||||
from . import DIFFUSERS_DYNAMIC_MODULE_NAME, HF_MODULES_CACHE, logging
|
from . import DIFFUSERS_DYNAMIC_MODULE_NAME, HF_MODULES_CACHE, logging
|
||||||
from .constants import DIFFUSERS_DISABLE_REMOTE_CODE
|
|
||||||
|
|
||||||
|
|
||||||
logger = logging.get_logger(__name__) # pylint: disable=invalid-name
|
logger = logging.get_logger(__name__) # pylint: disable=invalid-name
|
||||||
@@ -159,25 +159,52 @@ def check_imports(filename):
|
|||||||
return get_relative_imports(filename)
|
return get_relative_imports(filename)
|
||||||
|
|
||||||
|
|
||||||
def resolve_trust_remote_code(trust_remote_code, model_name, has_remote_code):
|
def _raise_timeout_error(signum, frame):
|
||||||
trust_remote_code = trust_remote_code and not DIFFUSERS_DISABLE_REMOTE_CODE
|
raise ValueError(
|
||||||
if DIFFUSERS_DISABLE_REMOTE_CODE:
|
"Loading this model requires you to execute custom code contained in the model repository on your local "
|
||||||
logger.warning(
|
"machine. Please set the option `trust_remote_code=True` to permit loading of this model."
|
||||||
"Downloading remote code is disabled globally via the DIFFUSERS_DISABLE_REMOTE_CODE environment variable. Ignoring `trust_remote_code`."
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def resolve_trust_remote_code(trust_remote_code, model_name, has_remote_code):
|
||||||
|
if trust_remote_code is None:
|
||||||
|
if has_remote_code and TIME_OUT_REMOTE_CODE > 0:
|
||||||
|
prev_sig_handler = None
|
||||||
|
try:
|
||||||
|
prev_sig_handler = signal.signal(signal.SIGALRM, _raise_timeout_error)
|
||||||
|
signal.alarm(TIME_OUT_REMOTE_CODE)
|
||||||
|
while trust_remote_code is None:
|
||||||
|
answer = input(
|
||||||
|
f"The repository for {model_name} contains custom code which must be executed to correctly "
|
||||||
|
f"load the model. You can inspect the repository content at https://hf.co/{model_name}.\n"
|
||||||
|
f"You can avoid this prompt in future by passing the argument `trust_remote_code=True`.\n\n"
|
||||||
|
f"Do you wish to run the custom code? [y/N] "
|
||||||
|
)
|
||||||
|
if answer.lower() in ["yes", "y", "1"]:
|
||||||
|
trust_remote_code = True
|
||||||
|
elif answer.lower() in ["no", "n", "0", ""]:
|
||||||
|
trust_remote_code = False
|
||||||
|
signal.alarm(0)
|
||||||
|
except Exception:
|
||||||
|
# OS which does not support signal.SIGALRM
|
||||||
|
raise ValueError(
|
||||||
|
f"The repository for {model_name} contains custom code which must be executed to correctly "
|
||||||
|
f"load the model. You can inspect the repository content at https://hf.co/{model_name}.\n"
|
||||||
|
f"Please pass the argument `trust_remote_code=True` to allow custom code to be run."
|
||||||
|
)
|
||||||
|
finally:
|
||||||
|
if prev_sig_handler is not None:
|
||||||
|
signal.signal(signal.SIGALRM, prev_sig_handler)
|
||||||
|
signal.alarm(0)
|
||||||
|
elif has_remote_code:
|
||||||
|
# For the CI which puts the timeout at 0
|
||||||
|
_raise_timeout_error(None, None)
|
||||||
|
|
||||||
if has_remote_code and not trust_remote_code:
|
if has_remote_code and not trust_remote_code:
|
||||||
error_msg = f"The repository for {model_name} contains custom code. "
|
raise ValueError(
|
||||||
error_msg += (
|
f"Loading {model_name} requires you to execute the configuration file in that"
|
||||||
"Downloading remote code is disabled globally via the DIFFUSERS_DISABLE_REMOTE_CODE environment variable."
|
" repo on your local machine. Make sure you have read the code there to avoid malicious use, then"
|
||||||
if DIFFUSERS_DISABLE_REMOTE_CODE
|
" set the option `trust_remote_code=True` to remove this error."
|
||||||
else "Pass `trust_remote_code=True` to allow loading remote code modules."
|
|
||||||
)
|
|
||||||
raise ValueError(error_msg)
|
|
||||||
|
|
||||||
elif has_remote_code and trust_remote_code:
|
|
||||||
logger.warning(
|
|
||||||
f"`trust_remote_code` is enabled. Downloading code from {model_name}. Please ensure you trust the contents of this repository"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
return trust_remote_code
|
return trust_remote_code
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ class SDXLModularTests:
|
|||||||
|
|
||||||
def get_pipeline(self, components_manager=None, torch_dtype=torch.float32):
|
def get_pipeline(self, components_manager=None, torch_dtype=torch.float32):
|
||||||
pipeline = self.pipeline_blocks_class().init_pipeline(self.repo, components_manager=components_manager)
|
pipeline = self.pipeline_blocks_class().init_pipeline(self.repo, components_manager=components_manager)
|
||||||
pipeline.load_components(torch_dtype=torch_dtype)
|
pipeline.load_default_components(torch_dtype=torch_dtype)
|
||||||
return pipeline
|
return pipeline
|
||||||
|
|
||||||
def get_dummy_inputs(self, device, seed=0):
|
def get_dummy_inputs(self, device, seed=0):
|
||||||
@@ -158,7 +158,7 @@ class SDXLModularIPAdapterTests:
|
|||||||
blocks = self.pipeline_blocks_class()
|
blocks = self.pipeline_blocks_class()
|
||||||
_ = blocks.sub_blocks.pop("ip_adapter")
|
_ = blocks.sub_blocks.pop("ip_adapter")
|
||||||
pipe = blocks.init_pipeline(self.repo)
|
pipe = blocks.init_pipeline(self.repo)
|
||||||
pipe.load_components(torch_dtype=torch.float32)
|
pipe.load_default_components(torch_dtype=torch.float32)
|
||||||
pipe = pipe.to(torch_device)
|
pipe = pipe.to(torch_device)
|
||||||
pipe.set_progress_bar_config(disable=None)
|
pipe.set_progress_bar_config(disable=None)
|
||||||
cross_attention_dim = pipe.unet.config.get("cross_attention_dim")
|
cross_attention_dim = pipe.unet.config.get("cross_attention_dim")
|
||||||
|
|||||||
@@ -344,7 +344,7 @@ class ModularPipelineTesterMixin:
|
|||||||
with tempfile.TemporaryDirectory() as tmpdirname:
|
with tempfile.TemporaryDirectory() as tmpdirname:
|
||||||
base_pipe.save_pretrained(tmpdirname)
|
base_pipe.save_pretrained(tmpdirname)
|
||||||
pipe = ModularPipeline.from_pretrained(tmpdirname).to(torch_device)
|
pipe = ModularPipeline.from_pretrained(tmpdirname).to(torch_device)
|
||||||
pipe.load_components(torch_dtype=torch.float32)
|
pipe.load_default_components(torch_dtype=torch.float32)
|
||||||
pipe.to(torch_device)
|
pipe.to(torch_device)
|
||||||
|
|
||||||
pipes.append(pipe)
|
pipes.append(pipe)
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ from ...testing_utils import (
|
|||||||
nightly,
|
nightly,
|
||||||
numpy_cosine_similarity_distance,
|
numpy_cosine_similarity_distance,
|
||||||
require_accelerate,
|
require_accelerate,
|
||||||
require_accelerator,
|
require_big_accelerator,
|
||||||
require_torch_cuda_compatibility,
|
require_torch_cuda_compatibility,
|
||||||
torch_device,
|
torch_device,
|
||||||
)
|
)
|
||||||
@@ -31,7 +31,7 @@ enable_full_determinism()
|
|||||||
|
|
||||||
|
|
||||||
@nightly
|
@nightly
|
||||||
@require_accelerator
|
@require_big_accelerator
|
||||||
@require_accelerate
|
@require_accelerate
|
||||||
class QuantoBaseTesterMixin:
|
class QuantoBaseTesterMixin:
|
||||||
model_id = None
|
model_id = None
|
||||||
|
|||||||
Reference in New Issue
Block a user