
gemma4:26b (MoE, Q4_K_M) returns empty response on Ollama 0.30.2
快速结论:在 Ollama 0.30.2 中使用 gemma4:26b(MoE 架构、Q4_K_M 量化)模型时,API 的响应字段返回空字符串 "",但底层 token 已正常生成。优先排查是否为 Ollama 0.30 系列版本的特定 bug,并考虑使用 num_predict 参数或切换到 0.30.3+ 版本(如果可用)。
问题场景
用户在 Ollama 0.30.2 运行的 Docker 容器中,通过 API 调用 gemma4:26b 模型。模型能正常加载到显存(约 17GB),推理速度正常(~67 tokens/sec),API 响应中 context 数组包含有效的 token ID,但 response 字段始终为空字符串。用户也尝试了同系列 gemma4:31b-it-bf16 模型,同样复现该问题。
报错原文
curl -X POST http://localhost:11434/api/generate -d '{
"model":"gemma4:26b",
"prompt":"What is 2+2?",
"options":{"num_predict":64,"num_ctx":4096}
}'
# Returns: response="" but context contains generated token IDs
# Actual: response: "", done_reason: "length", valid token IDs in context
原因分析
该问题极可能是 Ollama 0.30.2 版本的特定 bug,而非模型本身的错误。原因包括:
- 版本回归:Issue 提及相关 closed issue #15428 虽然在之前的版本标记为已修复,但在 0.30.2 上仍然复现,表明 0.30 系列可能存在回归。
- MoE 兼容性问题:gemma4:26b 是 MoE(Mixture of Experts)架构模型,可能和 Ollama 0.30.2 的 response 解码流程存在兼容问题。
- 多 token response 解析异常:用户测试发现,当
num_predict设置较大时,response场最后一段 token 不返回;但立即跟随第二次请求时,前一次生成的 token 才会被显式输出,暗示 response 流式输出缓存/拼接有 bug。 - 非硬件/驱动原因:同一环境下
granite4.1:30b-64k(dense 模型)正常工作,排除了 CUDA/驱动问题。
环境排查
- Ollama 版本: 0.30.2
- 模型: gemma4:26b (Q4_K_M, 量化版本号 2, 文件类型 15)
- 硬件: NVIDIA GB10 (DGX Spark), 显存 128GB unified RAM
- CUDA 版本: 13.0, 驱动版本: 580.142
- 运行环境: Docker 容器,启动时含
--gpus all - 其他已排除的因素:
num_gpu_layers:0纯 CPU 运行仍复现;相同环境下密集模型granite4.1:30b-64k正常。
解决步骤
- 确认是否为版本 bug:检查 Issue 更新,确认是否有 Ollama 0.30.3 或更高版本发布。如果有,可优先尝试升级 Ollama 版本。
- 调整 API 调用方式作为临场 workaround:在 Issue 评论中,用户发现修改
num_predict到较小值(例如 10 或直接不设置)可以使 response 字段正常输出。可尝试移除num_predict,或将其设为小于 64 的值。 - 显式捕获流式输出(如果使用 API):按 Issue 所展示,响应以 JSON 行流式返回,每行有
response字段。可编写脚本拼接所有流式响应的非空response值,避开最终汇总 response 为空的 bug 。 - 回退到已知的 stable 版本:如果紧急使用,可以尝试将 Ollama 降级到 0.29.x(需确认该版本对 gemma4 模型的支持情况)。
验证方法
执行以下 curl 命令,检查 response 字段在 done:true 之前是否逐段输出文字内容,而非空字符串:
curl -X POST http://localhost:11434/api/generate -d '{
"model":"gemma4:26b",
"prompt":"What is 2+2?",
"options":{"num_predict":64,"num_ctx":4096}
}'
# 应看到类似:{"response":"2","done":false} ... {"response":"4","done":false} ... {"response":"","done":true}
如果响应中每个流式行的 response 字段都不为空(至少在生成过程中),则问题缓解。最终 done:true 行的 response 为空是正常的。如果整个流中只出现 response="",则问题未解决。



