执行摘要
移除 feed_tokens 超时,修复 Voxtral 静默挂起
修复 #36015(连续流式音频约 10 分钟后无输出但连接不断)和 #35863(第三并发会话无转录输出)。根本原因为 feed_tokens 中 asyncio.wait_for 将正常的空闲等待视为异常,导致后台任务退出,Transcript 停滞。
值得合并。修复逻辑清晰,改动极小,且经 E2E 测试验证。建议后续考虑为队列等待添加更长的超时或健康检查机制,但当前方案已满足需求。
无 review 讨论。
修复 #36015(连续流式音频约 10 分钟后无输出但连接不断)和 #35863(第三并发会话无转录输出)。根本原因为 feed_tokens 中 asyncio.wait_for 将正常的空闲等待视为异常,导致后台任务退出,Transcript 停滞。
值得合并。修复逻辑清晰,改动极小,且经 E2E 测试验证。建议后续考虑为队列等待添加更长的超时或健康检查机制,但当前方案已满足需求。
无 review 讨论。
from vllm.envs import VLLM_ENGINE_ITERATION_TIMEOUT_S 导入。all_outputs = await asyncio.wait_for(input_stream.get(), timeout=VLLM_ENGINE_ITERATION_TIMEOUT_S) 改为 all_outputs = await input_stream.get(),去掉超时包装。| 文件 | 模块 | 状态 | 重要度 |
|---|---|---|---|
vllm/model_executor/models/voxtral_realtime.py |
模型执行器 | modified | 6.55 |
vllm/model_executor/models/voxtral_realtime.py
core-logic
核心修复文件:移除了 feed_tokens 协程中针对 input_stream.get() 的超时,解决了 Voxtral Realtime 静默挂起的根本原因。
# vllm/model_executor/models/voxtral_realtime.py
# 删除导入:from vllm.envs import VLLM_ENGINE_ITERATION_TIMEOUT_S
# ... 其他代码 ...
# Feed output tokens back into the buffer. Idle waits are normal here;
# request cleanup still cancels this task through the finally block.
async def feed_tokens():
while True:
# 直接调用 input_stream.get(),不再使用 asyncio.wait_for 超时
# 之前:all_outputs = await asyncio.wait_for(input_stream.get(), timeout=...)
all_outputs = await input_stream.get()
await buffer.append_tokens(all_outputs[-1:])
当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。
风险极低。移除超时后,若 input_stream 在某次 get() 后不再有新项目,feed_tokens 将永远阻塞,但任务通过 finally 块中的 token_task.cancel() 取消;请求生命周期结束、客户端断开、引擎异常等都会导致生成器结束,从而触发取消。仅当请求已结束但 cancel() 未生效(如事件循环异常)时可能出现僵尸任务,但此场景原代码也无法处理。
正面影响:消除 Voxtral Realtime 在单会话空闲或多会话并发时的静默挂起,提升服务稳定性。影响范围仅限于 Voxtral Realtime 模型。无性能或兼容性影响。
参与讨论