Skip to content

Commit 50e5e44

Browse files
authored
Fix tokenizer_class incompatibility with transformers 5.0 (#2403)
On transformers 5.0, save_pretrained() writes "TokenizersBackend" as the tokenizer_class. The existing fixup code appends "Fast" to any non-Fast class name, producing "TokenizersBackendFast" which doesn't exist in any transformers version, breaking all downstream consumers (vLLM, evalplus). Fix: read tokenizer_class from the source model instead of from the save_pretrained output, preserving a backwards-compatible model-specific class name (e.g. LlamaTokenizerFast) regardless of which transformers version does the saving.
1 parent 0197ed2 commit 50e5e44

1 file changed

Lines changed: 16 additions & 10 deletions

File tree

gptqmodel/models/writer.py

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -498,16 +498,22 @@ def _normalize_metadata(meta: Optional[Dict[str, Any]]) -> Dict[str, str]:
498498
if self.tokenizer:
499499
self.tokenizer.save_pretrained(save_dir)
500500

501-
# fixed this issue: https://github.com/huggingface/transformers/issues/35832
502-
saved_tokenizer_config = get_tokenizer_config(save_dir)
503-
config_tokenizer_class = saved_tokenizer_config.get("tokenizer_class")
504-
# if the tokenizer is fast, but the tokenizer_config.json does not have Fast suffix, add "Fast" suffix
505-
if config_tokenizer_class and (not config_tokenizer_class.endswith("Fast")) and (
506-
isinstance(self.tokenizer.tokenizer, PreTrainedTokenizerFast)
507-
):
508-
saved_tokenizer_config["tokenizer_class"] = saved_tokenizer_config["tokenizer_class"] + "Fast"
509-
with open(os.path.join(save_dir, "tokenizer_config.json"), "w", encoding="utf-8") as f:
510-
json.dump(saved_tokenizer_config, f, indent=2, ensure_ascii=False)
501+
# Use source model's tokenizer_class for cross-version compatibility
502+
# (transformers 5.0 save_pretrained writes "TokenizersBackend" which older versions can't load)
503+
source_tokenizer_config = get_tokenizer_config(self.model_local_path)
504+
source_tokenizer_class = source_tokenizer_config.get("tokenizer_class")
505+
506+
if source_tokenizer_class:
507+
# fix https://github.com/huggingface/transformers/issues/35832
508+
# if source tokenizer_class lacks "Fast" suffix but tokenizer is actually fast, add it
509+
if (not source_tokenizer_class.endswith("Fast")) and isinstance(self.tokenizer.tokenizer, PreTrainedTokenizerFast):
510+
source_tokenizer_class = source_tokenizer_class + "Fast"
511+
512+
saved_tokenizer_config = get_tokenizer_config(save_dir)
513+
if saved_tokenizer_config.get("tokenizer_class") != source_tokenizer_class:
514+
saved_tokenizer_config["tokenizer_class"] = source_tokenizer_class
515+
with open(os.path.join(save_dir, "tokenizer_config.json"), "w", encoding="utf-8") as f:
516+
json.dump(saved_tokenizer_config, f, indent=2, ensure_ascii=False)
511517

512518

513519
cls.save_quantized = save_quantized

0 commit comments

Comments
 (0)