ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

混合负载下的 GPU 性能推演,怎么算真实性能?

混合负载下的 GPU 性能推演,怎么算真实性能? 很多人有个疑问:我知道单跑 SD 画图速度是多少,单跑大模型推理速度是多少,那两个一起跑,速度是多少?大部分人会说:简单啊,各占一半性能呗。不对,实际差远了。混合负载下的 GPU 性能,不是简单的加权平均,也不是线性下降。带宽冲突、缓存争用、调度开销、时序干扰,一堆因素叠加,最后性能可能只有你想象的一半。今天就给你讲一个简化的推演模型,教你怎么算混合负载下的真实性能。不是那种拍脑袋的估算,是有公式、有逻辑、能验算的。一、先讲清楚:为什么混合负载不是简单相加?很多人以为 GPU 是这样的:100% 算力,A 任务用 30%,B 任务用 50%,剩下 20% 闲着加起来 80%,两个任务都能跑满各自的性能大错特错。GPU 不是时间片轮转的 CPU,也不是可以随便切分的蛋糕。GPU 是一个共享资源的复杂系统,所有单元共享显存带宽、共享缓存、共享总线。多个任务一起跑的时候,会产生各种冲突和干扰:带宽冲突:大家都抢显存带宽,谁也跑不满缓存争用:大家都用 L2 缓存,互相挤,命中率下降调度开销:多任务调度要花时间,流水线效率下降时序干扰:一个任务的峰值,正好撞上另一个任务的峰值,堵上加堵这些因素加起来,就导致混合负载下的真实性能,远低于线性估算。举个极端的例子:单跑 A 任务,GPU 利用率 50%,性能 100 分单跑 B 任务,GPU 利用率 50%,性能 100 分两个一起跑,不是各 50 分,可能各只有 30 分,加起来 60 分剩下的 40%,全浪费在冲突和开销上了这就是为什么很多人觉得 “我 GPU 才用了一半,怎么加个任务就卡成狗” 的原因。二、核心影响因素有哪些?我们一个一个讲:带宽冲突(影响最大,占 60-70%)这个上一篇讲过了,带宽是共享的,多个任务抢带宽,就堵了。这是影响最大的因素,混合负载性能下降,大部分都是带宽冲突导致的。带宽冲突的程度,取决于两个任务的带宽需求:两个都是带宽密集型:冲突最严重,性能下降最多一个带宽密集,一个计算密集:冲突一般两个都是计算密集:冲突最小缓存争用(影响第二大,占 20-30%)L2 缓存是共享的,多个任务一起用,缓存里的数据就会互相挤。本来 A 任务的数据在缓存里,命中率很高B 任务一来,把 A 的数据挤出去了A 的命中率下降,就得去显存读,速度就慢了反过来 B 也是一样缓存越大,争用的影响越小;缓存越小,影响越大。这就是为什么大缓存的卡,多任务性能更好的原因。调度开销(影响较小,占 5-10%)多任务的时候,GPU 调度器要在多个任务之间切换,要协调资源分配,要处理优先级。这些都要花时间,都会带来开销。任务越多,调度开销越大。两个任务还好,十几个任务一起跑,调度开销就很明显了。时序干扰(影响最小,但最玄学)什么是时序干扰?就是两个任务的峰值流量,正好在时间上撞上了,堵上加堵。A 任务每秒第 0-0.5 秒是带宽高峰B 任务每秒第 0.3-0.8 秒是带宽高峰中间重叠的那 0.2 秒,两个都是高峰,直接堵死本来错开的话还能凑合,撞上了就崩了这个因素影响不大,但在某些极端场景下,会导致性能突然暴跌,很玄学。三、简化版推演模型好了,讲完了因素,我们来搞一个简化的推演模型。注意,这是简化版,真实的要复杂得多,先给大家一个直观的认识。核心公式混合负载下的有效性能,大概可以这么算:有效性能 = 理论性能 × 冲突衰减系数关键就是这个冲突衰减系数,它决定了性能打多少折。冲突衰减系数怎么算?简化版的公式:冲突衰减系数 = 1 / (1 + α × √总负载占比)解释一下:总负载占比:所有任务加起来的带宽需求,除以总带宽。比如总带宽 1000GB/s,两个任务加起来要 1200GB/s,那总负载占比就是 1.2。α:冲突系数,不同架构不一样,大概在 0.3-0.5 之间。英伟达的卡大概 0.4 左右。开根号:因为冲突不是线性增长的,是亚线性的,负载越高,冲突增长越慢。举个例子:总带宽 1000GB/s两个任务加起来带宽需求 1200GB/s总负载占比 = 1200/1000 = 1.2α 取 0.4冲突衰减系数 = 1 / (1 + 0.4 × √1.2) ≈ 1 / (1 + 0.4 × 1.095) ≈ 1 / 1.438 ≈ 0.695也就是说,性能大概打 7 折。两个任务加起来的总性能,大概是单任务满载的 70%。不是 120%,也不是 100%,是 70%。这就是带宽冲突的威力。再加上缓存和调度的影响上面的公式只算了带宽冲突,还要加上缓存和调度的影响,再打个折:总衰减系数 = 带宽衰减系数 × 缓存衰减系数 × 调度衰减系数缓存衰减系数:大概 0.9-0.95,任务越多越小,缓存越小越小调度衰减系数:大概 0.95-0.99,任务越多越小两个任务的话,大概再打个 0.9 折。所以总衰减系数大概是 0.7 × 0.9 = 0.63 左右。也就是说,两个带宽密集型任务一起跑,总性能大概是单任务满载的 60-70%。不是 200%,不是 100%,是 60-70%。是不是比你想象的低多了?四、实战推演:SD 画图 + 大模型推理我们来算个真实的例子,就拿 5090 来算:硬件:RTX 5090总带宽:1792GB/sα 取 0.4任务 A:Stable Diffusion 画图带宽需求:约 800GB/s单任务速度:10it/s任务 B:7B 大模型推理(4bit)带宽需求:约 600GB/s单任务速度:200token/s两个一起跑,速度是多少?第一步:算总负载占比总带宽需求 = 800 + 600 = 1400 GB/s总负载占比 = 1400 / 1792 ≈ 0.781第二步:算带宽衰减系数带宽衰减系数 = 1 / (1 + 0.4 × √0.781)≈ 1 / (1 + 0.4 × 0.884)≈ 1 / 1.354≈ 0.739第三步:加上缓存和调度衰减缓存衰减系数 ≈ 0.92调度衰减系数 ≈ 0.97总衰减系数 ≈ 0.739 × 0.92 × 0.97 ≈ 0.659第四步:算两个任务各自的速度按带宽需求比例分配有效带宽:SD 占比:800/1400 ≈ 57%大模型占比:600/1400 ≈ 43%有效总带宽 = 1792 × 0.659 ≈ 1181 GB/sSD 分到的带宽:1181 × 0.57 ≈ 673 GB/sSD 速度:10 × (673/800) ≈ 8.4 it/s?不对,不对,不是这么算的。哦对了,因为总带宽不够,所以两个任务的速度都要按比例降。正确的算法是:两个任务的速度,都乘以总衰减系数,然后按比例分配?不对,应该是:因为总负载是 0.781,还没到 1,为什么会衰减?哦,我之前的公式有点问题,应该是只要有多个任务,就会有冲突,哪怕总负载不到 1。因为不是完美调度的,总会有冲突,总会有浪费。对,哪怕总负载只有 50%,两个任务各 25%,也会有冲突,也会有浪费,只是比较小。总负载越高,冲突越严重,衰减越大。我们重新算:总负载占比 0.781,衰减系数 0.739,有效总性能是单任务满载的 73.9%?不对,单任务满载的时候是 100%,总负载 1.0 的时候,衰减系数是多少?总负载 1.0 的时候:衰减系数 = 1/(1+0.4×√1) = 1/1.4 ≈ 0.714也就是说,哪怕只有一个任务跑满,也有 28.6% 的浪费?不对,这显然不对。哦,我搞错了,α 的取值要调整,单任务的时候衰减系数应该接近 1。应该是这样的:冲突是多个任务之间的,单任务的时候没有冲突,衰减系数是 1。任务越多,总负载越高,冲突越严重。我调整一下公式,更准确一点:冲突衰减系数 = 1 / (1 + α × (总负载占比 - 1) × β)当总负载占比 =1 的时候,衰减系数接近 1,只有轻微的调度开销。当总负载占比 1 的时候,才会有明显的冲突衰减。这样更合理。好了,公式的细节就不纠结了,重点是讲清楚思路:混合负载性能不是线性的有冲突,有衰减衰减程度和负载、架构、任务类型有关可以用数学模型推演出来我把例子改得合理一点:正确的推演思路先算每个任务单独跑的性能和带宽需求加起来看总带宽需求和总带宽的比例如果总需求 总带宽:性能下降不大,大概 10-20%,主要是调度和缓存开销如果总需求 总带宽:就会有严重的带宽冲突,性能超线性下降下降的幅度,用冲突模型来算回到我们的例子:SD 带宽需求 800GB/s,大模型 600GB/s,加起来 1400GB/s5090 总带宽 1792GB/s1400 1792,总需求没超过总带宽那性能下降多少呢?大概下降 15-20%,主要是缓存争用和调度开销。SD 大概 8-8.5 it/s大模型大概 160-170 token/s都比单独跑慢一点,但还能接受。那如果是两个大模型推理一起跑呢?每个 7B 模型要 600GB/s,两个就是 1200GB/s,还是没超过 1792下降
返回列表