MoE大模型剪枝以及量化
1. 混合专家模型
- 与稠密模型相比,预训练速度更快
- 与具有相同的参数数量的模型相比,有更快的推理速度
- 需要大量显存,因为所有专家都要加载到内存中
1.1. MoE的基础架构
参考文献 A comprehensive survey of mixture-of-experts: Algorithms, theory, and applications
1.1.1. 门控函数
决定输入数据是如何分配给指定的专家的
- 门控函数的评价标准
- 门控函数必须要同时兼顾输入和专家的特征. 相似的数据应该分配给相同的专家或者专家组, 使得专家专业化
- 输入数据应该尽可能均匀地分配给预定义的专家.
1.1.1.1. 线性门控 (softmax 门控)

- 函数: 获得在N个专家中前k高的专家得分, 其他置为
- : 是输入. 是一个线性方程, 代表鼓励专家探索的噪声
- softmax和TopK函数的先后可以灵活设置
- 如果先进行
- 可以先筛选出k个专家, 从而减少一些计算量
- 如果后进行
- 得出的结果不服从某个分布, 还需要额外归一化
- 后进行 可以充分利用分较低的专家
- 如果先进行
1.1.1.2. 非线性门控
- 基于与余弦距离
-
是MoE模块的输入. 是一个可学习的线性变换, 代表N个专家网络的特征
-
将输入进行线性映射, 再与专家的嵌入计算余弦相似性
- 如此, 专家嵌入可以捕捉不同专家的特征表示, 并逐渐优化适应任务需求
- 此外, 是温度参数控制门控分布的锐度
- 小的时候倾向于选择更少的专家
- 反之倾向于选择更加多的专家, 分布也更加平缓
-
基于指数族分布
-
这里是第 个专家网路的先验概率. 属于指数族分布, 是输入 在第 个专家网络下的条件概率密度函数
-
克服了由 引入的非线性关系以及后续的额外迭代优化步骤 (如迭代加权最小二乘法)
-
Soft MoE
-
具体而言,Soft MoE计算每个令牌与每个专家之间的权重,然后使用这些权重进行加权平均以生成输入slots。因此,每个专家处理的slots是所有令牌的加权组合,而非单个令牌。
-
Student-t distribution
-
deepseekMoE:

- 个共享专家, 个路由专家, 是亲和度,
1.1.2. 专家网络
1.1.2.1. 替代FFN层
其中 表示的是门控网络中选中的专家, 是一个两层的前馈神经网络
- 逻辑: FFN层具有更高的稀疏性和领域专业性
- 为了防止过拟合,并不是全连接层里的所有单元均会被同时激活
- Emergent Modularity (涌现模块化) 现象
1.1.2.2. 在注意力模块添加MoE
MoA: mixture of attention
- 由一些列参数不同的注意力头组成, 这些注意力头被视作是专家
- 对于给定的输入, 门控网络选择TopK个注意力头
- 输出: 被选择的头的输出的加权和
- 关键优势: 不需要使用全部的注意力头来处理每个输入
SwitchHead
- 为每个头的QKV以及输出的投影矩阵都引入MoE机制
MoH
- 共享头和两阶段路由策略
1.1.3. 路由策略
-
MaskMoE
- 为词汇表的每个token生成一个掩码向量, 针对不同频率的token调整可见专家的数量
- 频率低的token, 通过掩码, 限制它只能路由到单一专家, 确保这些token的训练一致性
- 对于频率高的token, 允许路由到多个专家
- 为词汇表的每个token生成一个掩码向量, 针对不同频率的token调整可见专家的数量
-
token循环路由策略,该策略采用循环神经网络根据输入序列上下文动态调整专家选择。
-
节点受限路由:
1.1.4. 训练策略
1.1.4.1. 辅助损失函数设计
训练中要防止模型坍塌, 也就是很少一部分专家获得了大部分输入, 导致负载不均衡
- Importance and Load loss functions
-
为超参数, 为给定新的随机噪声选择的情况下 不为0的概率, CoV是变异系数 (标准差/均值)
-
两者都添加进模型损失函数
-
Switch Transformer:
-
是一个batch中的tokens的总数量, 是batch中的token集合, 是赋予专家i的token的比例, 是专家i的路由概率比例
-
当均匀分配时取到最小损失
-
deepseekMoE:

1.1.4.2. 专家选择
- TopK策略
- TopP策略
- 通过设置概率阈值, 决定每个时间步决定激活的专家个数
- 门控网络计算每个专家的分数, 对应专家被选中的概率分布, 并通过降序的方式排列.
- 然后,该策略逐步累积专家的分数,直到累积值超过P,激活所有累积的专家来处理该令牌。
- dropout regularization for HMoE(层次混合专家)
- 随机丢掉不同分支的专家网络
1.1.4.3. 流水线设计
- BPR
- RMoE
1.1.5. 系统设计
1.1.5.1. 计算
特别是在大规模分布式系统环境中,标准的MoE架构要求专家操作之间进行同步, 所有专家全完成后才能进入下步计算
- 文献[15]提出并讨论了几种并行策略,包括数据并行、专家并行和模型并行,但不同的并行方法对数据和模型参数的分布有不同的要求。
- 为了使系统能够快速适应动态负载变化,[50]设计了一种统一的分布布局来管理模型的参数和输入数据。这可以适应各种并行策略的分布需求,实现并行策略的零成本切换。
- Soft MoE [27]提出了一种改进的调度算法,该算法采用基于梯度的路由选择方法,使计算过程更加平稳高效。这种方法减少了不必要的同步等待时间,降低了整体同步开销,并提高了系统吞吐量和效率。
- DeepSeekV3:

1.2. 量化
文章参考:大模型(LLM)的量化技术Quantization原理学习_大模型量化-CSDN博客和 2w字解析量化技术,全网最全的大模型量化技术解析 - 知乎 以及文献 Efficient Compressing and Tuning Methods for Large Language Models
1.2.1 神经网络中的数据形式

- FP32: 在深度学习中,单精度浮点数格式FP32是一种广泛使用的数据格式
- Tensor Float 32: Tensor Float 32是Tensor Core支持新的数值类型,从NVIDIA A100中开始支持。A100的普通FP32的峰值计算速度为19.5TOPs,而TF32的峰值计算速度为156TOPs,提升了非常多
- 在深度学习中,其实我们对浮点数的表示范围比较看重,而有效数字不是那么重要。在这个前提下,TF直接就把FP32中23个分数值截短为10bits,而指数位仍为8bits,总长度为19 (=1+8+10) bits。至于为什么是10bits 就够了,那是因为FP16就只有10bits用来表示分数值。而在实际测试中,FP16的精度水平已经足够应对深度学习负载,只是表示的范围不够广而已
- FP16: FP16是一种半精度浮点格式,深度学习有使用FP16而不是FP32的趋势,因为较低精度的计算对于神经网络来说似乎并不重要。额外的精度没有任何作用,同时速度较慢,需要更多内存并降低通信速度。
- BFLOAT16: 由Google开发的16位浮点格式称为“Brain Floating Point Format”,简称“bfloat16”。这个名字来源于“Google Brain”,这是谷歌的一个人工智能研究小组。FP16设计时并未考虑深度学习应用,其动态范围太窄。BFLOAT16解决了这个问题,提供与FP32相同的动态范围。其可以认为是直接将FP32的前16位截取获得的,现在似乎也有取代FP16的趋势。
对于FP32,指数位为采用偏移指数 E_actual = E - 127, 此外E=0(表示0和非规格化数)和E=255(表示无穷大和NaN)被留作特殊用途
尾数位可以节省一个bit,因此可以达到M+1的精度
- 所以计算FP32的最大正数为

1.2.2. 量化类型

- 对称量化:
- 放缩因子: 在8bit量化中,我们用的范围是 -127到127。根据最大绝对值来确定缩放因子。这里最大绝对值α = 8.58,量化位数(b)是8位,所以对称整数范围就是 -127到127。
- 量化数值:
- 反量化:
- 显然这样会损失一些精度
- 非对称量化
- 量化因子:
- 计算零点:
- 量化数值 :
- 反量化:
1.2.3. 量化方法

1.2.3.1. 后训练量化
- weight-only
- 在解码阶段,延迟主要是受到权重张量加载影响。现有技术通过只量化权重来加速内存读取
- 涉及离线量化权重,然后将低精度权重反量化为FP16的格式进行计算
- 8-bit 量化:
- LLM.int8()
- binary coding quantizaion(BCQ)
- low-bit量化:
- GPTQ:
- AWQ:
- 权重并不是同等重要的,仅有0.1%-1%的小部分权重影响输出的精度,那么如何筛选权重呢
- 随机挑选:
- 基于权重分布挑选:对于权重矩阵中的元素按照绝对值的大小由大到小排序,绝对值越大越显著,选择前0.1%-1%的元素作为显著权重
- 基于激活值分布挑选权重: 所谓激活值就是

- 作者对于三个方法均进行了试验:发现基于激活值分布挑选的方式相比FP16几乎没有精度损失,也就是说只需要把少量权重保持在FP16剩下的进行低bit量化
- 这里还有个细节:作者为了避免过于复杂,首先将激活值每一列求绝对值的平均,然后把平均值较大的一列视作显著通道,保留FP16精度

- 量化对显著权重进行放大可以降低量化误差
下面考虑一个权重元素 以及 
注意到单独放缩权重的某个元素实际上大概率并不会影响权重矩阵中最大的值所以 
- 寻找放缩系数
转化为一个优化问题
,为什么是 ?因为上面说了显著是一个列的行为
- 由于这个优化函数是不可微的,所以这里采用近似梯度,并且定义了最优scale的搜索空间
其中的 是每个通道的平均激活值, 是一个超参数,我们可以在区间[0,1]中使用快速网格搜索来找到最优的
- 由于这个优化函数是不可微的,所以这里采用近似梯度,并且定义了最优scale的搜索空间
- 权重并不是同等重要的,仅有0.1%-1%的小部分权重影响输出的精度,那么如何筛选权重呢
- 稀疏量化表示:
- Weight-Activation Quantization
- 再预填充阶段的延迟被高精度的CUDA核心的计算性能限制,未来解决这个挑战,现有的方法使用低精度的张量核心来计算量化的权重和激活值
- Activations在线量化再每个GEMM操作前进行
- 8-bit :
- ZeroQuant:
- SmoothQuant:
- Low-bit 量化:
- RPTQ
- LLM-FP4
- outlier-victim pair
- Low-rank compensation
1.2.3.2. 量化感知训练
- BitNet:
- LLM-QAT:
- DeepSeek-V3:
