一个让很多人困惑的现象:单张A100跑Llama3-70B,TTFT大约2秒。买4张A100做张量并行,按理说应该快4倍,实际测下来TTFT是0.8秒——只快了2.5倍。再加到8张,本该再快2倍,实际只有1.3倍提升。钱花了,速度没到位,差的那部分去哪了?被GPU之间的通信吃掉了。大模型为什么需要多张GPU这个问题的答案很简单:显存不够。常见模型的显存需求(FP16格式): 参数量(B) × 2字节 = 显存需求 ───────────────────────────────────── 7B × 2 = 14GB (一张消费级显卡能放下) 13B × 2 = 26GB (需要A100-40G) 70B × 2 = 140GB (需要2张A100-80G) 405B × 2 = 810GB (需要至少10张A100-80G)放不下就得拆开,分到多张GPU上。怎么拆,就是多GPU推理的核心问题。主流的方案有两种:张量并行(Tensor Parallelism)和流水线并行(Pipeline Parallelism)。理解这两种方式,你就能明白为什么多GPU不等于等比提速,以及钱到底花在了哪里。张量并行:把每一层的权重横着切开张量并行的思路:把模型每一层的权重矩阵,均匀分配到多张GPU上,每张GPU只存和计算一部分,最后把结果合并。打个比方:原来一个人做一道100步的数学题,张量并行变成4个人,每人做25步,最后把答案加在一起。速度理论上快4倍。但问题在于"最后把答案加在一起"这一步——这需要GPU之间互相传输数据,这个操作叫AllReduce。# 张量并行通信量的直觉估算# (不需要精确理解,感受数量级就行)defestimate_allreduce_cost(hidden_dim:int,# 模型隐层维度(70B模型约8192)sequence_len:int,# 序列长度num_layers:int,# 模型层数(70B模型约80层)batch_size:int=1,)-dict:""" 每次前向传播需要传输多少数据 """# 每次AllReduce传输的数据量bytes_per_allreduce=(batch_size*sequence_len*hidden_dim*2# FP16=2字节)# Transformer每层需要2次AllReduce(注意力层+FFN层各一次)total_bytes=bytes_per_allreduce*2*num_layersreturn{"单次AllReduce数据量":f"{bytes_per_allreduce/1024**2:.1f}MB","每次推理总通信量"