对 Batch 的理解
batch 的概念总能听到,而我们能普遍接触到的就是普通用户使用网页端大模型的这个视角
| 原语 | 输入 | 输出 | |
|---|---|---|---|
| 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
Sufficient memory: Can we go faster? 1
Memory is a constraint. What to do? 2. 模型并行 (Model Parallelism - MP)
SP 和 CP 的主要区别在于 SP 需要切分权重
Metaprogramming 就是写一段程序,这段程序可以生成或者修改一段程序,Macro and Template 都是实现 Metaprogramming 的手段。
特化(specialization)和部分特化(Partial Specialization)或者说叫偏特化,都是为了让编译器明确执行路径或者说接口选择
从抽象层面来理解注意力的 QKV 计算,实际是为原始 token 序列生成了一个新的信息表示。这个过程分为两个步骤:
具体而言,从矩阵的角度来看,Q 的每一行是一个 token 的原始信息,与 $K^T$ 的计算结果则表征了原始的一个 token 对于其他 token 的关注程度(此时如果 K 中行序发生改变,则 $K^T$ 中列序将发生改变,那么 $QK^T$ 的计算结果中一个 token 对其他 token 的关注程度,这个“其他 token”的顺序是发生了变化的);考虑与 V 的计算,由于左乘矩阵每一行依然对应到原始 token,所以与 V 的计算结果每一行依然是原始 token 的信息(如果 K 中行序发生变化,那么 V 的行序也需要对应变化,即只需要保证 $QK^T$ 的列能够正确作为对应 token 信息的权重)