执行摘要
- 一句话:修复 Model Runner V2 中 num_logprobs=-1 导致 500 错误
- 推荐动作:值得精读。虽然改动微小,但反映了 Model Runner V2 中参数传递路径的边界处理完整性,可作为模型运行器参数校验的参考模式。
功能与动机
用户使用 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 的采样状态未处理该值,导致后续数组访问越界。
实现拆解
- 定位问题根因:在文件
vllm/v1/worker/gpu/sample/states.py 的 add_request 方法中,原先只处理了 num_logprobs is None(代表无 logprobs 请求)的情况,而 num_logprobs == -1(代表请求所有 logprobs)未被处理,直接赋值为 -1,后续索引 vocab_size 数组时越界。
- 修复方案:在原有
if 分支后增加 elif num_logprobs == -1: 分支,将 num_logprobs 设置为 self.vocab_size,即请求所有 token 的 logprobs。
- 影响范围:仅涉及一行源码变更(+2/-0),无需修改测试文件,新增的
elif 分支逻辑清晰,不会影响其他采样参数的处理。
关键文件:
vllm/v1/worker/gpu/sample/states.py(模块 采样器;类别 source;类型 core-logic;符号 add_request): 修复的核心文件,在 add_request 方法中增加对 num_logprobs==-1 的边界处理,将 -1 转换为 vocab_size。
关键符号:add_request
关键源码片段
vllm/v1/worker/gpu/sample/states.py
修复的核心文件,在 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 的 logprobs
def 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
评论区精华
风险与影响
关联脉络
- PR #42667 [Model Runner v2] Migration from v1 to v2, with Qwen and DSv2 MOE models [3/N]: 本 PR 修复了 Model Runner V2 中未被处理的边界情况,属于同一功能线的后续修复。
参与讨论