问题是什么?
这是一个重复的问题,#3154已经被错误地关闭了。当包含额外的上下文时,format="json"
参数的性能比常规推理慢10倍。
一个类似这样的提示在启用CUDA和format="json"
的NVIDIA T4上需要约24秒才能返回。而没有格式化json的相同确切提示只需要约2秒就能返回。这肯定是一个bug,对吧?
Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer.
${context}
Please respond in the following JSON schema
{
"${schema.fieldName}": {
"type": ${schema.type},
"description": ${schema.description}
}
}
Question: ${schema.description}
Helpful Answer:
操作系统
Linux
GPU
Nvidia
CPU
Intel
Ollama版本
0.1.32
6条答案
按热度按时间7nbnzgx91#
我认为这与服务器中的循环检测代码有关。在server.go代码中,检测代码允许模型在空白处循环一定数量的令牌。如果最后一个令牌重复了一定次数或者只检测到30次空白,它就会中止预测。如果你能在调试模式下运行请求并设置ollama,这将会很有用。关于这个问题的更多信息,请参考:故障排除
如果这与循环检测逻辑有关,你将在日志中看到类似“预测中止,达到令牌重复限制”的一行。另一方面,一些与停止检测相关的其他bug与llama.cpp有关,也可能是一个原因。
我建议尝试启用流式传输来运行你的请求,这将显示模型返回的内容。
作为解决方法,我建议暂时不要使用format=json,而是在提示中直接提及它。根据你的集成方式,你可能会通过使用正则表达式或so来捕获响应中的JSON部分来获得更好的效果。我在不同模型中使用format=json时遇到了一些缺陷和不一致的行为,正则表达式可能是一个更稳健的解决方案。
mrzz3bfm2#
我会说...我观察到有些模型在json模式下比其他模型运行速度慢。我不确定这是否是实现中的一个bug,还是模型本身只是以有趣的方式进行训练。
观察流式响应,它似乎React迅速,但随后会在决定消息完成之前等待一段时间。一个明确定义的语法会意识到JSON消息已经结束,并立即终止,而不是等待某种流结束标记,这可能是这里的问题。
8e2ybdfx3#
在
llama3:8b
上遇到了这个问题,但在mistral:latest
上却没有,很奇怪吧?在我3080上,两个模型之间的常规文本速度完全相同。我认为@coder543是正确的,只是这个实现中的一个bug。为什么我们在json中首先输出了空白字符?j2cgzkjk4#
2024-04-25.08-44-01.mp4
2024-04-25.08-44-46.mp4
第一个视频展示了没有
"format": "json"
的情况下我的函数调用,第二个展示了有"format": "json"
的情况下的函数调用。你可以看到速度差异是惊人的;同样的提示和一切。svdrlsy45#
很遗憾,您的视频没有视觉展示在两种模式下生成JSON。如果模型在没有JSON模式的情况下不能至少在某些时候以正确的JSON响应,那么这使得很难确切地知道像这样的软件中问题出在哪里。
如果响应是流式的(有清晰的视觉指示何时流式响应结束),我们就可以看看它在生成JSON后是否会暂停,或者它只是逐个字符非常缓慢地生成JSON。
我绝对希望这种慢速JSON的情况能够得到解决。
mv1qrgav6#
关于语法限制(JSON格式使用)的一些已知上游问题:ggerganov/llama.cpp#4218