Skip to content

Commit 1b501a0

Browse files
authored
update perf dataset tqdm (#1168)
1 parent dbc46a1 commit 1b501a0

File tree

7 files changed

+27
-23
lines changed

7 files changed

+27
-23
lines changed

evalscope/perf/benchmark.py

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import json
33
import numpy as np
44
import sqlite3
5-
from typing import TYPE_CHECKING, AsyncGenerator, Dict, List, Tuple
5+
from typing import TYPE_CHECKING, AsyncGenerator, Dict, Tuple
66

77
from evalscope.constants import HEARTBEAT_INTERVAL_SEC
88
from evalscope.utils.logger import get_logger
@@ -26,48 +26,52 @@
2626
@exception_handler
2727
async def get_requests(args: Arguments, api_plugin: 'ApiPluginBase') -> AsyncGenerator[dict, None]:
2828

29-
async def generate_requests_from_prompt():
29+
async def _generate_from_prompt():
30+
"""Generate requests by repeating a single prompt."""
3031
prompt = load_prompt(args.prompt)
3132
messages = [{'role': 'user', 'content': prompt}] if args.apply_chat_template else prompt
3233
request = api_plugin.build_request(messages)
3334
for _ in range(args.number):
3435
yield request
3536

36-
async def generate_requests_from_dataset():
37-
message_generator_class = DatasetRegistry.get_class(args.dataset)
38-
message_generator = message_generator_class(args)
39-
37+
async def _generate_from_dataset():
38+
"""Generate requests by cycling through a dataset."""
39+
message_generator = DatasetRegistry.get_class(args.dataset)(args)
4040
dataset_messages = []
41-
try:
42-
for messages in message_generator.build_messages():
41+
42+
# Load dataset messages into memory (limited by args.number)
43+
# We catch StopIteration implicitly via the loop
44+
with tqdm(message_generator.build_messages(), desc='Generating datasets', total=args.number, initial=1) as pbar:
45+
for messages in pbar:
4346
dataset_messages.append(messages)
4447
if len(dataset_messages) >= args.number:
4548
break
46-
except StopIteration:
47-
pass
4849

4950
if not dataset_messages:
50-
raise Exception('Dataset is empty!')
51+
raise ValueError('Dataset is empty!')
5152

53+
# Yield requests cyclically until total count is reached
5254
count = 0
5355
dataset_index = 0
56+
num_messages = len(dataset_messages)
5457

5558
while count < args.number:
5659
messages = dataset_messages[dataset_index]
5760
request = api_plugin.build_request(messages)
5861
if request is not None:
5962
yield request
6063
count += 1
64+
dataset_index = (dataset_index + 1) % num_messages
6165

62-
dataset_index = (dataset_index + 1) % len(dataset_messages)
63-
66+
# Dispatch based on arguments
6467
if args.prompt:
65-
generator = generate_requests_from_prompt()
68+
generator = _generate_from_prompt()
6669
elif args.dataset:
67-
generator = generate_requests_from_dataset()
70+
generator = _generate_from_dataset()
6871
else:
6972
raise ValueError('Either prompt or dataset is required!')
7073

74+
# Yield requests with rate limiting
7175
async for request in generator:
7276
yield request
7377
if args.rate != -1:

evalscope/perf/plugin/api/base.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import aiohttp
22
from abc import abstractmethod
3-
from typing import Any, AsyncGenerator, Dict, List, Tuple
3+
from typing import Any, Dict, List, Optional, Tuple, Union
44

55
from evalscope.perf.arguments import Arguments
66
from evalscope.perf.utils.benchmark_util import BenchmarkData
@@ -13,7 +13,7 @@ def __init__(self, param: Arguments) -> None:
1313
self.model_path = param.tokenizer_path
1414

1515
@abstractmethod
16-
def build_request(self, messages: List[Dict], param: Arguments = None) -> Dict:
16+
def build_request(self, messages: Union[List[Dict], str], param: Optional[Arguments] = None) -> Dict:
1717
"""Build a api request body.
1818
1919
Args:

evalscope/perf/plugin/datasets/base.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import json
2-
import sys
32
from abc import abstractmethod
4-
from typing import Any, Dict, Iterator, List, Tuple, Union
3+
from typing import Any, Dict, Iterator, List, Optional, Tuple, Union
54

65
from evalscope.perf.arguments import Arguments
76

@@ -70,7 +69,7 @@ def dataset_json_list(self, dataset: str) -> Iterator[Dict]:
7069
for item in data:
7170
yield item
7271

73-
def create_message(self, text: str, image_urls: Union[List[str], str] = None, role: str = 'user') -> Dict:
72+
def create_message(self, text: str, image_urls: Optional[Union[List[str], str]] = None, role: str = 'user') -> Dict:
7473
"""Create a message with text and optional image URLs.
7574
7675
Args:

evalscope/perf/plugin/datasets/embedding_dataset.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import json
77
import numpy as np
88
import os
9-
from typing import Dict, Iterator, List, Union
9+
from typing import Iterator, List
1010

1111
from evalscope.perf.arguments import Arguments
1212
from evalscope.perf.plugin.datasets.base import DatasetPluginBase

evalscope/perf/plugin/datasets/random_dataset.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ def __init__(self, query_parameters: Arguments):
1818
assert query_parameters.tokenizer_path, 'Tokenizer path is required for random data generation, please provide it with `--tokenizer-path`.' # noqa: E501
1919
super().__init__(query_parameters)
2020

21+
assert self.tokenizer is not None, 'Tokenizer should be initialized for random data generation.' # noqa: E501
2122
self.prefix_length = self.query_parameters.prefix_length
2223
self.number = self.query_parameters.number or 1
2324
# Use numpy's default_rng for deterministic sampling

evalscope/perf/plugin/datasets/rerank_dataset.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ def _generate_random_pair(self) -> Dict:
156156
min_len = max(1, min_len)
157157
max_len = max(1, max_len)
158158

159-
query_len = self._rng.integers(min_len, max_len + 1)
159+
query_len = int(self._rng.integers(min_len, max_len + 1))
160160
doc_len = int(query_len * self.document_length_ratio)
161161
if doc_len < 1:
162162
doc_len = 1

tests/perf/test_perf.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,7 @@ def test_perf_rerank_random(self):
383383
from evalscope.perf.arguments import Arguments
384384
task_cfg = Arguments(
385385
parallel=[1, 2],
386-
number=[2, 4],
386+
number=[1000, 1000],
387387
model='qwen3-rerank',
388388
url='https://dashscope.aliyuncs.com/compatible-api/v1/reranks',
389389
api_key=env.get('DASHSCOPE_API_KEY'),

0 commit comments

Comments
 (0)