Skip to content
Merged
42 changes: 42 additions & 0 deletions src/transformers/configuration_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -762,6 +762,10 @@ def from_dict(cls, config_dict: Dict[str, Any], **kwargs) -> "PretrainedConfig":
to_remove = []
for key, value in kwargs.items():
if hasattr(config, key):
current_attr = getattr(config, key)
# To authorize passing a custom subconfig as kwarg in models that have nested configs.
if isinstance(current_attr, PretrainedConfig) and isinstance(value, dict):
value = current_attr.__class__(**value)
setattr(config, key, value)
if key != "torch_dtype":
to_remove.append(key)
Expand Down Expand Up @@ -823,6 +827,18 @@ def to_diff_dict(self) -> Dict[str, Any]:
# only serialize values that differ from the default config
for key, value in config_dict.items():
if (
isinstance(getattr(self, key, None), PretrainedConfig)
and key in class_config_dict
and isinstance(class_config_dict[key], dict)
):
# For nested configs we need to clean the diff recursively
diff = recursive_diff_dict(value, class_config_dict[key], config_obj=getattr(self, key, None))
if "model_type" in value:
# Needs to be set even if it's not in the diff
diff["model_type"] = value["model_type"]
if len(diff) > 0:
serializable_config_dict[key] = diff
elif (
key not in default_config_dict
or key == "transformers_version"
or value != default_config_dict[key]
Expand Down Expand Up @@ -859,6 +875,14 @@ def to_dict(self) -> Dict[str, Any]:
# Transformers version when serializing the model
output["transformers_version"] = __version__

for key, value in output.items():
# Deal with nested configs like CLIP
if isinstance(value, PretrainedConfig):
value = value.to_dict()
del value["transformers_version"]

output[key] = value

if hasattr(self, "quantization_config"):
output["quantization_config"] = (
self.quantization_config.to_dict()
Expand Down Expand Up @@ -1020,6 +1044,24 @@ def get_configuration_file(configuration_files: List[str]) -> str:
return configuration_file


def recursive_diff_dict(dict_a, dict_b, config_obj=None):
"""
Helper function to recursively take the diff between two nested dictionaries. The resulting diff only contains the
values from `dict_a` that are different from values in `dict_b`.
"""
diff = {}
default = config_obj.__class__().to_dict() if config_obj is not None else {}
for key, value in dict_a.items():
obj_value = getattr(config_obj, str(key), None)
if isinstance(obj_value, PretrainedConfig) and key in dict_b and isinstance(dict_b[key], dict):
diff_value = recursive_diff_dict(value, dict_b[key], config_obj=obj_value)
if len(diff_value) > 0:
diff[key] = diff_value
elif key not in dict_b or value != dict_b[key] or key not in default or value != default[key]:
diff[key] = value
return diff


PretrainedConfig.push_to_hub = copy_func(PretrainedConfig.push_to_hub)
if PretrainedConfig.push_to_hub.__doc__ is not None:
PretrainedConfig.push_to_hub.__doc__ = PretrainedConfig.push_to_hub.__doc__.format(
Expand Down
15 changes: 0 additions & 15 deletions src/transformers/models/align/configuration_align.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
# limitations under the License.
""" ALIGN model configuration"""

import copy
import os
from typing import TYPE_CHECKING, List, Union

Expand Down Expand Up @@ -344,7 +343,6 @@ class AlignConfig(PretrainedConfig):
```"""

model_type = "align"
is_composition = True

def __init__(
self,
Expand Down Expand Up @@ -383,16 +381,3 @@ def from_text_vision_configs(cls, text_config: AlignTextConfig, vision_config: A
"""

return cls(text_config=text_config.to_dict(), vision_config=vision_config.to_dict(), **kwargs)

def to_dict(self):
"""
Serializes this instance to a Python dictionary. Override the default [`~PretrainedConfig.to_dict`].

Returns:
`Dict[str, any]`: Dictionary of all the attributes that make up this configuration instance,
"""
output = copy.deepcopy(self.__dict__)
output["text_config"] = self.text_config.to_dict()
output["vision_config"] = self.vision_config.to_dict()
output["model_type"] = self.__class__.model_type
return output
15 changes: 0 additions & 15 deletions src/transformers/models/altclip/configuration_altclip.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
# See the License for the specific language governing permissions and
# limitations under the License.
""" AltCLIP model configuration"""
import copy
import os
from typing import Union

Expand Down Expand Up @@ -291,7 +290,6 @@ class AltCLIPConfig(PretrainedConfig):
```"""

model_type = "altclip"
is_composition = True

def __init__(
self, text_config=None, vision_config=None, projection_dim=768, logit_scale_init_value=2.6592, **kwargs
Expand Down Expand Up @@ -392,16 +390,3 @@ def from_text_vision_configs(cls, text_config: AltCLIPTextConfig, vision_config:
"""

return cls(text_config=text_config.to_dict(), vision_config=vision_config.to_dict(), **kwargs)

def to_dict(self):
"""
Serializes this instance to a Python dictionary. Override the default [`~PretrainedConfig.to_dict`].

Returns:
`Dict[str, any]`: Dictionary of all the attributes that make up this configuration instance,
"""
output = copy.deepcopy(self.__dict__)
output["text_config"] = self.text_config.to_dict()
output["vision_config"] = self.vision_config.to_dict()
output["model_type"] = self.__class__.model_type
return output
19 changes: 0 additions & 19 deletions src/transformers/models/bark/configuration_bark.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
# limitations under the License.
""" BARK model configuration"""

import copy
import os
from typing import Dict, Optional, Union

Expand Down Expand Up @@ -271,7 +270,6 @@ class BarkConfig(PretrainedConfig):
"""

model_type = "bark"
is_composition = True

def __init__(
self,
Expand Down Expand Up @@ -329,20 +327,3 @@ def from_sub_model_configs(
codec_config=codec_config.to_dict(),
**kwargs,
)

def to_dict(self):
"""
Serializes this instance to a Python dictionary. Override the default [`~PretrainedConfig.to_dict`].

Returns:
`Dict[str, any]`: Dictionary of all the attributes that make up this configuration instance,
"""
output = copy.deepcopy(self.__dict__)

output["semantic_config"] = self.semantic_config.to_dict()
output["coarse_acoustics_config"] = self.coarse_acoustics_config.to_dict()
output["fine_acoustics_config"] = self.fine_acoustics_config.to_dict()
output["codec_config"] = self.codec_config.to_dict()

output["model_type"] = self.__class__.model_type
return output
15 changes: 0 additions & 15 deletions src/transformers/models/blip/configuration_blip.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
# limitations under the License.
""" Blip model configuration"""

import copy
import os
from typing import Union

Expand Down Expand Up @@ -325,7 +324,6 @@ class BlipConfig(PretrainedConfig):
```"""

model_type = "blip"
is_composition = True

def __init__(
self,
Expand Down Expand Up @@ -368,16 +366,3 @@ def from_text_vision_configs(cls, text_config: BlipTextConfig, vision_config: Bl
"""

return cls(text_config=text_config.to_dict(), vision_config=vision_config.to_dict(), **kwargs)

def to_dict(self):
"""
Serializes this instance to a Python dictionary. Override the default [`~PretrainedConfig.to_dict`].

Returns:
`Dict[str, any]`: Dictionary of all the attributes that make up this configuration instance,
"""
output = copy.deepcopy(self.__dict__)
output["text_config"] = self.text_config.to_dict()
output["vision_config"] = self.vision_config.to_dict()
output["model_type"] = self.__class__.model_type
return output
16 changes: 0 additions & 16 deletions src/transformers/models/blip_2/configuration_blip_2.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
# limitations under the License.
""" BLIP-2 model configuration"""

import copy
import os
from typing import Union

Expand Down Expand Up @@ -302,7 +301,6 @@ class Blip2Config(PretrainedConfig):
```"""

model_type = "blip-2"
is_composition = True

def __init__(self, vision_config=None, qformer_config=None, text_config=None, num_query_tokens=32, **kwargs):
super().__init__(**kwargs)
Expand Down Expand Up @@ -355,17 +353,3 @@ def from_vision_qformer_text_configs(
text_config=text_config.to_dict(),
**kwargs,
)

def to_dict(self):
"""
Serializes this instance to a Python dictionary. Override the default [`~PretrainedConfig.to_dict`].

Returns:
`Dict[str, any]`: Dictionary of all the attributes that make up this configuration instance,
"""
output = copy.deepcopy(self.__dict__)
output["vision_config"] = self.vision_config.to_dict()
output["qformer_config"] = self.qformer_config.to_dict()
output["text_config"] = self.text_config.to_dict()
output["model_type"] = self.__class__.model_type
return output
14 changes: 0 additions & 14 deletions src/transformers/models/bridgetower/configuration_bridgetower.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
# limitations under the License.
""" BridgeTower model configuration"""

import copy
import os
from typing import Union

Expand Down Expand Up @@ -349,16 +348,3 @@ def from_text_vision_configs(
"""

return cls(text_config=text_config.to_dict(), vision_config=vision_config.to_dict(), **kwargs)

def to_dict(self):
"""
Serializes this instance to a Python dictionary. Override the default [`~PretrainedConfig.to_dict`].

Returns:
`Dict[str, any]`: Dictionary of all the attributes that make up this configuration instance,
"""
output = copy.deepcopy(self.__dict__)
output["text_config"] = self.text_config.to_dict()
output["vision_config"] = self.vision_config.to_dict()
output["model_type"] = self.__class__.model_type
return output
15 changes: 0 additions & 15 deletions src/transformers/models/chinese_clip/configuration_chinese_clip.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
# limitations under the License.
""" Chinese-CLIP model configuration"""

import copy
import os
from collections import OrderedDict
from typing import TYPE_CHECKING, Any, Mapping, Optional, Union
Expand Down Expand Up @@ -314,7 +313,6 @@ class ChineseCLIPConfig(PretrainedConfig):
```"""

model_type = "chinese_clip"
is_composition = True

def __init__(
self, text_config=None, vision_config=None, projection_dim=512, logit_scale_init_value=2.6592, **kwargs
Expand Down Expand Up @@ -417,19 +415,6 @@ def from_text_vision_configs(

return cls(text_config=text_config.to_dict(), vision_config=vision_config.to_dict(), **kwargs)

def to_dict(self):
"""
Serializes this instance to a Python dictionary. Override the default [`~PretrainedConfig.to_dict`].

Returns:
`Dict[str, any]`: Dictionary of all the attributes that make up this configuration instance,
"""
output = copy.deepcopy(self.__dict__)
output["text_config"] = self.text_config.to_dict()
output["vision_config"] = self.vision_config.to_dict()
output["model_type"] = self.__class__.model_type
return output


class ChineseCLIPOnnxConfig(OnnxConfig):
@property
Expand Down
15 changes: 0 additions & 15 deletions src/transformers/models/clap/configuration_clap.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
# limitations under the License.
""" CLAP model configuration"""

import copy
import os
from typing import Union

Expand Down Expand Up @@ -382,7 +381,6 @@ class ClapConfig(PretrainedConfig):
```"""

model_type = "clap"
is_composition = True

def __init__(
self,
Expand Down Expand Up @@ -431,16 +429,3 @@ def from_text_audio_configs(cls, text_config: ClapTextConfig, audio_config: Clap
"""

return cls(text_config=text_config.to_dict(), audio_config=audio_config.to_dict(), **kwargs)

def to_dict(self):
"""
Serializes this instance to a Python dictionary. Override the default [`~PretrainedConfig.to_dict`].

Returns:
`Dict[str, any]`: Dictionary of all the attributes that make up this configuration instance,
"""
output = copy.deepcopy(self.__dict__)
output["text_config"] = self.text_config.to_dict()
output["audio_config"] = self.audio_config.to_dict()
output["model_type"] = self.__class__.model_type
return output
15 changes: 0 additions & 15 deletions src/transformers/models/clip/configuration_clip.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
# limitations under the License.
""" CLIP model configuration"""

import copy
import os
from collections import OrderedDict
from typing import TYPE_CHECKING, Any, Mapping, Optional, Union
Expand Down Expand Up @@ -298,7 +297,6 @@ class CLIPConfig(PretrainedConfig):
```"""

model_type = "clip"
is_composition = True

def __init__(
self, text_config=None, vision_config=None, projection_dim=512, logit_scale_init_value=2.6592, **kwargs
Expand Down Expand Up @@ -400,19 +398,6 @@ def from_text_vision_configs(cls, text_config: CLIPTextConfig, vision_config: CL

return cls(text_config=text_config.to_dict(), vision_config=vision_config.to_dict(), **kwargs)

def to_dict(self):
"""
Serializes this instance to a Python dictionary. Override the default [`~PretrainedConfig.to_dict`].

Returns:
`Dict[str, any]`: Dictionary of all the attributes that make up this configuration instance,
"""
output = copy.deepcopy(self.__dict__)
output["text_config"] = self.text_config.to_dict()
output["vision_config"] = self.vision_config.to_dict()
output["model_type"] = self.__class__.model_type
return output


class CLIPOnnxConfig(OnnxConfig):
@property
Expand Down
Loading