[Frontend] Remove the slow tokenizer mode (#58545)

Signed-off-by: Harry Mellor <19981378+hmellor@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

Harry Mellor committed Sep 24, 2026 at 17:48 UTC d636456b1f9cc77706543203ea0e66a7598e490e
12 files changed +11 -39
benchmarks/backend_request_func.py
-4
@@ -630,10 +630,6 @@ def get_tokenizer(
630 pretrained_model_name_or_path
631 ):
632 pretrained_model_name_or_path = get_model(pretrained_model_name_or_path)
633 - if tokenizer_mode == "slow":
634 - if kwargs.get("use_fast", False):
635 - raise ValueError("Cannot use the fast tokenizer in slow tokenizer mode.")
636 - kwargs["use_fast"] = False
633 if tokenizer_mode == "mistral":
634 try:
635 from vllm.tokenizers.mistral import MistralTokenizer
examples/generate/multimodal/vision_language_multi_image_offline.py
-1
@@ -55,7 +55,6 @@ def load_aria(question: str, image_urls: list[str]) -> ModelRequestData:
55 model_name = "rhymes-ai/Aria"
56 engine_args = EngineArgs(
57 model=model_name,
58 - tokenizer_mode="slow",
58 trust_remote_code=True,
59 dtype="bfloat16",
60 limit_mm_per_prompt={"image": len(image_urls)},
rust/src/bench/src/cli.rs
+1 -1
@@ -176,7 +176,7 @@ pub struct BenchServeArgs {
176 #[arg(long)]
177 pub tokenizer: Option<String>,
178
179 - /// Tokenizer mode (auto, hf, slow, mistral). Accepted for Python CLI
179 + /// Tokenizer mode (auto, hf, mistral). Accepted for Python CLI
180 /// compatibility; non-auto values are ignored with a warning.
181 #[arg(long, default_value = "auto")]
182 pub tokenizer_mode: String,
tests/renderers/test_token_offsets.py
+1 -1
@@ -20,7 +20,7 @@ def fast_tokenizer():
20 """gpt2 ships a Fast tokenizer; use it to test the offsets happy path."""
21 from transformers import AutoTokenizer
22
23 - return AutoTokenizer.from_pretrained("openai-community/gpt2", use_fast=True)
23 + return AutoTokenizer.from_pretrained("openai-community/gpt2")
24
25
26 def _make_base_renderer_with(tokenizer):
tests/tokenizers_/test_basic.py
+1 -1
@@ -23,7 +23,7 @@ def _assert_tokenizer_like(tokenizer: object):
23
24
25 def test_tokenizer_like_protocol():
26 - tokenizer = get_tokenizer("openai-community/gpt2", use_fast=True)
26 + tokenizer = get_tokenizer("openai-community/gpt2")
27 assert isinstance(tokenizer, TokenizersBackend)
28 _assert_tokenizer_like(tokenizer)
29
tests/tokenizers_/test_registry.py
+5 -16
@@ -69,21 +69,11 @@ def test_resolve_tokenizer_args_idempotent(runner_type):
69 )
70
71
72 -@pytest.mark.parametrize(
73 - ("tokenizer_mode", "input_kwargs"),
74 - [
75 - ("hf", {}),
76 - ("hf", {"mistral_format": False}),
77 - ("slow", {}),
78 - ("slow", {"mistral_format": False}),
79 - ],
80 -)
81 -def test_resolve_tokenizer_args_forces_hf_mistral_format_false(
82 - tokenizer_mode, input_kwargs
83 -):
72 +@pytest.mark.parametrize("input_kwargs", [{}, {"mistral_format": False}])
73 +def test_resolve_tokenizer_args_forces_hf_mistral_format_false(input_kwargs):
74 resolved_mode, _, _, kwargs = resolve_tokenizer_args(
75 "mistralai/Mistral-Nemo-Instruct-2407",
86 - tokenizer_mode=tokenizer_mode,
76 + tokenizer_mode="hf",
77 **input_kwargs,
78 )
79
@@ -91,15 +81,14 @@ def test_resolve_tokenizer_args_forces_hf_mistral_format_false(
81 assert kwargs["mistral_format"] is False
82
83
94 -@pytest.mark.parametrize("tokenizer_mode", ["hf", "slow"])
95 -def test_resolve_tokenizer_args_rejects_hf_mistral_format_true(tokenizer_mode):
84 +def test_resolve_tokenizer_args_rejects_hf_mistral_format_true():
85 with pytest.raises(
86 ValueError,
87 match="mistral_format=True is not supported with tokenizer_mode='hf'",
88 ):
89 resolve_tokenizer_args(
90 "mistralai/Mistral-Nemo-Instruct-2407",
102 - tokenizer_mode=tokenizer_mode,
91 + tokenizer_mode="hf",
92 mistral_format=True,
93 )
94
vllm/benchmarks/serve.py
-1
@@ -1695,7 +1695,6 @@ def add_cli_args(parser: FlexibleArgumentParser):
1695 - "auto" will use the tokenizer from `mistral_common` for Mistral models
1696 if available, otherwise it will use the "hf" tokenizer.\n
1697 - "hf" will use the fast tokenizer if available.\n
1698 - - "slow" will always use the slow tokenizer.\n
1698 - "mistral" will always use the tokenizer from `mistral_common`.\n
1699 - "deepseek_v32" will always use the tokenizer from `deepseek_v32`.\n
1700 - Other custom values can be supported via plugins.""",
vllm/config/model.py
-2
@@ -89,7 +89,6 @@ ConvertOption = Literal["auto", ConvertType]
89 TokenizerMode = Literal[
90 "auto",
91 "hf",
92 - "slow",
92 "mistral",
93 "deepseek_v32",
94 "deepseek_v4",
@@ -148,7 +147,6 @@ class ModelConfig:
147 - "auto" will use the tokenizer from `mistral_common` for Mistral models
148 if available, otherwise it will use the "hf" tokenizer.
149 - "hf" will use the fast tokenizer if available.
151 - - "slow" will always use the slow tokenizer.
150 - "mistral" will always use the tokenizer from `mistral_common`.
151 - "deepseek_v32" will always use the tokenizer from `deepseek_v32`.
152 - "deepseek_v4" will always use the tokenizer from `deepseek_v4`.
vllm/entrypoints/llm.py
+2 -2
@@ -76,8 +76,8 @@ class LLM(BeamSearchOfflineMixin, PoolingOfflineMixin, OfflineInferenceMixin):
76 Args:
77 model: The name or path of a HuggingFace Transformers model.
78 tokenizer: The name or path of a HuggingFace Transformers tokenizer.
79 - tokenizer_mode: The tokenizer mode. "auto" will use the fast tokenizer
80 - if available, and "slow" will always use the slow tokenizer.
79 + tokenizer_mode: The tokenizer mode. See
80 + [ModelConfig.tokenizer_mode][vllm.config.ModelConfig.tokenizer_mode].
81 skip_tokenizer_init: If true, skip initialization of tokenizer and
82 detokenizer. Expect valid prompt_token_ids and None for prompt
83 from the input.
vllm/renderers/hf.py
+1 -2
@@ -966,8 +966,7 @@ class HfRenderer(BaseRenderer[HfTokenizer]):
966 )
967
968 def _can_produce_offsets(self) -> bool:
969 - # HF tokenizers may be slow (use_fast=False); only fast tokenizers
970 - # expose offset_mapping.
969 + # Only fast tokenizers expose offset_mapping.
970 return self.tokenizer is not None and self.tokenizer.is_fast
971
972 def render_messages(
vllm/tokenizers/registry.py
-7
@@ -145,13 +145,6 @@ def resolve_tokenizer_args(
145 else:
146 assert_never(runner_type)
147
148 - if tokenizer_mode == "slow":
149 - if kwargs.get("use_fast", False):
150 - raise ValueError("Cannot use the fast tokenizer in slow tokenizer mode.")
151 -
152 - tokenizer_mode = "hf"
153 - kwargs["use_fast"] = False
154 -
148 # Try to use official Mistral tokenizer if possible
149 if (
150 tokenizer_mode == "auto"
vllm/transformers_utils/processors/moondream3.py
-1
@@ -209,7 +209,6 @@ class Moondream3Processor(ProcessorMixin):
209 "revision",
210 "subfolder",
211 "token",
212 - "use_fast",
212 ):
213 if key in kwargs:
214 tokenizer_kwargs[key] = kwargs[key]