[Bug]: vllm 0.23.0 and 0.24.0 – Qwen3.6-35B-A3B-FP8 – Fails generating code- “400 Unterminated string starting at”

该报错通常发生在 vLLM 0.23.0 与 0.24.0 版本使用 Qwen3.6-35B-A3B-FP8 模型生成代码类内容时,服务端返回 400 Unterminated string starting at 错误。优先排查生成参数中的 stop 参数是否包含非法转义字符或未闭合字符串。

快速结论:该报错通常发生在 vLLM 0.23.0 与 0.24.0 版本使用 Qwen3.6-35B-A3B-FP8 模型生成代码类内容时,服务端返回 400 Unterminated string starting at 错误。优先排查生成参数中的 stop 参数是否包含非法转义字符或未闭合字符串。

适用环境:Ubuntu 22.04.5 LTS,Python 3.12.13,PyTorch 2.11.0+cu130,CUDA 13.0,NVIDIA A100-PCIE-40GB(双卡),vLLM 0.23.0 / 0.24.0 版本。

最快修复方案:暂无确认的一步修复方案。Issue 讨论中未给出已经验证的修复方法,以下解决步骤均为基于报错特征的可能原因排查方向。

注意事项:该报错并非模型权重损坏或 GPU 资源不足导致,问题更集中在请求参数或服务端对生成内容的解析环节。由于 Issue 关闭时未明确最终修复方案,以下排查步骤需要结合实际情况验证。

问题场景

用户通过 vLLM 启动的 OpenAI 兼容 API 服务(/v1/chat/completions 端点)调用 Qwen3.6-35B-A3B-FP8 模型生成代码。服务在生成过程中持续输出正常的吞吐量日志,但随后收到 POST /v1/chat/completions HTTP/1.1" 400 Bad Request,并在 ASGI 应用层抛出 Unterminated string starting at 异常。该错误在 vLLM 0.23.0 和 0.24.0 两个版本中均可复现,且只在生成代码类内容时触发。

报错原文

[Bug]: vllm 0.23.0 and 0.24.0 - Qwen3.6-35B-A3B-FP8 - Fails generating code- "400 Unterminated string starting at"

vllm-Qwen3.6-35B-A3B-FP8  | (APIServer pid=1) INFO:     172.16.27.254:59562 - "POST /v1/chat/completions HTTP/1.1" 400 Bad Request
vllm-Qwen3.6-35B-A3B-FP8  | (APIServer pid=1) ERROR:    Exception in ASGI application
vllm-Qwen3.6-35B-A3B-FP8  | (APIServer pid=1) Traceback (most recent call last):
vllm-Qwen3.6-35B-A3B-FP8  | (APIServer pid=1)   File "/usr/local/lib/python3.12/dist-packages/uvicorn/protocols/http/httptools_impl.py", line 421, in run_asgi
vllm-Qwen3.6-35B-A3B-FP8  | (APIServer pid=1)     result = await app(  # type: ignore[func-returns-value]
vllm-Qwen3.6-35B-A3B-FP8  | (APIServer pid=1)              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
vllm-Qwen3.6-35B-A3B-FP8  | (APIServer pid=1)   File "/usr/local/lib/python3.12/dist-packages/uvicorn/middleware/proxy_headers.py", line 62, in __call__
vllm-Qwen3.6-35B-A3B-FP8  | (APIServer pid=1)     return await self.app(scope, receive, send)

原因分析

可能原因如下:

1. 生成内容包含未闭合的 JSON 字符串(最可能):模型在生成代码时,输出内容中可能包含未转义的引号或未闭合的字符串,导致服务端在解析或序列化响应时抛出 Unterminated string starting at 异常。这通常发生在模型输出的代码中包含特殊字符(如制表符、换行符、反斜杠)且未被正确转义时。

2. 请求参数中的 stop 序列配置不当:如果请求中设置了 stop 参数,且该参数包含未闭合的字符串或非法转义符,FastAPI/Starlette 层在解析请求体时就会直接返回 400。虽然报错堆栈显示异常发生在 ASGI 中间件层,但并不能完全排除请求参数解析问题。

3. vLLM 0.23.0 / 0.24.0 版本特定回归问题:该问题仅出现在 0.23.0 和 0.24.0 版本中,暗示可能是 vLLM 在这两个版本引入的与 FP8 模型解码或响应格式化相关的回归缺陷。Issue 标题明确指向版本范围,但关闭时未提供具体修复 commit。

环境排查

  • 确认 vLLM 版本是否为 0.23.0 或 0.24.0,可尝试升级到更新版本(≥0.25.0)验证是否修复。
  • 确认 PyTorch 版本是否为 2.11.0+cu130,CUDA 是否 13.0。
  • 确认模型权重文件为 Qwen3.6-35B-A3B-FP8,且已正确下载至本地目录。
  • 检查 API 调用请求体中的 stop 参数是否包含 \n\\ 等需要转义的字符串,建议使用 JSON 序列化时进行合法性校验。
  • 确认使用双卡 A100-PCIE-40GB 时,张量并行(tensor_parallel_size)配置是否与模型结构匹配。
  • 如使用 Docker 部署,确认容器内 vLLM 版本与宿主机 CUDA 驱动兼容。

解决步骤

  1. 检查请求参数(可优先尝试):审查发送到 /v1/chat/completions 的请求体,重点检查 stop 参数。确保每个 stop 字符串都是合法的、完全闭合的 JSON 字符串。例如,不要直接传入 "\n" 以外的未转义字符,建议使用 json.dumps() 生成请求体,避免手工拼接。
  2. 简化生成参数:暂时移除请求中的 stop 参数,或将其替换为单个常见分隔符(如 ),观察是否仍触发 400 错误。
  3. 限制生成长度:在请求中将 max_tokens 调低(如 512),确认是否与超长代码生成有关。如果较短输出不报错,则问题更可能集中在模型输出解析环节。
  4. 更换 vLLM 版本:尝试降级到 0.22.x 或升级到最新版本,确认是否为 0.23.0 / 0.24.0 的版本回归问题。升级前建议先查看 vLLM release notes 中关于 FP8 模型支持或响应格式化的修复说明。
  5. 检查服务端日志完整堆栈:展开 ASGI 异常堆栈的尾部,定位具体抛出 Unterminated string 的代码行(通常在 JSON 解析或序列化模块中),根据堆栈指向的模块进一步缩小排查范围。
  6. 使用 curl 进行最小化复现:构造一个最简单的 chat completion 请求,仅包含 system + user 消息,让模型生成简短代码(如 print("hello")),排除复杂 prompt 的影响。

验证方法

重新发起相同的代码生成请求,观察服务端日志是否仍返回 400 Bad Request,以及客户端是否收到正常的 HTTP 200 响应与完整的生成结果。如果请求能正常返回,说明问题已解决;如果仍返回 400,请收集完整的 ASGI 异常堆栈(尤其是 traceback 最后 10 行)并提交到 vLLM GitHub issue 中进一步排查。

参考来源

vllm-project/vllm #47761

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 20534

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注