概念
不随版本变化
内存与显存:两块东西各装什么
报错说 out of memory 时,先搞清楚是哪一块不够。处理办法完全不同。
机器上有两块「内存」:系统内存(RAM)与显卡显存(VRAM)。模型、中间数据、缓存都会在这两块之间流动,报错信息里的 out of memory 指的是哪一块,决定了你该怎么处理。
两块内存的分工
| 项 | 装什么 | 不够时的表现 |
|---|---|---|
| 系统内存(RAM) | 程序本身、模型文件的读取缓冲、准备送进显卡的数据、被挪出显存的模型 | 系统变卡、进程被杀、报错里出现系统内存或页面文件字样 |
| 显卡显存(VRAM) | 当前正在计算的模型、每一步的中间数据、解码阶段的缓冲 | 报错里出现 CUDA、显存分配失败、device 相关字样 |
怎么判断是哪块不够
- 看报错原文里的关键词:出现 CUDA、device、显存分配相关的字样,多半是显存
- 出现系统内存、页面文件(paging file)、被系统终止,多半是系统内存
- 两块都不宽裕时,会先耗尽一块、再连带把另一块拖垮,这时要看最先出现的那条报错
- 同一个工作流,小图能跑、大图就挂,通常是显存;一直加载不动、系统卡死,通常是内存
各自怎么腾地方
- 显存不够:先降中间数据:把批量改回 1、分辨率降一档。这是见效最快的两步。
- 显存不够:再换更省空间的模型版本:量化版本、更小的模型,都能直接降低常驻占用。
- 内存不够:关掉占内存的程序:浏览器标签、播放器、其他大程序。系统内存是全局共享的。
- 内存不够:看页面文件设置:系统内存不足时靠页面文件顶,但它远慢于内存。页面文件被关掉或太小,就会直接报错。
- 都不够:错开时间跑:先跑出中间结果落盘,再在下一步读回来,避免所有东西同时驻留。
常见误解
常见误解
- 显卡显存大就一定不会报内存错
模型加载、预处理、把数据送进显卡都要经过系统内存。显存再大,内存不够照样报错。 - 看到任务管理器里显存还有空余就觉得不该报错
分配器需要连续空间,碎片化时总量够也会失败。 - 把两块内存的报错混着处理
处理办法不同:显存靠降低单次计算量,内存靠减少同时驻留的东西。先分清再动手。
知仓学习社