跳转至

层分片线性算子指南

概述

**层分片线性算子**是一项针对大语言模型(LLM)推理的内存优化特性。它解决了因**多层间重复出现、结构相同但权重不同**的线性算子所导致的高内存压力问题。

层分片线性算子**并非在每个设备上复制所有权重,而是将“一系列”此类算子的权重**分片存储到通信组内的各个NPU设备上

  • 第 i 层的线性权重**仅存储在**设备 i % K 上,其中 K 是组内设备数量。
  • 其他设备在初始化时持有一个轻量级的**共享虚拟张量**,并在前向传播过程中通过异步广播**按需**获取真实权重。

如下图所示,这种设计使得广播能够及时获取权重:在当前层(例如 MLA 或 MOE)进行计算的同时,系统在后台**异步广播下一层的权重**。由于 MLA 模块中的注意力计算具有足够的延迟限制,o_proj 的权重传输**与计算完全重叠**,使得通信**从端到端推理的角度来看是无延迟的**。

这种方法**保留了精确的计算语义**,同时**显著减少了NPU内存占用**,在以下场景中尤为关键:

  • 极深的架构(例如具有61层的 DeepSeek-V3/R1);
  • 使用 DSA-CPFlashComm2 的模型,这些模型要求每层内存中驻留完整的 O(输出)投影矩阵;
  • 注意力计算延迟完全重叠(隐藏)权重广播通信成本的场景。

流程图

layer shard

图. 层分片线性工作流:权重按层分片到不同设备(上方),在前向执行过程中(下方),异步广播**预取**下一层权重,同时当前层进行计算——实现**零开销**权重加载。


快速开始

要启用**层分片线性算子**,请在启动推理任务时使用 --additional-config 参数指定目标线性层。例如,要对 o_projq_b_proj 层进行分片,请使用:

--additional-config '{
  "layer_sharding": ["o_proj", "q_b_proj"]
}'

限制 层分片只能在PD分离架构的 P节点 中启用。 RFork权重传输不支持层分片。如果在使用 --load-format rfork 的同时使用了 layer_sharding,则会绕过RFork传输,通过默认模型加载器加载模型。


支持的场景

此特性在以下情况下能带来最大收益:

启用FlashComm2

当使用 FlashComm2 时,每层内存中必须驻留完整的输出投影(o_proj)矩阵。层分片通过将这些权重分布到不同设备上,显著降低了内存压力。

示例配置:

export VLLM_ASCEND_FLASHCOMM2_PARALLEL_SIZE=1
vllm serve \
  --model DeepSeek-V3/R1 \
  --additional-config '{
    "layer_sharding": ["o_proj"]
  }'

启用DSA-CP

使用 DSA-CP 时,q_b_projo_proj 层都需要为每层存储大型权重矩阵。将这些层分片到多个NPU上,有助于将极深的模型(例如61层架构)适配到有限的设备内存中。

层分片只能在PD分离架构的 P节点 中启用。

示例配置:

export VLLM_ASCEND_ENABLE_FLASHCOMM1=1
vllm serve \
  --model DeepSeek-V3.2 \
  --additional-config '{
    "layer_sharding": ["q_b_proj", "o_proj"]
  }'