Compare commits

..

6 Commits

Author SHA1 Message Date
Sayak Paul
0899c14fb0 Merge branch 'main' into revisit-deps-tests 2026-03-30 16:09:59 +05:30
Sayak Paul
5ad19730ef Merge branch 'main' into revisit-deps-tests 2026-03-27 09:07:53 +05:30
Sayak Paul
6433f2df10 Merge branch 'main' into revisit-deps-tests 2026-03-26 08:51:04 +05:30
sayakpaul
e2f8851b0b f 2026-03-25 14:22:25 +05:30
sayakpaul
cebed06b2a invoke dependency testing temporarily. 2026-03-25 14:13:48 +05:30
sayakpaul
7a94096c22 tighten dependency testing. 2026-03-25 14:10:27 +05:30
5 changed files with 74 additions and 44 deletions

View File

@@ -6,6 +6,7 @@ on:
- main
paths:
- "src/diffusers/**.py"
- "tests/**.py"
push:
branches:
- main

View File

@@ -6,6 +6,7 @@ on:
- main
paths:
- "src/diffusers/**.py"
- "tests/**.py"
push:
branches:
- main
@@ -26,7 +27,7 @@ jobs:
- name: Install dependencies
run: |
pip install -e .
pip install torch torchvision torchaudio pytest
pip install torch pytest
- name: Check for soft dependencies
run: |
pytest tests/others/test_dependencies.py

View File

@@ -5,10 +5,13 @@ import cv2
import numpy as np
import torch
from PIL import Image, ImageOps
from torchvision.transforms import InterpolationMode
from torchvision.transforms.functional import normalize, resize
from ...utils import get_logger, load_image
from ...utils import get_logger, is_torchvision_available, load_image
if is_torchvision_available():
from torchvision.transforms import InterpolationMode
from torchvision.transforms.functional import normalize, resize
logger = get_logger(__name__)

View File

@@ -13,29 +13,24 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import pytest
import torch
import unittest
from diffusers import AutoencoderDC
from ...testing_utils import IS_GITHUB_ACTIONS, enable_full_determinism, torch_device
from ..testing_utils import BaseModelTesterConfig, MemoryTesterMixin, ModelTesterMixin, TrainingTesterMixin
from ...testing_utils import IS_GITHUB_ACTIONS, enable_full_determinism, floats_tensor, torch_device
from ..test_modeling_common import ModelTesterMixin
from .testing_utils import AutoencoderTesterMixin
enable_full_determinism()
class AutoencoderDCTesterConfig(BaseModelTesterConfig):
@property
def model_class(self):
return AutoencoderDC
class AutoencoderDCTests(ModelTesterMixin, AutoencoderTesterMixin, unittest.TestCase):
model_class = AutoencoderDC
main_input_name = "sample"
base_precision = 1e-2
@property
def output_shape(self):
return (3, 32, 32)
def get_init_dict(self):
def get_autoencoder_dc_config(self):
return {
"in_channels": 3,
"latent_channels": 4,
@@ -61,34 +56,33 @@ class AutoencoderDCTesterConfig(BaseModelTesterConfig):
"scaling_factor": 0.41407,
}
def get_dummy_inputs(self, seed=0):
torch.manual_seed(seed)
@property
def dummy_input(self):
batch_size = 4
num_channels = 3
sizes = (32, 32)
image = torch.randn(batch_size, num_channels, *sizes).to(torch_device)
image = floats_tensor((batch_size, num_channels) + sizes).to(torch_device)
return {"sample": image}
# Bridge for AutoencoderTesterMixin which still uses the old interface
@property
def input_shape(self):
return (3, 32, 32)
@property
def output_shape(self):
return (3, 32, 32)
def prepare_init_args_and_inputs_for_common(self):
return self.get_init_dict(), self.get_dummy_inputs()
init_dict = self.get_autoencoder_dc_config()
inputs_dict = self.dummy_input
return init_dict, inputs_dict
@unittest.skipIf(IS_GITHUB_ACTIONS, reason="Skipping test inside GitHub Actions environment")
def test_layerwise_casting_inference(self):
super().test_layerwise_casting_inference()
class TestAutoencoderDC(AutoencoderDCTesterConfig, ModelTesterMixin):
base_precision = 1e-2
class TestAutoencoderDCTraining(AutoencoderDCTesterConfig, TrainingTesterMixin):
"""Training tests for AutoencoderDC."""
class TestAutoencoderDCMemory(AutoencoderDCTesterConfig, MemoryTesterMixin):
"""Memory optimization tests for AutoencoderDC."""
@pytest.mark.skipif(IS_GITHUB_ACTIONS, reason="Skipping test inside GitHub Actions environment")
@unittest.skipIf(IS_GITHUB_ACTIONS, reason="Skipping test inside GitHub Actions environment")
def test_layerwise_casting_memory(self):
super().test_layerwise_casting_memory()
class TestAutoencoderDCSlicingTiling(AutoencoderDCTesterConfig, AutoencoderTesterMixin):
"""Slicing and tiling tests for AutoencoderDC."""

View File

@@ -13,16 +13,14 @@
# limitations under the License.
import inspect
import unittest
from importlib import import_module
import pytest
class DependencyTester(unittest.TestCase):
class TestDependencies:
def test_diffusers_import(self):
try:
import diffusers # noqa: F401
except ImportError:
assert False
import diffusers # noqa: F401
def test_backend_registration(self):
import diffusers
@@ -52,3 +50,36 @@ class DependencyTester(unittest.TestCase):
if hasattr(diffusers.pipelines, cls_name):
pipeline_folder_module = ".".join(str(cls_module.__module__).split(".")[:3])
_ = import_module(pipeline_folder_module, str(cls_name))
def test_pipeline_module_imports(self):
"""Import every pipeline submodule whose dependencies are satisfied,
to catch unguarded optional-dep imports (e.g., torchvision).
Uses inspect.getmembers to discover classes that the lazy loader can
actually resolve (same self-filtering as test_pipeline_imports), then
imports the full module path instead of truncating to the folder level.
"""
import diffusers
import diffusers.pipelines
failures = []
all_classes = inspect.getmembers(diffusers, inspect.isclass)
for cls_name, cls_module in all_classes:
if not hasattr(diffusers.pipelines, cls_name):
continue
if "dummy_" in cls_module.__module__:
continue
full_module_path = cls_module.__module__
try:
import_module(full_module_path)
except ImportError as e:
failures.append(f"{full_module_path}: {e}")
except Exception:
# Non-import errors (e.g., missing config) are fine; we only
# care about unguarded import statements.
pass
if failures:
pytest.fail("Unguarded optional-dependency imports found:\n" + "\n".join(failures))