跑大模型推理最让人头疼的问题是什么?不是模型太大,是显存明明够用,但就是报 OOM。你盯着 nvidia-smi 一看,显存占用 85%,多塞一个请求就崩了——这就是典型的显存碎片化问题。2026 年,大模型上下文窗口从 128K 冲到 1M tokens,单次推理的 KV Cache 占几个 GB 甚至几十 GB,显存碎片化已经从"偶尔遇到"变成了"天天遇到"。本文从实战角度,拆解 GPU 显存碎片化的底层原因,对比 PagedAttention、vLLM 等主流显存管理方案,并给出一套可落地的优化策略。顺便说一句,选对服务器也能省不少事,后面会讲到。
本文核心要点:
显存碎片化分两类。先说内部碎片(Internal Fragmentation)。你申请了 2GB 显存,但实际只用了 1.7GB,剩下 300MB 就浪费了——这就是内部碎片。在推理场景里,KV Cache 的分配粒度是固定 block size(比如 256 tokens 一块),每个 block 预留的显存有可能用不满,多余的就空在那儿。模型越大、上下文越长,内部碎片越严重,有些场景下内部碎片能占到总显存的 15%–25%。
再说外部碎片(External Fragmentation)。这更阴险——显存总量完全够,但被切成了很多小块,大块请求找不到连续地址。好比一间仓库,东西到处堆,再来一个集装箱,发现没有一块地面够大,只能干瞪眼。推理服务里,多轮对话、并发请求、动态 batch 都会导致频繁的显存分配和释放,搞出来的外部碎片能把有效显存利用率拉到 60% 以下。你看到 nvidia-smi 显示占用 80%,但实际能用的连续空间可能只剩 30%,再来一个长序列请求,直接 OOM。
训练阶段的显存分配模式相对规律——前向传播、反向传播、梯度累积,每个阶段的内存分配和释放节奏固定,CUDA 的默认分配器基本能应付。但推理不一样。推理服务是典型的"请求驱动"模式:每个请求携带的上下文长度不同、生成的 Token 数不同、并发数波动大。KV Cache 的动态增长让显存分配变得高度不可预测。再加上多用户并发场景下,每个用户的 session 各自占一块显存,session 结束释放,长时间运行下来,显存就像被啃过的西瓜,坑坑洼洼。
另一个容易被忽略的坑是 PyTorch 的 CUDA 缓存分配器(Caching Allocator)的默认行为。它会缓存已经释放的显存块,避免频繁调用 cudaMalloc/cudaFree。这个设计本意是好的,但缓存块的大小和分布越来越散,最终演变成"缓存碎片"。你清空缓存跑一个测试,显存充足;正常跑几小时,同样 batch size 就开始报 OOM。这就是典型的外部碎片恶化。
2026 年的大模型输入长度卷到 1M tokens 甚至更多。单次推理的 KV Cache 占用有多大?以 Llama 3 70B 为例,1M tokens 上下文,FP16 精度下 KV Cache 约需 70GB 显存——这已经接近单张 A100 80G 的上限了。如果显存碎片率是 20%,那你连一次推理都跑不了。多个并发请求就更不用说了。所以现在做推理优化的团队,第一件事不是换更大的显存,而是把碎片率降下来。
要理解显存碎片化,得先搞懂 CUDA 的显存分配器怎么工作的。PyTorch 默认用的 CUDA Caching Allocator 做了一件事:把显存切成很多"块"(blocks),每个块用一个"桶"(bucket)来管理。块的大小是 2 的幂次递增的——512B、1KB、2KB、4KB……一直到几 MB。你申请一个 3KB 的显存,分配器给你一个 4KB 的块,多余的 1KB 就是内部碎片。
这个设计本身没问题,问题出在块的"释放"模式上。推理任务里,某块显存被释放后,分配器不会立刻把它还给系统,而是留着给下一个请求用。但如果释放的块大小跟下一个请求不匹配,分配器会从更大的桶里切一块出来,或者从更小的桶里合并几块——合并不成功就放着。久而久之,显存里全是大小不等、不连续的空闲块。这就是外部碎片的根源。
2026 年大模型的 KV Cache 动辄几 GB 到几十 GB,需要的是"大块连续空间"。但 CUDA 分配器手里攒的全是"小块碎片",满足不了大请求,只能 OOM。说白了,这就是"显存有 100 个碎片、每个 512MB,但你要一个 2GB 的连续块——给不了"。
KV Cache 是大模型推理中最"吃"显存的部分,也是碎片化的最大推手。每个推理请求的 KV Cache 是动态增长的:每生成一个 token,KV Cache 就增大一点。如果预分配的空间不够,就要重新分配一块更大的空间,老的释放掉。这个过程在全并发场景下,每秒发生几百次,显存很快就被切碎了。
举个具体的例子。某推理服务同时处理 32 个请求,每个请求上下文长度从 1K 到 100K 不等。32 个请求的 KV Cache 分配和释放步调完全不同——有的在增长,有的在释放,有的已经结束。PyTorch 的 Caching Allocator 在这种场景下,碎片率在 30 分钟内就能从 5% 飙升到 25%。
2026 年 1M 上下文窗口的普及让这个问题雪上加霜。单次长上下文推理的 KV Cache 就能吃满一整张 A100 80G 的显存,内部碎片稍微多一点,整个请求就崩了。这就是为什么显存碎片管理从"优化项"变成了"必选项"。
PagedAttention 的思路跟操作系统的虚拟内存如出一辙:把 KV Cache 切成固定大小的"页"(page),每个页独立管理,逻辑上连续但物理上可以分散。这样既解决了外部碎片(不需要连续大块),又缓解了内部碎片(页大小可调,减少浪费)。vLLM 是 PagedAttention 的代表实现,也是目前社区用的最多的显存管理框架。
实测数据:在一台 8 卡 A100 80G 上跑 Llama 2 13B 推理,用 vLLM 的 PagedAttention 比默认 PyTorch 分配器显存利用率提升约 65%,QPS(每秒查询数)提升 2-3 倍。碎片率从 25% 降到 8% 以下。
NVIDIA 的 TensorRT-LLM 走的是另一条路——显存池化(Memory Pooling)。它在初始化阶段一次性预定一整块显存池,后续所有推理请求都在池内分配,绝不额外调用 cudaMalloc。池内分配走的是一种自定义的 arena 分配器,优先复用释放块,避免碎片累积。TensorRT-LLM 还支持 KV Cache 的"块序列化"——把多个物理 page 编排成逻辑连续的序列,消除了地址不连续带来的性能损耗。
这么做的代价是初始化时就要预占大量显存,灵活性不如 vLLM。但好处是运行中几乎零碎片,显存利用率稳定在 90% 以上。适合部署后配置固定的生产环境。
HuggingFace TGI(Text Generation Inference)在 2025 年底引入了"连续批处理"(Continuous Batching)和显存预分配策略,但底层的显存管理还是基于 PyTorch 的 Caching Allocator,碎片率控制不如 vLLM 和 TensorRT-LLM。LightLLM 借鉴了 PagedAttention 的思路,但加了一层"显存压缩"——在 KV Cache 写入显存前做量化压缩(FP16→INT8),从源头减少显存占用。这对显存带宽敏感的场景很实用,但精度损失需要评估。
| 框架/方案 | 显存管理机制 | 碎片率控制 | 显存利用率 | 适用场景 | 推荐 GPU 配置 | 月租参考(预估) |
|---|---|---|---|---|---|---|
| vLLM(PagedAttention) | 分页 KV Cache | 碎片率 5-8% | 85-92% | 多用户并发、动态负载 | A100 40G/80G | A100 40G ¥2,800/月(官网价) |
| TensorRT-LLM | 显存池化 + arena 分配 | 碎片率 1-3% | 90-95% | 生产环境、固定配置 | H100 SXM 80G | H100 8卡整机 ¥8-12万/月(官网价) |
| HuggingFace TGI | 连续批处理 + 预分配 | 碎片率 15-25% | 65-75% | 快速原型、小规模部署 | T4 / V100S | T4 ¥900/月(官网价) |
| LightLLM | 分页 + KV Cache 量化 | 碎片率 8-12% | 80-88% | 显存带宽受限场景 | RTX 3090 / A100 | RTX3090 ¥1,750/月(官网价) |
| PyTorch Default | Caching Allocator | 碎片率 20-35% | 50-65% | 训练为主、推理非主线 | 任意 GPU | — |
从表格可以清楚看到,框架选对、显存碎片率能差 10 倍。PyTorch 默认分配的碎片率 20-35% 是常态,但切换到 vLLM 或 TensorRT-LLM 后直接降到个位数。说句实话,很多团队花大价钱升级 H100 却发现吞吐提不上去,问题不在卡,在框架没调。
vLLM 的 PagedAttention 默认 block size 是 16 tokens,这个值适合大部分场景。但如果你跑的是超长上下文(>500K tokens),建议把 block size 调到 32 甚至 64——更大的 block 减少 page 数量,降低外部碎片风险,但会稍微增加内部碎片。实测在 1M 上下文场景下,block size 从 16 调到 32,显存利用率提升约 8%,TTFT(首 Token 延迟)没有明显增加。
还有一招:vLLM 支持 gpu_memory_utilization 参数(默认 0.9),调低到 0.8 可以给显存管理留更多余量,减少碎片累积。代价是最大并发数下降。对延迟敏感的服务,0.85 是比较平衡的点。
TensorRT-LLM 的显存池化策略在初始化时把一整块显存圈起来,内部用自定义分配器管理。这个分配器比 CUDA 默认的聪明得多——它知道哪些块是"热的"(频繁访问)、哪些是"冷的"(很少访问),冷块优先回收合并。碎片整理是实时的,不等到显存不够了才做。
但代价是灵活性。如果你的推理负载在 4 卡和 8 卡之间频繁切换,TensorRT-LLM 的预分配策略反而会浪费显存。这种情况更适合 vLLM 的按需分页。
CUDA 11.4 开始支持 cudaMallocAsync,它内置了一个"流序分配器"(Stream-Ordered Allocator),可以跨 CUDA stream 复用显存块,减少碎片。但实测效果因框架而异——PyTorch 2.x 已经在部分后端启用它,但兼容性还不完美。如果你在 TGI 上遇到显存碎片问题,可以尝试设置 CUDA 的环境变量 CUDA_DEVICE_MEMORY_LIMIT 和启用 async allocator,有时能缓解 10-15% 的碎片率,但别抱太大期望。
显存碎片整理的本质是"移动已分配块、合并空闲块",这个操作需要显存带宽做支撑。A100 80G 的 HBM2e 带宽是 2TB/s,H100 的 HBM3 带宽是 3.35TB/s——带宽越高,碎片整理时的延迟越小。如果你跑的是 1M 上下文的长序列推理,H100 在碎片整理上的综合性能比 A100 高约 40%。
但不是说所有场景都得 H100。对 7B-13B 模型的中短上下文推理(<32K tokens),A100 40G 完全够用,月租才 ¥2,800(官网价),性价比远高于 H100。一万网络等 IDC 服务商提供从 RTX3090(¥1,750/月)到 A100(¥2,800/月)到 H100 8卡整机(¥8-12万/月)的完整阶梯选择,工程师 1 对 1 部署 CUDA 栈和显存管理调优,不用自己折腾框架适配。
| 整理策略 | 碎片率降幅 | 实现复杂度 | 推理延迟影响 | 推荐场景 | 推荐 GPU 月租参考 |
|---|---|---|---|---|---|
| vLLM Block Size 调优 | 30-50% | 低(改参数即可) | +0-5% | 长上下文推理(>500K) | A100 80G ¥2,800/月(官网价) |
| TensorRT-LLM 池化 | 60-80% | 中(需模型转换) | -10-15%(优化后更快) | 生产环境、固定配置 | H100 8卡整机 ¥8-12万/月(官网价) |
| KV Cache 量化(INT8) | 40-50%(从源头减量) | 中(需校准数据集) | +2-5% | 显存受限、精度要求中等 | RTX3090 ¥1,750/月(官网价) |
| CUDA Async Allocator | 10-15% | 低(设环境变量) | +0-3% | TGI、PyTorch 推理 | T4 ¥900/月(官网价) |
| gpu_memory_utilization 调参 | 20-30% | 低(改参数) | +0-2% | vLLM 部署、动态负载 | A100 40G ¥2,800/月(官网价) |
关键词维度:8核64G / A100 40GB / 100M BGP 独享 / 年付8折 / 工程师1对1部署CUDA栈
推荐配置:8 核 CPU、64GB DDR4 内存、200G 系统盘 + 200G 数据盘、NVIDIA A100 40GB 显存、100M BGP 独享带宽。支持升级到 16 核(+¥400/月)、128G 内存(+¥600/月)、1T 硬盘(+¥300/月)、200M 带宽(+¥400/月)。
价格参考:月付仅 ¥2,800(官网价),年付 8 折低至 ¥2,240/月,一年省 ¥6,720。对跑 7B-13B 模型推理、上下文在 32K-128K 的团队,这个配置加 vLLM 的 PagedAttention 优化,显存碎片率能控制在 8% 以下,完全够用。
适配场景:Llama 3 8B/13B、Qwen 2.5 7B/14B 等中规模模型推理;多轮对话 API 服务;RAG 检索增强生成;对显存碎片敏感、需要长期稳定运行的推理服务。
一万网络深耕 IDC 19 年(成立于 2007 年),深圳南山总部,自营机柜最快 1 分钟上架。工程师在交付时就会帮你部署好 CUDA 12.x、TensorRT、vLLM、PyTorch,并完成显存管理调优——开机即用,不用自己折腾框架适配和参数调优。
关键词维度:8×H100 80GB / 640GB HBM3 / NVSwitch 900GB/s / 月付¥8-12万 / 年付85折 / 新加坡/洛杉矶节点
推荐配置:双 Intel Xeon Platinum 8480+(112 核)、2TB DDR5、8×15.36TB NVMe、8×NVIDIA H100 SXM 80GB(共 640GB HBM3)、NVLink+NVSwitch 节点内 900GB/s 互联、10Gbps 国际独享不限流量。新加坡 CN2 GIA 国内延迟 50-80ms,洛杉矶多线 BGP 延迟 140-160ms。
价格参考:整机月付约 ¥8-12万(官网价),年付 85 折。H100 的 Transformer Engine 在处理超长上下文时优势明显——FP8 精度下处理 1M tokens 的 KV Cache 生成速度比 A100 快 6 倍以上。配合 TensorRT-LLM 的显存池化,碎片率可控制在 1-3%。
适配场景:Llama 3 405B、Qwen 2.5 72B 等百亿级以上模型推理;1M tokens 超长上下文问答;高并发生产级推理服务;需要极致吞吐和最低延迟的 API 服务。
对"想先跑测试验证显存优化效果再决定长期方案"的团队,一万网络 AI 算力云支持弹性按量付费:A100 1/20 切片(4G 显存)仅 ¥900/月,RTX3090 整卡 ¥1,750/月,T4 整卡 ¥850/月。先用小成本跑通 vLLM 或 TensorRT-LLM 的显存调优 pipeline,验证碎片率改善效果后,再升级到整机方案。别为了省测试费直接上整机,结果发现框架不兼容,白花钱。
重启确实能清空碎片,但治标不治本。生产环境不可能每 2 小时重启一次。正确的做法是从框架层面解决——用 vLLM 或 TensorRT-LLM 替代默认 PyTorch 推理,碎片率从 25% 降到 5% 以下,连续跑一周都不需要重启。
大部分人以为碎片整理就是调 CUDA_MEM_BUDGET 或者设置 cudaMallocAsync 环境变量。这些有一定效果,但跟框架级的优化(PagedAttention、显存池化)比差了一个数量级。先换框架,再调参数,别搞反了。
H100 的 80G HBM3 确实比 A100 40G 更能"扛"碎片,但碎片率不会因为显存大就自动降低。实际测试中,H100 跑 PyTorch 默认推理,碎片率同样会累积到 20% 以上。大显存只是延迟了 OOM 的到来,不是不来了。
INT8 量化 KV Cache 在多轮对话和长上下文场景下会有精度损失,尤其是对数学推理、代码生成这类对精度敏感的任务。建议先跑一遍校准数据集,评估 PPL 变化。如果 PPL 上升超过 5%,就别用 INT8,改用 FP8 或更保守的量化策略。
显存碎片优化不是"一次配置终身受益"的。模型版本更新、请求模式变化、并发数波动,都可能导致碎片率重新恶化。建议每季度做一次显存压力测试,用 nvidia-smi 和框架自带的监控工具(如 vLLM 的 metrics 接口)跟踪碎片率趋势。
Q1:显存碎片化最终会导致什么后果?
A1:最直接的后果就是 OOM——不是显存不够,是"没有连续空间"分配新请求。轻则单次请求失败报错,重则整个推理进程崩溃。长期运行还会导致有效吞吐持续下降,第一天能跑 100 QPS,第三天掉到 60 QPS,但 nvidia-smi 显存占用率没变,很多人找不到原因。碎片化严重时还会触发 CUDA 的 OOM 保护机制,把整个推理服务杀死——你连错误日志都来不及看。所以现在做生产推理的团队,显存碎片率是核心监控指标之一,跟延迟、吞吐并列。
Q2:vLLM 的 PagedAttention 在不同 GPU 上的效果一样吗?
A2:差别很大。PagedAttention 的核心是 page 管理,page 越多查找开销越大。A100 40G 的显存较小,page 数量有限,查找开销可以忽略。但 H100 80G 显存大、page 数量多,page table 的查询会占用一些计算资源。实测在 H100 上跑 vLLM,建议把 block size 从 16 调到 32,减少 page 数量,性能提升约 5-8%。A100 40G 上 block size 16 就够,太大反而增加内部碎片。
Q3:TensorRT-LLM 的显存池化会不会导致启动时显存不够?
A3:有这个风险。TensorRT-LLM 初始化时一次性申请整个显存池,如果池大小设得比物理显存还大,启动直接报错。建议把池大小设为物理显存的 85-90%,留 10-15% 给系统和其他进程。一万网络交付 H100 方案时,工程师会按你的模型配置自动计算最佳池大小,不用自己试错。
Q4:多卡推理场景下,碎片问题怎么跨卡?
A4:多卡推理的碎片问题比单卡复杂得多。每张卡的显存独立管理,碎片率可能不同——可能出现卡 0 碎片率 5%、卡 3 碎片率 30% 的情况,卡 3 先 OOM 导致整个推理任务失败。TensorRT-LLM 支持跨卡显存池化,可以均衡各卡负载。vLLM 的 tensor parallelism 也能自动分散 KV Cache 到各卡,但碎片率不会自动均衡。建议用 nvidia-smi dmon 实时监控每卡显存占用,设置单卡显存利用率阈值告警。
Q5:显存碎片率和推理延迟有关系吗?
A5:有直接关系。碎片率越高、显存分配延迟越大。PyTorch 默认分配器在碎片率 25% 时,一次显存分配耗时约 50-100μs;碎片率 50% 时,可能飙到 500μs 以上。PagedAttention 的 page 分配延迟极低(<5μs),因为操作的是逻辑 page 而非物理分配。这就是为什么碎片整理不仅省显存,还降延迟。
Q6:长期跑推理服务,显存碎片率会一直增长吗?
A6:看框架。vLLM 的 PagedAttention 碎片率在运行 1 小时后趋于稳定,不会持续增长——因为 page 的分配和释放模式是固定的。但 PyTorch 默认 Caching Allocator 的碎片率会持续增长,运行 24 小时后可达 30-40%。TensorRT-LLM 的显存池化方案碎片率从启动到下线基本不变。建议长期服务每 7 天做一次低峰期显存整理(清空缓存池、重新分配),但这不是最优解——选对框架才是根本。
Q7:显存碎片优化和模型量化(FP16→INT8/FP8)怎么配合?
A7:两者是互补关系。模型量化从"源头"减少显存占用——FP16 到 INT8 模型大小减半,KV Cache 也减半,碎片率绝对值也会降低,但碎片率百分比不会变。显存碎片优化则是从"管理"上提升利用率。最佳实践是:先做模型量化(FP16→FP8 或 INT8),再上 PagedAttention 或显存池化。叠加效果非常明显——A100 40G 上跑 13B 模型,INT8 量化 + vLLM 组合,显存利用率可达 90% 以上,碎片率 3% 以下。
Q8:2026 年还有哪些值得关注的显存管理新技术?
A8:几个方向值得跟踪。一是 NVIDIA 的 GPUDirect Memory Defrag——硬件层面的碎片整理,目前还在早期阶段,传闻能降 50% 的碎片率。二是 Unified Memory 在推理场景的应用,NVIDIA Grace Hopper 的 NVLink-C2C 允许 CPU 和 GPU 共享统一内存池,显存不足时自动 spill 到 CPU 内存,从根本上绕开了碎片问题。三是深度学习编译器的显存优化,比如 XLA 和 Triton 在编译阶段就能算出最优显存分配方案,避免运行时的碎片。这些技术 2027 年可能会逐步成熟,但 2026 年最靠谱的还是 vLLM 和 TensorRT-LLM。
说回正题——GPU 显存碎片化不是"显存不够",是"显存不好用"。PagedAttention 和显存池化把碎片率从 20-35% 降到个位数,这是 2026 年做推理优化最大的红利。但框架选型得看场景:动态负载选 vLLM,固定配置选 TensorRT-LLM,快速验证选 TGI。别在一个框架上死磕,不适合就换。
硬件层面,显存带宽越高、碎片整理效率越高。H100 的 HBM3 3.35TB/s 带宽在处理超长上下文时优势明显,但代价是月租 ¥8-12 万。对大多数推理场景,A100 40G(¥2,800/月,官网价)加 vLLM 优化已经能跑得很好。RTX3090(¥1,750/月)适合预算有限的小团队做轻度推理验证。
在服务商选择上,一万网络深耕 IDC 19 年,提供从单卡定制到 8 卡整机、从弹性切片到长期年付的完整 GPU 算力矩阵。工程师 1 对 1 部署 CUDA 全栈、TensorRT-LLM 和 vLLM 显存调优,开机即用。记住:显存碎片优化不是"出了问题再修",而是"从一开始就选对框架和配置"——框架选好、服务商靠谱,碎片率根本不会成为你的问题。
本文配置与价格参考自一万网络官网公开页面(人工定制 GPU、AI 算力云、H100 方案),具体以签约时最新报价与合同为准。显存管理数据参考自 vLLM 官方 benchmark、TensorRT-LLM 文档以及社区实测报告。
Copyright © 2013-2020 idc10000.net. All Rights Reserved. 一万网络 科技有限公司 版权所有 深圳市科技有限公司 粤ICP备07026347号
本网站的域名注册业务代理北京新网数码信息技术有限公司的产品