目录
然后是8/64 + 32/(64·256) = 0.127位的来源:Block-wise Quantization内存占用降低解释
看这个大佬的文档,对里面这一段话理解的不是很透彻,尝试理解一下:
https://zhuanlan.zhihu.com/p/632533576
双重量化我们引入了双重量化(Double Quantization,DQ),这是一种为了额外的内存节省而量化量化常数的过程。虽然需要较小的块大小来进行精确的4位量化[13],但它也带来了相当大的内存开销。例如,使用32位常数和64的块大小对W进行量化,平均每个参数的量化常数增加32/64 = 0.5位。双重量化有助于减少量化常数的内存占用。
更具体地说,双重量化将第一次量化的量化常数cFP322作为第二次量化的输入。这个第二步产生了量化的量化常数cFP82和第二级的量化常数cFP321。我们使用块大小为256的8位浮点数进行第二次量化,因为我们观察到8位量化没有性能下降,这与Dettmers和Zettlemoyer[13]的结果一致。由于cFP322是正的,我们在量化之前从c2中减去平均值,以使值围绕零居中,并利用对称量化。平均而言,对于64的块大小,这种量化将每个参数的内存占用从32/64 = 0.5位,降低到8/64 + 32/(64·256) = 0.127位,减少了0.373位每个参数。
首先是0.5位参数来源
1. 块大小和常量c的关系
在Block-wise Quantization中,参数被分成多个大小固定的块,每个块有自己的一个常量c。这个常量c是一个浮点数,通常用float32表示,占用32位内存。假设一个块的大小为64,即一个块中有64个参数。
2. 常量c的共享性
在每个块中,所有的参数都会共享这个常量c。换句话说,块中的64个参数都使用同一个常量c进行量化,因此,这个常量c只需要存储一次。
3. 常量c的内存开销分摊
虽然所有的参数都共享这个常量c,但在计算内存开销时,我们通常会将这个常量c的内存开销平均分摊到块中的每个参数上。也就是说,32位的内存开销需要平均分摊到64个参数上。
4. 计算每个参数的额外内存开销
所以,每个参数的额外内存开销就是常量c的内存开销(32位)除以块的大小(64),即32/64 = 0.5位。这意味着,为了存储这个常量c,每个参数需要额外增加0.5位的内存。
然后是8/64 + 32/(64·256) = 0.127位的来源:Block-wise Quantization内存占用降低解释
1. 块大小和常量c的关系
在Block-wise Quantization中,参数被分成多个大小固定的块,每个块有自己的一个常量c。这个常量c是一个浮点数,通常用float32表示,占用32位内存。假设一个块的大小为64,即一个块中有64个参数。
2. 参数量化后的内存占用
在量化过程中,每个参数被量化为一个8位的整数,所以每个参数的内存占用是8位。然后,这个8位的内存占用需要平均分摊到块中的每个参数上,所以每个参数的内存占用是8/64 = 0.125位。
3. 常量c的内存开销分摊
然后,我们还需要将常量c的内存开销平均分摊到块中的每个参数上。因为常量c是一个32位的浮点数,所以它的内存开销是32位。但是,因为我们有256个不同的量化级别,所以实际上,我们可以将这个32位的内存开销分摊到256个级别上,所以每个级别的内存开销是32/256 = 0.125位。然后,这个0.125位的内存开销还需要平均分摊到块中的每个参数上,所以每个参数的内存开销是0.125/64 = 0.001953125位。
4. 计算每个参数的总内存占用
所以,每个参数的总内存占用就是参数量化后的内存占用(0.125位)加上常量c的内存开销(0.001953125位),即0.125 + 0.001953125 = 0.126953125位。这意味着,通过量化,我们将每个参数的内存占用从0.5位降低到了0.126953125位,减少了0.373046875位。
如果有问题,欢迎各位大佬指正!!!