记录一下那天晚上的排查过程。在 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 不一定够。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
