Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
OpenDAS
diffusers
Commits
a69ebe55
Unverified
Commit
a69ebe55
authored
Oct 26, 2023
by
Patrick von Platen
Committed by
GitHub
Oct 26, 2023
Browse files
[Tests] Speed up expert of mixture tests (#5533)
* [Tests] Speed up expert of mixture tests * make style
parent
ce7f3344
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
165 additions
and
2 deletions
+165
-2
tests/pipelines/stable_diffusion_xl/test_stable_diffusion_xl.py
...pipelines/stable_diffusion_xl/test_stable_diffusion_xl.py
+103
-1
tests/pipelines/stable_diffusion_xl/test_stable_diffusion_xl_inpaint.py
...s/stable_diffusion_xl/test_stable_diffusion_xl_inpaint.py
+62
-1
No files found.
tests/pipelines/stable_diffusion_xl/test_stable_diffusion_xl.py
View file @
a69ebe55
...
...
@@ -32,7 +32,7 @@ from diffusers import (
UNet2DConditionModel
,
UniPCMultistepScheduler
,
)
from
diffusers.utils.testing_utils
import
enable_full_determinism
,
require_torch_gpu
,
torch_device
from
diffusers.utils.testing_utils
import
enable_full_determinism
,
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
..test_pipelines_common
import
PipelineLatentTesterMixin
,
PipelineTesterMixin
,
SDXLOptionalComponentsTesterMixin
...
...
@@ -301,6 +301,107 @@ class StableDiffusionXLPipelineFastTests(
# make sure that it's equal
assert
np
.
abs
(
image_slice_1
.
flatten
()
-
image_slice_2
.
flatten
()).
max
()
<
1e-4
def
test_stable_diffusion_two_xl_mixture_of_denoiser_fast
(
self
):
components
=
self
.
get_dummy_components
()
pipe_1
=
StableDiffusionXLPipeline
(
**
components
).
to
(
torch_device
)
pipe_1
.
unet
.
set_default_attn_processor
()
pipe_2
=
StableDiffusionXLImg2ImgPipeline
(
**
components
).
to
(
torch_device
)
pipe_2
.
unet
.
set_default_attn_processor
()
def
assert_run_mixture
(
num_steps
,
split
,
scheduler_cls_orig
,
expected_tss
,
num_train_timesteps
=
pipe_1
.
scheduler
.
config
.
num_train_timesteps
,
):
inputs
=
self
.
get_dummy_inputs
(
torch_device
)
inputs
[
"num_inference_steps"
]
=
num_steps
class
scheduler_cls
(
scheduler_cls_orig
):
pass
pipe_1
.
scheduler
=
scheduler_cls
.
from_config
(
pipe_1
.
scheduler
.
config
)
pipe_2
.
scheduler
=
scheduler_cls
.
from_config
(
pipe_2
.
scheduler
.
config
)
# Let's retrieve the number of timesteps we want to use
pipe_1
.
scheduler
.
set_timesteps
(
num_steps
)
expected_steps
=
pipe_1
.
scheduler
.
timesteps
.
tolist
()
if
pipe_1
.
scheduler
.
order
==
2
:
expected_steps_1
=
list
(
filter
(
lambda
ts
:
ts
>=
split
,
expected_tss
))
expected_steps_2
=
expected_steps_1
[
-
1
:]
+
list
(
filter
(
lambda
ts
:
ts
<
split
,
expected_tss
))
expected_steps
=
expected_steps_1
+
expected_steps_2
else
:
expected_steps_1
=
list
(
filter
(
lambda
ts
:
ts
>=
split
,
expected_tss
))
expected_steps_2
=
list
(
filter
(
lambda
ts
:
ts
<
split
,
expected_tss
))
# now we monkey patch step `done_steps`
# list into the step function for testing
done_steps
=
[]
old_step
=
copy
.
copy
(
scheduler_cls
.
step
)
def
new_step
(
self
,
*
args
,
**
kwargs
):
done_steps
.
append
(
args
[
1
].
cpu
().
item
())
# args[1] is always the passed `t`
return
old_step
(
self
,
*
args
,
**
kwargs
)
scheduler_cls
.
step
=
new_step
inputs_1
=
{
**
inputs
,
**
{
"denoising_end"
:
1.0
-
(
split
/
num_train_timesteps
),
"output_type"
:
"latent"
,
},
}
latents
=
pipe_1
(
**
inputs_1
).
images
[
0
]
assert
expected_steps_1
==
done_steps
,
f
"Failure with
{
scheduler_cls
.
__name__
}
and
{
num_steps
}
and
{
split
}
"
inputs_2
=
{
**
inputs
,
**
{
"denoising_start"
:
1.0
-
(
split
/
num_train_timesteps
),
"image"
:
latents
,
},
}
pipe_2
(
**
inputs_2
).
images
[
0
]
assert
expected_steps_2
==
done_steps
[
len
(
expected_steps_1
)
:]
assert
expected_steps
==
done_steps
,
f
"Failure with
{
scheduler_cls
.
__name__
}
and
{
num_steps
}
and
{
split
}
"
steps
=
10
for
split
in
[
300
,
700
]:
for
scheduler_cls_timesteps
in
[
(
EulerDiscreteScheduler
,
[
901
,
801
,
701
,
601
,
501
,
401
,
301
,
201
,
101
,
1
]),
(
HeunDiscreteScheduler
,
[
901.0
,
801.0
,
801.0
,
701.0
,
701.0
,
601.0
,
601.0
,
501.0
,
501.0
,
401.0
,
401.0
,
301.0
,
301.0
,
201.0
,
201.0
,
101.0
,
101.0
,
1.0
,
1.0
,
],
),
]:
assert_run_mixture
(
steps
,
split
,
scheduler_cls_timesteps
[
0
],
scheduler_cls_timesteps
[
1
])
@
slow
def
test_stable_diffusion_two_xl_mixture_of_denoiser
(
self
):
components
=
self
.
get_dummy_components
()
pipe_1
=
StableDiffusionXLPipeline
(
**
components
).
to
(
torch_device
)
...
...
@@ -584,6 +685,7 @@ class StableDiffusionXLPipelineFastTests(
]:
assert_run_mixture
(
steps
,
split
,
scheduler_cls_timesteps
[
0
],
scheduler_cls_timesteps
[
1
])
@
slow
def
test_stable_diffusion_three_xl_mixture_of_denoiser
(
self
):
components
=
self
.
get_dummy_components
()
pipe_1
=
StableDiffusionXLPipeline
(
**
components
).
to
(
torch_device
)
...
...
tests/pipelines/stable_diffusion_xl/test_stable_diffusion_xl_inpaint.py
View file @
a69ebe55
...
...
@@ -32,7 +32,7 @@ from diffusers import (
UNet2DConditionModel
,
UniPCMultistepScheduler
,
)
from
diffusers.utils.testing_utils
import
enable_full_determinism
,
floats_tensor
,
require_torch_gpu
,
torch_device
from
diffusers.utils.testing_utils
import
enable_full_determinism
,
floats_tensor
,
require_torch_gpu
,
slow
,
torch_device
from
..pipeline_params
import
TEXT_GUIDED_IMAGE_INPAINTING_BATCH_PARAMS
,
TEXT_GUIDED_IMAGE_INPAINTING_PARAMS
from
..test_pipelines_common
import
PipelineLatentTesterMixin
,
PipelineTesterMixin
...
...
@@ -294,6 +294,66 @@ class StableDiffusionXLInpaintPipelineFastTests(PipelineLatentTesterMixin, Pipel
assert
np
.
abs
(
image_slice
.
flatten
()
-
expected_slice
).
max
()
<
1e-2
def
test_stable_diffusion_two_xl_mixture_of_denoiser_fast
(
self
):
components
=
self
.
get_dummy_components
()
pipe_1
=
StableDiffusionXLInpaintPipeline
(
**
components
).
to
(
torch_device
)
pipe_1
.
unet
.
set_default_attn_processor
()
pipe_2
=
StableDiffusionXLInpaintPipeline
(
**
components
).
to
(
torch_device
)
pipe_2
.
unet
.
set_default_attn_processor
()
def
assert_run_mixture
(
num_steps
,
split
,
scheduler_cls_orig
,
num_train_timesteps
=
pipe_1
.
scheduler
.
config
.
num_train_timesteps
):
inputs
=
self
.
get_dummy_inputs
(
torch_device
)
inputs
[
"num_inference_steps"
]
=
num_steps
class
scheduler_cls
(
scheduler_cls_orig
):
pass
pipe_1
.
scheduler
=
scheduler_cls
.
from_config
(
pipe_1
.
scheduler
.
config
)
pipe_2
.
scheduler
=
scheduler_cls
.
from_config
(
pipe_2
.
scheduler
.
config
)
# Let's retrieve the number of timesteps we want to use
pipe_1
.
scheduler
.
set_timesteps
(
num_steps
)
expected_steps
=
pipe_1
.
scheduler
.
timesteps
.
tolist
()
split_ts
=
num_train_timesteps
-
int
(
round
(
num_train_timesteps
*
split
))
if
pipe_1
.
scheduler
.
order
==
2
:
expected_steps_1
=
list
(
filter
(
lambda
ts
:
ts
>=
split_ts
,
expected_steps
))
expected_steps_2
=
expected_steps_1
[
-
1
:]
+
list
(
filter
(
lambda
ts
:
ts
<
split_ts
,
expected_steps
))
expected_steps
=
expected_steps_1
+
expected_steps_2
else
:
expected_steps_1
=
list
(
filter
(
lambda
ts
:
ts
>=
split_ts
,
expected_steps
))
expected_steps_2
=
list
(
filter
(
lambda
ts
:
ts
<
split_ts
,
expected_steps
))
# now we monkey patch step `done_steps`
# list into the step function for testing
done_steps
=
[]
old_step
=
copy
.
copy
(
scheduler_cls
.
step
)
def
new_step
(
self
,
*
args
,
**
kwargs
):
done_steps
.
append
(
args
[
1
].
cpu
().
item
())
# args[1] is always the passed `t`
return
old_step
(
self
,
*
args
,
**
kwargs
)
scheduler_cls
.
step
=
new_step
inputs_1
=
{
**
inputs
,
**
{
"denoising_end"
:
split
,
"output_type"
:
"latent"
}}
latents
=
pipe_1
(
**
inputs_1
).
images
[
0
]
assert
expected_steps_1
==
done_steps
,
f
"Failure with
{
scheduler_cls
.
__name__
}
and
{
num_steps
}
and
{
split
}
"
inputs_2
=
{
**
inputs
,
**
{
"denoising_start"
:
split
,
"image"
:
latents
}}
pipe_2
(
**
inputs_2
).
images
[
0
]
assert
expected_steps_2
==
done_steps
[
len
(
expected_steps_1
)
:]
assert
expected_steps
==
done_steps
,
f
"Failure with
{
scheduler_cls
.
__name__
}
and
{
num_steps
}
and
{
split
}
"
for
steps
in
[
7
,
20
]:
assert_run_mixture
(
steps
,
0.33
,
EulerDiscreteScheduler
)
assert_run_mixture
(
steps
,
0.33
,
HeunDiscreteScheduler
)
@
slow
def
test_stable_diffusion_two_xl_mixture_of_denoiser
(
self
):
components
=
self
.
get_dummy_components
()
pipe_1
=
StableDiffusionXLInpaintPipeline
(
**
components
).
to
(
torch_device
)
...
...
@@ -360,6 +420,7 @@ class StableDiffusionXLInpaintPipelineFastTests(PipelineLatentTesterMixin, Pipel
]:
assert_run_mixture
(
steps
,
split
,
scheduler_cls
)
@
slow
def
test_stable_diffusion_three_xl_mixture_of_denoiser
(
self
):
components
=
self
.
get_dummy_components
()
pipe_1
=
StableDiffusionXLInpaintPipeline
(
**
components
).
to
(
torch_device
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment