Skip to content

Commit 65a7917

Browse files
authored
Fix(benchmarks): allow multiple mm contents in OpenAI Chat Completion Benchmarks (#22534)
Signed-off-by: breno.skuk <[email protected]>
1 parent b76753f commit 65a7917

File tree

6 files changed

+49
-10
lines changed

6 files changed

+49
-10
lines changed

benchmarks/backend_request_func.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class RequestFuncInput:
3131
model_name: Optional[str] = None
3232
logprobs: Optional[int] = None
3333
extra_body: Optional[dict] = None
34-
multi_modal_content: Optional[dict] = None
34+
multi_modal_content: Optional[dict | list[dict]] = None
3535
ignore_eos: bool = False
3636
language: Optional[str] = None
3737

@@ -364,7 +364,15 @@ async def async_request_openai_chat_completions(
364364
) as session:
365365
content = [{"type": "text", "text": request_func_input.prompt}]
366366
if request_func_input.multi_modal_content:
367-
content.append(request_func_input.multi_modal_content)
367+
mm_content = request_func_input.multi_modal_content
368+
if isinstance(mm_content, list):
369+
content.extend(mm_content)
370+
elif isinstance(mm_content, dict):
371+
content.append(mm_content)
372+
else:
373+
raise TypeError(
374+
"multi_modal_content must be a dict or list[dict] for openai-chat"
375+
)
368376
payload = {
369377
"model": request_func_input.model_name
370378
if request_func_input.model_name
@@ -491,7 +499,10 @@ def to_bytes(y, sr):
491499
buffer.seek(0)
492500
return buffer
493501

494-
with to_bytes(*request_func_input.multi_modal_content["audio"]) as f:
502+
mm_audio = request_func_input.multi_modal_content
503+
if not isinstance(mm_audio, dict) or "audio" not in mm_audio:
504+
raise TypeError("multi_modal_content must be a dict containing 'audio'")
505+
with to_bytes(*mm_audio["audio"]) as f:
495506
form = aiohttp.FormData()
496507
form.add_field("file", f, content_type="audio/wav")
497508
for key, value in payload.items():

benchmarks/benchmark_dataset.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class SampleRequest:
5252
prompt: Union[str, Any]
5353
prompt_len: int
5454
expected_output_len: int
55-
multi_modal_data: Optional[Union[MultiModalDataDict, dict]] = None
55+
multi_modal_data: Optional[Union[MultiModalDataDict, dict, list[dict]]] = None
5656
lora_request: Optional[LoRARequest] = None
5757

5858

benchmarks/benchmark_serving.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,14 @@ async def benchmark(
263263
input_requests[0].multi_modal_data,
264264
)
265265

266-
assert test_mm_content is None or isinstance(test_mm_content, dict)
266+
assert (
267+
test_mm_content is None
268+
or isinstance(test_mm_content, dict)
269+
or (
270+
isinstance(test_mm_content, list)
271+
and all(isinstance(item, dict) for item in test_mm_content)
272+
)
273+
), "multi_modal_data must be a dict or list[dict]"
267274
test_input = RequestFuncInput(
268275
model=model_id,
269276
model_name=model_name,

vllm/benchmarks/datasets.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,9 @@ class SampleRequest:
7171
prompt: Union[str, Any]
7272
prompt_len: int
7373
expected_output_len: int
74-
multi_modal_data: Optional[Union[MultiModalDataDict, dict]] = None
74+
multi_modal_data: Optional[
75+
Union[MultiModalDataDict, dict, list[dict]]
76+
] = None
7577
lora_request: Optional[LoRARequest] = None
7678

7779

vllm/benchmarks/lib/endpoint_request_func.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class RequestFuncInput:
2828
model_name: Optional[str] = None
2929
logprobs: Optional[int] = None
3030
extra_body: Optional[dict] = None
31-
multi_modal_content: Optional[dict] = None
31+
multi_modal_content: Optional[dict | list[dict]] = None
3232
ignore_eos: bool = False
3333
language: Optional[str] = None
3434

@@ -172,7 +172,16 @@ async def async_request_openai_chat_completions(
172172

173173
content = [{"type": "text", "text": request_func_input.prompt}]
174174
if request_func_input.multi_modal_content:
175-
content.append(request_func_input.multi_modal_content)
175+
mm_content = request_func_input.multi_modal_content
176+
if isinstance(mm_content, list):
177+
content.extend(mm_content)
178+
elif isinstance(mm_content, dict):
179+
content.append(mm_content)
180+
else:
181+
raise TypeError(
182+
"multi_modal_content must be a dict or list[dict] "
183+
"for openai-chat"
184+
)
176185
payload = {
177186
"model":
178187
request_func_input.model_name
@@ -310,7 +319,10 @@ def to_bytes(y, sr):
310319
buffer.seek(0)
311320
return buffer
312321

313-
with to_bytes(*request_func_input.multi_modal_content["audio"]) as f:
322+
mm_audio = request_func_input.multi_modal_content
323+
if not isinstance(mm_audio, dict) or "audio" not in mm_audio:
324+
raise TypeError("multi_modal_content must be a dict containing 'audio'")
325+
with to_bytes(*mm_audio["audio"]) as f:
314326
form = aiohttp.FormData()
315327
form.add_field("file", f, content_type="audio/wav")
316328
for key, value in payload.items():

vllm/benchmarks/serve.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,14 @@ async def benchmark(
365365
input_requests[0].multi_modal_data,
366366
)
367367

368-
assert test_mm_content is None or isinstance(test_mm_content, dict)
368+
assert (
369+
test_mm_content is None
370+
or isinstance(test_mm_content, dict)
371+
or (
372+
isinstance(test_mm_content, list)
373+
and all(isinstance(item, dict) for item in test_mm_content)
374+
)
375+
), "multi_modal_data must be a dict or list[dict]"
369376
test_input = RequestFuncInput(
370377
model=model_id,
371378
model_name=model_name,

0 commit comments

Comments
 (0)