Skip to content

guidellm.scheduler.constraints.request

Request-based constraint implementations.

Provides constraint types for limiting benchmark execution based on request counts and time duration. These constraints monitor request creation, processing, and elapsed time to determine when to stop benchmark execution.

MaxDurationConstraint

Bases: PydanticConstraintInitializer

Constraint that limits execution based on maximum time duration.

Stops both request queuing and processing when the elapsed time since scheduler start exceeds the maximum duration. Provides progress tracking based on remaining time and completion fraction.

Source code in src/guidellm/scheduler/constraints/request.py
@ConstraintsInitializerFactory.register("max_duration")
class MaxDurationConstraint(PydanticConstraintInitializer):
    """
    Constraint that limits execution based on maximum time duration.

    Stops both request queuing and processing when the elapsed time since scheduler
    start exceeds the maximum duration. Provides progress tracking based on
    remaining time and completion fraction.
    """

    type_: Literal["max_duration"] = "max_duration"  # type: ignore[assignment]
    args: MaxDurationConstraintArgs = Field(
        description="Configuration arguments for max duration constraint",
    )
    current_index: int = Field(default=-1, description="Current index in duration list")

    def create_constraint(self, **_kwargs) -> Constraint:
        """
        Return self as the constraint instance.

        :param kwargs: Additional keyword arguments (unused)
        :return: Self instance as the constraint
        """
        self.current_index += 1

        return cast("Constraint", self.model_copy())

    def __call__(
        self, state: SchedulerState, request_info: RequestInfo
    ) -> SchedulerUpdateAction:
        """
        Evaluate constraint against current scheduler state and elapsed time.

        :param state: Current scheduler state with start time
        :param request_info: Individual request information (unused)
        :return: Action indicating whether to continue or stop operations
        """
        _ = request_info  # Unused parameters
        current_index = max(0, self.current_index)
        max_duration = (
            self.args.seconds
            if isinstance(self.args.seconds, int | float)
            else self.args.seconds[min(current_index, len(self.args.seconds) - 1)]
        )

        start_time = state.start_requests_time or state.start_time
        current_time = time.time()
        elapsed = current_time - start_time
        duration_exceeded = elapsed >= max_duration
        remaining_duration = min(max(0.0, max_duration - elapsed), max_duration)
        stop_time = None if not duration_exceeded else start_time + max_duration

        return SchedulerUpdateAction(
            request_queuing="stop" if duration_exceeded else "continue",
            request_processing="stop_local" if duration_exceeded else "continue",
            stopping_scope=self.args.stopping_scope,
            metadata={
                "max_duration": max_duration,
                "elapsed_time": elapsed,
                "duration_exceeded": duration_exceeded,
                "start_time": start_time,
                "current_time": current_time,
                "stop_time": stop_time,
            },
            progress=SchedulerProgress(
                remaining_duration=remaining_duration,
                total_duration=max_duration,
                stop_time=stop_time,
            ),
        )

__call__(state, request_info)

Evaluate constraint against current scheduler state and elapsed time.

Parameters:

Name Type Description Default
state SchedulerState

Current scheduler state with start time

required
request_info RequestInfo

Individual request information (unused)

required

Returns:

Type Description
SchedulerUpdateAction

Action indicating whether to continue or stop operations

Source code in src/guidellm/scheduler/constraints/request.py
def __call__(
    self, state: SchedulerState, request_info: RequestInfo
) -> SchedulerUpdateAction:
    """
    Evaluate constraint against current scheduler state and elapsed time.

    :param state: Current scheduler state with start time
    :param request_info: Individual request information (unused)
    :return: Action indicating whether to continue or stop operations
    """
    _ = request_info  # Unused parameters
    current_index = max(0, self.current_index)
    max_duration = (
        self.args.seconds
        if isinstance(self.args.seconds, int | float)
        else self.args.seconds[min(current_index, len(self.args.seconds) - 1)]
    )

    start_time = state.start_requests_time or state.start_time
    current_time = time.time()
    elapsed = current_time - start_time
    duration_exceeded = elapsed >= max_duration
    remaining_duration = min(max(0.0, max_duration - elapsed), max_duration)
    stop_time = None if not duration_exceeded else start_time + max_duration

    return SchedulerUpdateAction(
        request_queuing="stop" if duration_exceeded else "continue",
        request_processing="stop_local" if duration_exceeded else "continue",
        stopping_scope=self.args.stopping_scope,
        metadata={
            "max_duration": max_duration,
            "elapsed_time": elapsed,
            "duration_exceeded": duration_exceeded,
            "start_time": start_time,
            "current_time": current_time,
            "stop_time": stop_time,
        },
        progress=SchedulerProgress(
            remaining_duration=remaining_duration,
            total_duration=max_duration,
            stop_time=stop_time,
        ),
    )

create_constraint(**_kwargs)

Return self as the constraint instance.

Parameters:

Name Type Description Default
kwargs

Additional keyword arguments (unused)

required

Returns:

Type Description
Constraint

Self instance as the constraint

Source code in src/guidellm/scheduler/constraints/request.py
def create_constraint(self, **_kwargs) -> Constraint:
    """
    Return self as the constraint instance.

    :param kwargs: Additional keyword arguments (unused)
    :return: Self instance as the constraint
    """
    self.current_index += 1

    return cast("Constraint", self.model_copy())

MaxDurationConstraintArgs

Bases: ConstraintArgs

Arguments for maximum duration constraint.

Limits benchmark execution time per strategy.

Attributes:

Name Type Description
kind Literal['max_duration']

Always "max_duration"

Source code in src/guidellm/scheduler/constraints/request.py
@ConstraintArgs.register("max_duration")
class MaxDurationConstraintArgs(ConstraintArgs):
    """
    Arguments for maximum duration constraint.

    Limits benchmark execution time per strategy.

    :cvar kind: Always "max_duration"
    """

    kind: Literal["max_duration"] = Field(
        default="max_duration",
        description="Constraint type discriminator",
    )
    seconds: PositiveNumOrList = Field(
        description="Maximum duration in seconds before stopping execution",
    )

MaxNumberConstraint

Bases: PydanticConstraintInitializer

Constraint that limits execution based on maximum request counts.

Stops request queuing when created requests reach the limit and stops local request processing when processed requests reach the limit. Provides progress tracking based on remaining requests and completion fraction.

Source code in src/guidellm/scheduler/constraints/request.py
@ConstraintsInitializerFactory.register("max_requests")
class MaxNumberConstraint(PydanticConstraintInitializer):
    """
    Constraint that limits execution based on maximum request counts.

    Stops request queuing when created requests reach the limit and stops local
    request processing when processed requests reach the limit. Provides progress
    tracking based on remaining requests and completion fraction.
    """

    type_: Literal["max_requests"] = "max_requests"  # type: ignore[assignment]
    args: MaxRequestsConstraintArgs = Field(
        description="Configuration arguments for max request count constraint",
    )
    current_index: int = Field(
        default=-1, description="Current index for list-based max_num values"
    )

    def create_constraint(self, **_kwargs) -> Constraint:
        """
        Return self as the constraint instance.

        :param kwargs: Additional keyword arguments (unused)
        :return: Self instance as the constraint
        """
        self.current_index += 1

        return cast("Constraint", self.model_copy())

    def __call__(
        self, state: SchedulerState, request_info: RequestInfo
    ) -> SchedulerUpdateAction:
        """
        Evaluate constraint against current scheduler state and request count.

        :param state: Current scheduler state with request counts
        :param request_info: Individual request information (unused)
        :return: Action indicating whether to continue or stop operations
        """
        _ = request_info  # Unused parameters
        current_index = max(0, self.current_index)
        max_num = (
            self.args.count
            if isinstance(self.args.count, int | float)
            else self.args.count[min(current_index, len(self.args.count) - 1)]
        )

        create_exceeded = state.created_requests >= max_num
        processed_exceeded = state.processed_requests >= max_num
        remaining_requests = min(max(0, max_num - state.processed_requests), max_num)
        stop_time = (
            None if remaining_requests > 0 else request_info.completed_at or time.time()
        )

        return SchedulerUpdateAction(
            request_queuing="stop" if create_exceeded else "continue",
            request_processing="stop_local" if processed_exceeded else "continue",
            stopping_scope=self.args.stopping_scope,
            metadata={
                "max_requests": max_num,
                "create_exceeded": create_exceeded,
                "processed_exceeded": processed_exceeded,
                "created_requests": state.created_requests,
                "processed_requests": state.processed_requests,
                "remaining_requests": remaining_requests,
                "stop_time": stop_time,
            },
            progress=SchedulerProgress(
                remaining_requests=remaining_requests,
                total_requests=max_num,
                stop_time=stop_time,
            ),
        )

__call__(state, request_info)

Evaluate constraint against current scheduler state and request count.

Parameters:

Name Type Description Default
state SchedulerState

Current scheduler state with request counts

required
request_info RequestInfo

Individual request information (unused)

required

Returns:

Type Description
SchedulerUpdateAction

Action indicating whether to continue or stop operations

Source code in src/guidellm/scheduler/constraints/request.py
def __call__(
    self, state: SchedulerState, request_info: RequestInfo
) -> SchedulerUpdateAction:
    """
    Evaluate constraint against current scheduler state and request count.

    :param state: Current scheduler state with request counts
    :param request_info: Individual request information (unused)
    :return: Action indicating whether to continue or stop operations
    """
    _ = request_info  # Unused parameters
    current_index = max(0, self.current_index)
    max_num = (
        self.args.count
        if isinstance(self.args.count, int | float)
        else self.args.count[min(current_index, len(self.args.count) - 1)]
    )

    create_exceeded = state.created_requests >= max_num
    processed_exceeded = state.processed_requests >= max_num
    remaining_requests = min(max(0, max_num - state.processed_requests), max_num)
    stop_time = (
        None if remaining_requests > 0 else request_info.completed_at or time.time()
    )

    return SchedulerUpdateAction(
        request_queuing="stop" if create_exceeded else "continue",
        request_processing="stop_local" if processed_exceeded else "continue",
        stopping_scope=self.args.stopping_scope,
        metadata={
            "max_requests": max_num,
            "create_exceeded": create_exceeded,
            "processed_exceeded": processed_exceeded,
            "created_requests": state.created_requests,
            "processed_requests": state.processed_requests,
            "remaining_requests": remaining_requests,
            "stop_time": stop_time,
        },
        progress=SchedulerProgress(
            remaining_requests=remaining_requests,
            total_requests=max_num,
            stop_time=stop_time,
        ),
    )

create_constraint(**_kwargs)

Return self as the constraint instance.

Parameters:

Name Type Description Default
kwargs

Additional keyword arguments (unused)

required

Returns:

Type Description
Constraint

Self instance as the constraint

Source code in src/guidellm/scheduler/constraints/request.py
def create_constraint(self, **_kwargs) -> Constraint:
    """
    Return self as the constraint instance.

    :param kwargs: Additional keyword arguments (unused)
    :return: Self instance as the constraint
    """
    self.current_index += 1

    return cast("Constraint", self.model_copy())

MaxRequestsConstraintArgs

Bases: ConstraintArgs

Arguments for maximum request count constraint.

Limits the number of requests processed per strategy.

Attributes:

Name Type Description
kind Literal['max_requests']

Always "max_requests"

Source code in src/guidellm/scheduler/constraints/request.py
@ConstraintArgs.register("max_requests")
class MaxRequestsConstraintArgs(ConstraintArgs):
    """
    Arguments for maximum request count constraint.

    Limits the number of requests processed per strategy.

    :cvar kind: Always "max_requests"
    """

    kind: Literal["max_requests"] = Field(
        default="max_requests",
        description="Constraint type discriminator",
    )
    count: PositiveNumOrList = Field(
        description="Maximum number of requests before stopping execution",
    )

RequestsExhaustedConstraint

Bases: StandardBaseModel, InfoMixin

Source code in src/guidellm/scheduler/constraints/request.py
class RequestsExhaustedConstraint(StandardBaseModel, InfoMixin):
    type_: Literal["requests_exhausted"] = "requests_exhausted"  # type: ignore[assignment]
    num_requests: int

    @property
    def info(self) -> dict[str, Any]:
        """
        Extract serializable information from this constraint initializer.

        :return: Dictionary containing constraint configuration and metadata
        """
        return self.model_dump()

    def __call__(
        self, state: SchedulerState, request: RequestInfo
    ) -> SchedulerUpdateAction:
        _ = request  # Unused parameter
        create_exceeded = state.created_requests >= self.num_requests
        processed_exceeded = state.processed_requests >= self.num_requests
        remaining_requests = max(0, self.num_requests - state.processed_requests)
        stop_time = (
            None if remaining_requests > 0 else request.completed_at or time.time()
        )

        return SchedulerUpdateAction(
            request_queuing="stop" if create_exceeded else "continue",
            request_processing="stop_local" if processed_exceeded else "continue",
            metadata={
                "num_requests": self.num_requests,
                "create_exceeded": create_exceeded,
                "processed_exceeded": processed_exceeded,
                "created_requests": state.created_requests,
                "processed_requests": state.processed_requests,
                "remaining_requests": remaining_requests,
                "stop_time": stop_time,
            },
            progress=SchedulerProgress(
                remaining_requests=remaining_requests,
                total_requests=self.num_requests,
                stop_time=stop_time,
            ),
        )

info property

Extract serializable information from this constraint initializer.

Returns:

Type Description
dict[str, Any]

Dictionary containing constraint configuration and metadata