1
0
mirror of https://github.com/huggingface/diffusers.git synced 2026-10-23 09:09:01 +03:00

tests: fix qwen tests from getting oom'd in our CI. (#14474)

This commit is contained in:
Sayak Paul
2026-08-14 14:25:33 +02:00
committed by GitHub
parent 69a0d5a52b
commit 90b4e34e79
3 changed files with 50 additions and 4 deletions

View File

@@ -24,7 +24,7 @@ from diffusers import (
QwenImageTransformer2DModel,
)
from ...testing_utils import assert_tensors_close, torch_device
from ...testing_utils import assert_tensors_close, require_accelerator_memory, torch_device
from ..testing_utils import (
BasePipelineTesterConfig,
MemoryTesterMixin,
@@ -170,6 +170,15 @@ class TestQwenImageEditPipeline(QwenImageEditPipelineTesterConfig, PipelineTeste
"VAE tiling should not affect the inference results."
)
# The condition image is always resized to ~1 megapixel before it is encoded, so the VAE attention runs over
# 65k tokens no matter how small the dummy inputs are. On GPUs without bf16 SDPA support that attention falls
# back to the math backend, which materializes the full attention matrix (~16GB).
@require_accelerator_memory(24)
@pytest.mark.skipif(torch_device not in ["cuda", "xpu"], reason="half-precision inference requires CUDA or XPU")
@pytest.mark.parametrize("dtype", [torch.float16, torch.bfloat16], ids=str)
def test_half_precision_inference_no_nan(self, dtype):
super().test_half_precision_inference_no_nan(dtype)
@pytest.mark.xfail(condition=True, reason="Preconfigured embeddings need to be revisited.", strict=True)
def test_encode_prompt_works_in_isolation(self, extra_required_param_value_dict=None, atol=1e-4, rtol=1e-4):
super().test_encode_prompt_works_in_isolation(extra_required_param_value_dict, atol, rtol)
@@ -200,4 +209,7 @@ class TestQwenImageEditPipeline(QwenImageEditPipelineTesterConfig, PipelineTeste
class TestQwenImageEditPipelineMemory(QwenImageEditPipelineTesterConfig, MemoryTesterMixin):
pass
# Runs the pipeline in bf16, see the note on `test_half_precision_inference_no_nan` above.
@require_accelerator_memory(24)
def test_layerwise_casting_inference(self):
super().test_layerwise_casting_inference()

View File

@@ -24,7 +24,7 @@ from diffusers import (
QwenImageTransformer2DModel,
)
from ...testing_utils import assert_tensors_close, torch_device
from ...testing_utils import assert_tensors_close, require_accelerator_memory, torch_device
from ..testing_utils import BasePipelineTesterConfig, MemoryTesterMixin, PipelineTesterMixin
@@ -164,6 +164,15 @@ class TestQwenImageEditPlusPipeline(QwenImageEditPlusPipelineTesterConfig, Pipel
"VAE tiling should not affect the inference results."
)
# The condition image is always resized to ~1 megapixel before it is encoded, so the VAE attention runs over
# 65k tokens no matter how small the dummy inputs are. On GPUs without bf16 SDPA support that attention falls
# back to the math backend, which materializes the full attention matrix (~16GB).
@require_accelerator_memory(24)
@pytest.mark.skipif(torch_device not in ["cuda", "xpu"], reason="half-precision inference requires CUDA or XPU")
@pytest.mark.parametrize("dtype", [torch.float16, torch.bfloat16], ids=str)
def test_half_precision_inference_no_nan(self, dtype):
super().test_half_precision_inference_no_nan(dtype)
@pytest.mark.xfail(condition=True, reason="Preconfigured embeddings need to be revisited.", strict=True)
def test_encode_prompt_works_in_isolation(self, extra_required_param_value_dict=None, atol=1e-4, rtol=1e-4):
super().test_encode_prompt_works_in_isolation(extra_required_param_value_dict, atol, rtol)
@@ -206,4 +215,7 @@ class TestQwenImageEditPlusPipeline(QwenImageEditPlusPipelineTesterConfig, Pipel
class TestQwenImageEditPlusPipelineMemory(QwenImageEditPlusPipelineTesterConfig, MemoryTesterMixin):
pass
# Runs the pipeline in bf16, see the note on `test_half_precision_inference_no_nan` above.
@require_accelerator_memory(24)
def test_layerwise_casting_inference(self):
super().test_layerwise_casting_inference()

View File

@@ -660,6 +660,28 @@ def require_big_accelerator(test_case):
)(test_case)
def require_accelerator_memory(min_memory_gb: int):
"""
Decorator marking a test that needs at least `min_memory_gb` GB of memory on the accelerator it runs on. Tests
running on CPU are not affected.
"""
def decorator(test_case):
if torch_device == "cuda" and torch.cuda.is_available():
total_memory = torch.cuda.get_device_properties(0).total_memory / (1024**3)
elif torch_device == "xpu" and torch.xpu.is_available():
total_memory = torch.xpu.get_device_properties(0).total_memory / (1024**3)
else:
return test_case
return pytest.mark.skipif(
total_memory < min_memory_gb,
reason=f"test requires an accelerator with at least {min_memory_gb} GB memory",
)(test_case)
return decorator
def require_torch_accelerator_with_training(test_case):
"""Decorator marking a test that requires an accelerator with support for training."""
return pytest.mark.skipif(