Skip to content

Commit 0c0a8f2

Browse files
committed
Implement worker group and worker tests, fix any bugs/issues that popped up
1 parent b5f510e commit 0c0a8f2

File tree

13 files changed

+1378
-489
lines changed

13 files changed

+1378
-489
lines changed

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ dependencies = [
4646
"click>=8.0.0,<8.2.0",
4747
"culsans~=0.9.0",
4848
"datasets",
49+
"eval_type_backport",
4950
"ftfy>=6.0.0",
5051
"httpx[http2]<1.0.0",
5152
"loguru",

src/guidellm/benchmark/entrypoints.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,12 @@ async def benchmark_generative_text(
160160
instances=progress or [], enabled=progress is not None
161161
)
162162

163-
async for aggregator_update, benchmark, strategy, scheduler_state in progress_group(
163+
async for (
164+
_aggregator_update,
165+
benchmark,
166+
_strategy,
167+
_scheduler_state,
168+
) in progress_group(
164169
profile,
165170
Benchmarker[
166171
GenerativeBenchmark,

src/guidellm/config.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ class Settings(BaseSettings):
134134
max_worker_processes: int = 10
135135
max_add_requests_per_loop: int = 20
136136
scheduler_start_delay_non_distributed: float = 0.1
137+
scheduler_poll_interval: float = 0.05
137138

138139
# Data settings
139140
dataset: DatasetSettings = DatasetSettings()

src/guidellm/scheduler/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
BackendT,
2020
MeasuredRequestTimings,
2121
MeasuredRequestTimingsT,
22+
MultiTurnRequestT,
2223
RequestSchedulerTimings,
2324
RequestT,
2425
ResponseT,
@@ -70,6 +71,7 @@
7071
"MaxNumberConstraintInitializer",
7172
"MeasuredRequestTimings",
7273
"MeasuredRequestTimingsT",
74+
"MultiTurnRequestT",
7375
"NoDelayRequestTimings",
7476
"NonDistributedEnvironment",
7577
"PoissonRateRequestTimings",

src/guidellm/scheduler/constraints.py

Lines changed: 27 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@
2222
ConstraintInitializer: Function signature for constraint factory.
2323
"""
2424

25+
from __future__ import annotations
26+
2527
import time
26-
from typing import Any, Optional, Protocol, Union, runtime_checkable
28+
from typing import Any, Protocol, runtime_checkable
2729

2830
from pydantic import Field
2931

@@ -32,6 +34,7 @@
3234
ScheduledRequestInfo,
3335
SchedulerState,
3436
SchedulerUpdateAction,
37+
SchedulerUpdateActionProgress,
3538
)
3639
from guidellm.utils import RegistryMixin
3740

@@ -127,7 +130,7 @@ def resolve(
127130
cls,
128131
initializers: dict[
129132
str,
130-
Union[Any, dict[str, Any], Constraint, ConstraintInitializer],
133+
Any | dict[str, Any] | Constraint | ConstraintInitializer,
131134
],
132135
) -> dict[str, Constraint]:
133136
"""
@@ -154,7 +157,7 @@ def resolve(
154157
@classmethod
155158
def resolve_constraints(
156159
cls,
157-
constraints: dict[str, Union[Any, dict[str, Any], Constraint]],
160+
constraints: dict[str, Any | dict[str, Any] | Constraint],
158161
) -> dict[str, Constraint]:
159162
"""
160163
Resolve constraints from mixed constraint specifications.
@@ -177,9 +180,7 @@ def resolve_constraints(
177180

178181

179182
class _MaxNumberBase(StandardBaseModel):
180-
max_num: Union[int, float] = Field(
181-
gt=0, description="Maximum number of requests allowed"
182-
)
183+
max_num: int | float = Field(gt=0, description="Maximum number of requests allowed")
183184

184185

185186
class MaxNumberConstraint(_MaxNumberBase):
@@ -208,12 +209,12 @@ def __call__(
208209
"created_requests": state.created_requests,
209210
"processed_requests": state.processed_requests,
210211
},
211-
progress={
212-
"remaining_fraction": max(
212+
progress=SchedulerUpdateActionProgress(
213+
remaining_fraction=max(
213214
0.0, 1.0 - state.processed_requests / float(self.max_num)
214215
),
215-
"remaining_requests": max(0, self.max_num - state.processed_requests),
216-
},
216+
remaining_requests=max(0, self.max_num - state.processed_requests),
217+
),
217218
)
218219

219220

@@ -222,9 +223,7 @@ class MaxNumberConstraintInitializer(_MaxNumberBase):
222223
"""Factory for creating MaxNumberConstraint instances."""
223224

224225
@classmethod
225-
def from_simple_value(
226-
cls, value: Union[int, float]
227-
) -> "MaxNumberConstraintInitializer":
226+
def from_simple_value(cls, value: int | float) -> MaxNumberConstraintInitializer:
228227
"""
229228
Create a MaxNumberConstraintInitializer from a simple scalar value.
230229
@@ -246,9 +245,7 @@ def create_constraint(self, **_kwargs) -> Constraint:
246245

247246

248247
class _MaxDurationBase(StandardBaseModel):
249-
max_duration: Union[int, float] = Field(
250-
gt=0, description="Maximum duration in seconds"
251-
)
248+
max_duration: int | float = Field(gt=0, description="Maximum duration in seconds")
252249

253250

254251
class MaxDurationConstraint(_MaxDurationBase):
@@ -278,12 +275,10 @@ def __call__(
278275
"start_time": state.start_time,
279276
"current_time": current_time,
280277
},
281-
progress={
282-
"remaining_fraction": max(
283-
0.0, 1.0 - elapsed / float(self.max_duration)
284-
),
285-
"remaining_duration": max(0.0, self.max_duration - elapsed),
286-
},
278+
progress=SchedulerUpdateActionProgress(
279+
remaining_fraction=max(0.0, 1.0 - elapsed / float(self.max_duration)),
280+
remaining_duration=max(0.0, self.max_duration - elapsed),
281+
),
287282
)
288283

289284

@@ -292,9 +287,7 @@ class MaxDurationConstraintInitializer(_MaxDurationBase):
292287
"""Factory for creating MaxDurationConstraint instances."""
293288

294289
@classmethod
295-
def from_simple_value(
296-
cls, value: Union[int, float]
297-
) -> "MaxDurationConstraintInitializer":
290+
def from_simple_value(cls, value: int | float) -> MaxDurationConstraintInitializer:
298291
"""
299292
Create a MaxDurationConstraintInitializer from a simple scalar value.
300293
@@ -316,7 +309,7 @@ def create_constraint(self, **_kwargs) -> Constraint:
316309

317310

318311
class _MaxErrorsBase(StandardBaseModel):
319-
max_errors: Union[int, float] = Field(
312+
max_errors: int | float = Field(
320313
gt=0, description="Maximum number of errors allowed"
321314
)
322315

@@ -352,9 +345,7 @@ class MaxErrorsConstraintInitializer(_MaxErrorsBase):
352345
"""Factory for creating MaxErrorsConstraint instances."""
353346

354347
@classmethod
355-
def from_simple_value(
356-
cls, value: Union[int, float]
357-
) -> "MaxErrorsConstraintInitializer":
348+
def from_simple_value(cls, value: int | float) -> MaxErrorsConstraintInitializer:
358349
"""
359350
Create a MaxErrorsConstraintInitializer from a simple scalar value.
360351
@@ -376,10 +367,10 @@ def create_constraint(self, **_kwargs) -> Constraint:
376367

377368

378369
class _MaxErrorRateBase(StandardBaseModel):
379-
max_error_rate: Union[int, float] = Field(
370+
max_error_rate: int | float = Field(
380371
gt=0, le=1, description="Maximum error rate allowed (0.0 to 1.0)"
381372
)
382-
window_size: Union[int, float] = Field(
373+
window_size: int | float = Field(
383374
default=50,
384375
gt=0,
385376
description="Size of sliding window for calculating error rate",
@@ -444,9 +435,7 @@ class MaxErrorRateConstraintInitializer(_MaxErrorRateBase):
444435
"""Factory for creating MaxErrorRateConstraint instances."""
445436

446437
@classmethod
447-
def from_simple_value(
448-
cls, value: Union[int, float]
449-
) -> "MaxErrorRateConstraintInitializer":
438+
def from_simple_value(cls, value: int | float) -> MaxErrorRateConstraintInitializer:
450439
"""
451440
Create a MaxErrorRateConstraintInitializer from a simple scalar value.
452441
@@ -469,10 +458,10 @@ def create_constraint(self, **_kwargs) -> Constraint:
469458

470459

471460
class _MaxGlobalErrorRateBase(StandardBaseModel):
472-
max_error_rate: Union[int, float] = Field(
461+
max_error_rate: int | float = Field(
473462
gt=0, le=1, description="Maximum error rate allowed (0.0 to 1.0)"
474463
)
475-
min_processed: Optional[Union[int, float]] = Field(
464+
min_processed: int | float | None = Field(
476465
default=50,
477466
gt=30,
478467
description=(
@@ -524,8 +513,8 @@ class MaxGlobalErrorRateConstraintInitializer(_MaxGlobalErrorRateBase):
524513

525514
@classmethod
526515
def from_simple_value(
527-
cls, value: Union[int, float]
528-
) -> "MaxGlobalErrorRateConstraintInitializer":
516+
cls, value: int | float
517+
) -> MaxGlobalErrorRateConstraintInitializer:
529518
"""
530519
Create a MaxGlobalErrorRateConstraintInitializer from a simple scalar value.
531520

src/guidellm/scheduler/environment.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,13 @@
1010
NonDistributedEnvironment: Single-node implementation with minimal overhead.
1111
"""
1212

13+
from __future__ import annotations
14+
1315
import time
1416
from abc import ABC, abstractmethod
1517
from collections.abc import AsyncIterator, Iterable
1618
from typing import (
1719
Generic,
18-
Optional,
1920
)
2021

2122
from guidellm.config import settings
@@ -82,7 +83,7 @@ async def sync_run_start(self) -> float:
8283
@abstractmethod
8384
async def update_run_iteration(
8485
self,
85-
response: Optional[ResponseT],
86+
response: ResponseT | None,
8687
request: RequestT,
8788
request_info: ScheduledRequestInfo[MeasuredRequestTimingsT],
8889
):
@@ -177,7 +178,7 @@ async def sync_run_start(self) -> float:
177178

178179
async def update_run_iteration(
179180
self,
180-
response: Optional[ResponseT],
181+
response: ResponseT | None,
181182
request: RequestT,
182183
request_info: ScheduledRequestInfo[MeasuredRequestTimingsT],
183184
):

0 commit comments

Comments
 (0)