Shim removed vllm.transformers_utils.tokenizer so fast_inference works on vLLM >= 0.22 (#6390)

* Shim removed vllm.transformers_utils.tokenizer for older unsloth-zoo

vLLM >= 0.22 (PR vllm-project/vllm#35024) deleted
`vllm.transformers_utils.tokenizer`. Older unsloth-zoo
patch_vllm_lora_tokenizer() does an unguarded
`import vllm.transformers_utils.tokenizer`, crashing fast_inference with
`No module named 'vllm.transformers_utils.tokenizer'`.

Add fix_vllm_lora_tokenizer_module(): a meta path finder appended after
the real finders that provides a no-op stub module only when vLLM no
longer ships it. Registered in _gpu_init.py before vLLM is imported, so
users who upgrade unsloth but keep an older unsloth-zoo are protected.

Refs unslothai/unsloth#6385

* Shorten comments in fix_vllm_lora_tokenizer_module

---------

Co-authored-by: Daniel Han <danielhanchen@gmail.com>
This commit is contained in:
Saicharan Ramineni 2026-06-17 20:25:41 -04:00 committed by GitHub
commit b0b27c9383
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 72 additions and 0 deletions

View file

@ -169,6 +169,7 @@ from unsloth_zoo.device_type import (
from .import_fixes import (
fix_xformers_performance_issue,
fix_vllm_aimv2_issue,
fix_vllm_lora_tokenizer_module,
check_vllm_torch_sm100_compatibility,
fix_vllm_guided_decoding_params,
fix_vllm_pdl_blackwell,
@ -195,6 +196,7 @@ from .import_fixes import (
fix_xformers_performance_issue()
fix_vllm_aimv2_issue()
fix_vllm_lora_tokenizer_module()
# Check vLLM + torch < 2.9.0 + SM100 compatibility BEFORE importing vLLM
check_vllm_torch_sm100_compatibility()
fix_vllm_guided_decoding_params()
@ -224,6 +226,7 @@ patch_accelerate_recursively_apply()
del fix_xformers_performance_issue
del fix_vllm_aimv2_issue
del fix_vllm_lora_tokenizer_module
del check_vllm_torch_sm100_compatibility
del fix_vllm_guided_decoding_params
del fix_trl_vllm_ascend

View file

@ -419,6 +419,75 @@ def fix_vllm_aimv2_issue():
logger.info(f"Unsloth: Failed patching vLLM with error = {str(e)}")
# vLLM >= 0.22 (PR #35024) deleted `vllm.transformers_utils.tokenizer`, but an
# older unsloth_zoo still imports it unguarded and crashes (issue #6385). Supply
# a stub via a meta path finder appended AFTER the real finders, so it only
# activates when vLLM no longer ships the module.
_VLLM_LORA_TOKENIZER_MODULE = "vllm.transformers_utils.tokenizer"
_VLLM_TOKENIZER_STUB_SENTINEL = "__unsloth_vllm_tokenizer_stub__"
def _unsloth_return_no_lora_tokenizer(*args, **kwargs):
# None -> vLLM uses the base tokenizer for LoRA (matches unsloth_zoo).
return None
class _VllmLoraTokenizerStubLoader(importlib.abc.Loader):
__slots__ = ("module_name",)
def __init__(self, module_name):
self.module_name = module_name
def create_module(self, spec):
import types
module = types.ModuleType(self.module_name)
module.__file__ = f"<unsloth stub: {self.module_name}>"
module.__package__ = self.module_name.rpartition(".")[0]
setattr(module, _VLLM_TOKENIZER_STUB_SENTINEL, True)
module.get_lora_tokenizer = _unsloth_return_no_lora_tokenizer
module.get_lora_tokenizer_async = _unsloth_return_no_lora_tokenizer
return module
def exec_module(self, module):
return None
class _VllmLoraTokenizerStubFinder(importlib.abc.MetaPathFinder):
__slots__ = (_VLLM_TOKENIZER_STUB_SENTINEL,)
def __init__(self):
setattr(self, _VLLM_TOKENIZER_STUB_SENTINEL, True)
def find_spec(
self,
fullname,
path = None,
target = None,
):
if fullname != _VLLM_LORA_TOKENIZER_MODULE:
return None
return importlib.machinery.ModuleSpec(
name = fullname,
loader = _VllmLoraTokenizerStubLoader(fullname),
is_package = False,
)
def fix_vllm_lora_tokenizer_module():
if importlib.util.find_spec("vllm") is None:
return
for finder in sys.meta_path:
if getattr(finder, _VLLM_TOKENIZER_STUB_SENTINEL, False):
return
# Appended, not inserted at 0, so a real module on older vLLM always wins.
sys.meta_path.append(_VllmLoraTokenizerStubFinder())
logger.info(
"Unsloth: Installed `vllm.transformers_utils.tokenizer` compatibility "
"stub for newer vLLM versions"
)
def fix_vllm_guided_decoding_params():
def _maybe_raise_vllm_transformers_mismatch(error):
error_text = str(error)