分布式推理基础:张量并行与流水线并行原理

聊到多GPU部署,绕不开两个核心概念:张量并行和流水线并行。说实话,这两个东西刚接触时容易搞混,我当年也踩过坑。今天咱们就把它们掰开揉碎了讲清楚。

一、为什么需要模型并行?

先问个问题:一个大模型,比如70B参数的LLaMA,单张A100放得下吗?

答案是:放不下。70B参数,就算用FP16,也需要约140GB显存。单张A100只有80GB。所以我们必须把模型拆开,放到多张GPU上。

拆的方式有两种主流思路:

  • 按层切分 —— 流水线并行
  • 按层内切分 —— 张量并行

这两种方式,我都在生产环境里折腾过。下面逐个说。

二、张量并行(Tensor Parallelism)

张量并行,说白了就是把一个矩阵乘法拆成多份,让不同GPU各自算一部分,最后拼起来。

举个例子:假设有一个线性层 y = xW,其中W是权重矩阵。我们可以把W按列切成两块:W = [W1, W2]。GPU0算 xW1,GPU1算 xW2。最后把结果拼接起来,就得到了完整的y。

嗯,这里要注意:切分方式有两种——

切分方式 操作 通信量
按列切分 前向:各GPU独立计算,结果拼接
反向:梯度需要all-reduce
较大(需同步梯度)
按行切分 前向:输入需要广播,结果累加
反向:梯度需要all-reduce
类似

我在项目中遇到过一个问题:张量并行虽然能降低单卡显存,但通信开销不小。尤其是当模型宽度很大时,每层都要做all-reduce,通信会成为瓶颈。

核心要点:张量并行适合单机多卡场景,因为NVLink带宽高、延迟低。跨机做张量并行?我劝你慎重,网络延迟会让你怀疑人生。

vLLM中张量并行的配置很简单,启动时加个参数就行:

# 启动vLLM服务,使用4张GPU做张量并行
python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Llama-2-70b-hf \
    --tensor-parallel-size 4 \
    --gpu-memory-utilization 0.9

这个参数告诉vLLM:把模型按张量并行切到4张卡上。vLLM内部会自动处理切分和通信。

个人经验:张量并行的大小一般设为单机GPU数。比如8卡机器,就设8。跨机时,我建议优先考虑流水线并行。

三、流水线并行(Pipeline Parallelism)

流水线并行,思路更直观:把模型按层切成几段,每段放在一张GPU上。GPU0算第1-10层,GPU1算第11-20层,以此类推。

但这里有个坑:如果只是简单串行,GPU1在等GPU0算完,GPU2在等GPU1算完……大部分时间GPU都在空转。这就是经典的「气泡问题」。

怎么解决?用微批次(micro-batch)。

把一个大batch拆成多个小batch,让GPU0算完第一个小batch后立刻传给GPU1,同时GPU0开始算第二个小batch。这样流水线就「流」起来了。

避坑指南:我曾经在部署一个130B模型时,流水线并行设了4段,但微批次数量设得太小,结果吞吐量还不如单卡。后来把微批次从4调到16,吞吐量直接翻倍。微批次数量一般建议是流水线深度的2-4倍。

vLLM中流水线并行的配置:

# 启动vLLM服务,使用2台机器,每台4卡,做流水线并行
python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Llama-2-70b-hf \
    --pipeline-parallel-size 2 \
    --tensor-parallel-size 4

这里pipeline-parallel-size=2表示把模型切成2段,每段放在一台机器上。每台机器内部再用tensor-parallel-size=4做张量并行。

四、两种并行的对比与选择

你可能会问:到底用哪种?我的建议是:

  • 单机多卡:优先用张量并行。通信快,实现简单。
  • 多机多卡:优先用流水线并行。跨机通信慢,流水线并行只需要在切分点通信,压力小。
  • 超大模型:两者结合。比如8台机器,每台8卡,可以设pipeline-parallel-size=8,tensor-parallel-size=8。

下面这张图,是我自己总结的两种并行方式的对比:

张量并行 vs 流水线并行 张量并行 输入 x GPU0: xW1 GPU1: xW2 拼接: [xW1, xW2] 输出 y 流水线并行 微批次1 → 微批次2 → 微批次3 GPU0: 第1-10层 GPU1: 第11-20层 GPU2: 第21-30层 GPU3: 第31-40层 左:按层内切分,需要all-reduce通信 | 右:按层切分,只需在切分点通信

五、实际部署中的选择策略

最后,分享一个我自己的决策流程:

  1. 先看模型大小:如果单卡能放下,啥并行都不用,直接上。
  2. 再看GPU数量:单机多卡,张量并行优先。多机,流水线并行优先。
  3. 最后看延迟要求:在线服务对延迟敏感,张量并行更合适(流水线并行有气泡,延迟略高)。离线批处理,流水线并行吞吐量更高。

一句话总结:张量并行是「横向切分」,适合单机;流水线并行是「纵向切分」,适合多机。实际部署中,两者经常搭配使用。

好了,这一章的内容就到这里。下一章我们会深入vLLM的配置细节,看看这些并行策略在代码层面是怎么落地的。


专注资料整理