Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e8d40b3d5d | |||
| d699d686c0 | |||
| e7696e20f9 | |||
| 4b89aeffe1 | |||
| 0a1daadef8 |
@@ -56,6 +56,60 @@ pipeline = DiffusionPipeline.from_pretrained(
|
|||||||
)
|
)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Load from a local file
|
||||||
|
|
||||||
|
Community pipelines can also be loaded from a local file if you pass a file path instead. The path to the passed directory must contain a `pipeline.py` file that contains the pipeline class in order to successfully load it.
|
||||||
|
|
||||||
|
```py
|
||||||
|
pipeline = DiffusionPipeline.from_pretrained(
|
||||||
|
"runwayml/stable-diffusion-v1-5",
|
||||||
|
custom_pipeline="./path/to/pipeline_directory/",
|
||||||
|
clip_model=clip_model,
|
||||||
|
feature_extractor=feature_extractor,
|
||||||
|
use_safetensors=True,
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Load from a specific version
|
||||||
|
|
||||||
|
By default, community pipelines are loaded from the latest stable version of Diffusers. To load a community pipeline from another version, use the `custom_revision` parameter.
|
||||||
|
|
||||||
|
<hfoptions id="version">
|
||||||
|
<hfoption id="main">
|
||||||
|
|
||||||
|
For example, to load from the `main` branch:
|
||||||
|
|
||||||
|
```py
|
||||||
|
pipeline = DiffusionPipeline.from_pretrained(
|
||||||
|
"runwayml/stable-diffusion-v1-5",
|
||||||
|
custom_pipeline="clip_guided_stable_diffusion",
|
||||||
|
custom_revision="main",
|
||||||
|
clip_model=clip_model,
|
||||||
|
feature_extractor=feature_extractor,
|
||||||
|
use_safetensors=True,
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
</hfoption>
|
||||||
|
<hfoption id="older version">
|
||||||
|
|
||||||
|
For example, to load from a previous version of Diffusers like `v0.25.0`:
|
||||||
|
|
||||||
|
```py
|
||||||
|
pipeline = DiffusionPipeline.from_pretrained(
|
||||||
|
"runwayml/stable-diffusion-v1-5",
|
||||||
|
custom_pipeline="clip_guided_stable_diffusion",
|
||||||
|
custom_revision="v0.25.0",
|
||||||
|
clip_model=clip_model,
|
||||||
|
feature_extractor=feature_extractor,
|
||||||
|
use_safetensors=True,
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
</hfoption>
|
||||||
|
</hfoptions>
|
||||||
|
|
||||||
|
|
||||||
For more information about community pipelines, take a look at the [Community pipelines](custom_pipeline_examples) guide for how to use them and if you're interested in adding a community pipeline check out the [How to contribute a community pipeline](contribute_pipeline) guide!
|
For more information about community pipelines, take a look at the [Community pipelines](custom_pipeline_examples) guide for how to use them and if you're interested in adding a community pipeline check out the [How to contribute a community pipeline](contribute_pipeline) guide!
|
||||||
|
|
||||||
## Community components
|
## Community components
|
||||||
|
|||||||
@@ -376,18 +376,14 @@ After training, LoRA weights can be loaded very easily into the original pipelin
|
|||||||
load the original pipeline:
|
load the original pipeline:
|
||||||
|
|
||||||
```python
|
```python
|
||||||
from diffusers import DiffusionPipeline, DPMSolverMultistepScheduler
|
from diffusers import DiffusionPipeline
|
||||||
import torch
|
pipe = DiffusionPipeline.from_pretrained("base-model-name").to("cuda")
|
||||||
|
|
||||||
pipe = DiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16)
|
|
||||||
pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)
|
|
||||||
pipe.to("cuda")
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Next, we can load the adapter layers into the UNet with the [`load_attn_procs` function](https://huggingface.co/docs/diffusers/api/loaders#diffusers.loaders.UNet2DConditionLoadersMixin.load_attn_procs).
|
Next, we can load the adapter layers into the pipeline with the [`load_lora_weights` function](https://huggingface.co/docs/diffusers/main/en/using-diffusers/loading_adapters#lora).
|
||||||
|
|
||||||
```python
|
```python
|
||||||
pipe.unet.load_attn_procs("patrickvonplaten/lora_dreambooth_dog_example")
|
pipe.load_lora_weights("path-to-the-lora-checkpoint")
|
||||||
```
|
```
|
||||||
|
|
||||||
Finally, we can run the model in inference.
|
Finally, we can run the model in inference.
|
||||||
|
|||||||
@@ -67,8 +67,8 @@ DATASET_NAME_MAPPING = {
|
|||||||
def save_model_card(
|
def save_model_card(
|
||||||
args,
|
args,
|
||||||
repo_id: str,
|
repo_id: str,
|
||||||
images=None,
|
images: list = None,
|
||||||
repo_folder=None,
|
repo_folder: str = None,
|
||||||
):
|
):
|
||||||
img_str = ""
|
img_str = ""
|
||||||
if len(images) > 0:
|
if len(images) > 0:
|
||||||
|
|||||||
@@ -56,7 +56,9 @@ check_min_version("0.27.0.dev0")
|
|||||||
logger = get_logger(__name__, log_level="INFO")
|
logger = get_logger(__name__, log_level="INFO")
|
||||||
|
|
||||||
|
|
||||||
def save_model_card(repo_id: str, images=None, base_model=str, dataset_name=str, repo_folder=None):
|
def save_model_card(
|
||||||
|
repo_id: str, images: list = None, base_model: str = None, dataset_name: str = None, repo_folder: str = None
|
||||||
|
):
|
||||||
img_str = ""
|
img_str = ""
|
||||||
for i, image in enumerate(images):
|
for i, image in enumerate(images):
|
||||||
image.save(os.path.join(repo_folder, f"image_{i}.png"))
|
image.save(os.path.join(repo_folder, f"image_{i}.png"))
|
||||||
|
|||||||
@@ -66,12 +66,12 @@ DATASET_NAME_MAPPING = {
|
|||||||
|
|
||||||
def save_model_card(
|
def save_model_card(
|
||||||
repo_id: str,
|
repo_id: str,
|
||||||
images=None,
|
images: list = None,
|
||||||
validation_prompt=None,
|
validation_prompt: str = None,
|
||||||
base_model=str,
|
base_model: str = None,
|
||||||
dataset_name=str,
|
dataset_name: str = None,
|
||||||
repo_folder=None,
|
repo_folder: str = None,
|
||||||
vae_path=None,
|
vae_path: str = None,
|
||||||
):
|
):
|
||||||
img_str = ""
|
img_str = ""
|
||||||
for i, image in enumerate(images):
|
for i, image in enumerate(images):
|
||||||
|
|||||||
@@ -981,10 +981,9 @@ class DiffusionPipeline(ConfigMixin, PushToHubMixin):
|
|||||||
revision (`str`, *optional*, defaults to `"main"`):
|
revision (`str`, *optional*, defaults to `"main"`):
|
||||||
The specific model version to use. It can be a branch name, a tag name, a commit id, or any identifier
|
The specific model version to use. It can be a branch name, a tag name, a commit id, or any identifier
|
||||||
allowed by Git.
|
allowed by Git.
|
||||||
custom_revision (`str`, *optional*, defaults to `"main"`):
|
custom_revision (`str`, *optional*):
|
||||||
The specific model version to use. It can be a branch name, a tag name, or a commit id similar to
|
The specific model version to use. It can be a branch name, a tag name, or a commit id similar to
|
||||||
`revision` when loading a custom pipeline from the Hub. It can be a 🤗 Diffusers version when loading a
|
`revision` when loading a custom pipeline from the Hub. Defaults to the latest stable 🤗 Diffusers version.
|
||||||
custom pipeline from GitHub, otherwise it defaults to `"main"` when loading from the Hub.
|
|
||||||
mirror (`str`, *optional*):
|
mirror (`str`, *optional*):
|
||||||
Mirror source to resolve accessibility issues if you’re downloading a model in China. We do not
|
Mirror source to resolve accessibility issues if you’re downloading a model in China. We do not
|
||||||
guarantee the timeliness or safety of the source, and you should refer to the mirror site for more
|
guarantee the timeliness or safety of the source, and you should refer to the mirror site for more
|
||||||
|
|||||||
@@ -27,7 +27,13 @@ from diffusers import (
|
|||||||
PixArtAlphaPipeline,
|
PixArtAlphaPipeline,
|
||||||
Transformer2DModel,
|
Transformer2DModel,
|
||||||
)
|
)
|
||||||
from diffusers.utils.testing_utils import enable_full_determinism, require_torch_gpu, slow, torch_device
|
from diffusers.utils.testing_utils import (
|
||||||
|
enable_full_determinism,
|
||||||
|
numpy_cosine_similarity_distance,
|
||||||
|
require_torch_gpu,
|
||||||
|
slow,
|
||||||
|
torch_device,
|
||||||
|
)
|
||||||
|
|
||||||
from ..pipeline_params import TEXT_TO_IMAGE_BATCH_PARAMS, TEXT_TO_IMAGE_IMAGE_PARAMS, TEXT_TO_IMAGE_PARAMS
|
from ..pipeline_params import TEXT_TO_IMAGE_BATCH_PARAMS, TEXT_TO_IMAGE_IMAGE_PARAMS, TEXT_TO_IMAGE_PARAMS
|
||||||
from ..test_pipelines_common import PipelineTesterMixin, to_np
|
from ..test_pipelines_common import PipelineTesterMixin, to_np
|
||||||
@@ -332,37 +338,35 @@ class PixArtAlphaPipelineIntegrationTests(unittest.TestCase):
|
|||||||
torch.cuda.empty_cache()
|
torch.cuda.empty_cache()
|
||||||
|
|
||||||
def test_pixart_1024(self):
|
def test_pixart_1024(self):
|
||||||
generator = torch.manual_seed(0)
|
generator = torch.Generator("cpu").manual_seed(0)
|
||||||
|
|
||||||
pipe = PixArtAlphaPipeline.from_pretrained(self.ckpt_id_1024, torch_dtype=torch.float16)
|
pipe = PixArtAlphaPipeline.from_pretrained(self.ckpt_id_1024, torch_dtype=torch.float16)
|
||||||
pipe.enable_model_cpu_offload()
|
pipe.enable_model_cpu_offload()
|
||||||
prompt = self.prompt
|
prompt = self.prompt
|
||||||
|
|
||||||
image = pipe(prompt, generator=generator, output_type="np").images
|
image = pipe(prompt, generator=generator, num_inference_steps=2, output_type="np").images
|
||||||
|
|
||||||
image_slice = image[0, -3:, -3:, -1]
|
image_slice = image[0, -3:, -3:, -1]
|
||||||
|
expected_slice = np.array([0.0742, 0.0835, 0.2114, 0.0295, 0.0784, 0.2361, 0.1738, 0.2251, 0.3589])
|
||||||
|
|
||||||
expected_slice = np.array([0.1941, 0.2117, 0.2188, 0.1946, 0.218, 0.2124, 0.199, 0.2437, 0.2583])
|
max_diff = numpy_cosine_similarity_distance(image_slice.flatten(), expected_slice)
|
||||||
|
self.assertLessEqual(max_diff, 1e-4)
|
||||||
max_diff = np.abs(image_slice.flatten() - expected_slice).max()
|
|
||||||
self.assertLessEqual(max_diff, 1e-3)
|
|
||||||
|
|
||||||
def test_pixart_512(self):
|
def test_pixart_512(self):
|
||||||
generator = torch.manual_seed(0)
|
generator = torch.Generator("cpu").manual_seed(0)
|
||||||
|
|
||||||
pipe = PixArtAlphaPipeline.from_pretrained(self.ckpt_id_512, torch_dtype=torch.float16)
|
pipe = PixArtAlphaPipeline.from_pretrained(self.ckpt_id_512, torch_dtype=torch.float16)
|
||||||
pipe.enable_model_cpu_offload()
|
pipe.enable_model_cpu_offload()
|
||||||
|
|
||||||
prompt = self.prompt
|
prompt = self.prompt
|
||||||
|
|
||||||
image = pipe(prompt, generator=generator, output_type="np").images
|
image = pipe(prompt, generator=generator, num_inference_steps=2, output_type="np").images
|
||||||
|
|
||||||
image_slice = image[0, -3:, -3:, -1]
|
image_slice = image[0, -3:, -3:, -1]
|
||||||
|
expected_slice = np.array([0.3477, 0.3882, 0.4541, 0.3413, 0.3821, 0.4463, 0.4001, 0.4409, 0.4958])
|
||||||
|
|
||||||
expected_slice = np.array([0.2637, 0.291, 0.2939, 0.207, 0.2512, 0.2783, 0.2168, 0.2324, 0.2817])
|
max_diff = numpy_cosine_similarity_distance(image_slice.flatten(), expected_slice)
|
||||||
|
self.assertLessEqual(max_diff, 1e-4)
|
||||||
max_diff = np.abs(image_slice.flatten() - expected_slice).max()
|
|
||||||
self.assertLessEqual(max_diff, 1e-3)
|
|
||||||
|
|
||||||
def test_pixart_1024_without_resolution_binning(self):
|
def test_pixart_1024_without_resolution_binning(self):
|
||||||
generator = torch.manual_seed(0)
|
generator = torch.manual_seed(0)
|
||||||
@@ -372,7 +376,7 @@ class PixArtAlphaPipelineIntegrationTests(unittest.TestCase):
|
|||||||
|
|
||||||
prompt = self.prompt
|
prompt = self.prompt
|
||||||
height, width = 1024, 768
|
height, width = 1024, 768
|
||||||
num_inference_steps = 10
|
num_inference_steps = 2
|
||||||
|
|
||||||
image = pipe(
|
image = pipe(
|
||||||
prompt,
|
prompt,
|
||||||
@@ -406,7 +410,7 @@ class PixArtAlphaPipelineIntegrationTests(unittest.TestCase):
|
|||||||
|
|
||||||
prompt = self.prompt
|
prompt = self.prompt
|
||||||
height, width = 512, 768
|
height, width = 512, 768
|
||||||
num_inference_steps = 10
|
num_inference_steps = 2
|
||||||
|
|
||||||
image = pipe(
|
image = pipe(
|
||||||
prompt,
|
prompt,
|
||||||
|
|||||||
Reference in New Issue
Block a user