一、什么是张量并行(Tensor Parallelism) ?
张量并行(Tensor Parallelism) 是一种分布式矩阵算法。
随着模型越来越大,模型内的矩阵也越来越大。一个大矩阵的乘法可以拆分成多个小矩阵的运算,这个些运算就可以充分利用 GPU 的多核还有多 GPU 来进行分布式计算,从而提高运算速度。
1.1 1D Tensor Parallelism 两种矩阵切分方法
1、使用第一种方法:
这样的切分方法需要一个 Reduce 操作,因为要把各部分的结果求和得到最终结果。
2、使用第二种方法:
这样的切分方法需要一个结果 Concat 拼接起来。但是由于每一部分的计算结果都是最终结果的一部分,所以可以不着急 Reduce 结果,可以直接作为下一次并行计算的输入。
组合切分方法:
如果有多个矩阵进行相乘,相邻之间的矩阵可以一个横切,一个纵切,然后放到不同的 device 上。从而达到并行计算的目的。
分割成多个也是类似的结论。所以对于矩阵相乘来说,如果有 N 个 GPU,完全可以将参数平分到 N 个GPU上,每个 GPU 只负责计算 1/N 的参数。
1.2 举例:FFN 的 Tensor Parallelism
Transformers 的 FFN 层涉及两次矩阵乘法。
其中 g 是激活函数 Gelu。激活函数的非线性导致:
由于有这个激活函数的存在,我们最好按照切分方法2 来进行。因为如果采用第一种,那么需要先进行 Reduce 之后才能执行 Gelu 操作。然后再拆分,再 Reduce。这里有2步 Reduce 操作。
如果采用第二种,则仅需要最后一步进行 Reduce 即可,少了中间的 Reduce 再拆分的工作。
原文地址:京东面试官:“ 什么是张量并行(Tensor Parallelism) ?”
二、量化模型格式GPTQ、GGUF
首先介绍一下量化的概念:
大型语言模型由一堆权重和激活表示。这些值通常由通常的32位浮点(float32)数据类型表示。比特的数量告诉你它可以表示多少个值。量化是指将LLM从其原始Float32表示转换为更小的表示。
如果我们选择较低的位大小,那么模型就会变得不那么准确,但它表示更少的值,从而降低其大小和内存需求。
tips:对哪些值可以进行量化:
可以对模型参数(weight)、激活值(activation)或者梯度(gradient)做量化。
2.1 GPTQ
GPTQ是一种4位量化的训练后量化(PTQ)方法,主要关注GPU推理和性能。
该方法背后的思想是,尝试通过最小化该权重的均方误差将所有权重压缩到4位。
在推理过程中,它将动态地将其权重去量化为float16,以提高性能,同时保持低内存。
所以一般情况下,我们经常使用一种名为4bit-NormalFloat (NF4)的新格式来实现这一点。
这个数据类型做了一些特殊的技巧,以便有效地表示更大的位数据类型。它包括三个步骤:
①归一化:将模型的权重归一化,以便我们期望权重落在一定范围内。这允许更有效地表示更常见的值。
②量化:将权重量化为4位。在NF4中,量化级别相对于归一化权重是均匀间隔的,从而有效地表示原始的32位权重。
③去量化:虽然权重以4位存储,但它们在计算期间被去量化,从而在推理期间提高性能。
2.2 GGUF
如果你的GPU无法处理如此大的模型,那么可使用针对于使用CPU对模型进行量化的方法。典型的就是GGUF。
参考文章:
[1] A Visual Guide to Quantization - Maarten Grootendorst
[2] Which Quantization Method Works Best for You?
[3] https://zhuanlan.zhihu.com/p/667109491