执行摘要
修复 eos_token_id 为 None 时 min_new_tokens 崩溃
修复 Issue #31972:min_new_tokens 惩罚器在 tokenizer.eos_token_id 为 None 时崩溃。原代码将 None 插入 int64 张量,触发异常。
建议合入,属于明确的边界 bug 修复,代码简洁,风险低。可快速合入。
无 review 讨论。
修复 Issue #31972:min_new_tokens 惩罚器在 tokenizer.eos_token_id 为 None 时崩溃。原代码将 None 插入 int64 张量,触发异常。
建议合入,属于明确的边界 bug 修复,代码简洁,风险低。可快速合入。
无 review 讨论。
python/sglang/srt/sampling/penaltylib/min_new_tokens.py 的 _prepare 方法中,将构造 stop token 集合的表达式由 {req.tokenizer.eos_token_id} 改为条件表达式:{req.tokenizer.eos_token_id} if req.tokenizer.eos_token_id is not None else set()。| 文件 | 模块 | 状态 | 重要度 |
|---|---|---|---|
python/sglang/srt/sampling/penaltylib/min_new_tokens.py |
采样器 | modified | 5.19 |
python/sglang/srt/sampling/penaltylib/min_new_tokens.py
core-logic
核心修复文件,增加 eos_token_id 非 None 检查
# python/sglang/srt/sampling/penaltylib/min_new_tokens.py
# 修正后的 _prepare 方法片段:仅在 eos_token_id 不为 None 时加入集合
def _prepare(self):
# ... 前面的代码省略 ...
padded_stop_token_ids = torch.nn.utils.rnn.pad_sequence(
sequences=[
torch.tensor(
data=(
list(
(req.sampling_params.stop_token_ids or set())
| (req.tokenizer.additional_stop_token_ids or set())
| (
{req.tokenizer.eos_token_id}
if req.tokenizer.eos_token_id is not None # 新增守卫:避免 None 进入 int64 张量
else set() # eos_token_id 为 None 时使用空集合
)
)
),
dtype=torch.int64,
device=self.orchestrator.device,
)
for req in self.orchestrator.reqs()
],
batch_first=True,
padding_value=self.orchestrator.vocab_size,
)
# ... 后续代码不变 ...
当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。
风险极低:改动仅一行条件守卫,不影响 eos_token_id 正常存在时的行为。需注意若其他位置有类似模式也应检查,但当前 PR 范围安全。
影响范围:使用 min_new_tokens 或 min_tokens 参数且模型 tokenizer 无 eos_token_id 的用户。修复后请求不再崩溃,min_length 约束通过其他 stop token 执行。对大多数模型无影响。
参与讨论