diff --git a/python/sglang/srt/managers/tokenizer_manager.py b/python/sglang/srt/managers/tokenizer_manager.py index 0d63f608a..64a69018d 100644 --- a/python/sglang/srt/managers/tokenizer_manager.py +++ b/python/sglang/srt/managers/tokenizer_manager.py @@ -1444,6 +1444,12 @@ class TokenizerManager(TokenizerControlMixin, TokenizerManagerScoreMixin): for i in range(batch_size): tmp_obj = copy.copy(objs[i]) tokenized_obj = copy.copy(tokenized_objs[i]) + # Ensure independent mm_items so wrap_shm_features won't mutate the original + if hasattr(tokenized_obj, "mm_inputs") and tokenized_obj.mm_inputs: + tokenized_obj.mm_inputs = copy.copy(tokenized_obj.mm_inputs) + tokenized_obj.mm_inputs.mm_items = [ + copy.copy(item) for item in tokenized_obj.mm_inputs.mm_items + ] tokenized_obj.rid = tmp_obj.regenerate_rid() tokenized_obj.sampling_params = copy.copy(tokenized_obj.sampling_params) tokenized_obj.sampling_params.max_new_tokens = 0 @@ -1457,6 +1463,12 @@ class TokenizerManager(TokenizerControlMixin, TokenizerManagerScoreMixin): for _ in range(obj.parallel_sample_num): tmp_obj = copy.copy(objs[i]) tokenized_obj = copy.copy(tokenized_objs[i]) + # Ensure independent mm_items so wrap_shm_features won't mutate the original + if hasattr(tokenized_obj, "mm_inputs") and tokenized_obj.mm_inputs: + tokenized_obj.mm_inputs = copy.copy(tokenized_obj.mm_inputs) + tokenized_obj.mm_inputs.mm_items = [ + copy.copy(item) for item in tokenized_obj.mm_inputs.mm_items + ] tokenized_obj.rid = tmp_obj.regenerate_rid() self._init_req_state(tmp_obj) tokenized_obj.time_stats = self.rid_to_state[tmp_obj.rid].time_stats