权重预取指南¶
权重预取通过在需要之前将权重预加载到缓存中来优化内存使用,最小化模型执行期间内存访问引起的延迟。线性层有时表现出较高的 MTE 利用率。为了解决这个问题,我们创建了一个专门用于权重预取的独立流水线,它与原始向量计算流水线(如量化、MoE 门控 top_k、RMSNorm 和 SwiGlu)并行运行。这种方法允许权重提前预加载到 L2 缓存中,减少了线性层计算期间的 MTE 利用率,并通过最小化资源争用和优化数据流间接提高了 Cube 计算效率。
由于我们使用向量计算来隐藏权重预取流水线,这会对计算产生影响。如果您优先考虑低延迟而非高吞吐量,最好不要启用预取。
快速开始¶
使用 --additional-config '{"weight_prefetch_config": {"enabled": true}}' 开启权重预取。
微调预取比例¶
由于权重预取使用向量计算来隐藏权重预取流水线,预取大小的设置至关重要。如果大小太小,优化收益将无法充分发挥;而如果大小太大,可能导致资源争用,从而造成性能下降。为了适应不同的场景,我们添加了 prefetch_ratio,以便根据具体工作负载灵活配置大小,详情如下:
通过 prefetch_ratio 中的 "weight_prefetch_config" 为特定的线性层自定义权重预取比例。
“attn” 和 “moe” 配置选项用于 MoE 模型,详情如下:
"attn": { "qkv": 1.0, "o": 1.0}, "moe": {"gate_up": 0.8}
“mlp” 配置选项用于优化稠密模型的性能,详情如下:
"mlp": {"gate_up": 1.0, "down": 1.0}
以上值为默认配置,对于 Qwen3-235B-A22B-W8A8,当 --max-num-seqs 为 144 时具有良好的性能;对于 Qwen3-32B-W8A8,当 --max-num-seqs 为 72 时具有良好的性能。
然而,这可能不是您场景下的最佳配置。对于更高的并发,您可以尝试增加预取大小。对于较低的并发,预取可能没有任何优势,因此您可以减小大小或禁用预取。通过收集性能分析数据来确定预取大小是否合适。具体来说,检查预取操作(例如 MLP Down Proj 权重预取)所需的时间是否与并行向量计算算子(例如 SwiGlu 计算)所需的时间重叠,以及预取操作是否不晚于向量计算算子的完成时间。在性能分析时间线中,预取操作表现为单个流上的 CMO 操作;这个 CMO 操作就是预取操作。
说明:
1) MLP down 投影的权重预取依赖于序列并行,如果希望为 MLP down 开启预取,请同时启用序列并行。
2) 由于当前 L2 缓存的大小,最大预取量不能超过 18MB。如果 prefetch_ratio * linear_layer_weight_size >= 18 * 1024 * 1024 字节,后端将仅预取 18MB。
示例¶
1) 对于 MoE 模型:
```shell
--additional-config \
'{
"weight_prefetch_config": {
"enabled": true,
"prefetch_ratio": {
"attn": {
"qkv": 1.0,
"o": 1.0
},
"moe": {
"gate_up": 0.8
}
}
}
}'
```
2) For dense model:
Following is the default configuration that can get a good performance for `--max-num-seqs` is 72 for Qwen3-32B-W8A8
```shell
--additional-config \
'{
"weight_prefetch_config": {
"enabled": true,
"prefetch_ratio": {
"mlp": {
"gate_up": 1.0,
"down": 1.0
}
}
}
}'
```