-
Notifications
You must be signed in to change notification settings - Fork 5.7k
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
[Stable Diffusion] Add components function #889
Conversation
The documentation is not available anymore as the PR was closed or merged. |
c502f1c
to
c1fad36
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks very cool, just left one comment.
@property | ||
def components(self) -> Dict[str, Any]: | ||
r""" | ||
|
||
The `self.compenents` property can be useful to run different pipelines with the same weights and | ||
configurations to not have to re-allocate memory. | ||
|
||
Examples: | ||
|
||
```py | ||
>>> from diffusers import ( | ||
... StableDiffusionPipeline, | ||
... StableDiffusionImg2ImgPipeline, | ||
... StableDiffusionInpaintPipeline, | ||
... ) | ||
|
||
>>> img2text = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4") | ||
>>> img2img = StableDiffusionImg2ImgPipeline(**img2text.components) | ||
>>> inpaint = StableDiffusionInpaintPipeline(**img2text.components) | ||
``` | ||
|
||
Returns: | ||
A dictionaly containing all the modules needed to initialize the pipleline. | ||
""" | ||
components = {k: getattr(self, k) for k in self.config.keys() if not k.startswith("_")} | ||
expected_modules = set(inspect.signature(self.__init__).parameters.keys()) - set(["self"]) | ||
|
||
if set(components.keys()) != expected_modules: | ||
raise ValueError( | ||
f"{self} has been incorrectly initialized or {self.__class__} is incorrectly implemented. Expected" | ||
f" {expected_modules} to be defined, but {components} are defined." | ||
) | ||
|
||
return components | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Very cool!
- Make use of the [Stable Diffusion Mega Pipeline](https://github.com/huggingface/diffusers/tree/main/examples/community#stable-diffusion-mega) or | ||
- Make use of the `components` functionality to instantiate all components in the most memory-efficient way: | ||
|
||
```python | ||
>>> from diffusers import ( | ||
... StableDiffusionPipeline, | ||
... StableDiffusionImg2ImgPipeline, | ||
... StableDiffusionInpaintPipeline, | ||
... ) | ||
|
||
>>> img2text = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4") | ||
>>> img2img = StableDiffusionImg2ImgPipeline(**img2text.components) | ||
>>> inpaint = StableDiffusionInpaintPipeline(**img2text.components) | ||
|
||
>>> # now you can use img2text(...), img2img(...), inpaint(...) just like the call methods of each respective pipeline |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice example! We should also explain a bit more details, for example, the revision
, dtype
.
Also we should mention that each pipeline needs to be placed on a device
so it has it's self.device
set.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah leaving this for a follow-up PR ;-)
* [Stable Diffusion] Add components function * uP
Co-authored-by: dan <dan@nod-labs.com>
* [Stable Diffusion] Add components function * uP
No description provided.