import os import shutil import tempfile import unittest import torch from modelscope import Model from peft.utils import WEIGHTS_NAME from swift import LoRAConfig, SwiftModel @unittest.skip class TestSwift(unittest.TestCase): def setUp(self): print(('Testing %s.%s' % (type(self).__name__, self._testMethodName))) self.tmp_dir = tempfile.TemporaryDirectory().name if not os.path.exists(self.tmp_dir): os.makedirs(self.tmp_dir) def tearDown(self): shutil.rmtree(self.tmp_dir) super().tearDown() def test_swift_multiple_adapters(self): model = Model.from_pretrained('modelscope/Llama-2-7b-ms', device_map='auto') lora_config = LoRAConfig(target_modules=['q_proj', 'k_proj', 'v_proj']) model: SwiftModel = SwiftModel(model, config={'lora': lora_config}) self.assertTrue(isinstance(model, SwiftModel)) model.save_pretrained(self.tmp_dir, adapter_name=['lora']) state_dict = model.state_dict() with open(os.path.join(self.tmp_dir, 'configuration.json'), 'w') as f: f.write('{}') self.assertTrue(os.path.exists(os.path.join(self.tmp_dir, 'lora'))) self.assertTrue(os.path.exists(os.path.join(self.tmp_dir, 'lora', WEIGHTS_NAME))) model = Model.from_pretrained('modelscope/Llama-2-7b-ms', device_map='auto') model = SwiftModel.from_pretrained(model, self.tmp_dir, adapter_name=['lora'], device_map='auto') state_dict2 = model.state_dict() for key in state_dict: self.assertTrue(key in state_dict2) self.assertTrue(all(torch.isclose(state_dict[key], state_dict2[key]).flatten().detach().cpu())) self.assertTrue(len(set(model.hf_device_map.values())) == torch.cuda.device_count())