Replace hasattr with isinstance in SHM feature helpers (#29549)

This commit is contained in:
Lianmin Zheng
2026-06-28 21:31:28 -07:00
committed by GitHub
parent f76e707f59
commit bb74ed4a8d
+22 -17
View File
@@ -16,6 +16,11 @@ from torch import nn
from sglang.srt.environ import envs from sglang.srt.environ import envs
from sglang.srt.layers.multimodal import gpu_tensor_hash from sglang.srt.layers.multimodal import gpu_tensor_hash
from sglang.srt.managers.io_struct import (
BaseBatchReq,
TokenizedEmbeddingReqInput,
TokenizedGenerateReqInput,
)
from sglang.srt.managers.schedule_batch import ( from sglang.srt.managers.schedule_batch import (
CudaIpcTensorTransportProxy, CudaIpcTensorTransportProxy,
Modality, Modality,
@@ -1733,17 +1738,14 @@ def wrap_shm_features(obj):
if _get_is_default_transport() or get_global_server_args().skip_tokenizer_init: if _get_is_default_transport() or get_global_server_args().skip_tokenizer_init:
return obj return obj
if hasattr(obj, "mm_inputs") and obj.mm_inputs: if obj.mm_inputs:
for item in obj.mm_inputs.mm_items: for item in obj.mm_inputs.mm_items:
item_hash = getattr(item, "hash", None) item_hash = item.hash
if hasattr(item, "feature") and item.feature is not None: if item.feature is not None:
item.feature = _wrap_tensor_or_list( item.feature = _wrap_tensor_or_list(
item.feature, precomputed_hash=item_hash item.feature, precomputed_hash=item_hash
) )
if ( if item.precomputed_embeddings is not None:
hasattr(item, "precomputed_embeddings")
and item.precomputed_embeddings is not None
):
item.precomputed_embeddings = _wrap_tensor_or_list( item.precomputed_embeddings = _wrap_tensor_or_list(
item.precomputed_embeddings, precomputed_hash=item_hash item.precomputed_embeddings, precomputed_hash=item_hash
) )
@@ -1762,14 +1764,17 @@ def _feature_has_shm(feat) -> bool:
def has_shm_features(recv_reqs): def has_shm_features(recv_reqs):
"""Return True if any request in the list contains ShmPointerMMData.""" """Return True if any request in the list contains ShmPointerMMData."""
for req in recv_reqs: for req in recv_reqs:
if hasattr(req, "batch"): if isinstance(req, BaseBatchReq):
if has_shm_features(req.batch): if has_shm_features(req.batch):
return True return True
elif hasattr(req, "mm_inputs") and req.mm_inputs: elif (
isinstance(req, (TokenizedGenerateReqInput, TokenizedEmbeddingReqInput))
and req.mm_inputs
):
for item in req.mm_inputs.mm_items: for item in req.mm_inputs.mm_items:
if _feature_has_shm(item.feature): if _feature_has_shm(item.feature):
return True return True
if _feature_has_shm(getattr(item, "precomputed_embeddings", None)): if _feature_has_shm(item.precomputed_embeddings):
return True return True
return False return False
@@ -1794,19 +1799,19 @@ def unwrap_shm_features(obj):
if _get_is_default_transport() or get_global_server_args().skip_tokenizer_init: if _get_is_default_transport() or get_global_server_args().skip_tokenizer_init:
return obj return obj
# Handle batch requests # Handle batch requests
if hasattr(obj, "batch"): if isinstance(obj, BaseBatchReq):
for sub_obj in obj.batch: for sub_obj in obj.batch:
unwrap_shm_features(sub_obj) unwrap_shm_features(sub_obj)
return obj return obj
# Handle single requests # Handle single requests
if hasattr(obj, "mm_inputs") and obj.mm_inputs: if (
isinstance(obj, (TokenizedGenerateReqInput, TokenizedEmbeddingReqInput))
and obj.mm_inputs
):
for item in obj.mm_inputs.mm_items: for item in obj.mm_inputs.mm_items:
if hasattr(item, "feature") and item.feature is not None: if item.feature is not None:
item.feature = _unwrap_tensor_or_list(item.feature) item.feature = _unwrap_tensor_or_list(item.feature)
if ( if item.precomputed_embeddings is not None:
hasattr(item, "precomputed_embeddings")
and item.precomputed_embeddings is not None
):
item.precomputed_embeddings = _unwrap_tensor_or_list( item.precomputed_embeddings = _unwrap_tensor_or_list(
item.precomputed_embeddings item.precomputed_embeddings
) )