test_basic.py 2.46 KB
Newer Older
1
2
3
4
5
# SPDX-License-Identifier: Apache-2.0
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
from typing import _get_protocol_attrs  # type: ignore

import pytest
6
7
8
9
from transformers import (
    PreTrainedTokenizerBase,
    PreTrainedTokenizerFast,
)
10

11
from vllm.tokenizers import TokenizerLike, get_tokenizer
Bijaya Dangol's avatar
Bijaya Dangol committed
12
from vllm.tokenizers.grok2 import Grok2Tokenizer
13
from vllm.tokenizers.hf import HfTokenizer
14
from vllm.tokenizers.mistral import MistralTokenizer
15
16
17
18
19
20


def _get_missing_attrs(obj: object, target: type):
    return [k for k in _get_protocol_attrs(target) if not hasattr(obj, k)]


21
22
23
24
25
def _assert_tokenizer_like(tokenizer: object):
    missing_attrs = _get_missing_attrs(tokenizer, TokenizerLike)
    assert not missing_attrs, f"Missing attrs: {missing_attrs}"


26
def test_tokenizer_like_protocol():
27
28
29
30
31
32
33
34
35
    tokenizer = get_tokenizer("gpt2", use_fast=True)
    assert isinstance(tokenizer, PreTrainedTokenizerFast)
    _assert_tokenizer_like(tokenizer)

    tokenizer = get_tokenizer(
        "mistralai/Mistral-7B-Instruct-v0.3", tokenizer_mode="mistral"
    )
    assert isinstance(tokenizer, MistralTokenizer)
    _assert_tokenizer_like(tokenizer)
36

Bijaya Dangol's avatar
Bijaya Dangol committed
37
38
39
40
    tokenizer = get_tokenizer("xai-org/grok-2", tokenizer_mode="grok2")
    assert isinstance(tokenizer, Grok2Tokenizer)
    _assert_tokenizer_like(tokenizer)

41
42
43
44
45
46
47
    tokenizer = get_tokenizer("deepseek-ai/DeepSeek-V3", tokenizer_mode="deepseek_v32")
    assert isinstance(tokenizer, HfTokenizer)
    # Verify it's a fast tokenizer (required for FastIncrementalDetokenizer)
    assert isinstance(tokenizer, PreTrainedTokenizerFast)
    assert "DSV32" in tokenizer.__class__.__name__
    _assert_tokenizer_like(tokenizer)

48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67

@pytest.mark.parametrize("tokenizer_name", ["facebook/opt-125m", "gpt2"])
def test_tokenizer_revision(tokenizer_name: str):
    # Assume that "main" branch always exists
    tokenizer = get_tokenizer(tokenizer_name, revision="main")
    assert isinstance(tokenizer, PreTrainedTokenizerBase)

    # Assume that "never" branch always does not exist
    with pytest.raises(OSError, match="not a valid git identifier"):
        get_tokenizer(tokenizer_name, revision="never")


@pytest.mark.parametrize("tokenizer_name", ["BAAI/bge-base-en"])
@pytest.mark.parametrize("n_tokens", [510])
def test_special_tokens(tokenizer_name: str, n_tokens: int):
    tokenizer = get_tokenizer(tokenizer_name, revision="main")

    prompts = "[UNK]" * n_tokens
    prompt_token_ids = tokenizer.encode(prompts)
    assert len(prompt_token_ids) == n_tokens + 2