Skip to content

Commit

Permalink
update tests and utils
Browse files Browse the repository at this point in the history
  • Loading branch information
IlyasMoutawwakil committed Sep 10, 2024
1 parent 5023cac commit 2cd616e
Show file tree
Hide file tree
Showing 2 changed files with 135 additions and 144 deletions.
11 changes: 0 additions & 11 deletions optimum/pipelines/diffusers/pipeline_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -159,14 +159,3 @@ def retrieve_latents(
return encoder_output.latents
else:
raise AttributeError("Could not access latents of provided encoder_output")

from contextlib import contextmanager

@contextmanager
def patch_randn_tensor():
import diffusers.utils.torch_utils

old_randn_tensor = diffusers.utils.torch_utils.randn_tensor
diffusers.utils.torch_utils.randn_tensor = randn_tensor
yield
diffusers.utils.torch_utils.randn_tensor = old_randn_tensor
268 changes: 135 additions & 133 deletions tests/onnxruntime/test_diffusion.py
Original file line number Diff line number Diff line change
Expand Up @@ -165,45 +165,6 @@ def test_compare_to_diffusers_pipeline(self, model_arch: str):
)
self.assertEqual(ort_pipeline.device, diffusers_pipeline.device)

@parameterized.expand(
grid_parameters({"model_arch": SUPPORTED_ARCHITECTURES, "provider": ["CUDAExecutionProvider"]})
)
@require_torch_gpu
@pytest.mark.cuda_ep_test
@require_diffusers
def test_pipeline_on_gpu(self, test_name: str, model_arch: str, provider: str):
model_args = {"test_name": test_name, "model_arch": model_arch}
self._setup(model_args)
pipeline = self.ORTMODEL_CLASS.from_pretrained(self.onnx_model_dirs[test_name], provider=provider)
height, width, batch_size = 32, 64, 1
inputs = self.generate_inputs(height=height, width=width, batch_size=batch_size)
outputs = pipeline(**inputs).images
# Verify model devices
self.assertEqual(pipeline.device.type.lower(), "cuda")
# Verify model outptus
self.assertIsInstance(outputs, np.ndarray)
self.assertEqual(outputs.shape, (batch_size, height, width, 3))

@parameterized.expand(
grid_parameters({"model_arch": SUPPORTED_ARCHITECTURES, "provider": ["ROCMExecutionProvider"]})
)
@require_torch_gpu
@require_ort_rocm
@pytest.mark.rocm_ep_test
@require_diffusers
def test_pipeline_on_rocm_ep(self, test_name: str, model_arch: str, provider: str):
model_args = {"test_name": test_name, "model_arch": model_arch}
self._setup(model_args)
pipeline = self.ORTMODEL_CLASS.from_pretrained(self.onnx_model_dirs[test_name], provider=provider)
height, width, batch_size = 64, 32, 1
inputs = self.generate_inputs(height=height, width=width, batch_size=batch_size)
outputs = pipeline(**inputs).images
# Verify model devices
self.assertEqual(pipeline.device.type.lower(), "cuda")
# Verify model outptus
self.assertIsInstance(outputs, np.ndarray)
self.assertEqual(outputs.shape, (batch_size, height, width, 3))

@parameterized.expand(SUPPORTED_ARCHITECTURES)
@require_diffusers
def test_callback(self, model_arch: str):
Expand Down Expand Up @@ -261,9 +222,6 @@ def test_shape(self, model_arch: str):
@parameterized.expand(SUPPORTED_ARCHITECTURES)
@require_diffusers
def test_image_reproducibility(self, model_arch: str):
# if model_arch in ["latent-consistency"]:
# pytest.skip("Latent Consistency Model (LCM) doesn't support deterministic outputs")

model_args = {"test_name": model_arch, "model_arch": model_arch}
self._setup(model_args)

Expand All @@ -273,6 +231,9 @@ def test_image_reproducibility(self, model_arch: str):
pipeline = self.ORTMODEL_CLASS.from_pretrained(self.onnx_model_dirs[model_arch])

for generator_framework in ["np", "pt"]:
if model_arch in ["latent-consistency"] and generator_framework == "np":
pytest.skip("Latent Consistency Model (LCM) scheduler doesn't support numpy generator")

ort_outputs_1 = pipeline(**inputs, generator=get_generator(generator_framework, SEED))
ort_outputs_2 = pipeline(**inputs, generator=get_generator(generator_framework, SEED))
ort_outputs_3 = pipeline(**inputs, generator=get_generator(generator_framework, SEED + 1))
Expand All @@ -285,9 +246,6 @@ def test_image_reproducibility(self, model_arch: str):

@parameterized.expand(SUPPORTED_ARCHITECTURES)
def test_negative_prompt(self, model_arch: str):
# if model_arch in ["latent-consistency"]:
# pytest.skip("Latent Consistency Model (LCM) does not support negative prompts")

model_args = {"test_name": model_arch, "model_arch": model_arch}
self._setup(model_args)

Expand All @@ -297,7 +255,9 @@ def test_negative_prompt(self, model_arch: str):
negative_prompt = ["This is a negative prompt"]
pipeline = self.ORTMODEL_CLASS.from_pretrained(self.onnx_model_dirs[model_arch])
image_slice_1 = pipeline(
**inputs, negative_prompt=negative_prompt, generator=np.random.RandomState(SEED)
**inputs,
negative_prompt=negative_prompt,
generator=torch.Generator().manual_seed(SEED),
).images[0, -3:, -3:, -1]
prompt = inputs.pop("prompt")

Expand Down Expand Up @@ -326,10 +286,52 @@ def test_negative_prompt(self, model_arch: str):
inputs["prompt_embeds"] = pipeline.text_encoder(text_ids)[0]
inputs["negative_prompt_embeds"] = pipeline.text_encoder(negative_text_ids)[0]

image_slice_2 = pipeline(**inputs, generator=np.random.RandomState(SEED)).images[0, -3:, -3:, -1]
image_slice_2 = pipeline(
**inputs,
generator=torch.Generator().manual_seed(SEED),
).images[0, -3:, -3:, -1]

self.assertTrue(np.allclose(image_slice_1, image_slice_2, rtol=1e-1))

@parameterized.expand(
grid_parameters({"model_arch": SUPPORTED_ARCHITECTURES, "provider": ["CUDAExecutionProvider"]})
)
@require_torch_gpu
@pytest.mark.cuda_ep_test
@require_diffusers
def test_pipeline_on_gpu(self, test_name: str, model_arch: str, provider: str):
model_args = {"test_name": test_name, "model_arch": model_arch}
self._setup(model_args)
pipeline = self.ORTMODEL_CLASS.from_pretrained(self.onnx_model_dirs[test_name], provider=provider)
height, width, batch_size = 32, 64, 1
inputs = self.generate_inputs(height=height, width=width, batch_size=batch_size)
outputs = pipeline(**inputs).images
# Verify model devices
self.assertEqual(pipeline.device.type.lower(), "cuda")
# Verify model outptus
self.assertIsInstance(outputs, np.ndarray)
self.assertEqual(outputs.shape, (batch_size, height, width, 3))

@parameterized.expand(
grid_parameters({"model_arch": SUPPORTED_ARCHITECTURES, "provider": ["ROCMExecutionProvider"]})
)
@require_torch_gpu
@require_ort_rocm
@pytest.mark.rocm_ep_test
@require_diffusers
def test_pipeline_on_rocm_ep(self, test_name: str, model_arch: str, provider: str):
model_args = {"test_name": test_name, "model_arch": model_arch}
self._setup(model_args)
pipeline = self.ORTMODEL_CLASS.from_pretrained(self.onnx_model_dirs[test_name], provider=provider)
height, width, batch_size = 64, 32, 1
inputs = self.generate_inputs(height=height, width=width, batch_size=batch_size)
outputs = pipeline(**inputs).images
# Verify model devices
self.assertEqual(pipeline.device.type.lower(), "cuda")
# Verify model outptus
self.assertIsInstance(outputs, np.ndarray)
self.assertEqual(outputs.shape, (batch_size, height, width, 3))


class ORTPipelineForImage2ImageTest(ORTModelTestMixin):
SUPPORTED_ARCHITECTURES = ["stable-diffusion", "stable-diffusion-xl"]
Expand Down Expand Up @@ -393,49 +395,6 @@ def test_num_images_per_prompt(self, model_arch: str):
outputs = pipeline(**inputs, num_images_per_prompt=num_images).images
self.assertEqual(outputs.shape, (batch_size * num_images, height, width, 3))

@parameterized.expand(
grid_parameters({"model_arch": SUPPORTED_ARCHITECTURES, "provider": ["CUDAExecutionProvider"]})
)
@require_torch_gpu
@pytest.mark.cuda_ep_test
@require_diffusers
def test_pipeline_on_gpu(self, test_name: str, model_arch: str, provider: str):
model_args = {"test_name": test_name, "model_arch": model_arch}
self._setup(model_args)

height, width, batch_size = 32, 64, 1
inputs = self.generate_inputs(height=height, width=width, batch_size=batch_size)

pipeline = self.ORTMODEL_CLASS.from_pretrained(self.onnx_model_dirs[test_name], provider=provider)
outputs = pipeline(**inputs).images
# Verify model devices
self.assertEqual(pipeline.device.type.lower(), "cuda")
# Verify model outptus
self.assertIsInstance(outputs, np.ndarray)
self.assertEqual(outputs.shape, (batch_size, height, width, 3))

@parameterized.expand(
grid_parameters({"model_arch": SUPPORTED_ARCHITECTURES, "provider": ["ROCMExecutionProvider"]})
)
@require_torch_gpu
@require_ort_rocm
@pytest.mark.rocm_ep_test
@require_diffusers
def test_pipeline_on_rocm_ep(self, test_name: str, model_arch: str, provider: str):
model_args = {"test_name": test_name, "model_arch": model_arch}
self._setup(model_args)

height, width, batch_size = 32, 64, 1
inputs = self.generate_inputs(height=height, width=width, batch_size=batch_size)

pipeline = self.ORTMODEL_CLASS.from_pretrained(self.onnx_model_dirs[test_name], provider=provider)
outputs = pipeline(**inputs).images
# Verify model devices
self.assertEqual(pipeline.device.type.lower(), "cuda")
# Verify model outptus
self.assertIsInstance(outputs, np.ndarray)
self.assertEqual(outputs.shape, (batch_size, height, width, 3))

@parameterized.expand(SUPPORTED_ARCHITECTURES)
@require_diffusers
def test_callback(self, model_arch: str):
Expand Down Expand Up @@ -532,6 +491,49 @@ def test_image_reproducibility(self, model_arch: str):
self.assertTrue(np.array_equal(ort_outputs_1.images[0], ort_outputs_2.images[0]))
self.assertFalse(np.array_equal(ort_outputs_1.images[0], ort_outputs_3.images[0]))

@parameterized.expand(
grid_parameters({"model_arch": SUPPORTED_ARCHITECTURES, "provider": ["CUDAExecutionProvider"]})
)
@require_torch_gpu
@pytest.mark.cuda_ep_test
@require_diffusers
def test_pipeline_on_gpu(self, test_name: str, model_arch: str, provider: str):
model_args = {"test_name": test_name, "model_arch": model_arch}
self._setup(model_args)

height, width, batch_size = 32, 64, 1
inputs = self.generate_inputs(height=height, width=width, batch_size=batch_size)

pipeline = self.ORTMODEL_CLASS.from_pretrained(self.onnx_model_dirs[test_name], provider=provider)
outputs = pipeline(**inputs).images
# Verify model devices
self.assertEqual(pipeline.device.type.lower(), "cuda")
# Verify model outptus
self.assertIsInstance(outputs, np.ndarray)
self.assertEqual(outputs.shape, (batch_size, height, width, 3))

@parameterized.expand(
grid_parameters({"model_arch": SUPPORTED_ARCHITECTURES, "provider": ["ROCMExecutionProvider"]})
)
@require_torch_gpu
@require_ort_rocm
@pytest.mark.rocm_ep_test
@require_diffusers
def test_pipeline_on_rocm_ep(self, test_name: str, model_arch: str, provider: str):
model_args = {"test_name": test_name, "model_arch": model_arch}
self._setup(model_args)

height, width, batch_size = 32, 64, 1
inputs = self.generate_inputs(height=height, width=width, batch_size=batch_size)

pipeline = self.ORTMODEL_CLASS.from_pretrained(self.onnx_model_dirs[test_name], provider=provider)
outputs = pipeline(**inputs).images
# Verify model devices
self.assertEqual(pipeline.device.type.lower(), "cuda")
# Verify model outptus
self.assertIsInstance(outputs, np.ndarray)
self.assertEqual(outputs.shape, (batch_size, height, width, 3))


class ORTPipelineForInpaintingTest(ORTModelTestMixin):
SUPPORTED_ARCHITECTURES = ["stable-diffusion"]
Expand Down Expand Up @@ -602,49 +604,6 @@ def test_num_images_per_prompt(self, model_arch: str):
outputs = pipeline(**inputs, num_images_per_prompt=num_images).images
self.assertEqual(outputs.shape, (batch_size * num_images, height, width, 3))

@parameterized.expand(
grid_parameters({"model_arch": SUPPORTED_ARCHITECTURES, "provider": ["CUDAExecutionProvider"]})
)
@require_torch_gpu
@pytest.mark.cuda_ep_test
@require_diffusers
def test_pipeline_on_gpu(self, test_name: str, model_arch: str, provider: str):
model_args = {"test_name": test_name, "model_arch": model_arch}
self._setup(model_args)

height, width, batch_size = 32, 64, 1
inputs = self.generate_inputs(height=height, width=width, batch_size=batch_size)

pipeline = self.ORTMODEL_CLASS.from_pretrained(self.onnx_model_dirs[test_name], provider=provider)
outputs = pipeline(**inputs).images
# Verify model devices
self.assertEqual(pipeline.device.type.lower(), "cuda")
# Verify model outptus
self.assertIsInstance(outputs, np.ndarray)
self.assertEqual(outputs.shape, (batch_size, height, width, 3))

@parameterized.expand(
grid_parameters({"model_arch": SUPPORTED_ARCHITECTURES, "provider": ["ROCMExecutionProvider"]})
)
@require_torch_gpu
@require_ort_rocm
@pytest.mark.rocm_ep_test
@require_diffusers
def test_pipeline_on_rocm_ep(self, test_name: str, model_arch: str, provider: str):
model_args = {"test_name": test_name, "model_arch": model_arch}
self._setup(model_args)

height, width, batch_size = 32, 64, 1
inputs = self.generate_inputs(height=height, width=width, batch_size=batch_size)

pipeline = self.ORTMODEL_CLASS.from_pretrained(self.onnx_model_dirs[test_name], provider=provider)
outputs = pipeline(**inputs).images
# Verify model devices
self.assertEqual(pipeline.device.type.lower(), "cuda")
# Verify model outptus
self.assertIsInstance(outputs, np.ndarray)
self.assertEqual(outputs.shape, (batch_size, height, width, 3))

@parameterized.expand(SUPPORTED_ARCHITECTURES)
@require_diffusers
def test_callback(self, model_arch: str):
Expand Down Expand Up @@ -749,3 +708,46 @@ def test_image_reproducibility(self, model_arch: str):

self.assertTrue(np.array_equal(ort_outputs_1.images[0], ort_outputs_2.images[0]))
self.assertFalse(np.array_equal(ort_outputs_1.images[0], ort_outputs_3.images[0]))

@parameterized.expand(
grid_parameters({"model_arch": SUPPORTED_ARCHITECTURES, "provider": ["CUDAExecutionProvider"]})
)
@require_torch_gpu
@pytest.mark.cuda_ep_test
@require_diffusers
def test_pipeline_on_gpu(self, test_name: str, model_arch: str, provider: str):
model_args = {"test_name": test_name, "model_arch": model_arch}
self._setup(model_args)

height, width, batch_size = 32, 64, 1
inputs = self.generate_inputs(height=height, width=width, batch_size=batch_size)

pipeline = self.ORTMODEL_CLASS.from_pretrained(self.onnx_model_dirs[test_name], provider=provider)
outputs = pipeline(**inputs).images
# Verify model devices
self.assertEqual(pipeline.device.type.lower(), "cuda")
# Verify model outptus
self.assertIsInstance(outputs, np.ndarray)
self.assertEqual(outputs.shape, (batch_size, height, width, 3))

@parameterized.expand(
grid_parameters({"model_arch": SUPPORTED_ARCHITECTURES, "provider": ["ROCMExecutionProvider"]})
)
@require_torch_gpu
@require_ort_rocm
@pytest.mark.rocm_ep_test
@require_diffusers
def test_pipeline_on_rocm_ep(self, test_name: str, model_arch: str, provider: str):
model_args = {"test_name": test_name, "model_arch": model_arch}
self._setup(model_args)

height, width, batch_size = 32, 64, 1
inputs = self.generate_inputs(height=height, width=width, batch_size=batch_size)

pipeline = self.ORTMODEL_CLASS.from_pretrained(self.onnx_model_dirs[test_name], provider=provider)
outputs = pipeline(**inputs).images
# Verify model devices
self.assertEqual(pipeline.device.type.lower(), "cuda")
# Verify model outptus
self.assertIsInstance(outputs, np.ndarray)
self.assertEqual(outputs.shape, (batch_size, height, width, 3))

0 comments on commit 2cd616e

Please sign in to comment.