显存不够还想跑大模型?从量化选型到上下文优化全攻略
发布时间:2026/10/12 3:32:46 锦皓数字建站

显存是这个领域里最现实的一道门槛。很多朋友看中了一个开源大模型兴冲冲下载完结果加载那一刻直接“显存不足”整张卡呆若木鸡。这不是你操作有问题而是从选型环节就漏算了一笔账——模型文件不是只有“下载大小”真正跑起来占用的是显存而显存大小决定了你根本能不能加载它、能加载多大参数的版本、能跑多长的上下文。这篇文章就专门聊清楚这件事显存是怎么被吃掉的怎么用公式提前算出结果以及按不同显存档位到底该怎么选模型。先把最核心的公式放在前面跑一个模型的显存需求约等于“模型权重体积 推理过程额外占用 程序自身预留”其中权重体积可以粗算成“参数量 × 每个参数占用的字节数”。这个账算不明白后面全是虚无算明白了就算只有 6GB 显存也能把 7B 参数级别的开源模型玩得明明白白。全文其实就是围绕这句话展开的适合所有想在本地跑模型、又不想当赌狗硬试的人。1. 显存占用的底层逻辑模型的“重量”是怎么算出来的1.1 先看懂参数量和字节数所有大模型在描述自己时都会说“某某 B”这个 B 是英文 Billion 的缩写说的是参数数量。比如 7B 就是 70 亿个参数13B 是 130 亿个参数70B 是 700 亿个参数。每一个参数在计算时都需要占一块存储空间这个空间大小取决于用什么样的精度去保存它。精度的概念可以类比成数字的拍照清晰度。你用 32 位存储一个数相当于一张超高像素原图细节多但体积大用 16 位存储相当于压缩成 JPG肉眼看起来几乎没差体积直接减半再到 8 位、4 位那就是更进一步的压缩图细节少一些但观感依然能接受。模型领域也一样把参数从高位压缩到低位的过程叫量化目的就是用一点点精度损失换取大幅度显存释放。各精度的每参数占用字节数如下精度每参数字节数7B 模型权重体积13B 模型权重体积70B 模型权重体积FP3232位全精度4 字节28 GB52 GB280 GBFP16/BF1616位半精度2 字节14 GB26 GB140 GBINT88位量化1 字节7 GB13 GB70 GBINT44位量化约 0.5~0.8 字节约 4~5.6 GB约 7~10 GB约 35~56 GB这里有个容易误解的点INT4 并不会真的正好等于参数量 × 0.5 字节。实际量化文件里除了压缩后的权重还要额外存一些缩放因子、补偿数据所以 7B 模型的 INT4 文件通常在 4GB 到 5GB 左右不同量化方案会有差别。选型时不要死抠理论值直接看模型发布页标注的“已量化模型文件体积”最靠谱。1.2 模型权重只是第一层开销别以为算出权重体积就够了显卡真正运行模型时显存里还活着另外两批数据一批是计算过程中产生的中间激活值一批是程序运行环境自身提前占用的显存。中间激活值很难一概而论它和输入长度、批处理大小、模型层数都有关系。简单说模型运行时要不断“记住”刚才算到哪一步文本越长记住的东西越多。而程序运行环境就比较固定了比如框架本身、基础库、加载器等加起来会吃掉 1GB 上下显卡越好越不明显但 6GB 小显存卡上就相当肉疼。我用一个保守的估算方式实际显存需求 ≈ 权重体积 × 1.2再额外加 1GB 固定开销。这个系数是给激活值和缓存留的余量。比如某个 7B 模型的 FP16 权重是 14GB乘以 1.2 再 1GB大概是 17.8GB所以 16GB 显存跑不动、24GB 跑起来比较舒服完全符合大家平时看到的现象。量化版本的权重小很多余量自然宽松得多。1.3 为什么量化后照样能用的直觉解释很多人第一次听 INT4 量化都觉得离谱把一个神经网络里的海量参数砍成 4 位不是等于把高清电影转成马赛克吗实际效果确实有轻微损失但远没有想象中严重。原因很简单神经网络在训练时本身就带有冗余参数的权重并不是每个比特都至关重要模型自己都学会了抗干扰。量化相当于把 100 个数字归并成 16 档近似值对单个极端参数可能有影响但对整体输出分布影响很小。尤其是 7B、13B 这种规模的模型量化后的质量损失普通用户几乎感知不到太多换来的是 2GB 显存能跑、8GB 显存能跑得更顺畅这笔交易太划算了。注意量化也不是越低越好。INT4 偶尔会让模型在复杂推理、长文本生成时出现轻微的语义漂移。如果你特别在意输出质量且显存有富余优先选 INT8显存确实紧张再考虑 INT4。2. 按显存大小选模型从 6GB 到 24GB 的实战档位表2.1 不同显存容量对应的安全选择范围不同显卡的显存容量天差地别但选型逻辑其实是同一个让你的权重体积加预留在显存里放得下并且留出足够空间给上下文增长。我按常见显存档位总结成下面这张表直接对着抄作业就行显存容量推荐模型范围建议精度注意事项6GB7B 及以下INT4上下文尽量控制在 2K~4K不要开大窗口8GB7B/8B 可流畅跑13B 可勉强跑INT4/INT813B 建议 INT4且关闭大上下文扩展12GB13B/14B 是甜点区间7B 可上 FP16INT4/FP16跑 13B INT4 时剩余空间较充足体验好16GB13B/14B FP1634B 级 INT4FP16/INT4跑 34B INT4 必须控制上下文长度24GB34B 级 FP1670B 级 INT4FP16/INT470B INT4 是极限操作需优化上下文和批大小48GB 以上70B 级 FP16更大模型看情况FP16/INT4基本脱离消费级瓶颈开始进入服务器范畴这个表的前提是“推理”不是“训练”或“微调”。区分好场景比什么都重要推理是模型已经训练好了你输入文本让它回答微调是还要让模型继续学习你的数据显存需求可能是推理的三倍以上。下面第三部分单讲这方面的差距。2.2 6GB 和 8GB 小显存的极限玩法只有 6GB 或 8GB 显存的人最多也最容易焦虑。我的看法是别焦虑7B 级别的开源模型经过 INT4 量化后权重才四五个 GB6GB 显存完全可以跑8GB 显存还能多留点余量给模型吃上下文。实际跑的时候有几个小技巧很有效。第一个是把上下文窗口设短一点。很多模型的默认上下文是 8K如果显存不够可以手动改成 2K。长上下文会额外占用大量显存每多一个 token 都在增长 KV Cache这个增长虽然单看不大但堆到几千 token 后轻松吃掉两三个 GB。第二个是优先选带量化版本的模型仓库不要自己去量化官方量化过的文件更稳还往往针对低显存做过专项调整。第三个是在启动参数里关闭额外扩展模块别把记忆增强、画图插件这些和服务一起开。8GB 显存跑 13B INT4 是很多人的小目标。我实测过权重约 7 到 8GB加载完只剩几百 MB 余量模型能跑但生成速度会受限制而且上下文稍微一拉长立刻报显存不足。所以我的结论是8GB 显存跑 13B 属于“能用但煎熬”如果只是聊聊天问题不大如果要跑很长的文档分析还是老老实实回到 7B INT8 更舒服。2.3 12GB 和 16GB 的黄金甜点12GB 显存是当前性价比很不错的档位。这个容量跑 13B INT4 非常舒服权重七到八个 GB 下去之后还有四五个 GB 富余上下文开到 8K 也不慌。甚至可以尝试开两个模型同时排队调度但我不推荐这么做显存管理的碎片化会让两个模型都变慢。16GB 显存就更不必说了几乎可以通吃消费级场景13B 或 14B 的 FP16 版本直接加载权重约 26GB等一下这里要提醒一句13B 的 FP16 权重约 26GB16GB 显存是放不下的很多人会在这里踩坑。16GB 跑 13B 的标准姿势是 INT4 量化版或者 INT8 版本大约 13GB 权重勉强塞得下。为什么我前面表格里写 16GB 可以跑 13B FP16这是我表述不准确赶紧修正16GB 跑 13B FP16 是不可行的它是 24GB 显存才能干的活16GB 真正舒服的区间是 7B 随便跑 FP16、13B 跑量化的余地很大、34B 级以上跑 INT4 也能尝试。选型时宁可保守一点给你的显存留出至少 20% 的余量否则任何长文本场景都会让你崩溃。2.4 显存不够时的另类思路如果看上的模型确实超出了显存容量不必立刻放弃还有几个变通手段。最常用的是 CPU 卸载把一部分权重放到内存里显卡只放计算最密集的部分相当于给显存挂了一个低速但容量巨大的外接仓库。代价是推理速度明显变慢而且你需要足够大的运行内存比如内存 32GB 以上不然进程直接变泥潭。还有一种手段是张量并行或模型分片。现在主流推理框架都支持把模型切成几块用多张显卡一起跑。如果你手头有两张 8GB 显存的卡合起来跑 13B INT4 完全没有问题速度还比单卡 CPU 卸载快得多。缺点是配置起来稍微麻烦但值得学习。提示显存不足的困境优先从“换量化档位”开始其次才是“换更小的模型”。单纯因为显存放弃一个模型之前先确认你用的量化档位已经是最低的了国产社区里很多模型都有成熟的 INT4 版本你完全可以在不牺牲太多质量的前提下把需求压下来。3. 不只是权重上下文长度和微调都会把显存账本翻倍3.1 KV Cache上下文越长账单越贵前面提到的推理过程额外占用核心就是 KV Cache。这名字听着高级本质是模型在生成每一个新词时都要反复读取之前已经算过的历史信息。为了不重复计算模型把历史中间结果缓存下来这些缓存放在显存里随着生成的长度增长而线性增长。KV Cache 的计算公式大致是层数 × 注意力头数 × 每个头的维度 × 上下文长度 × 参数精度系数最后再乘一个 2因为缓存要同时存 K 和 V 两份数据。不同模型的参数不一样但你可以用这个粗略结论对于 7B 到 13B 级别模型每额外增长 1K 上下文显存多占用大约 0.5GB 到 1.5GB。上下文从 2K 拉到 8K多出几个 GB 很常见这就是为什么很多教程里都提醒你“不要盲目拉长上下文”。我实际操作时有一个心法先按默认短上下文把模型跑通确认显存占用符合预期再逐步调高上下文长度观察显存变化曲线。直接一步开到最大上下文的人十有八九都会撞上显存不足的报错。这个曲线也是判断一张卡能不能带动某个模型的最好办法比跑一堆基准测试直观多了。3.2 批处理大小同时干活越多占用越大如果只是聊天一次只生成一个回答显存压力主要来自权重和上下文。但如果你想批量处理任务比如一次性给模型塞 4 个问题让它并行回答那激活值和 KV Cache 都会成倍增加。批处理大小为 NKV Cache 大约也是 N 倍激活值可能更高。所以显存不足时优先缩小批处理大小而不是直接换模型。很多推理框架默认批次值比较高新手根本不知道这个参数在哪里改。我建议所有在小显存卡上运行的朋友第一次启动时先查一下默认批大小改成 1 或 2能救回不少显存。代价只是多跑几轮但至少不会随机爆炸。3.3 微调才是显存深渊LoRA 把小成本变成可能推理的显存账已经比较复杂了训练和微调更夸张。全参数微调一个 7B FP16 模型显存里同时要驻留四类东西模型权重、梯度、优化器状态和中间激活值。梯度大小和权重差不多Adam 优化器状态更是权重的好几倍。算一笔账7B FP16 权重 14GB梯度 14GB优化器状态如果按 32 位浮点保存动量和方差各 28GB加起来超过 84GB再加上激活值单卡基本无望。这就是为什么消费级显卡几乎不谈全参数微调。普通人的破局之道是 LoRA 这类低秩适配器技术。原理简单说就是冻结原模型权重只在旁边加一小块可训练的小参数模块最终真正更新的参数可能只有原模型的 0.5% 到 2%。这样你就需要单独存储的额外显存大幅下降整体微调显存需求可能就比推理多出三四 GB。16GB 显存跑 7B 模型的 LoRA 微调我试过很多次是可行且效果很爽的12GB 配合理量化手段也能跑但非常紧张8GB 我建议直接用别人训练好的 adapter 去加载不要自己硬训。注意即使只做 LoRA模型权重本身依旧要完整放显存里。7B INT8 推理只要 7GB 权重但 LoRA 微调时为了计算梯度通常建议用更高精度所以实际占用会比推理状态下高不少。不要拿纯推理的显存估算去套微调那一套会把你带到沟里去。3.4 从零算一遍13B 模型到底需要多大的显存把上面的知识串起来我用一个具体例子完整算一遍。假设你想在本地跑一个 13B 开源模型选择了 INT4 量化版权重体积约 8GB。推理时上下文控制在 4KKV Cache 和激活值大约多占 2GB 到 3GB程序运行环境预留 1GB。整体显存需求大概在 11GB 到 12GB。所以 12GB 显存卡可以跑8GB 绝对跑不了16GB 跑起来很舒服能顺手把上下文开到 8K 甚至更高。再假设你换成了 FP16 版权重约 26GB算上上下文和预留至少要 28GB 以上16GB 卡直接出局24GB 卡勉强带得动 4K 上下文但几乎留不出安全边际。结论很清楚不是模型越大越好而是要找一个你的显存容量恰好能“装得下还有余力”的档位。先算权重再加按 1.2 系数和 1GB 预留最后根据上下文长度调整这就是完整方法论。4. 显卡跑不了模型时的典型报错与排查顺序4.1 “out of memory”别急着换卡先按顺序排查显存不足的报错几乎人人都会遇到但这不代表你这张卡就废了。我遇到这类报错时有一套固定的排查顺序按照这个顺序走常常不换硬件就能解决。第一步先查显存占用情况。在终端输入gpu-smi显卡品牌不同命令略有差别以你手头使用的显卡官方工具为准看看整卡显存还剩多少。如果显存已经快满了但明明刚开机说明有残留进程占着显存把之前的 Python 或推理服务进程杀掉再试。这是很多人忽略的坑机器重启一次就恢复正常其实不是模型问题。第二步把显存占用小量化的参数全部压低。上下文长度改成 2K、批大小改为 1、关闭所有非必要的扩展模块再跑一次。如果这时候成功了说明你的显卡其实能带这个模型只是你的配置太贪心参数调低就好。第三步检查模型本身选的量化档位。确认你加载的是 INT4 而不是默认的 FP16 版本这个错误每天都会发生因为很多模型库默认下载完整 FP16 权重量化版需要在加载命令里特别指定。FP16 和 INT4 的体积差距两三倍走错一步就是地狱和天堂的差别。第四步启用 CPU 卸载。主流推理框架里都有相关配置开关把所有中间层都放到内存显卡只保留关键计算部分。这个动作会把生成速度拖慢不少但至少能让模型跑起来。4.2 模型加载了但生成速度像蜗牛几个隐形原因速度慢不一定是因为显卡太老我碰到过几种伪装成“性能不足”的配置问题。最常见的是权重根本没有全部塞进显存而是偷偷落在了内存里。你以为在“显卡推理”实际底层在“内存计算”速度自然感人。检查方式也简单看推理时gpu-smi显示的显存占用和 GPU 使用率如果显存占用低但 CPU 或内存占用很高大概率就是模型被放到了 CPU 上。再一个容易被忽视的原因是量化版本本身不兼容当前推理框架框架会自动回退到非量化计算甚至 CPU 计算。这种情况在冷门模型和旧版本框架时特别常见解决办法说穿了就是“看官方要求匹配框架版本”。开源世界的兼容性本来就是最麻烦的环节模型发布页写的支持列表一定读清楚别闭着眼睛 pip install。最后进程混跑也很常见。一张显卡上同时跑着两个推理进程特别是 8GB 小显存卡任何多余的占用都是致命打击。我习惯在任何推理任务开始前用gpu-smi看一眼有没有残留还把这些检查写成启动脚本省得每次手动翻。4.3 显存够用却突然崩溃隐藏的显存碎片化问题有些时候模型权重加起来明明没超过显存总量可跑到一半就崩了。这里面有两个高手才会碰到的问题显存碎片化和显存分配失败。显存碎片化指的是显卡里被大量小块的残留数据占住新的大块数据申请不出来就像硬盘碎片一样。对策是启动前把进程彻底清理干净或者干脆重启一次立刻见效。显存分配失败则常常和框架的预分配策略有关。有些框架不管你实际用多少启动时直接一口气向显卡申请模型权重加完整上下文缓存如果你显存只剩一点点都会被判负。这种情况下看到报错先别焦虑试着调整框架的显存分配策略比如把自动分配改成手动保守分配常常能救命。提示任何显存相关问题的排查永远从“实际数据”出发不要靠感觉。显存剩多少用gpu-smi看一眼模型权重多大看下载文件体积上下文占了多少看监控曲线。这里的每一步我都在文章里放上了具体原则按顺序执行绝大多数问题都能定位到根因。5. 踩坑之后形成的选型心法我最初也走过那种“看到大模型就下载”的弯路8GB 显存的机器硬扛 13B 模型加载五分钟、生成一个词卡三秒体验极差。后来想明白了一件事选模型不是找最大参数量的那一个而是找你的显存恰好能舒适承载的那一个。舒适的标准不是“勉强能加载”而是加载后还有至少 20% 的显存余量用来应对上下文增长和程序波动。现在我做任何模型选型都会先过一遍这个思路确定可用显存上限写清楚模型参数量选定量化档位算出权重体积乘以 1.2 加 1GB 得到基准值再根据上下文长度和批大小调整。算完之后如果基准值明显小于显存就往下走如果接近或超过主动换更小的模型或更激进的量化方案。这套流程跑得多了你就有了手感看到任何模型标题都能在十秒内判断出自己的显卡行不行。再分享一个进一步的技巧不用真的把模型下载完再判断很多模型库和推理框架都会在加载前打印模型参数量和推荐的设备类型留意这些日志比事后拿报错硬碰硬聪明得多。你甚至可以先用 CPU 加载几次做个快速验证确认模型能跑通再换显存推理省下的显存折腾时间非常可观。显存计算这件事本质上就是帮你在“模型质量”和“硬件限制”之间找一个平衡点提前算明白你就能把这张卡的价值压榨到最大。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。