forked from phoenix/litellm-mirror
add llama3 tokenizer and support for custom tokenizer
This commit is contained in:
parent
b3f5ff4d11
commit
2fd2e811fd
1 changed files with 39 additions and 3 deletions
|
@ -3687,6 +3687,10 @@ def _select_tokenizer(model: str):
|
||||||
elif "llama-2" in model.lower() or "replicate" in model.lower():
|
elif "llama-2" in model.lower() or "replicate" in model.lower():
|
||||||
tokenizer = Tokenizer.from_pretrained("hf-internal-testing/llama-tokenizer")
|
tokenizer = Tokenizer.from_pretrained("hf-internal-testing/llama-tokenizer")
|
||||||
return {"type": "huggingface_tokenizer", "tokenizer": tokenizer}
|
return {"type": "huggingface_tokenizer", "tokenizer": tokenizer}
|
||||||
|
# llama3
|
||||||
|
elif "llama-3" in model.lower():
|
||||||
|
tokenizer = Tokenizer.from_pretrained("Xenova/llama-3-tokenizer")
|
||||||
|
return {"type": "huggingface_tokenizer", "tokenizer": tokenizer}
|
||||||
# default - tiktoken
|
# default - tiktoken
|
||||||
else:
|
else:
|
||||||
return {"type": "openai_tokenizer", "tokenizer": encoding}
|
return {"type": "openai_tokenizer", "tokenizer": encoding}
|
||||||
|
@ -3881,10 +3885,41 @@ def calculage_img_tokens(
|
||||||
tile_tokens = (base_tokens * 2) * tiles_needed_high_res
|
tile_tokens = (base_tokens * 2) * tiles_needed_high_res
|
||||||
total_tokens = base_tokens + tile_tokens
|
total_tokens = base_tokens + tile_tokens
|
||||||
return total_tokens
|
return total_tokens
|
||||||
|
|
||||||
|
|
||||||
|
def create_pretrained_tokenizer(
|
||||||
|
identifier: str,
|
||||||
|
revision="main",
|
||||||
|
auth_token: Optional[str] = None
|
||||||
|
):
|
||||||
|
"""
|
||||||
|
Creates a tokenizer from an existing file on a HuggingFace repository to be used with `token_counter`.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
identifier (str): The identifier of a Model on the Hugging Face Hub, that contains a tokenizer.json file
|
||||||
|
revision (str, defaults to main): A branch or commit id
|
||||||
|
auth_token (str, optional, defaults to None): An optional auth token used to access private repositories on the Hugging Face Hub
|
||||||
|
"""
|
||||||
|
|
||||||
|
tokenizer = Tokenizer.from_pretrained(identifier, revision=revision, auth_token=auth_token)
|
||||||
|
return {"type": "huggingface_tokenizer", "tokenizer": tokenizer}
|
||||||
|
|
||||||
|
|
||||||
|
def create_tokenizer(json: str):
|
||||||
|
"""
|
||||||
|
Creates a tokenizer from a valid JSON string for use with `token_counter`.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
json (str): A valid JSON string representing a previously serialized tokenizer
|
||||||
|
"""
|
||||||
|
|
||||||
|
tokenizer = Tokenizer.from_str(json)
|
||||||
|
return {"type": "huggingface_tokenizer", "tokenizer": tokenizer}
|
||||||
|
|
||||||
|
|
||||||
def token_counter(
|
def token_counter(
|
||||||
model="",
|
model="",
|
||||||
|
custom_tokenizer: Optional[dict] = None,
|
||||||
text: Optional[Union[str, List[str]]] = None,
|
text: Optional[Union[str, List[str]]] = None,
|
||||||
messages: Optional[List] = None,
|
messages: Optional[List] = None,
|
||||||
count_response_tokens: Optional[bool] = False,
|
count_response_tokens: Optional[bool] = False,
|
||||||
|
@ -3894,13 +3929,14 @@ def token_counter(
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
model (str): The name of the model to use for tokenization. Default is an empty string.
|
model (str): The name of the model to use for tokenization. Default is an empty string.
|
||||||
|
tokenizer (Optional[dict]): A custom tokenizer created with the `create_pretrained_tokenizer` or `create_tokenizer` method. Must be a dictionary with a string value for `type` and Tokenizer for `tokenizer`. Default is None.
|
||||||
text (str): The raw text string to be passed to the model. Default is None.
|
text (str): The raw text string to be passed to the model. Default is None.
|
||||||
messages (Optional[List[Dict[str, str]]]): Alternative to passing in text. A list of dictionaries representing messages with "role" and "content" keys. Default is None.
|
messages (Optional[List[Dict[str, str]]]): Alternative to passing in text. A list of dictionaries representing messages with "role" and "content" keys. Default is None.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
int: The number of tokens in the text.
|
int: The number of tokens in the text.
|
||||||
"""
|
"""
|
||||||
# use tiktoken, anthropic, cohere or llama2's tokenizer depending on the model
|
# use tiktoken, anthropic, cohere, llama2, or llama3's tokenizer depending on the model
|
||||||
is_tool_call = False
|
is_tool_call = False
|
||||||
num_tokens = 0
|
num_tokens = 0
|
||||||
if text == None:
|
if text == None:
|
||||||
|
@ -3942,8 +3978,8 @@ def token_counter(
|
||||||
elif isinstance(text, str):
|
elif isinstance(text, str):
|
||||||
count_response_tokens = True # user just trying to count tokens for a text. don't add the chat_ml +3 tokens to this
|
count_response_tokens = True # user just trying to count tokens for a text. don't add the chat_ml +3 tokens to this
|
||||||
|
|
||||||
if model is not None:
|
if model is not None or custom_tokenizer is not None:
|
||||||
tokenizer_json = _select_tokenizer(model=model)
|
tokenizer_json = custom_tokenizer or _select_tokenizer(model=model)
|
||||||
if tokenizer_json["type"] == "huggingface_tokenizer":
|
if tokenizer_json["type"] == "huggingface_tokenizer":
|
||||||
print_verbose(
|
print_verbose(
|
||||||
f"Token Counter - using hugging face token counter, for model={model}"
|
f"Token Counter - using hugging face token counter, for model={model}"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue