Update tech.md
This commit is contained in:
+56
-1
@@ -1 +1,56 @@
|
|||||||
#
|
一、RMSNorm操作
|
||||||
|
代码实现几乎一样,但在返回值的操作上略有不同:
|
||||||
|
OSS:
|
||||||
|
return (self.weight * hidden_states).to(input_dtype)
|
||||||
|
Qwen3:
|
||||||
|
return self.weight * hidden_states.to(input_dtype)
|
||||||
|
更推荐OSS的方式
|
||||||
|
|
||||||
|
二、MoE层
|
||||||
|
1.专家网络权重形式不一样
|
||||||
|
OSS采用大矩阵存储所有的MLP,且有bias,gate_up_proj形状为num_experts*hidden_size*(2*expert_dim),合并了两个上采样的权重;
|
||||||
|
down_proj的权重形状为:num_experts*expert_dim*hidden_size
|
||||||
|
|
||||||
|
Qwen3采用存储的粒度更细,每个专家的权重独立存储,且门控和上采样权重分开,不使用bias,形状均为hidden_size*expert_dim;
|
||||||
|
下采样权重为:expert_dim*hiddent_size
|
||||||
|
所有专家的权重定义为:nn.ModuleList(
|
||||||
|
[Qwen3MoeMLP(config, intermediate_size=config.moe_intermediate_size) for _ in range(self.num_experts)]
|
||||||
|
)
|
||||||
|
|
||||||
|
2.专家的前向计算方式不一样
|
||||||
|
Qwen3采用:Loop over all available experts
|
||||||
|
OSS可以有两种方式:
|
||||||
|
When training is is more efficient to just loop over the experts and compute the output for each expert
|
||||||
|
For inference we can sacrifice some memory and compute the output for all experts at once.
|
||||||
|
|
||||||
|
3.激活函数
|
||||||
|
OSS使用:
|
||||||
|
glu = gate * torch.sigmoid(gate * self.alpha)
|
||||||
|
Qwen3使用:
|
||||||
|
silu
|
||||||
|
4.MLP结构不一样,OSS including clamping and a residual connection
|
||||||
|
OSS使用:
|
||||||
|
gate = gate.clamp(min=None, max=self.limit)
|
||||||
|
up = up.clamp(min=-self.limit, max=self.limit)
|
||||||
|
glu = gate * torch.sigmoid(gate * self.alpha)
|
||||||
|
gated_output = (up + 1) * glu
|
||||||
|
out = gated_output @ self.down_proj[expert_idx] + self.down_proj_bias[expert_idx]
|
||||||
|
|
||||||
|
Qwen使用:
|
||||||
|
down_proj = self.down_proj(self.act_fn(self.gate_proj(x)) * self.up_proj(x))
|
||||||
|
|
||||||
|
三、RoPE代码一样
|
||||||
|
四、 eager_attention的计算
|
||||||
|
OSS使用了GQA和sink attention
|
||||||
|
combined_logits = torch.cat([attn_weights, sinks], dim=-1)
|
||||||
|
combined_logits = combined_logits - combined_logits.max(dim=-1, keepdim=True).values
|
||||||
|
probs = F.softmax(combined_logits, dim=-1, dtype=combined_logits.dtype)
|
||||||
|
scores = probs[..., :-1]
|
||||||
|
Qwen3使用了GQA,未使用sink attention
|
||||||
|
attn_weights = torch.matmul(query, key_states.transpose(2, 3)) * scaling
|
||||||
|
attn_weights = nn.functional.softmax(attn_weights, dim=-1, dtype=torch.float32).to(query.dtype)
|
||||||
|
五、 Attention类型不一样
|
||||||
|
OSS交替使用sliding_attention,full_attention
|
||||||
|
Qwen3支持sliding_window
|
||||||
|
六、负载均衡
|
||||||
|
均使用Switch Transformer
|
||||||
|
|||||||
Reference in New Issue
Block a user