def test_load_adapter_fusion(self):
        for adater_fusion_config_name, adapter_fusion_config in ADAPTERFUSION_CONFIG_MAP.items():
            model1 = AutoModel.from_config(self.config())
            model1.eval()

            with self.subTest(model_class=model1.__class__.__name__):
                name1 = "name1"
                name2 = "name2"
                model1.add_adapter(name1)
                model1.add_adapter(name2)

                model2 = copy.deepcopy(model1)
                model2.eval()

                model1.add_fusion([name1, name2], adater_fusion_config_name)
                with tempfile.TemporaryDirectory() as temp_dir:
                    model1.save_adapter_fusion(temp_dir, ",".join([name1, name2]))
                    model2.load_adapter_fusion(temp_dir)

                # check if adapter was correctly loaded
                self.assertTrue(model1.config.adapter_fusion_models == model2.config.adapter_fusion_models)

                # check equal output
                in_data = self.get_input_samples((1, 128), config=model1.config)
                model1.set_active_adapters([[name1, name2]])
                model2.set_active_adapters([[name1, name2]])
                output1 = model1(in_data)
                output2 = model2(in_data)
                self.assertEqual(len(output1), len(output2))
                self.assertTrue(torch.equal(output1[0], output2[0]))
예제 #2
0
    def test_config_immutable(self):
        def set_attr(config: AdapterFusionConfig):
            config.temperature = True

        for config in ADAPTERFUSION_CONFIG_MAP.values():
            with self.subTest(config=config.__class__.__name__):
                self.assertRaises(FrozenInstanceError, lambda: set_attr(config))
    def test_add_adapter_fusion(self):
        config_name = "pfeiffer"
        adapter_config = AdapterConfig.load(config_name)

        for adater_fusion_config_name, adapter_fusion_config in ADAPTERFUSION_CONFIG_MAP.items():
            model = AutoModel.from_config(self.config())
            model.eval()

            with self.subTest(model_class=model.__class__.__name__, config=config_name):
                name1 = f"{config_name}-1"
                name2 = f"{config_name}-2"
                model.add_adapter(name1, config=config_name)
                model.add_adapter(name2, config=config_name)

                # adapter is correctly added to config
                self.assertTrue(name1 in model.config.adapters)
                self.assertTrue(name2 in model.config.adapters)
                self.assertEqual(asdict(adapter_config), asdict(model.config.adapters.get(name1)))
                self.assertEqual(asdict(adapter_config), asdict(model.config.adapters.get(name2)))

                model.add_fusion([name1, name2], adater_fusion_config_name)

                # check forward pass
                input_ids = self.get_input_samples((1, 128), config=model.config)
                input_data = {"input_ids": input_ids}
                model.set_active_adapters([[name1, name2]])
                adapter_output = model(**input_data)
                model.set_active_adapters(None)
                base_output = model(**input_data)
                self.assertEqual(len(adapter_output), len(base_output))
                self.assertFalse(torch.equal(adapter_output[0], base_output[0]))
    def test_model_config_serialization_fusion(self):
        """PretrainedConfigurations should not raise an Exception when serializing the config dict

        See, e.g., PretrainedConfig.to_json_string()
        """
        for k, v in ADAPTERFUSION_CONFIG_MAP.items():
            model = self.get_model()
            model.add_adapter("test1")
            model.add_adapter("test2")
            model.add_adapter_fusion(["test1", "test2"], config=v)
            # should not raise an exception
            model.config.to_json_string()
예제 #5
0
    def test_model_config_serialization(self):
        """PretrainedConfigurations should not raise an Exception when serializing the config dict

        See, e.g., PretrainedConfig.to_json_string()
        """
        for model_class in self.model_classes:
            for k, v in ADAPTERFUSION_CONFIG_MAP.items():
                model_config = model_class.config_class
                model = model_class(model_config())
                model.add_adapter("test1", AdapterType.text_task)
                model.add_adapter("test2", AdapterType.text_task)
                model.add_fusion(["test1", "test2"], adapter_fusion_config=v)
                # should not raise an exception
                model.config.to_json_string()
    def test_add_adapter_fusion(self):

        for adater_fusion_config_name, adapter_fusion_config in ADAPTERFUSION_CONFIG_MAP.items(
        ):
            for config_name, adapter_config in ADAPTER_CONFIG_MAP.items():
                for type_name, adapter_type in AdapterType.__members__.items():
                    for model_class in self.model_classes:
                        model_config = model_class.config_class
                        model = model_class(model_config())

                        # skip configs without invertible language adapters
                        if adapter_type == AdapterType.text_lang and not adapter_config.invertible_adapter:
                            continue
                        with self.subTest(model_class=model_class,
                                          config=config_name,
                                          adapter_type=type_name):
                            name1 = f"{type_name}-{config_name}-1"
                            name2 = f"{type_name}-{config_name}-2"
                            model.add_adapter(name1,
                                              adapter_type,
                                              config=adapter_config)
                            model.add_adapter(name2,
                                              adapter_type,
                                              config=adapter_config)

                            # adapter is correctly added to config
                            self.assertTrue(name1 in model.config.adapters.
                                            adapter_list(adapter_type))
                            self.assertTrue(name2 in model.config.adapters.
                                            adapter_list(adapter_type))
                            self.assertEqual(adapter_config,
                                             model.config.adapters.get(name1))
                            self.assertEqual(adapter_config,
                                             model.config.adapters.get(name2))

                            model.add_fusion([name1, name2],
                                             adater_fusion_config_name)

                            # check forward pass
                            input_ids = ids_tensor((1, 128), 1000)
                            input_data = {"input_ids": input_ids}
                            if adapter_type == AdapterType.text_task or adapter_type == AdapterType.text_lang:
                                input_data["adapter_names"] = [[name1, name2]]
                            adapter_output = model(**input_data)
                            base_output = model(input_ids)
                            self.assertEqual(len(adapter_output),
                                             len(base_output))
                            self.assertFalse(
                                torch.equal(adapter_output[0], base_output[0]))
예제 #7
0
class AdapterFusionConfigTest(unittest.TestCase):

    config_names = ADAPTERFUSION_CONFIG_MAP.keys()

    def test_config_load(self):
        for config_name in self.config_names:
            with self.subTest(config_name=config_name):
                config = AdapterFusionConfig.load(config_name, temperature=True)
                self.assertTrue(isinstance(config, AdapterFusionConfig))
                self.assertEqual(config.temperature, True)

    def test_config_immutable(self):
        def set_attr(config: AdapterFusionConfig):
            config.temperature = True

        for config in ADAPTERFUSION_CONFIG_MAP.values():
            with self.subTest(config=config.__class__.__name__):
                self.assertRaises(FrozenInstanceError, lambda: set_attr(config))

    def test_custom_attr(self):
        for config in ADAPTERFUSION_CONFIG_MAP.values():
            with self.subTest(config=config.__class__.__name__):
                config.dummy_attr = "test_value"
                self.assertEqual(config.dummy_attr, "test_value")
    def test_load_adapter_fusion(self):
        for adater_fusion_config_name, adapter_fusion_config in ADAPTERFUSION_CONFIG_MAP.items(
        ):
            for name, adapter_type in AdapterType.__members__.items():
                for model_class in self.model_classes:
                    with self.subTest(model_class=model_class,
                                      adapter_type=name):
                        model_config = model_class.config_class
                        model1 = model_class(model_config())
                        name1 = "name1"
                        name2 = "name2"
                        model1.add_adapter(name1, adapter_type)
                        model1.add_adapter(name2, adapter_type)
                        model1, model2 = create_twin_models(model1)

                        model1.add_fusion([name1, name2],
                                          adater_fusion_config_name)
                        with tempfile.TemporaryDirectory() as temp_dir:
                            model1.save_adapter_fusion(
                                temp_dir, ",".join([name1, name2]))
                            model2.load_adapter_fusion(temp_dir)

                        model1.eval()
                        model2.eval()
                        # check if adapter was correctly loaded
                        self.assertTrue(model1.config.adapter_fusion_models ==
                                        model2.config.adapter_fusion_models)

                        # check equal output
                        in_data = ids_tensor((1, 128), 1000)
                        output1 = model1(in_data,
                                         adapter_names=[[name1, name2]])
                        output2 = model2(in_data,
                                         adapter_names=[[name1, name2]])
                        self.assertEqual(len(output1), len(output2))
                        self.assertTrue(torch.equal(output1[0], output2[0]))
예제 #9
0
 def test_custom_attr(self):
     for config in ADAPTERFUSION_CONFIG_MAP.values():
         with self.subTest(config=config.__class__.__name__):
             config.dummy_attr = "test_value"
             self.assertEqual(config.dummy_attr, "test_value")