-
Notifications
You must be signed in to change notification settings - Fork 6.4k
The Modular Diffusers #9672
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
The Modular Diffusers #9672
Changes from 163 commits
Commits
Show all changes
188 commits
Select commit
Hold shift + click to select a range
33f85fa
add
yiyixuxu 52a7f1c
add dataflow info for each block in builder _repr_
yiyixuxu e8d0980
add img2img support - output does not match with non-modular pipeline…
yiyixuxu ad3f9a2
update img2img, result match
yiyixuxu ddea157
add from_pipe + run_blocks
yiyixuxu af9572d
controlnet
yiyixuxu 2b6dcbf
fix controlnet
yiyixuxu 70272b1
combine controlnetstep into contronetdesnoisestep
yiyixuxu 46ec174
refactor guider, remove prepareguidance step to be combinedd into den…
yiyixuxu f1b3036
update pag guider - draft
yiyixuxu 540d303
refactor guider
yiyixuxu 6742f16
up
yiyixuxu 005195c
add
yiyixuxu 024a9f5
fix so that run_blocks can work with inputs in the state
yiyixuxu 37e8dc7
remove img2img blocksgit status consolidate text2img and img2img
yiyixuxu 8b811fe
refactor, from_pretrained, from_pipe, remove_blocks, replace_blocks
yiyixuxu c70a285
style
yiyixuxu ffc2992
add autostep (not complete)
yiyixuxu ace53e2
update/refactor
yiyixuxu a8df0f1
Modular APG (#10173)
hlky e50d614
only add model as expected_component when the model need to run for t…
yiyixuxu bc3d1c9
add model_cpu_offload_seq + _exlude_from_cpu_offload
yiyixuxu 2b3cd2d
update
yiyixuxu b305c77
add offload support!
yiyixuxu 0b90051
add vae encoder node
yiyixuxu 806e8e6
Merge branch 'main' into modular-diffusers
yiyixuxu 4fa85c7
add model_manager and global offloading method
yiyixuxu 72d9a81
components manager
yiyixuxu 10d4a77
style
yiyixuxu 27dde51
add output arg to run_blocks
yiyixuxu 8c02572
add memory_reserve_margin arg to auto offload
yiyixuxu a09ca7f
refactors: block __init__ no longer accept args. remove update_state…
yiyixuxu ed59f90
modular pipeline builder -> ModularPipeline
yiyixuxu 72c5bf0
add a from_block class method to modular pipeline
yiyixuxu 6c93626
remove run_blocks, just use __call__
yiyixuxu 1d63306
make it work with lora
yiyixuxu 2e0f5c8
start to add inpaint
yiyixuxu c12a05b
update to to not assume pipeline has hf_device_map
yiyixuxu 54f410d
add inpaint
yiyixuxu 6985906
controlnet input & remove the MultiPipelineBlocks class
yiyixuxu db94ca8
add controlnet inpaint + more refactor
yiyixuxu e973de6
fix contro;net inpaint preprocess
yiyixuxu 7a34832
[modular] Stable Diffusion XL ControlNet Union (#10509)
hlky 2220af6
refactor
yiyixuxu fb78f4f
Merge branch 'modular-diffusers' of github.com:huggingface/diffusers …
yiyixuxu 0966663
adjust print
yiyixuxu 7f897a9
fix
yiyixuxu a6804de
add controlnet union to auto & fix for pag
yiyixuxu 7007f72
InputParam, OutputParam, get_auto_doc
yiyixuxu a226920
get_block_state make it less verbose
yiyixuxu 77b5fa5
make it work with lora has both text_encoder & unet
yiyixuxu 6e2fe26
fix more for lora
yiyixuxu 68a5185
refactor more, ipadapter node, lora node
yiyixuxu d046cf7
block state + fix for num_images_per_prompt > 1 for denoise/controlne…
yiyixuxu 71df158
Update src/diffusers/pipelines/stable_diffusion_xl/pipeline_stable_di…
yiyixuxu b3fb418
Merge branch 'modular-diffusers' of github.com:huggingface/diffusers …
yiyixuxu 00cae4e
docstring doc doc doc
yiyixuxu ccb35ac
Merge branch 'main' into modular-diffusers
yiyixuxu 00a3bc9
fix
yiyixuxu 4bed3e3
up up
yiyixuxu c7020df
add model_info
yiyixuxu 2c3e4ea
fix
yiyixuxu e5089d7
update
yiyixuxu 8ddb20b
up
yiyixuxu cff0fd6
more refactor
yiyixuxu 485f8d1
more refactor
yiyixuxu addaad0
more more more refactor
yiyixuxu 12650e1
up
yiyixuxu 96795af
Merge branch 'main' into modular-diffusers
yiyixuxu 6a509ba
Merge branch 'main' into modular-diffusers
yiyixuxu a8e853b
[modular diffusers] more refactor (#11235)
yiyixuxu 7ad01a6
rename modular_pipeline_block_mappings.py to modular_block_mapping
yiyixuxu 5a8c1b5
add block mappings to modular_diffusers.stable_diffusion_xl.__init__
yiyixuxu 8913d59
add to method to modular loader, copied from DiffusionPipeline, not t…
yiyixuxu 45392cc
update the description of StableDiffusionXLDenoiseLoopWrapper
yiyixuxu 9e58856
add __repr__ method for InsertableOrderedDict
yiyixuxu 04c16d0
update
yiyixuxu 083479c
ordereddict -> insertableOrderedDict; make sure loader to method works
yiyixuxu 4751d45
shorten loop subblock name
yiyixuxu d12531d
lora: only remove hooks that we add back
yiyixuxu 19545fd
update components manager __repr__
yiyixuxu 78d2454
fix
yiyixuxu 085ade0
add doc (developer guide)
yiyixuxu 42c06e9
update doc
yiyixuxu 1ae591e
update code format
yiyixuxu bb40443
up
yiyixuxu 7c78fb1
add a overview doc page
yiyixuxu 48e4ff5
update overview
yiyixuxu e49413d
update doc
yiyixuxu ffbaa89
move save_pretrained to the correct place
yiyixuxu cdaaa40
update ComponentSpec.from_component, only update config if it is crea…
yiyixuxu 1c9f0a8
ujpdate toctree
yiyixuxu 174628e
Merge branch 'main' into modular-diffusers
yiyixuxu c0327e4
update init
yiyixuxu 5917d70
remove lora related changes
yiyixuxu 8c038f0
Update src/diffusers/loaders/lora_base.py
yiyixuxu cb328d3
Apply suggestions from code review
yiyixuxu 7d2a633
style
yiyixuxu 74b908b
style
yiyixuxu 9530245
correct code format
yiyixuxu c437ae7
copies
yiyixuxu f3453f0
copy
yiyixuxu a82e211
style
yiyixuxu a33206d
fix
yiyixuxu 75e6238
revert changes in pipelines.stable_diffusion_xl folder, can seperate …
yiyixuxu 129d658
oops, fix
yiyixuxu da4242d
use diffusers ModelHook, raise a import error for accelerate inside e…
yiyixuxu ab6d634
style
yiyixuxu 7492e33
fix
yiyixuxu b92cda2
move quicktour to first page
yiyixuxu 61772f0
updatee a comment
yiyixuxu 9abac85
remove mapping file, move to preeset.py
yiyixuxu 84f4b27
modular_pipeline_presets.py -> modular_blocks_presets.py
yiyixuxu 449f299
move all the sequential pipelines & auto pipelines to the blocks_pres…
yiyixuxu 7608d2e
style
yiyixuxu f63d62e
intermediates_inputs -> intermediate_inputs; component_manager -> com…
yiyixuxu 655512e
components manager: change get -> search_models; add get_ids, get_com…
yiyixuxu 885a596
blocks -> sub_blocks; will not by default load all; add load_default…
yiyixuxu b543bcc
docstring blocks -> sub_blocks
yiyixuxu 75540f4
more blocks -> sub_blocks
yiyixuxu 93760b1
InsertableOrderedDict -> InsertableDict
yiyixuxu 9aaec5b
up
yiyixuxu 58dbe0c
finimsh the quickstart!
yiyixuxu 49ea4d1
style
yiyixuxu 92b6b43
add some visuals
yiyixuxu 8c680bc
up
yiyixuxu fedaa00
Merge branch 'main' into modular-diffusers
yiyixuxu fdd2bed
2024 -> 2025; fix a circular import
yiyixuxu 3a3441c
start the write your own pipeline block tutorial
yiyixuxu 9fae382
Apply suggestions from code review
yiyixuxu b43e703
Update docs/source/en/modular_diffusers/write_own_pipeline_block.md
yiyixuxu c75b88f
up
yiyixuxu 285f877
make InsertableDict importable from modular_pipelines
yiyixuxu f09b1cc
start the section on sequential pipelines
yiyixuxu c5849ba
more
yiyixuxu 363737e
add loop sequential blocks
yiyixuxu bbd9340
up
yiyixuxu 0138e17
remove the get_exeuction_blocks rec from AutoPipelineBlocks repr
yiyixuxu db4b54c
finish the autopipelines section!
yiyixuxu abf28d5
update
yiyixuxu 4b12a60
Merge branch 'main' into modular-diffusers
yiyixuxu f27fbce
more attemp to fix circular import
yiyixuxu 98ea5c9
Merge branch 'modular-diffusers' of github.com:huggingface/diffusers …
yiyixuxu b5db8aa
developer_guide -> end-to-end guide
yiyixuxu 4543d21
rename quick start- it is really not quick
yiyixuxu 1987c07
update docstree
yiyixuxu 2e20241
up up
yiyixuxu 13fe248
add modularpipelineblocks to be pushtohub mixin
yiyixuxu 8cb5b08
up upup
yiyixuxu 3e46c86
fix links in the doc
yiyixuxu 13c51bb
Modular PAG Guider (#11860)
a-r-r-o-w b750c69
Modular Guider ConfigMixin (#11862)
a-r-r-o-w 284f827
Modular custom config object serialization (#11868)
a-r-r-o-w 2c66fb3
Apply suggestions from code review
yiyixuxu 63e94cb
resolve conflicnt
yiyixuxu 4f8b6f5
style + copy
yiyixuxu 23de59e
add sub_blocks for pipelineBlock
yiyixuxu 7cea9a3
add a guider section on doc
yiyixuxu 0a4819a
add sub_folder to save_pretrained() for config mixin
yiyixuxu 229c4b3
add from_pretrained/save_pretrained for guider
yiyixuxu 179d6d9
add subfolder to push_to_hub
yiyixuxu 5af003a
update from_componeenet, update_component
yiyixuxu 0fcdd69
style
yiyixuxu ceeb3c1
fix
yiyixuxu 0fcce2a
Merge branch 'main' into modular-diffusers
yiyixuxu 6521f59
make sure modularpipeline from_pretrained works without modular_model…
yiyixuxu e0083b2
Merge branch 'modular-diffusers' of github.com:huggingface/diffusers …
yiyixuxu 863c7df
components manager: use shorter ID, display id instead of name
yiyixuxu a2da000
add a guide on components manager
yiyixuxu be5e10a
Copied-from implementation of PAG-guider (#11882)
a-r-r-o-w 04171c7
Merge branch 'modular-diffusers' of github.com:huggingface/diffusers …
yiyixuxu e6ffde2
Apply suggestions from code review
yiyixuxu 5f3ebef
update remove duplicated config for pag, and remove the description o…
yiyixuxu 59abd95
add link to components manager doc
yiyixuxu f95c320
addreess more review comments
yiyixuxu 79166dc
Merge branch 'main' into modular-diffusers
yiyixuxu cb9dca5
add experimental marks to all modular docs
yiyixuxu d27b654
add more docstrings + experimental marks
yiyixuxu 595581d
style
yiyixuxu 73c5fe8
Merge branch 'modular-diffusers' of github.com:huggingface/diffusers …
yiyixuxu de7cdf6
Merge modular diffusers with main (#11893)
a-r-r-o-w a935bea
big doc updategit status!
yiyixuxu 2b006a2
Merge branch 'modular-diffusers' of github.com:huggingface/diffusers …
yiyixuxu 9106f9c
Merge branch 'main' into modular-diffusers
a-r-r-o-w cf0f8e5
Merge branch 'main' into modular-diffusers
a-r-r-o-w 2104bef
update more modular pipeline doc
yiyixuxu 65ba892
update doc
yiyixuxu 01300a3
up
yiyixuxu File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Large diffs are not rendered by default.
Oops, something went wrong.
1,620 changes: 1,620 additions & 0 deletions
1,620
docs/source/en/modular_diffusers/getting_started.md
Large diffs are not rendered by default.
Oops, something went wrong.
811 changes: 811 additions & 0 deletions
811
docs/source/en/modular_diffusers/write_own_pipeline_block.md
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,134 @@ | ||
| # Copyright 2025 The HuggingFace Team. All rights reserved. | ||
| # | ||
| # Licensed under the Apache License, Version 2.0 (the "License"); | ||
| # you may not use this file except in compliance with the License. | ||
| # You may obtain a copy of the License at | ||
| # | ||
| # http://www.apache.org/licenses/LICENSE-2.0 | ||
| # | ||
| # Unless required by applicable law or agreed to in writing, software | ||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| # See the License for the specific language governing permissions and | ||
| # limitations under the License. | ||
|
|
||
| """ | ||
| Usage example: | ||
| TODO | ||
| """ | ||
|
|
||
| import ast | ||
| import importlib.util | ||
| import os | ||
| from argparse import ArgumentParser, Namespace | ||
| from pathlib import Path | ||
|
|
||
| from ..utils import logging | ||
| from . import BaseDiffusersCLICommand | ||
|
|
||
|
|
||
| EXPECTED_PARENT_CLASSES = ["ModularPipelineBlocks"] | ||
| CONFIG = "config.json" | ||
|
|
||
|
|
||
| def conversion_command_factory(args: Namespace): | ||
| return CustomBlocksCommand(args.block_module_name, args.block_class_name) | ||
|
|
||
|
|
||
| class CustomBlocksCommand(BaseDiffusersCLICommand): | ||
| @staticmethod | ||
| def register_subcommand(parser: ArgumentParser): | ||
| conversion_parser = parser.add_parser("custom_blocks") | ||
| conversion_parser.add_argument( | ||
| "--block_module_name", | ||
| type=str, | ||
| default="block.py", | ||
| help="Module filename in which the custom block will be implemented.", | ||
| ) | ||
| conversion_parser.add_argument( | ||
| "--block_class_name", | ||
| type=str, | ||
| default=None, | ||
| help="Name of the custom block. If provided None, we will try to infer it.", | ||
| ) | ||
| conversion_parser.set_defaults(func=conversion_command_factory) | ||
|
|
||
| def __init__(self, block_module_name: str = "block.py", block_class_name: str = None): | ||
| self.logger = logging.get_logger("diffusers-cli/custom_blocks") | ||
| self.block_module_name = Path(block_module_name) | ||
| self.block_class_name = block_class_name | ||
|
|
||
| def run(self): | ||
| # determine the block to be saved. | ||
| out = self._get_class_names(self.block_module_name) | ||
| classes_found = list({cls for cls, _ in out}) | ||
|
|
||
| if self.block_class_name is not None: | ||
| child_class, parent_class = self._choose_block(out, self.block_class_name) | ||
| if child_class is None and parent_class is None: | ||
| raise ValueError( | ||
| "`block_class_name` could not be retrieved. Available classes from " | ||
| f"{self.block_module_name}:\n{classes_found}" | ||
| ) | ||
| else: | ||
| self.logger.info( | ||
| f"Found classes: {classes_found} will be using {classes_found[0]}. " | ||
| "If this needs to be changed, re-run the command specifying `block_class_name`." | ||
| ) | ||
| child_class, parent_class = out[0][0], out[0][1] | ||
|
|
||
| # dynamically get the custom block and initialize it to call `save_pretrained` in the current directory. | ||
| # the user is responsible for running it, so I guess that is safe? | ||
| module_name = f"__dynamic__{self.block_module_name.stem}" | ||
| spec = importlib.util.spec_from_file_location(module_name, str(self.block_module_name)) | ||
| module = importlib.util.module_from_spec(spec) | ||
| spec.loader.exec_module(module) | ||
| getattr(module, child_class)().save_pretrained(os.getcwd()) | ||
|
|
||
| # or, we could create it manually. | ||
| # automap = self._create_automap(parent_class=parent_class, child_class=child_class) | ||
| # with open(CONFIG, "w") as f: | ||
| # json.dump(automap, f) | ||
| with open("requirements.txt", "w") as f: | ||
| f.write("") | ||
|
|
||
| def _choose_block(self, candidates, chosen=None): | ||
| for cls, base in candidates: | ||
| if cls == chosen: | ||
| return cls, base | ||
| return None, None | ||
|
|
||
| def _get_class_names(self, file_path): | ||
| source = file_path.read_text(encoding="utf-8") | ||
| try: | ||
| tree = ast.parse(source, filename=file_path) | ||
| except SyntaxError as e: | ||
| raise ValueError(f"Could not parse {file_path!r}: {e}") from e | ||
|
|
||
| results: list[tuple[str, str]] = [] | ||
| for node in tree.body: | ||
| if not isinstance(node, ast.ClassDef): | ||
| continue | ||
|
|
||
| # extract all base names for this class | ||
| base_names = [bname for b in node.bases if (bname := self._get_base_name(b)) is not None] | ||
|
|
||
| # for each allowed base that appears in the class's bases, emit a tuple | ||
| for allowed in EXPECTED_PARENT_CLASSES: | ||
| if allowed in base_names: | ||
| results.append((node.name, allowed)) | ||
|
|
||
| return results | ||
|
|
||
| def _get_base_name(self, node: ast.expr): | ||
| if isinstance(node, ast.Name): | ||
| return node.id | ||
| elif isinstance(node, ast.Attribute): | ||
| val = self._get_base_name(node.value) | ||
| return f"{val}.{node.attr}" if val else node.attr | ||
| return None | ||
|
|
||
| def _create_automap(self, parent_class, child_class): | ||
| module = str(self.block_module_name).replace(".py", "").rsplit(".", 1)[-1] | ||
| auto_map = {f"{parent_class}": f"{module}.{child_class}"} | ||
| return {"auto_map": auto_map} | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,39 @@ | ||
| # Copyright 2025 The HuggingFace Team. All rights reserved. | ||
| # | ||
| # Licensed under the Apache License, Version 2.0 (the "License"); | ||
| # you may not use this file except in compliance with the License. | ||
| # You may obtain a copy of the License at | ||
| # | ||
| # http://www.apache.org/licenses/LICENSE-2.0 | ||
| # | ||
| # Unless required by applicable law or agreed to in writing, software | ||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| # See the License for the specific language governing permissions and | ||
| # limitations under the License. | ||
|
|
||
| from typing import Union | ||
|
|
||
| from ..utils import is_torch_available | ||
|
|
||
|
|
||
| if is_torch_available(): | ||
| from .adaptive_projected_guidance import AdaptiveProjectedGuidance | ||
| from .auto_guidance import AutoGuidance | ||
| from .classifier_free_guidance import ClassifierFreeGuidance | ||
| from .classifier_free_zero_star_guidance import ClassifierFreeZeroStarGuidance | ||
| from .perturbed_attention_guidance import PerturbedAttentionGuidance | ||
| from .skip_layer_guidance import SkipLayerGuidance | ||
| from .smoothed_energy_guidance import SmoothedEnergyGuidance | ||
| from .tangential_classifier_free_guidance import TangentialClassifierFreeGuidance | ||
|
|
||
| GuiderType = Union[ | ||
| AdaptiveProjectedGuidance, | ||
| AutoGuidance, | ||
yiyixuxu marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| ClassifierFreeGuidance, | ||
| ClassifierFreeZeroStarGuidance, | ||
| PerturbedAttentionGuidance, | ||
| SkipLayerGuidance, | ||
| SmoothedEnergyGuidance, | ||
| TangentialClassifierFreeGuidance, | ||
| ] | ||
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.