作者在24GB MacBook上运行27B模型导致三次内核崩溃,测得实际可用GPU内存约17.76 GiB,并给出各内存规格的准确数据计算方法。
我在 24GB 内存的 MacBook 上尝试运行了一个 270 亿参数的模型。
它让我的 Mac kernel-panic 了。三次。强制重启、工作丢失,全部重来。而论坛上给的所有修复方案都让情况变得更糟。
下面是这个没人会告诉你的数字,以及如何找到你自己的。

点击观看:12 分钟,三次 panic、量化选型,以及模型通过 MCP 控制电视的全过程。
你的 Mac 有 24GB 内存。你的 GPU 能用到 17.76 GiB。

这大约是包装盒上标注数字的 74%。你的权重、KV 缓存和计算缓冲全部共享这个空间。
每篇指南拿 GGUF 文件大小和你总内存做比较,算的都是一个 GPU 从来看不到的数字。
现在就在你的机器上找到它:
ioreg -l | grep recommendedMaxWorkingSetSize
在我机器上只有 24GB 那行有测量值。运行这个命令,相信你自己的数字。
值得精确说明这究竟是什么,因为流行说法是错的。Apple 不称之为上限。他们自己的定义是:
一个 GPU 设备在不影响运行时性能的情况下可以分配的内存字节数近似值。
这是 Apple 建议你保持在以下的一个阈值,不是一堵阻止你的墙。没有什么会在 17.76 GiB 时拒绝你的分配。你可以自由地走过它,进入 Apple 警告你应该避开的区域——在这台机器上,那个区域里藏着一个驱动 bug。
为什么它 panic 而不是报错
Q4_K_M,这个人人推荐的量化方式,权重占 15.3GB,一旦投影器和运行时缓冲加载,峰值达到 19.6GB。这是预算的 110%。
panic(cpu 9): "pending memory object unexpectedly found in non pending hash"
IOGPUGroupMemory.cpp:528
process: WindowServer
重要的日志行在别处:
Compressor Info: 4% of compressed pages limit (OK)
百分之四。这台机器没有内存耗尽。它触发了 Apple GPU 驱动里的一个 bug。
不只是我,也不只是 llama.cpp。同样的故障在 MLX 里反复出现:M4 Max 在大 prefill 时 kernel panic,以及无界 KV 缓存增长导致 Mac Studio 宕机。那个帖子命名了机制:内存是 wired 的,所以 macOS 的 out-of-memory killer 无法回收它,甚至根本感知不到压力。
一个普通进程申请太多内存会被 kill。GPU 分配申请太多则会拉着内核一起 panic。
为什么提高 wired limit 会适得其反
每个论坛都说 sudo sysctl iogpu.wired_limit_mb=20480。这完全是搞反了。

普通内存是停车场里的一辆车。如果系统需要空间,就把这辆车拖走。
Wired 内存是用螺栓钉死在地面上的。内核不允许移动它、压缩它或把它 swap 出去。这就是这个词的含义。
提高限制不会让停车场变大。它会固定更多的车。你获得的腾挪空间反而更少,同时也剥夺了 macOS 自救的能力。
我提高了它。又 panic 了。
"但我有 64GB 还是很慢"
这是我收到最多的回复,所以单独作答。

内存决定能装什么。带宽决定有多快。两者是不同的限制,却不断被混为一谈。
你的 GPU 每次写入一个 token 都要重新读取整个活跃权重集,所以速度大致等于带宽除以模型大小。你的内存数字对带宽毫无参考价值:
同样 64GB,差距达三倍。在 Pro 档位你被带宽上限卡住了,没有任何设置能打破它。你很可能在和带宽是你两倍的人比较。
llama-server -m Qwen3.8-27B-UD-Q3_K_XL.gguf \
--mmproj mmproj-F16.gguf \
-ngl 99 -c 16384 -fa on -ctk q4_0 -ctv q4_0 --jinja
-ctk q4_0 -ctv q4_0 将 KV 缓存本身量化到 4 位,大约缩小 4 倍。在这台机器上,这是 16k context 能否装下的分水岭。在权重上降档之前,先量化你的缓存。你损失的精度少得多。
第二行就是重点。同样的配置,只因为机器带着一个长会话的 swap,就慢了 11%。你的吞吐量里,有 11% 可能正躺在一个你忘关的浏览器标签里。
还有一件事差点坑到我:我的 fit 工具估算占用预算的 90%。实测 wired 占用 92%,一旦给它看一张图片就飙到 94%。把任何 fit 估算当作地板,而不是天花板。
它能装进你的机器吗
pip install localfit
localfit qwen3.8-27b --gpu-gb 12
--gpu-gb 帮你用你自己的 ioreg 数字,而不是我的,去评估每种量化方式相对于你预算的表现。
AnassKartit / localfit
能装下吗?GPU 工具包 for AI 模型 — MLX + GGUF + Cloud 一站式菜单。
██╗ ██████╗ ██████╗ █████╗ ██╗ ███████╗██╗████████╗
██║ ██╔═══██╗██╔════╝██╔══██╗██║ ██╔════╝██║╚══██╔══╝
██║ ██║ ██║██║ ███████║██║ █████╗ ██║ ██║
██║ ██║ ██║██║ ██╔══██║██║ ██╔══╝ ██║ ██║
███████╗╚██████╔╝╚██████╗██║ ██║███████╗██║ ██║ ██║
╚══════╝ ╚═════╝ ╚═════╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝ ╚═╝
能装下吗?说出你想要什么模型 — localfit 自动搞定其余一切。
文本和图像生成。能本地跑就本地跑。装不下就用免费 Kaggle GPU。还是太大就用 RunPod 云端。一个命令搞定所有:下载模型、启动服务、配置工具、打开界面。
pip install localfit
一条命令 — 全部搞定
# 在 Open WebUI 中聊天 + 图像生成(gemma4 LLM + Flux Klein 4B 图像)
localfit launch openwebui --model gemma4:e4b --img klein-4b
# 在 localcoder 中编程 + 图像生成
localfit launch localcoder --model gemma4:e4b --img klein-4b
# 带图像 MCP 工具的 Claude Code
localfit launch claude --model gemma4:e4b --img klein-4b
# 模型本地装不下?在免费 Kaggle GPU 上跑
localfit launch openwebui
完整撰写包含 agent 工具调用结果、通过 MCP 将模型控制权交给电视的设置过程,以及让 llama.cpp 在服务器坚称不行时仍能解码视频的技巧。
去 kartit.net 阅读完整版
如果你也遇到过这个问题,我想要你的 ioreg 数字和你的芯片型号。写在评论区里。