diff --git a/modelscope/models/multi_modal/efficient_diffusion_tuning/efficient_stable_diffusion.py b/modelscope/models/multi_modal/efficient_diffusion_tuning/efficient_stable_diffusion.py index 2fcd1df8..cec87bad 100644 --- a/modelscope/models/multi_modal/efficient_diffusion_tuning/efficient_stable_diffusion.py +++ b/modelscope/models/multi_modal/efficient_diffusion_tuning/efficient_stable_diffusion.py @@ -13,7 +13,6 @@ from diffusers import (AutoencoderKL, DDPMScheduler, DiffusionPipeline, utils) from diffusers.models import attention from diffusers.utils import deprecation_utils -from swift import AdapterConfig, LoRAConfig, PromptConfig, Swift from transformers import CLIPTextModel, CLIPTokenizer from modelscope import snapshot_download @@ -26,6 +25,7 @@ from modelscope.outputs import OutputKeys from modelscope.utils.checkpoint import save_checkpoint, save_configuration from modelscope.utils.config import Config from modelscope.utils.constant import ModelFile, Tasks +from modelscope.utils.import_utils import is_swift_available from .control_sd_lora import ControlLoRATuner utils.deprecate = lambda *arg, **kwargs: None @@ -34,6 +34,9 @@ attention.deprecate = lambda *arg, **kwargs: None __tuner_MAP__ = {'lora': LoRATuner, 'control_lora': ControlLoRATuner} +if is_swift_available(): + from swift import AdapterConfig, LoRAConfig, PromptConfig, Swift + @MODELS.register_module( Tasks.efficient_diffusion_tuning, @@ -110,6 +113,10 @@ class EfficientStableDiffusion(TorchModel): self.tuner_name = tuner_name if tuner_name == 'swift-lora': + if not is_swift_available(): + raise ValueError( + 'Please install swift by `pip install ms-swift` to use swift tuners.' + ) rank = tuner_config[ 'rank'] if tuner_config and 'rank' in tuner_config else 4 lora_config = LoRAConfig( @@ -119,6 +126,10 @@ class EfficientStableDiffusion(TorchModel): use_merged_linear=False) self.unet = Swift.prepare_model(self.unet, lora_config) elif tuner_name == 'swift-adapter': + if not is_swift_available(): + raise ValueError( + 'Please install swift by `pip install ms-swift` to use swift tuners.' + ) adapter_length = tuner_config[ 'adapter_length'] if tuner_config and 'adapter_length' in tuner_config else 10 adapter_config = AdapterConfig( @@ -128,6 +139,10 @@ class EfficientStableDiffusion(TorchModel): adapter_length=adapter_length) self.unet = Swift.prepare_model(self.unet, adapter_config) elif tuner_name == 'swift-prompt': + if not is_swift_available(): + raise ValueError( + 'Please install swift by `pip install ms-swift` to use swift tuners.' + ) prompt_length = tuner_config[ 'prompt_length'] if tuner_config and 'prompt_length' in tuner_config else 10 prompt_config = PromptConfig( diff --git a/modelscope/utils/error.py b/modelscope/utils/error.py index 8259c7ce..65c92196 100644 --- a/modelscope/utils/error.py +++ b/modelscope/utils/error.py @@ -174,3 +174,9 @@ XFORMERS_IMPORT_ERROR = """ {0} requires the timm library but it was not found in your environment. You can install it with pip: `pip install xformers>=0.0.17` """ + +# docstyle-ignore +SWIFT_IMPORT_ERROR = """ +{0} requires the ms-swift library but it was not found in your environment. You can install it with pip: +`pip install ms-swift -U` +""" diff --git a/modelscope/utils/import_utils.py b/modelscope/utils/import_utils.py index 2ce9d55d..1910039a 100644 --- a/modelscope/utils/import_utils.py +++ b/modelscope/utils/import_utils.py @@ -310,6 +310,7 @@ REQUIREMENTS_MAAPING = OrderedDict([ ('open_clip', (is_package_available('open_clip'), OPENCLIP_IMPORT_ERROR)), ('taming', (is_package_available('taming'), TAMING_IMPORT_ERROR)), ('xformers', (is_package_available('xformers'), XFORMERS_IMPORT_ERROR)), + ('swift', (is_package_available('swift'), SWIFT_IMPORT_ERROR)), ]) SYSTEM_PACKAGE = set(['os', 'sys', 'typing']) diff --git a/requirements/framework.txt b/requirements/framework.txt index e9dc08c4..83e69a00 100644 --- a/requirements/framework.txt +++ b/requirements/framework.txt @@ -4,7 +4,6 @@ datasets>=2.8.0,<=2.13.0 einops filelock>=3.3.0 gast>=0.2.2 -ms-swift numpy oss2 pandas diff --git a/tests/pipelines/test_efficient_diffusion_tuning.py b/tests/pipelines/test_efficient_diffusion_tuning.py index 330aee57..1f224917 100644 --- a/tests/pipelines/test_efficient_diffusion_tuning.py +++ b/tests/pipelines/test_efficient_diffusion_tuning.py @@ -1,8 +1,8 @@ # Copyright 2022-2023 The Alibaba Fundamental Vision Team Authors. All rights reserved. +import os import unittest from modelscope.models import Model -from modelscope.models.multi_modal import EfficientStableDiffusion from modelscope.pipelines import pipeline from modelscope.utils.constant import Tasks from modelscope.utils.test_utils import test_level @@ -11,6 +11,7 @@ from modelscope.utils.test_utils import test_level class EfficientDiffusionTuningTest(unittest.TestCase): def setUp(self) -> None: + os.system('pip install ms-swift -U') self.task = Tasks.efficient_diffusion_tuning @unittest.skipUnless(test_level() >= 0, 'skip test in current test level') @@ -28,6 +29,7 @@ class EfficientDiffusionTuningTest(unittest.TestCase): model_id = 'damo/multi-modal_efficient-diffusion-tuning-lora' model_revision = 'v1.0.2' model = Model.from_pretrained(model_id, model_revision=model_revision) + from modelscope.models.multi_modal import EfficientStableDiffusion self.assertTrue(model.__class__ == EfficientStableDiffusion) @unittest.skipUnless(test_level() >= 0, 'skip test in current test level') @@ -52,6 +54,7 @@ class EfficientDiffusionTuningTest(unittest.TestCase): model_id = 'damo/multi-modal_efficient-diffusion-tuning-control-lora' model_revision = 'v1.0.2' model = Model.from_pretrained(model_id, model_revision=model_revision) + from modelscope.models.multi_modal import EfficientStableDiffusion self.assertTrue(model.__class__ == EfficientStableDiffusion) diff --git a/tests/pipelines/test_efficient_diffusion_tuning_swift.py b/tests/pipelines/test_efficient_diffusion_tuning_swift.py index a2af7dec..d225a538 100644 --- a/tests/pipelines/test_efficient_diffusion_tuning_swift.py +++ b/tests/pipelines/test_efficient_diffusion_tuning_swift.py @@ -1,11 +1,11 @@ # Copyright 2022-2023 The Alibaba Fundamental Vision Team Authors. All rights reserved. +import os import tempfile import unittest import cv2 from modelscope.models import Model -from modelscope.models.multi_modal import EfficientStableDiffusion from modelscope.pipelines import pipeline from modelscope.utils.constant import Tasks from modelscope.utils.test_utils import test_level @@ -14,6 +14,7 @@ from modelscope.utils.test_utils import test_level class EfficientDiffusionTuningTestSwift(unittest.TestCase): def setUp(self) -> None: + os.system('pip install ms-swift -U') self.task = Tasks.efficient_diffusion_tuning @unittest.skipUnless(test_level() >= 1, 'skip test in current test level') @@ -39,6 +40,7 @@ class EfficientDiffusionTuningTestSwift(unittest.TestCase): model_id = 'damo/multi-modal_efficient-diffusion-tuning-swift-lora' model_revision = 'v1.0.2' model = Model.from_pretrained(model_id, model_revision=model_revision) + from modelscope.models.multi_modal import EfficientStableDiffusion self.assertTrue(model.__class__ == EfficientStableDiffusion) @unittest.skipUnless(test_level() >= 1, 'skip test in current test level') @@ -64,6 +66,7 @@ class EfficientDiffusionTuningTestSwift(unittest.TestCase): model_id = 'damo/multi-modal_efficient-diffusion-tuning-swift-adapter' model_revision = 'v1.0.2' model = Model.from_pretrained(model_id, model_revision=model_revision) + from modelscope.models.multi_modal import EfficientStableDiffusion self.assertTrue(model.__class__ == EfficientStableDiffusion) @unittest.skipUnless(test_level() >= 1, 'skip test in current test level') @@ -89,6 +92,7 @@ class EfficientDiffusionTuningTestSwift(unittest.TestCase): model_id = 'damo/multi-modal_efficient-diffusion-tuning-swift-prompt' model_revision = 'v1.0.2' model = Model.from_pretrained(model_id, model_revision=model_revision) + from modelscope.models.multi_modal import EfficientStableDiffusion self.assertTrue(model.__class__ == EfficientStableDiffusion)