分布式推理基础:张量并行与流水线并行原理
聊到多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。
下面这张图,是我自己总结的两种并行方式的对比:
五、实际部署中的选择策略
最后,分享一个我自己的决策流程:
- 先看模型大小:如果单卡能放下,啥并行都不用,直接上。
- 再看GPU数量:单机多卡,张量并行优先。多机,流水线并行优先。
- 最后看延迟要求:在线服务对延迟敏感,张量并行更合适(流水线并行有气泡,延迟略高)。离线批处理,流水线并行吞吐量更高。
一句话总结:张量并行是「横向切分」,适合单机;流水线并行是「纵向切分」,适合多机。实际部署中,两者经常搭配使用。
好了,这一章的内容就到这里。下一章我们会深入vLLM的配置细节,看看这些并行策略在代码层面是怎么落地的。