|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import importlib |
|
import inspect |
|
import os |
|
import re |
|
|
|
|
|
|
|
|
|
PATH_TO_TRANSFORMERS = "src/transformers" |
|
|
|
|
|
|
|
spec = importlib.util.spec_from_file_location( |
|
"transformers", |
|
os.path.join(PATH_TO_TRANSFORMERS, "__init__.py"), |
|
submodule_search_locations=[PATH_TO_TRANSFORMERS], |
|
) |
|
transformers = spec.loader.load_module() |
|
|
|
CONFIG_MAPPING = transformers.models.auto.configuration_auto.CONFIG_MAPPING |
|
|
|
|
|
|
|
_re_checkpoint = re.compile(r"\[(.+?)\]\((https://huggingface\.co/.+?)\)") |
|
|
|
|
|
CONFIG_CLASSES_TO_IGNORE_FOR_DOCSTRING_CHECKPOINT_CHECK = { |
|
"CLIPConfigMixin", |
|
"DecisionTransformerConfigMixin", |
|
"EncoderDecoderConfigMixin", |
|
"RagConfigMixin", |
|
"SpeechEncoderDecoderConfigMixin", |
|
"VisionEncoderDecoderConfigMixin", |
|
"VisionTextDualEncoderConfigMixin", |
|
} |
|
|
|
|
|
def check_config_docstrings_have_checkpoints(): |
|
configs_without_checkpoint = [] |
|
|
|
for config_class in list(CONFIG_MAPPING.values()): |
|
checkpoint_found = False |
|
|
|
|
|
config_source = inspect.getsource(config_class) |
|
checkpoints = _re_checkpoint.findall(config_source) |
|
|
|
for checkpoint in checkpoints: |
|
|
|
|
|
ckpt_name, ckpt_link = checkpoint |
|
|
|
|
|
ckpt_link_from_name = f"https://huggingface.co/{ckpt_name}" |
|
if ckpt_link == ckpt_link_from_name: |
|
checkpoint_found = True |
|
break |
|
|
|
name = config_class.__name__ |
|
if not checkpoint_found and name not in CONFIG_CLASSES_TO_IGNORE_FOR_DOCSTRING_CHECKPOINT_CHECK: |
|
configs_without_checkpoint.append(name) |
|
|
|
if len(configs_without_checkpoint) > 0: |
|
message = "\n".join(sorted(configs_without_checkpoint)) |
|
raise ValueError(f"The following configurations don't contain any valid checkpoint:\n{message}") |
|
|
|
|
|
if __name__ == "__main__": |
|
check_config_docstrings_have_checkpoints() |
|
|