import time from typing import List, Union from sglang.srt.managers.schedule_batch import ( Modality, MultimodalDataItem, MultimodalProcessorOutput, ) from sglang.srt.models.interns1pro import InternS1ProForConditionalGeneration from sglang.srt.multimodal.processors.qwen_vl import ( QwenVLImageProcessor, preprocess_video, ) from sglang.utils import logger class InternS1_1ImageProcessor(QwenVLImageProcessor): models = [ InternS1ProForConditionalGeneration, ] def get_mm_data(self, prompt, embeddings, img_grid_thw): input_ids, offsets = self.build_input_ids(prompt, img_grid_thw) mm_items = [ MultimodalDataItem( modality=Modality.IMAGE, offsets=offsets, precomputed_embeddings=embeddings, ) ] return MultimodalProcessorOutput( input_ids=input_ids, mm_items=mm_items, im_start_id=self.IM_START_TOKEN_ID, im_end_id=self.IM_END_TOKEN_ID, im_token_id=self.mm_tokens.image_token_id, video_token_id=self.mm_tokens.video_token_id, audio_token_id=self.mm_tokens.audio_token_id, ) async def process_mm_data_async( self, image_data: List[Union[str, bytes]], input_text, request_obj, *args, **kwargs, ): entry_time = time.perf_counter() base_output = await self.load_mm_data( prompt=input_text, image_data=image_data, video_data=request_obj.video_data, audio_data=request_obj.audio_data, multimodal_tokens=self.mm_tokens, ) load_time = time.perf_counter() rid = getattr(request_obj, "rid", "anonymous_rid") video_metadata = None if base_output.videos: videos_processed = [ await preprocess_video(video, video_config=self.video_config) for video in base_output.videos ] base_output.videos, video_metadata = map(list, zip(*videos_processed)) preprocess_time = time.perf_counter() mm_items, input_ids, ret = self.process_and_combine_mm_data( base_output, self.mm_tokens, video_metadata=video_metadata, do_sample_frames=False, ) second_per_grid_ts = getattr(ret, "second_per_grid_ts", None) if second_per_grid_ts is None: second_per_grid_ts = getattr(ret, "video_second_per_grid", None) process_time = time.perf_counter() input_ids = input_ids.flatten() image_grid_thw = None if hasattr(ret, "image_grid_thw"): image_grid_thw = ret.image_grid_thw if image_grid_thw is None and image_data and isinstance(image_data[0], dict): image_grid_thw = image_data[0].get("image_grid_thw") video_grid_thw = None if hasattr(ret, "video_grid_thw"): video_grid_thw = ret.video_grid_thw if video_grid_thw is None and request_obj.video_data: first_video = request_obj.video_data[0] if isinstance(first_video, dict): video_grid_thw = first_video.get("video_grid_thw") get_rope_index_time = time.perf_counter() logger.debug( f"[QwenVLProcessor Perf] {rid=}, " f"load_time: {(load_time - entry_time) * 1000:.2f} ms, " f"preprocess_time: {(preprocess_time - load_time) * 1000:.2f} ms, " f"process_time: {(process_time - preprocess_time) * 1000:.2f} ms, " f"get_rope_index_time: {(get_rope_index_time - process_time) * 1000:.2f} ms, " f"total_time: {(get_rope_index_time - entry_time) * 1000:.2f} ms" ) return MultimodalProcessorOutput( input_ids=input_ids.tolist(), mm_items=mm_items, im_start_id=self.vision_start_token_id, im_end_id=self.vision_end_token_id, im_token_id=self.mm_tokens.image_token_id, video_token_id=self.mm_tokens.video_token_id, audio_token_id=self.mm_tokens.audio_token_id, )