Distributed Parallel Strategies for Large Models
Contents
通信原语
| 原语 | 输入 | 输出 | |
|---|---|---|---|
| Broadcast | 一个rank有数据 | 所有人一样 | 一个 rank 把数据发送给所有其他 rank |
| Scatter | 一个rank有完整数据 | 每人一部分 | 一个 rank 给不同 rank 不同数据 |
| Gather | 每人一部分 | 一个rank完整 | 所有 rank 发送数据给一个 rank |
| Reduce | 每人数据 | 一个结果 | 所有 rank 提供数据,经过某种操作(sum/max/min)后,只保留一个结果 |
| All-Gather | 每人一部分 | 所有人完整 | 每个 rank 提供一份数据,最后所有 rank 都拿到完整数据 |
| All-Reduce | 每人数据 | 所有人相同结果 | 先做 Reduce, 再把结果广播给所有 rank |
| Reduce-Scatter | 每人完整部分 | 每人得到reduce后的shard | 先求和,然后切分发送 |
| All-to-All | 每人切片发送 | 每人重新组合 | 每个 rank 把数据切片后分别发送给所有 rank,最后每个 rank 收集属于自己的那部分 |
具体功能效果见 parallemism method
- All-Gather。通信完成后,每个进程都获得所有进程数据块的拼接总和。所有人最后拿到的内容是完全一样的。
| |
- All-to-All。通信完成后,每个进程收到的数据,是来自其他所有进程专门发给它的数据块的拼接
| |
不同的并行策略下有不同的通信方式的需求,但是下面的内容的正确性有待确定
| |
CP x Ulysses SP
CP=4 表示每个 CP group 内有 4 个 GPU 参与 context parallel
其实不管是何种并行,它的数量表示的都是参与并行的 GPU 数量,这些 GPU 会作为一个单独的组别,多出来的 GPU 则会重复。举个例子
当sequence length 为 16000, 有 8 个 GPU,CP 为 4 时,会形成两个 CP group, 通信发生在 CP group 内部
- CP group 0: GPU0 GPU1 GPU2 GPU3
- GPU0: token 0~3999
- GPU1: token 4000~7999
- GPU2: token 8000~11999
- GPU3: token 12000~15999
- CP group 1: GPU4 GPU5 GPU6 GPU7
GPU4~7 保持相同的划分模式,如果没有其他维度的并行,这 4 张卡的计算就是浪费的
当有多种并行机制叠加时,具体组别的划分就要看推理框架的具体实现了,它们可能有着不同的 GPU-to-grid 的映射方式,这里我们只说一种可能的情况,更重要的是理解在多维并行存在时的数据划分方式
序列长度保持不变,head 数量为 16,8 个 GPU,CP 为 4,SP 为 2
- CP group 0: GPU0 GPU1 GPU2 GPU3
- GPU0: token 0~3999, heads 0-7
- GPU1: token 4000~7999, heads 0-7
- GPU2: token 8000~11999, heads 0-7
- GPU3: token 12000~15999, heads 0-7
- CP group 1: GPU4 GPU5 GPU6 GPU7
- GPU4: token 0~3999, heads 8-15
- GPU5: token 4000~7999, heads 8-15
- GPU6: token 8000~11999, heads 8-15
- GPU7: token 12000~15999, heads 8-15
EP
每个 GPU 都拿到完整的 expert