本地模型桌面端“闪退”和“卡住不回答”:两次都是日志里写明白了的事

本地模型桌面端“闪退”和“卡住不回答” — 封面

Mac 上的本地模型我一直在终端里用,最近想换成 Ollama 官方桌面端:有聊天窗口,断网也能直接用。结果装好后碰到了两件怪事:一启动就“闪退”,聊天时随便问一句就“卡住不回答”。翻了日志才发现,两件事都不是程序坏了,日志里写得清清楚楚。这篇把排查过程记下来。

环境:MacBook Pro(M5 Pro,Ollama 识别到可用显存 17.8 GB),Ollama 桌面端 0.40.6,本机已有 qwen3.5:9b 和 gemma4:12b 两个模型。

先知道日志在哪

Mac 上 Ollama 的日志都在 ~/.ollama/logs/:

  • app.log:桌面程序本身,比如启动、退出、界面请求、自动更新。上一次运行的日志会滚动成 app-1.log。
  • server.log:真正跑模型的服务,比如加载了哪个模型、上下文多长、每次回答生成了多少 token、用了多久。

遇到问题先看这两个文件,比对着界面猜要快得多。

怪事一:启动就闪退

app-1.log 里,第一个进程启动一秒后收到了一个“交接”信号,然后自己退出了:

10:58:13 starting Ollama  version=0.40.6
10:58:14 received app handoff signal, shutting down
10:58:14 shutting down desktop server

而 app.log 里,紧接着启动的第二个进程先给第一个进程发了信号,然后正常跑起来,服务也在 127.0.0.1:11434 上开始监听了:

10:58:14 starting Ollama
10:58:14 signaling Ollama app process  pid=33519 signal="user defined signal 1"
10:58:16 Listening on 127.0.0.1:11434 (version 0.40.6)

原来是程序被打开了两次:可能是双击了两下,也可能是安装完自动打开了一次。Ollama 的设计是新进程接管、旧进程退出,旧的那个窗口一关,看起来就像闪退了。再加上 Ollama 在 Mac 上平时只在顶部菜单栏显示一个小羊驼图标,不常驻 Dock,窗口关了就以为程序没了。

解决办法:点菜单栏的小羊驼图标,选“Open Ollama”;或者在终端运行 open -a Ollama。要确认是不是真崩溃,可以看 ~/Library/Logs/DiagnosticReports/ 里有没有 Ollama 的崩溃报告。我这次一份都没有。

怪事二:随便问一句就卡住

这个更有意思。界面上一直转圈,最后没有回答。但 server.log 显示模型其实在正常工作,而且速度不慢:

vram-based default context  total_vram="17.8 GiB" default_num_ctx=4096
new prompt, n_ctx_slot = 4096, task.n_tokens = 3381
n_gen = 704, tg = 38.55 t/s
eval time = 18747 ms / 715 tokens (38.09 tokens per second)
stop processing: n_tokens = 4095, truncated = 1

把这几行连起来看,事情就清楚了:

  1. 上下文只有 4096。桌面端按显存大小自动选了一个默认值,17.8 GB 显存也只给了 4096。
  2. 输入已经占了 3381。我在同一个对话里问了好几轮,之前的问答,加上桌面端自带的系统提示,全都算在里面。
  3. 模型一边“思考”一边往下写,写到第 715 个 token 时,3381 + 715 正好撞上 4096 的上限。
  4. 日志里记了 truncated = 1:被截断了。多半是思考还没结束就被截掉,正文根本没来得及写出来,界面上看到的就是“卡住、没有回答”。

同一个对话聊得越久,输入越长,留给回答的空间越少,这个问题就越严重。

改法:把上下文调大

在菜单栏图标打开 Settings,把 Context length 从 4k 拉到 32k。改完以后,server.log 开头的配置变成了 OLLAMA_CONTEXT_LENGTH:32768,模型加载时也是 n_ctx_slot = 32768。

之后同一天晚上用 qwen3.5:9b 聊了一阵,日志里一次截断都没有。挑几条看:

输入 token生成 token生成速度耗时
25139647 t/s30 秒
1179225047 t/s50 秒
1346595845 t/s2 分 13 秒
6837520244 t/s2 分 8 秒
11249375143 t/s1 分 33 秒

一轮对话的总长度超过一万两千 token 也能正常回答,生成速度一直稳定在每秒 43–47 个 token,32k 上下文对这块芯片的显存完全没有压力。

但表格也暴露了另一件事:一个只有 25 个 token 的短问题,生成了将近 1400 个 token;有一次生成了将近 6000 个。这些大部分是模型的“思考过程”。上下文调大解决的是“答不出来”,解决不了“答得慢”。日常问答如果嫌慢,就需要关掉思考模式,或者换用不带思考的调用方式。我在《4GB 显卡跑本地模型》里专门写过思考模式的代价。

几条经验

  • “闪退”“卡死”先看日志再下结论。这两次都不是程序坏了,日志里一个写着“交接退出”,一个写着“截断”。
  • 桌面端的默认上下文偏保守。显存够用就主动调大,16k 到 32k 对日常对话比较合适。
  • 长对话会悄悄吃掉上下文。换话题时开个新对话,比在一个对话里一直聊更稳。
  • 看 eval count 和答案长度差多少。差得远,时间就是花在思考上了。

上一篇
下一篇