AI 推理为什么有时更依赖显存带宽而不是 GPU 算力
买一块GPU做人工智能任务,很多人第一眼会看TOPS、TFLOPS或者CUDA核心数量。但到了大语言模型推理阶段,经常会出现一个让人意外的现象:一块算力非常强的GPU,实际跑大模型的速度未必比另一块显存带宽更高的GPU快多少。
原因并不是GPU算力没有用,而是很多LLM推理任务根本没有机会让大量计算单元持续满负荷工作。
问题的核心在于:GPU既要计算,也要不断搬运数据。
如果计算单元处理数据的速度远远超过显存能够提供数据的速度,那么计算单元就会等待数据。此时继续增加CUDA核心或者提升理论算力,并不能按照同样比例提高实际性能。反过来,如果一个任务需要进行大量数学运算,而参与计算的数据可以被高效地留在片上缓存或者以较高效率重复使用,那么算力就可能成为主要瓶颈。
这就是为什么AI推理不能简单用“算力越高越快”来判断。
对于大语言模型来说,这个问题尤其明显。
一个模型拥有数十亿甚至数千亿参数。模型运行时,这些参数必须参与矩阵运算。对于某些推理阶段,GPU需要反复从HBM或其他显存中读取大量模型权重,然后进行计算。
如果一次读取的数据只能支持相对有限的计算,那么GPU就会表现出很高的内存带宽压力。
可以把它理解成一座工厂。
GPU计算单元是工人,显存是仓库。工人本身再多,如果仓库送货速度跟不上,很多工人就只能站在那里等材料。增加工人数量,也不会让生产线按照同样比例提速。
这就是显存带宽成为瓶颈时的基本情况。
在大语言模型的逐token生成阶段,这个问题尤其值得关注。
所谓逐token生成,就是模型已经处理完用户输入之后,一个token一个token地产生后续内容。这个阶段与训练时一次处理大量数据有很大区别。
假设模型正在生成一个新token,模型仍然需要执行大量层级的计算,同时还要使用之前生成内容留下的KV Cache。
KV Cache保存了Transformer注意力机制中前面token对应的Key和Value。它的作用是避免每生成一个新token,都把整个历史序列从头重新计算一遍。
这项技术大幅减少了重复计算,但代价是KV Cache本身会越来越大。
上下文越长,同时处理的请求越多,KV Cache占用的显存就越大,访问它所需要的数据搬运也越多。
这也是长上下文和高并发推理越来越依赖显存容量与带宽的重要原因之一。
不过,这里需要避免一个常见误解:KV Cache并不是简单的“随机读取数据”,也不能因为存在KV Cache就断定GPU一定被显存带宽完全限制。
实际性能取决于很多因素,包括序列长度、batch size、并发请求数量、注意力实现方式、KV Cache布局、数据类型以及GPU架构。
因此,同一块GPU运行同一个模型,在不同工作负载下可能完全处于不同的瓶颈状态。
这里最重要的概念是“计算强度”,也就是完成一定计算量需要搬运多少数据。
如果一个任务需要搬运大量数据,却只进行相对有限的计算,那么它通常更容易受到内存带宽限制。反过来,如果同一批数据能够被计算单元反复利用,执行大量矩阵乘法,那么计算能力就可能成为瓶颈。
这也是为什么LLM推理通常需要区分Prefill和Decode两个阶段。
Prefill阶段负责处理用户输入的整个上下文。假设用户一次输入几千甚至几万个token,GPU可以同时处理大量矩阵运算,因此计算单元往往能够获得更高的利用率。这个阶段通常更容易表现出计算密集型特征,尤其是在批量较大的情况下。
Decode阶段则完全不同。
模型一次生成一个或少量token,每一步都要读取模型权重,并处理不断增长的KV Cache。单个请求的计算规模相对有限,但数据访问持续发生,因此内存带宽和内存访问效率可能成为非常重要的限制因素。
这也是为什么一些GPU在AI基准测试中拥有非常惊人的理论算力,但真正运行LLM逐token生成时,并没有出现同等幅度的性能优势。
理论TOPS或者TFLOPS描述的是GPU在特定数学运算下的峰值计算能力,而不是完整推理系统的实际速度。
对于AI推理来说,还必须看显存容量、显存带宽、缓存层级、矩阵计算单元、互联带宽以及软件栈。
例如,一块GPU拥有更高的理论算力,但显存带宽没有同步提高。如果运行的是一个严重依赖权重和KV Cache数据搬运的工作负载,那么新增的计算能力可能无法完全发挥。
相反,一块理论算力稍低、但显存带宽更高的GPU,在某些LLM Decode任务中反而可能取得更好的实际吞吐表现。
这也是HBM在AI加速器中如此重要的原因。
现代数据中心GPU大量采用HBM,并不是因为HBM能够神奇地提高所有AI任务的速度,而是因为它可以提供非常高的显存带宽,让GPU计算单元能够获得更快的数据供应。
当然,高带宽并不等于所有问题都解决了。
如果GPU本身计算能力不足,那么提高显存带宽也不会无限提升性能。如果内存访问模式效率很差,理论带宽也无法完全转换成有效带宽。如果模型无法放进单张GPU的显存,就还会涉及GPU之间的数据传输。
当模型需要多张GPU共同运行时,问题会进一步复杂。
此时不仅要考虑GPU本地显存带宽,还要考虑GPU之间的互联带宽和通信延迟。模型并行、张量并行等技术都会产生GPU之间的数据交换。如果GPU本地算得很快,但跨GPU通信成为瓶颈,整体推理速度依然可能受到限制。
因此,大模型部署不能只看单张GPU的参数。
另一个重要方向是量化。
如果模型权重从FP16、BF16等较高精度格式转换为INT8、INT4等更低精度格式,在保持可接受模型质量的情况下,所需要存储和搬运的数据量可以明显减少。
例如,一个参数使用16 bit存储和使用4 bit存储,理论上的权重数据量就相差4倍。当然,真实系统还会受到量化比例、元数据、对齐、算子实现以及KV Cache精度等因素影响,因此不能简单认为整个推理速度也会提高4倍。
但量化的意义非常明确:减少需要搬运的数据。
如果系统原本受显存带宽限制,那么减少数据量就可能带来明显收益。
KV Cache同样可以量化或者采用更节省显存的表示方式。对于长上下文和高并发服务来说,这不仅能够减少显存占用,也可能降低内存带宽压力,并允许同一块GPU容纳更多请求。
软件优化同样重要。
高性能推理框架会通过Kernel Fusion、内存布局优化、连续批处理等技术,减少不必要的数据读写和kernel启动开销。所谓Continuous Batching,就是让不同请求根据生成进度动态加入和离开批次,而不是简单等待所有请求同时完成。
这些优化的共同目标,并不是单纯让GPU“算得更多”,而是尽可能让计算和数据搬运协调起来。
所以,在实际选GPU时,不能简单问“这张卡有多少TOPS”。
如果主要运行图像生成、科学计算或者大规模矩阵运算,计算能力可能具有非常高的权重;如果主要运行大型语言模型的逐token推理,则显存容量和显存带宽的重要性可能明显上升;如果运行的是高并发服务,则还必须考虑KV Cache容量、批处理能力以及GPU之间的通信。
对于本地AI用户,这个区别同样有现实意义。
假设一张GPU能够提供非常高的计算性能,但只有相对有限的显存容量,那么大型模型可能根本无法完整装入显存,只能进行CPU与GPU之间的数据交换。此时问题甚至不再只是“显存带宽够不够”,而是PCIe等外部数据通道可能直接成为瓶颈。
因此,运行大模型时,首先要确认模型能否完整放入目标GPU的显存,再判断推理工作负载究竟更偏向计算密集还是数据搬运密集。
还有一个容易被忽略的问题:GPU利用率低,并不自动意味着显存带宽是瓶颈。
GPU利用率只是一个综合指标。低利用率可能来自显存访问、kernel启动、CPU调度、数据准备、通信、同步等待,甚至是请求本身太小。要判断真正瓶颈,需要结合显存带宽利用率、SM利用率、Tensor Core利用率、内存延迟、kernel执行时间以及端到端吞吐量一起分析。
这也是专业GPU性能分析和“看一个百分比猜原因”的区别。
对于普通消费者,可以把整个问题理解成一句话:AI推理不是单纯计算数学题,而是一个持续搬运数据并进行计算的过程。
当GPU能够快速完成计算,但数据供应速度跟不上时,显存带宽就会成为限制性能的关键因素;当数据能够高效供应,而计算任务非常重时,GPU算力才会成为主要瓶颈。
而大语言模型最有意思的地方在于,同一个模型在不同阶段甚至可以处于不同的瓶颈状态。Prefill可能更加偏向计算,Decode则可能更加受到内存带宽、KV Cache和内存访问效率影响;低并发与高并发也会改变这种平衡。
因此,判断一块GPU适不适合AI推理,不能只盯着TOPS、TFLOPS或者CUDA核心数量。显存容量决定模型能不能装得下,显存带宽决定数据能以多快的速度供应给计算单元,而计算能力决定这些数据进入GPU之后能够多快完成运算。
真正高效的AI系统,追求的并不是某一个数字达到最大,而是让计算、显存、缓存、通信和软件调度尽可能彼此匹配。对于今天越来越大的语言模型来说,这种“算得快”和“搬得快”之间的平衡,已经成为决定实际推理性能的核心问题之一。
喜欢这篇报道?
使用下面的功能,方便以后继续阅读和分享 MNewsTV
关于文章收藏
收藏不需要注册帐号,收藏信息仅保存在当前浏览器中。
删除收藏请进入「我的收藏」进行管理。
捐助(Paypal): https://www.paypal.me/observeccp 订阅中国观察电报 Telegram : https://t.me/s/ObserveCCP