From 29e8f7f9e572eb7c8fd1a77c9babcbea32f0c5c2 Mon Sep 17 00:00:00 2001 From: Feng Su Date: Fri, 19 Dec 2025 07:27:59 +0800 Subject: [PATCH] multimodal: precompute hash for MultimodalDataItem (#14354) Signed-off-by: Feng Su Signed-off-by: Junjie Mao --- docs/references/environment_variables.md | 1 + python/sglang/srt/environ.py | 1 + python/sglang/srt/managers/schedule_batch.py | 3 +++ python/sglang/srt/managers/tokenizer_manager.py | 10 +++++++++- 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/docs/references/environment_variables.md b/docs/references/environment_variables.md index 344f0746e..6170e07ba 100644 --- a/docs/references/environment_variables.md +++ b/docs/references/environment_variables.md @@ -36,6 +36,7 @@ SGLang supports various environment variables that can be used to configure its | `SGLANG_SCHEDULER_RECV_SKIPPER_WEIGHT_DECODE` | Weight increment for decode forward mode in scheduler recv skipper. Works with `--scheduler-recv-interval` to control polling frequency during decode phase. | `1` | | `SGLANG_SCHEDULER_RECV_SKIPPER_WEIGHT_VERIFY` | Weight increment for target verify forward mode in scheduler recv skipper. Works with `--scheduler-recv-interval` to control polling frequency during verification phase. | `1` | | `SGLANG_SCHEDULER_RECV_SKIPPER_WEIGHT_NONE` | Weight increment when forward mode is None in scheduler recv skipper. Works with `--scheduler-recv-interval` to control polling frequency when no specific forward mode is active. | `1` | +| `SGLANG_MM_PRECOMPUTE_HASH` | Enable precomputing of hash values for MultimodalDataItem | `false` | ## DeepGEMM Configuration (Advanced Optimization) diff --git a/python/sglang/srt/environ.py b/python/sglang/srt/environ.py index b10002c91..bfc606375 100644 --- a/python/sglang/srt/environ.py +++ b/python/sglang/srt/environ.py @@ -330,6 +330,7 @@ class Envs: SGLANG_IMAGE_MAX_PIXELS = EnvInt(16384 * 28 * 28) SGLANG_RESIZE_RESAMPLE = EnvStr("") SGLANG_MM_BUFFER_SIZE_MB = EnvInt(0) + SGLANG_MM_PRECOMPUTE_HASH = EnvBool(False) # VLM Item CUDA IPC Transport SGLANG_USE_CUDA_IPC_TRANSPORT=EnvBool(False) diff --git a/python/sglang/srt/managers/schedule_batch.py b/python/sglang/srt/managers/schedule_batch.py index 53eea9b5a..1ac309649 100644 --- a/python/sglang/srt/managers/schedule_batch.py +++ b/python/sglang/srt/managers/schedule_batch.py @@ -243,6 +243,9 @@ class MultimodalDataItem: """ Set the pad value after first hashing the data """ + if self.pad_value is not None: + return + from sglang.srt.managers.mm_utils import hash_feature if self.hash is None: diff --git a/python/sglang/srt/managers/tokenizer_manager.py b/python/sglang/srt/managers/tokenizer_manager.py index 2a53eb64b..5f61c670e 100644 --- a/python/sglang/srt/managers/tokenizer_manager.py +++ b/python/sglang/srt/managers/tokenizer_manager.py @@ -73,7 +73,7 @@ from sglang.srt.managers.io_struct import ( from sglang.srt.managers.mm_utils import TensorTransportMode from sglang.srt.managers.multimodal_processor import get_mm_processor, import_processors from sglang.srt.managers.request_metrics_exporter import RequestMetricsExporterManager -from sglang.srt.managers.schedule_batch import RequestStage +from sglang.srt.managers.schedule_batch import MultimodalDataItem, RequestStage from sglang.srt.managers.scheduler import is_health_check_generate_req from sglang.srt.managers.scheduler_input_blocker import input_blocker_guard_region from sglang.srt.managers.tokenizer_communicator_mixin import TokenizerCommunicatorMixin @@ -653,6 +653,14 @@ class TokenizerManager(TokenizerCommunicatorMixin, TokenizerManagerMultiItemMixi if mm_inputs and "input_ids" in mm_inputs: input_ids = mm_inputs["input_ids"] + if ( + envs.SGLANG_MM_PRECOMPUTE_HASH.get() + and mm_inputs + and "mm_items" in mm_inputs + ): + for item in mm_inputs["mm_items"]: + if isinstance(item, MultimodalDataItem): + item.set_pad_value() else: mm_inputs = None