Prhub

#49754 [Frontend] expose stream_interval as req sampling param

原始 PR 作者 walterbm 合并时间 2026-07-27 11:30 文件变更 5 提交数 5 评论 1 代码增减 +114 / -0

执行摘要

暴露 stream_interval 作为请求级采样参数

原本 stream_interval 仅在服务器启动时全局配置,无法按请求调整。对于长时间生成任务,客户端可能希望缩短间隔以获得更实时的反馈,或拉长间隔以减少通信开销。PR 让客户端可以根据任务特点动态指定间隔,提升灵活性。讨论中 njhill 要求客户端不能降低服务器设置的间隔,最终采用 clamp 策略确保安全。

此 PR 设计简洁,clamp 模式值得在其他请求级参数中借鉴。建议阅读 vllm/v1/engine/output_processor.py 中的 clamp 逻辑和测试用例,以理解安全边界的设计思路。

讨论亮点

njhill 在 review 中提出:"I'm not sure that this is something we would want the client to be in control of? ... I don't think the client should be able to reduce the interval from the server setting." 作者回应后接受此建议,修改实现为 clamp 策略:请求的 stream_interval 低于引擎设置时自动提升至引擎值。最终 njhill 批准合并。

实现拆解

  1. 数据模型:在 vllm/sampling_params.pySamplingParams 类中添加 stream_interval: int | None 字段,并在 from_optional 方法中增加对应参数,在 _verify_args 中校验其值至少为 1。
  2. API 协议:在 vllm/entrypoints/openai/chat_completion/protocol.pycompletion/protocol.py 的请求模型中添加同名字段,并在 to_sampling_params 方法中传递给 SamplingParams.from_optional
  3. 输出处理器:在 vllm/v1/engine/output_processor.pyfrom_new_request 中实现 clamp:stream_interval = max(sampling_params.stream_interval, stream_interval),确保请求值不会低于引擎全局设置。
  4. 测试:在 tests/v1/engine/test_output_processor.py 中添加 test_request_stream_interval_raises_but_not_below_engine_default,验证低于引擎设置的值被 clamp、高于的值生效,且生成文本不受影响。
文件 模块 状态 重要度
vllm/sampling_params.py 采样参数 modified 6.45
vllm/v1/engine/output_processor.py 输出处理器 modified 5.77
tests/v1/engine/test_output_processor.py 测试 modified 5.95
vllm/entrypoints/openai/chat_completion/protocol.py Chat 接口 modified 5.77
vllm/entrypoints/openai/completion/protocol.py Completion 接口 modified 5.77

关键符号

SamplingParams.from_optional SamplingParams._verify_args OutputProcessor.from_new_request ChatCompletionRequest.to_sampling_params CompletionRequest.to_sampling_params

关键源码片段

vllm/sampling_params.py core-logic

定义了 SamplingParams 的新字段 stream_interval,是本次变更的核心数据模型。

# sampling_params.py 中与 stream_interval 相关的核心变更
class SamplingParams:
    # ... 其他字段 ...
    stream_interval: int | None = None
    '''Number of newly generated tokens to batch into each streamed
    `RequestOutput`. Raises the interval above the engine-level
    `--stream-interval`. Values below engine setting are clamped up to it.
    The first and final outputs are always emitted immediately.'''
​
    @staticmethod
    def from_optional(
        # ... 其他参数 ...
        stream_interval: int | None = None, # 新增请求级间隔
    ) -> 'SamplingParams':
        return cls(
            # ... 其他字段 ...
            stream_interval=stream_interval,
        )
​
    def _verify_args(self) -> None:
        # ... 已有验证 ...
        if self.stream_interval is not None and self.stream_interval < 1:
            raise VLLMValidationError(
                f'stream_interval must be at least 1, got {self.stream_interval}.',
                parameter='stream_interval',
                value=self.stream_interval,
            )
vllm/v1/engine/output_processor.py core-logic

实现了请求级 stream_interval 与引擎设置比较并 clamp 的核心逻辑。

# vllm/v1/engine/output_processor.py 中 from_new_request 方法的 clamp 逻辑
@classmethod
def from_new_request(
    cls,
    request: EngineCoreRequest,
    # ...
    stream_interval: int,
    # ...
) -> 'OutputProcessor':
    # ... 前期处理 ...
    if sampling_params.stream_interval is not None:
        # 请求级间隔不能低于引擎设置,clamp 到最大值
        stream_interval = max(sampling_params.stream_interval, stream_interval)
    # ... 后续处理 ...
tests/v1/engine/test_output_processor.py test-coverage

新增针对 clamp 行为的单元测试,确保正确性。

def test_request_stream_interval_raises_but_not_below_engine_default(
    dummy_test_vectors,
):
    '''验证请求级 stream_interval 低于引擎默认值时被 clamp,高于时生效,且生成文本不变。'''
    engine_stream_interval = 5
    request_stream_intervals = [1, 10]
    output_processor = OutputProcessor(
        dummy_test_vectors.tokenizer,
        log_stats=False,
        stream_interval=engine_stream_interval,
    )
    # 构造请求并处理输出,断言 token 数符合预期间隔
    # 完整实现参见源文件

评论区精华

是否允许客户端控制 stream_interval 设计

njhill 认为客户端不应能降低服务器设置的间隔,建议如果保留此功能则需要 clamp。作者同意并采纳 clamp 策略。

结论:采用 clamp,请求值低于引擎设置时自动提升到引擎值。 · 已解决

风险与影响

无重大风险。主要风险点在于客户端可能设置过大的值导致输出延迟,但这是用户主动行为且受引擎最小限制保护。新参数默认为 None,不影响现有请求。验证逻辑确保值 >=1。测试覆盖了 clamp 边界。API 协议的新字段对旧客户端透明(忽略未知字段)。

影响范围限于 OpenAI API 用户,新增可选参数,无性能开销。团队维护成本低,逻辑集中在少数几个文件。向后兼容,不会破坏现有部署。

客户端可配置流间隔 需 clamp 约束

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论