A high-throughput and memory-efficient inference and serving engine for LLMs
Mirrored from https://github.com/tduncan-lum/Nvidia-Optimization-Stack---VLLM.git
Synced Nov 14, 05:30 UTC
[Benchmark] Add option to skip oversampling in benchmark (#24457)
Signed-off-by: Ekagra Ranjan <3116519+ekagra-ranjan@users.noreply.github.com>
Ekagra Ranjan committed
Sep 9, 2025 at 18:00 UTC
fb1a8f932a6dabf19f890dd905ebe217539fd147
1 file changed
+58
-13
vllm/benchmarks/datasets.py
+58
-13
@@ -198,8 +198,9 @@ class BenchmarkDataset(ABC):
198
199
@abstractmethod
200
def sample(self, tokenizer: PreTrainedTokenizerBase,
201
- num_requests: int,
202
- request_id_prefix: str = "") -> list[SampleRequest]:
201
+ num_requests: int,
202
+ request_id_prefix: str = "",
203
+ no_oversample: bool = False) -> list[SampleRequest]:
204
"""
205
Abstract method to generate sample requests from the dataset.
206
@@ -224,6 +225,7 @@ class BenchmarkDataset(ABC):
225
requests: list[SampleRequest],
226
num_requests: int,
227
request_id_prefix: str = "",
228
+ no_oversample: bool = False,
229
) -> None:
230
"""
231
Oversamples the list of requests if its size is less than the desired
@@ -236,6 +238,11 @@ class BenchmarkDataset(ABC):
238
request_id_prefix (str) The prefix of the request ids.
239
240
"""
241
+ if no_oversample:
242
+ logger.info("Skipping oversampling. " \
243
+ "Total samples: %d.", len(requests))
244
+ return
245
+
246
if len(requests) < num_requests:
247
random.seed(self.random_seed)
248
additional = deepcopy(
@@ -405,6 +412,7 @@ class RandomDataset(BenchmarkDataset):
412
tokenizer: PreTrainedTokenizerBase,
413
num_requests: int,
414
request_id_prefix: str = "",
415
+ no_oversample: bool = False,
416
prefix_len: int = DEFAULT_PREFIX_LEN,
417
range_ratio: float = DEFAULT_RANGE_RATIO,
418
input_len: int = DEFAULT_INPUT_LEN,
@@ -832,6 +840,7 @@ class RandomMultiModalDataset(RandomDataset):
840
tokenizer: PreTrainedTokenizerBase,
841
num_requests: int,
842
request_id_prefix: str = "",
843
+ no_oversample: bool = False,
844
prefix_len: int = RandomDataset.DEFAULT_PREFIX_LEN,
845
range_ratio: float = RandomDataset.DEFAULT_RANGE_RATIO,
846
input_len: int = RandomDataset.DEFAULT_INPUT_LEN,
@@ -959,6 +968,7 @@ class ShareGPTDataset(BenchmarkDataset):
968
output_len: Optional[int] = None,
969
enable_multimodal_chat: bool = False,
970
request_id_prefix: str = "",
971
+ no_oversample: bool = False,
972
**kwargs,
973
) -> list:
974
samples: list = []
@@ -1002,7 +1012,10 @@ class ShareGPTDataset(BenchmarkDataset):
1012
request_id=request_id_prefix + str(ind),
1013
))
1014
ind += 1
1005
- self.maybe_oversample_requests(samples, num_requests, request_id_prefix)
1015
+ self.maybe_oversample_requests(samples,
1016
+ num_requests,
1017
+ request_id_prefix,
1018
+ no_oversample)
1019
return samples
1020
1021
@@ -1036,6 +1049,12 @@ def add_dataset_parser(parser: FlexibleArgumentParser):
1049
help="Path to the sharegpt/sonnet dataset. "
1050
"Or the huggingface dataset ID if using HF dataset.",
1051
)
1052
+ parser.add_argument(
1053
+ "--no-oversample",
1054
+ action="store_true",
1055
+ help="Do not oversample if the dataset has " \
1056
+ "fewer samples than num-prompts.",
1057
+ )
1058
1059
# group for dataset specific arguments
1060
custom_group = parser.add_argument_group("custom dataset options")
@@ -1322,6 +1341,7 @@ def get_samples(args, tokenizer) -> list[SampleRequest]:
1341
output_len=args.custom_output_len,
1342
skip_chat_template=args.custom_skip_chat_template,
1343
request_id_prefix=args.request_id_prefix,
1344
+ no_oversample=args.no_oversample,
1345
)
1346
1347
elif args.dataset_name == "sonnet":
@@ -1336,6 +1356,7 @@ def get_samples(args, tokenizer) -> list[SampleRequest]:
1356
tokenizer=tokenizer,
1357
return_prompt_formatted=False,
1358
request_id_prefix=args.request_id_prefix,
1359
+ no_oversample=args.no_oversample,
1360
)
1361
else:
1362
assert tokenizer.chat_template or tokenizer.default_chat_template, (
@@ -1348,6 +1369,7 @@ def get_samples(args, tokenizer) -> list[SampleRequest]:
1369
tokenizer=tokenizer,
1370
return_prompt_formatted=True,
1371
request_id_prefix=args.request_id_prefix,
1372
+ no_oversample=args.no_oversample,
1373
)
1374
1375
elif args.dataset_name == "hf":
@@ -1443,6 +1465,7 @@ def get_samples(args, tokenizer) -> list[SampleRequest]:
1465
tokenizer=tokenizer,
1466
output_len=args.hf_output_len,
1467
request_id_prefix=args.request_id_prefix,
1468
+ no_oversample=args.no_oversample,
1469
**hf_kwargs
1470
)
1471
@@ -1456,6 +1479,7 @@ def get_samples(args, tokenizer) -> list[SampleRequest]:
1479
tokenizer=tokenizer,
1480
output_len=args.spec_bench_output_len,
1481
request_id_prefix=args.request_id_prefix,
1482
+ no_oversample=args.no_oversample,
1483
),
1484
"sharegpt": lambda: ShareGPTDataset(
1485
random_seed=args.seed, dataset_path=args.dataset_path
@@ -1464,6 +1488,7 @@ def get_samples(args, tokenizer) -> list[SampleRequest]:
1488
num_requests=args.num_prompts,
1489
output_len=args.sharegpt_output_len,
1490
request_id_prefix=args.request_id_prefix,
1491
+ no_oversample=args.no_oversample,
1492
),
1493
"burstgpt": lambda: BurstGPTDataset(
1494
random_seed=args.seed, dataset_path=args.dataset_path
@@ -1471,6 +1496,7 @@ def get_samples(args, tokenizer) -> list[SampleRequest]:
1496
tokenizer=tokenizer,
1497
num_requests=args.num_prompts,
1498
request_id_prefix=args.request_id_prefix,
1499
+ no_oversample=args.no_oversample,
1500
),
1501
"random": lambda: RandomDataset(
1502
random_seed=args.seed, dataset_path=args.dataset_path
@@ -1483,6 +1509,7 @@ def get_samples(args, tokenizer) -> list[SampleRequest]:
1509
range_ratio=args.random_range_ratio,
1510
request_id_prefix=args.request_id_prefix,
1511
batchsize=args.random_batch_size,
1512
+ no_oversample=args.no_oversample,
1513
),
1514
"random-mm":
1515
lambda: RandomMultiModalDataset(
@@ -1499,6 +1526,7 @@ def get_samples(args, tokenizer) -> list[SampleRequest]:
1526
num_mm_items_range_ratio=args.random_mm_num_mm_items_range_ratio,
1527
bucket_config=args.random_mm_bucket_config,
1528
request_id_prefix=args.request_id_prefix,
1529
+ no_oversample=args.no_oversample,
1530
),
1531
"prefix_repetition":
1532
lambda: PrefixRepetitionRandomDataset(
@@ -1511,6 +1539,7 @@ def get_samples(args, tokenizer) -> list[SampleRequest]:
1539
num_prefixes=args.prefix_repetition_num_prefixes,
1540
output_len=args.prefix_repetition_output_len,
1541
request_id_prefix=args.request_id_prefix,
1542
+ no_oversample=args.no_oversample,
1543
),
1544
}
1545
@@ -1592,6 +1621,7 @@ class CustomDataset(BenchmarkDataset):
1621
enable_multimodal_chat: bool = False,
1622
skip_chat_template: bool = False,
1623
request_id_prefix: str = "",
1624
+ no_oversample: bool = False,
1625
**kwargs,
1626
) -> list:
1627
# load all data if needed
@@ -1628,7 +1658,7 @@ class CustomDataset(BenchmarkDataset):
1658
request_id=request_id_prefix + str(i),
1659
))
1660
self.maybe_oversample_requests(sampled_requests, num_requests,
1631
- request_id_prefix)
1661
+ request_id_prefix, no_oversample)
1662
1663
return sampled_requests
1664
@@ -1719,6 +1749,7 @@ class SonnetDataset(BenchmarkDataset):
1749
output_len: int = DEFAULT_OUTPUT_LEN,
1750
return_prompt_formatted: bool = False,
1751
request_id_prefix: str = "",
1752
+ no_oversample: bool = False,
1753
**kwargs,
1754
) -> list:
1755
# Calculate average token length for a poem line.
@@ -1814,6 +1845,7 @@ class BurstGPTDataset(BenchmarkDataset):
1845
max_loras: Optional[int] = None,
1846
lora_path: Optional[str] = None,
1847
request_id_prefix: str = "",
1848
+ no_oversample: bool = False,
1849
**kwargs,
1850
) -> list[SampleRequest]:
1851
samples = []
@@ -1893,6 +1925,7 @@ class ConversationDataset(HuggingFaceDataset):
1925
output_len: Optional[int] = None,
1926
enable_multimodal_chat: bool = False,
1927
request_id_prefix: str = "",
1928
+ no_oversample: bool = False,
1929
**kwargs) -> list:
1930
# Filter examples with at least 2 conversations
1931
filtered_data = self.data.filter(
@@ -1934,7 +1967,7 @@ class ConversationDataset(HuggingFaceDataset):
1967
))
1968
ind += 1
1969
self.maybe_oversample_requests(sampled_requests, num_requests,
1937
- request_id_prefix)
1970
+ request_id_prefix, no_oversample)
1971
return sampled_requests
1972
1973
@@ -1964,6 +1997,7 @@ class VisionArenaDataset(HuggingFaceDataset):
1997
output_len: Optional[int] = None,
1998
enable_multimodal_chat: bool = False,
1999
request_id_prefix: str = "",
2000
+ no_oversample: bool = False,
2001
**kwargs,
2002
) -> list:
2003
output_len = (output_len
@@ -1993,7 +2027,7 @@ class VisionArenaDataset(HuggingFaceDataset):
2027
request_id=request_id_prefix + str(i),
2028
))
2029
self.maybe_oversample_requests(sampled_requests, num_requests,
1996
- request_id_prefix)
2030
+ request_id_prefix, no_oversample)
2031
return sampled_requests
2032
2033
@@ -2023,6 +2057,7 @@ class InstructCoderDataset(HuggingFaceDataset):
2057
output_len: Optional[int] = None,
2058
enable_multimodal_chat: bool = False,
2059
request_id_prefix: str = "",
2060
+ no_oversample: bool = False,
2061
**kwargs) -> list:
2062
output_len = (output_len
2063
if output_len is not None else self.DEFAULT_OUTPUT_LEN)
@@ -2054,7 +2089,7 @@ class InstructCoderDataset(HuggingFaceDataset):
2089
request_id=request_id_prefix + str(i),
2090
))
2091
self.maybe_oversample_requests(sampled_requests, num_requests,
2057
- request_id_prefix)
2092
+ request_id_prefix, no_oversample)
2093
return sampled_requests
2094
2095
@@ -2085,6 +2120,7 @@ class MTBenchDataset(HuggingFaceDataset):
2120
output_len: Optional[int] = None,
2121
enable_multimodal_chat: bool = False,
2122
request_id_prefix: str = "",
2123
+ no_oversample: bool = False,
2124
**kwargs,
2125
) -> list:
2126
output_len = (output_len
@@ -2115,7 +2151,7 @@ class MTBenchDataset(HuggingFaceDataset):
2151
request_id=request_id_prefix + str(i),
2152
))
2153
self.maybe_oversample_requests(sampled_requests, num_requests,
2118
- request_id_prefix)
2154
+ request_id_prefix, no_oversample)
2155
return sampled_requests
2156
2157
@@ -2149,6 +2185,7 @@ class BlazeditDataset(HuggingFaceDataset):
2185
num_requests: int,
2186
output_len: Optional[int] = None,
2187
request_id_prefix: str = "",
2188
+ no_oversample: bool = False,
2189
min_distance: float = 0.0,
2190
max_distance: float = 1.0,
2191
**kwargs,
@@ -2202,7 +2239,7 @@ Please generate the new code file in the "New file" section below.""" # noqa: E5
2239
request_id=request_id_prefix + str(i),
2240
))
2241
self.maybe_oversample_requests(sampled_requests, num_requests,
2205
- request_id_prefix)
2242
+ request_id_prefix, no_oversample)
2243
2244
return sampled_requests
2245
@@ -2226,6 +2263,7 @@ class AIMODataset(HuggingFaceDataset):
2263
num_requests: int,
2264
output_len: Optional[int] = None,
2265
request_id_prefix: str = "",
2266
+ no_oversample: bool = False,
2267
**kwargs) -> list:
2268
sampled_requests = []
2269
ind = 0
@@ -2258,7 +2296,7 @@ class AIMODataset(HuggingFaceDataset):
2296
))
2297
ind += 1
2298
self.maybe_oversample_requests(sampled_requests, num_requests,
2261
- request_id_prefix)
2299
+ request_id_prefix, no_oversample)
2300
return sampled_requests
2301
2302
@@ -2330,6 +2368,7 @@ class NextEditPredictionDataset(HuggingFaceDataset):
2368
2369
def sample(self, tokenizer: PreTrainedTokenizerBase, num_requests: int,
2370
request_id_prefix: str = "",
2371
+ no_oversample: bool = False,
2372
**kwargs):
2373
formatting_prompt_func = self.MAPPING_PROMPT_FUNCS.get(self.hf_name)
2374
if formatting_prompt_func is None:
@@ -2347,7 +2386,10 @@ class NextEditPredictionDataset(HuggingFaceDataset):
2386
))
2387
if len(samples) >= num_requests:
2388
break
2350
- self.maybe_oversample_requests(samples, num_requests, request_id_prefix)
2389
+ self.maybe_oversample_requests(samples,
2390
+ num_requests,
2391
+ request_id_prefix,
2392
+ no_oversample)
2393
return samples
2394
2395
@@ -2398,6 +2440,7 @@ class ASRDataset(HuggingFaceDataset):
2440
num_requests: int,
2441
output_len: Optional[int] = None,
2442
request_id_prefix: str = "",
2443
+ no_oversample: bool = False,
2444
**kwargs,
2445
) -> list:
2446
output_len = (output_len
@@ -2436,7 +2479,7 @@ class ASRDataset(HuggingFaceDataset):
2479
skipped,
2480
)
2481
self.maybe_oversample_requests(sampled_requests, num_requests,
2439
- request_id_prefix)
2482
+ request_id_prefix, no_oversample)
2483
return sampled_requests
2484
2485
@@ -2474,6 +2517,7 @@ class MLPerfDataset(HuggingFaceDataset):
2517
num_requests: int,
2518
output_len: Optional[int] = None,
2519
request_id_prefix: str = "",
2520
+ no_oversample: bool = False,
2521
**kwargs,
2522
) -> list[SampleRequest]:
2523
# Force dynamic output length based on reference completion.
@@ -2520,7 +2564,7 @@ class MLPerfDataset(HuggingFaceDataset):
2564
ind += 1
2565
2566
self.maybe_oversample_requests(sampled_requests, num_requests,
2523
- request_id_prefix)
2567
+ request_id_prefix, no_oversample)
2568
return sampled_requests
2569
2570
@@ -2554,6 +2598,7 @@ class PrefixRepetitionRandomDataset(BenchmarkDataset):
2598
num_prefixes: int = DEFAULT_NUM_PREFIXES,
2599
output_len: int = DEFAULT_OUTPUT_LEN,
2600
request_id_prefix: str = "",
2601
+ no_oversample: bool = False,
2602
**kwargs,
2603
) -> list[SampleRequest]:
2604
vocab_size = tokenizer.vocab_size