model: support interns1-pro (#18145)

Co-authored-by: Ke Bao <ispobaoke@gmail.com>
This commit is contained in:
RunningLeon
2026-02-05 00:22:44 +08:00
committed by GitHub
co-authored by Ke Bao
parent a6f53cc5e3
commit 3e7ecb78a6
5 changed files with 578 additions and 2 deletions
@@ -0,0 +1,118 @@
import time
from typing import List, Union
from sglang.srt.managers.schedule_batch import Modality, MultimodalDataItem
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 {
"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 = 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 {
"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,
}