例子:大模型推理遇到内存不足
1. 场景还原
你在Mac上用Ollama运行如下代码(以Python为例,假设Ollama有API接口):
import requests
prompt = "请写一首关于夏天的诗。"
response = requests.post(
"http://localhost:11434/api/generate",
json={"model": "llama2", "prompt": prompt}
)
print(response.json()["response"])
第一次运行:同时打开了Adobe Photoshop、Chrome几十个标签,系统内存只剩下3GB可用
实际输出:
夏天的阳光温暖,鸟儿歌唱,树叶沙沙,&^%$#,水面波光粼粼……7asf@#*...
2. 为什么会出现这种输出?(深入原理)
(1)大模型推理的原理
- 模型参数和中间激活(中间结果)需要全部加载到内存或显存。
- 推理过程中,每一步都依赖前一步的输出,属于“自回归”,任何一步出错都会影响后续输出。
(2)内存不足时发生什么?
- 参数未完整加载:模型文件可能部分加载失败,或者部分参数被操作系统临时换出到硬盘(swap)。这样模型在推理时,访问到的参数值可能是错误、损坏、甚至是0,导致神经网络计算异常。
- 中间结果丢失或被破坏:推理过程中产生的大量中间数据,如果内存不够,可能被系统丢弃或覆盖,下一步就用到了错误的结果。
- 系统响应滞后、进程被暂停:操作系统会降低占用过多内存的进程优先级,或临时挂起,导致推理过程被打断。
(3)为什么不是直接报错?
- 模型底层库做了“容错”:比如PyTorch会用默认值(如0)填充未能正常分配的内存区域。
- 神经网络本身鲁棒,即使部分参数错了,依然能给出“看似合理”的输出,但内容混乱、逻辑跳跃、夹杂乱码。
(4)所以,出现了什么?
- 有效的文本和乱码混杂。
- 语义跳跃,答非所问。
- 偶发奇怪符号或拼写错误。
3. 恢复资源后再试
结束占用大内存的软件,释放内存,再运行同样的代码:
夏日炎炎树影斜,蝉鸣声里绿成霞。
清风拂面荷花笑,碧水流光映晚霞。
这次输出流畅、无乱码、语句通顺。
例子2:CPU被抢占
假设你用Ollama推理时,后台有一个程序(比如视频转码ffmpeg)疯狂占用CPU。
模型推理时输出:
人工智能是一种技术,它&^%$,广泛应用于自动化、数据分析、错乱...#@!*&...
原因分析:
- Ollama分不到CPU时间片,推理过程被频繁打断。
- 线程间切换导致部分计算结果丢失,输出内容混乱。
总结(深入原理归纳)
- 大模型推理是一个链式计算过程,任何环节数据损坏(如参数未加载、激活丢失、推理中断),都会让后续输出出现问题。
- 内存/CPU资源不足,导致关键数据丢失、损坏;底层框架忍受了这种错误,导致“看似正常、实则混乱”的输出。
- 这些问题不会必然崩溃,因为模型和框架都具有一定的容错机制,但输出的质量会大幅下降。