Files
2026-07-13 13:24:13 +08:00

73 lines
2.8 KiB
Python

from transformers import PreTrainedTokenizer, AutoTokenizer
import os
from general_util.logger import get_child_logger
DEFAULT_PAD_TOKEN = "[PAD]"
DEFAULT_EOS_TOKEN = "</s>"
DEFAULT_BOS_TOKEN = "<s>"
DEFAULT_UNK_TOKEN = "<unk>"
logger = get_child_logger(__name__)
def tokenizer_get_name(_tokenizer: PreTrainedTokenizer):
tokenizer_name = _tokenizer.__class__.__name__
tokenizer_name = tokenizer_name.replace('TokenizerFast', '')
tokenizer_name = tokenizer_name.replace('Tokenizer', '').lower()
return tokenizer_name
def expand_special_tokenizer(tokenizer: PreTrainedTokenizer):
tokenizer_name = tokenizer_get_name(tokenizer)
if "llama" in tokenizer_name or "mistral" in tokenizer_name:
special_tokens_map = {}
eos_token = os.environ.get("EOS_TOKEN", None)
if eos_token or (not tokenizer.eos_token):
special_tokens_map["eos_token"] = eos_token if eos_token else DEFAULT_EOS_TOKEN
bos_token = os.environ.get("BOS_TOKEN", None)
if bos_token or (not tokenizer.bos_token):
special_tokens_map["bos_token"] = bos_token if bos_token else DEFAULT_BOS_TOKEN
unk_token = os.environ.get("UNK_TOKEN", None)
if not tokenizer.unk_token:
special_tokens_map["unk_token"] = unk_token if unk_token else DEFAULT_UNK_TOKEN
pad_token = os.environ.get("PAD_TOKEN", None)
if not tokenizer.pad_token:
special_tokens_map["pad_token"] = pad_token if pad_token else DEFAULT_PAD_TOKEN
new_tokens = tokenizer.add_special_tokens(
special_tokens_dict=special_tokens_map
)
# new_tokens = tokenizer.add_special_tokens(special_tokens_dict=dict(pad_token=DEFAULT_PAD_TOKEN))
# tokenizer.pad_token = tokenizer.eos_token
# tokenizer.pad_token_id = tokenizer.eos_token_id
# assert new_tokens == 1
elif "gptneox" in tokenizer_name:
special_tokens_map = {}
eos_token = os.environ.get("EOS_TOKEN", None)
if eos_token:
special_tokens_map["eos_token"] = eos_token if eos_token else DEFAULT_EOS_TOKEN
new_tokens = tokenizer.add_special_tokens(
special_tokens_dict=special_tokens_map
)
if not tokenizer.pad_token:
tokenizer.pad_token = tokenizer.eos_token
tokenizer.pad_token_id = tokenizer.eos_token_id
logger.info(tokenizer)
def init_tokenizer(tokenizer_path: str, **kwargs) -> PreTrainedTokenizer:
tokenizer = AutoTokenizer.from_pretrained(tokenizer_path, **kwargs)
expand_special_tokenizer(tokenizer)
return tokenizer
def is_seq2seq_tokenizer(tokenizer: PreTrainedTokenizer):
tokenizer_name = tokenizer_get_name(tokenizer)
return any([x in tokenizer_name for x in ["t5", "bart", "pegasus", "mbart", "marian", "blenderbot"]])