记录一下那天晚上的排查过程。在 M2 Pro 16GB 上用 mlx-lm 0.20 跑 Llama-3.1-8B 的 8bit 量化,生成到第 300 个 token 时报 Metal out of memory,重启后同样的提示词仍复现。

刚开始盯着「上下文按模型上限分配」,折腾了半个多小时,排掉了。

这类报错背后常见的原因有几处,逐个排除就行。KV cache 随生成长度线性增长。另一种情况是8bit 权重的常驻占用已接近上限。

还有一种情况,其他应用占用了统一内存。

上来先换 4bit 量化再试

python -m mlx_lm.generate --model mlx-community/Llama-3.1-8B-Instruct-4bit --prompt '你好' --max-tokens 128

限制生成长度观察拐点

python -m mlx_lm.generate --model mlx-community/Llama-3.1-8B-Instruct-4bit --prompt '你好' --max-tokens 512

缩短上下文窗口

python -m mlx_lm.generate --model mlx-community/Llama-3.1-8B-Instruct-4bit --prompt '你好' --max-tokens 128 --max-kv-size 2048

生成时看内存压力

memory_pressure | head -5

同样的操作我在测试机上先走了一遍,线上只做验证过的部分。

这台环境是别人交接的,不少默认值被动过,只能一项项核。

别只看报错消失,验证要多做一步。512 token 能稳定生成,内存压力不再进入红色区,重启后复测同一提示词也通过。

补一句。量化省的是权重,长输出吃的是 KV cache,两件事要分开调,光换 4bit 不一定够。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189