Prhub

#45467 [Model Runner V2] Fix `openai.InternalServerError: Error code: 500 - 'list index out of range'`

原始 PR 作者 yewentao256 合并时间 2026-06-13 16:44 文件变更 1 提交数 1 评论 0 代码增减 +2 / -0

执行摘要

修复 Model Runner V2 中 num_logprobs=-1 导致 500 错误

用户使用 VLLM_USE_V2_MODEL_RUNNER=1 并设置 top_logprobs=-1 时,收到 openai.InternalServerError: Error code: 500 - 'list index out of range'。根据 OpenAI 协议,top_logprobs=-1 表示返回所有 logprobs,但 Model Runner V2 的采样状态未处理该值,导致后续数组访问越界。

值得精读。虽然改动微小,但反映了 Model Runner V2 中参数传递路径的边界处理完整性,可作为模型运行器参数校验的参考模式。

实现拆解

  1. 定位问题根因:在文件 vllm/v1/worker/gpu/sample/states.pyadd_request 方法中,原先只处理了 num_logprobs is None(代表无 logprobs 请求)的情况,而 num_logprobs == -1(代表请求所有 logprobs)未被处理,直接赋值为 -1,后续索引 vocab_size 数组时越界。
  2. 修复方案:在原有 if 分支后增加 elif num_logprobs == -1: 分支,将 num_logprobs 设置为 self.vocab_size,即请求所有 token 的 logprobs。
  3. 影响范围:仅涉及一行源码变更(+2/-0),无需修改测试文件,新增的 elif 分支逻辑清晰,不会影响其他采样参数的处理。
文件 模块 状态 重要度
vllm/v1/worker/gpu/sample/states.py 采样器 modified 5.75

关键符号

add_request

关键源码片段

vllm/v1/worker/gpu/sample/states.py core-logic

修复的核心文件,在 add_request 方法中增加对 num_logprobs==-1 的边界处理,将 -1 转换为 vocab_size。

# 文件 : vllm/v1/worker/gpu/sample/states.py
# 修复前 : num_logprobs==-1 未被处理,直接赋值为 -1,导致后续索引 vocab_size 数组时越界
# 修复后 : 将 -1 转换为实际的 vocab_size,请求所有 token 的 logprobsdef add_request(self, req_idx: int, sampling_params: SamplingParams) -> None:
    self.temperature.np[req_idx] = sampling_params.temperature
    self.top_p.np[req_idx] = sampling_params.top_p
    top_k = sampling_params.top_k
    if top_k <= 0 or top_k > self.vocab_size:
        top_k = self.vocab_size
    self.top_k.np[req_idx] = top_k
    self.min_p.np[req_idx] = sampling_params.min_p
​
    seed = sampling_params.seed
    self.seeds_set[req_idx] = seed is not None
    if seed is None:
        seed = np.random.randint(_NP_INT64_MIN, _NP_INT64_MAX)
    self.seeds.np[req_idx] = seed
​
    num_logprobs = sampling_params.logprobs
    if num_logprobs is None:
        # None 表示不请求 logprobs,使用特殊值 NO_LOGPROBS
        num_logprobs = NO_LOGPROBS
    elif num_logprobs == -1:
        # -1 表示请求所有 logprobs,转换为实际的 vocab_size
        num_logprobs = self.vocab_size
    self.num_logprobs[req_idx] = num_logprobs

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

该变更仅增加一个边界条件处理,风险极低。但需注意:

  • self.vocab_size 非常大(如 DeepSeek V3 的 4096 或更大),请求所有 logprobs 可能带来显著的内存和带宽压力。
  • 该修复仅在 Model Runner V2 路径生效,V1 路径是否已有类似处理需确认(PR body 未提及 V1 状态)。

影响范围:仅影响使用 VLLM_USE_V2_MODEL_RUNNER=1 且设置 top_logprobs=-1logprobs=-1 的用户。
影响程度:低。修复了一个明确的 bug,且改动极小。但需要用户知晓 -1 的特殊语义,未来可能需要在文档中注明。

缺少测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论