0%
URL
TL;DR
BAdam 全称是 Blockwise Adam,是一种内存高效的大型语言模型参数优化方法。
BAdam 的核心思想是将模型参数分块,每次只更新一个块的参数,而且对每个块用 Adam 连续更新 K 次,然后再更新下一个块。
Algorithm

BAdam 的算法流程如上图所示,其中 K 是一个超参数,表示每个块的参数用 Adam 更新次数。
- 当一个块的参数更新
K 次后,就丢掉 这个块的所有优化器信息,包括梯度、一阶动量、二阶动量。
- 假设模型有
M billion 参数,最低内存占用:
Adam:
- 参数:
2M GB(fp16)
- 优化器:
- 梯度:
4M GB(fp32)
- 参数:
4M GB(fp32)
- 一阶动量:
4M GB(fp32)
- 二阶动量:
4M GB(fp32)
- 总共:
18M GB
BAdam:
- 参数:
2M GB(fp16)
- 优化器:
- 梯度:D4M
GB(fp32)
- 参数:D4M
GB(fp32)
- 一阶动量:D4M
GB(fp32)
- 二阶动量:D4M
GB(fp32)
- 总共:2M+D16M
GB,其中 D 是块的数量。
Thoughts
BAdam 的核心思想是将模型参数分块更新,但实际上和 Adam 的思想是 完全不一样
- 因为
Adam 想要追求的是全训练过程的步长自适应,即每一个 step 的步长都来自于只有所有历史信息。
- 而
BAdam 只能保证当前步长最多由之前 K 个 step 的信息决定,所以 BAdam 的收敛性和 Adam 是不一样的。