跳转至

权重预取指南

权重预取通过提前将权重加载到缓存中,在需要时即可使用,从而优化内存使用,最大限度地减少模型执行期间因内存访问造成的延迟。线性层有时会表现出较高的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”配置选项用于优化Dense模型的性能,详情如下:

"mlp": {"gate_up": 1.0, "down": 1.0}

以上值为默认配置,当 --max-num-seqs 为144时,默认值对Qwen3-235B-A22B-W8A8有良好性能;当 --max-num-seqs 为72时,对Qwen3-32B-W8A8有良好性能。

然而,这可能不是您场景下的最优配置。对于更高并发,您可以尝试增加预取大小。对于较低并发,预取可能没有优势,因此您可以减小大小或禁用预取。通过收集性能分析数据来确定预取大小是否合适。具体来说,检查预取操作(例如,MLP Down Proj权重预取)所需的时间是否与并行向量计算算子(例如,SwiGlu计算)所需的时间重叠,并且预取操作是否不晚于向量计算算子的完成时间。在性能分析时间线中,预取操作显示为单个流上的CMO操作;此CMO操作即为预取操作。

注意:

1) MLP down 投影的权重预取依赖于序列并行,如果您想为 mlp down 开启预取,请同时启用序列并行。 2) 由于当前L2缓存的大小,最大预取不能超过18MB。如果 prefetch_ratio * linear_layer_weight_size >= 18 * 1024 * 1024 字节,后端将仅预取18 MB。

示例

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) 对于Dense模型:

以下是当 `--max-num-seqs` 为72时,对Qwen3-32B-W8A8能获得良好性能的默认配置

```shell
    --additional-config \
    '{
        "weight_prefetch_config": {
            "enabled": true,
            "prefetch_ratio": {
                "mlp": {
                    "gate_up": 1.0,
                    "down": 1.0
                }
            }
        }
    }'
```