核心加速API#
本文档描述 mindiesd 包通过 layers 模块对外暴露的接口。所有接口均可通过 from mindiesd import <接口名> 直接导入使用。
FA 系列#
FA(Flash Attention)系列接口提供昇腾亲和的注意力计算能力,涵盖标准注意力、变长序列注意力和稀疏注意力场景。
接口名 |
类型 |
功能描述 |
|---|---|---|
|
函数 |
标准注意力前向计算,支持自动算子寻优 |
|
函数 |
变长序列注意力前向计算 |
|
函数 |
稀疏注意力前向计算,支持 rf_v2 / ada_bsa 稀疏策略 |
attention_forward#
标准注意力前向计算接口,支持多种底层算子(PFA、FASCore、LaserAttention 等)和自动寻优。
from mindiesd import attention_forward
函数签名#
attention_forward(
query, key, value,
attn_mask=None,
scale=None,
fused=True,
head_first=False,
**kwargs
) -> torch.Tensor
参数说明#
参数 |
类型 |
必选 |
默认值 |
说明 |
|---|---|---|---|---|
|
|
是 |
- |
查询张量,4D,布局为 |
|
|
是 |
- |
键张量,4D,布局与 |
|
|
是 |
- |
值张量,4D,布局与 |
|
|
否 |
|
注意力掩码 |
|
|
否 |
|
缩放因子,为 |
|
|
否 |
|
是否使用融合算子, |
|
|
否 |
|
头维度是否在序列维度之前, |
|
|
否 |
|
算子调度模式,支持 |
|
|
否 |
|
算子类型,仅在 |
|
|
否 |
|
算子布局,仅在 |
返回值#
torch.Tensor:注意力计算结果,布局与输入一致。
使用示例#
import torch
from mindiesd import attention_forward
query = torch.randn(2, 4096, 24, 128, device="npu", dtype=torch.float16)
key = torch.randn(2, 4096, 24, 128, device="npu", dtype=torch.float16)
value = torch.randn(2, 4096, 24, 128, device="npu", dtype=torch.float16)
out = attention_forward(query, key, value)
迁移指南#
从
torch.nn.functional.scaled_dot_product_attention迁移时,输入布局需从[B,N,S,D]调整为[B,S,N,D],并去掉transpose操作。从
flash_attn.flash_attn_func迁移时,输入布局已为[B,S,N,D],可直接替换。本接口仅提供前向推理,不支持反向梯度计算,迁移时需去掉
dropout并将输入张量的requires_grad设为False。
attention_forward_varlen#
变长序列注意力前向计算接口,适用于同一 batch 内序列长度不一致的场景。
from mindiesd import attention_forward_varlen
函数签名#
attention_forward_varlen(
q, k, v,
cu_seqlens_q,
cu_seqlens_k,
max_seqlen_q=None,
max_seqlen_k=None,
dropout_p=0.0,
softmax_scale=None,
causal=False,
window_size=None,
softcap=None,
alibi_slopes=None,
deterministic=None,
return_attn_probs=None,
block_table=None
) -> torch.Tensor
参数说明#
参数 |
类型 |
必选 |
默认值 |
说明 |
|---|---|---|---|---|
|
|
是 |
- |
查询张量,3D,布局为 |
|
|
是 |
- |
键张量,3D,布局为 |
|
|
是 |
- |
值张量,3D,布局为 |
|
|
是 |
- |
查询序列的累积长度,1D 张量,形状为 |
|
|
是 |
- |
键序列的累积长度,1D 张量,形状为 |
|
|
否 |
|
预留参数 |
|
|
否 |
|
预留参数 |
|
|
否 |
|
Dropout 概率,当前仅支持 |
|
|
否 |
|
缩放因子,为 |
|
|
否 |
|
是否使用因果注意力掩码 |
|
|
否 |
|
预留参数 |
|
|
否 |
|
预留参数 |
|
|
否 |
|
预留参数 |
|
|
否 |
|
预留参数 |
|
|
否 |
|
预留参数 |
|
|
否 |
|
预留参数 |
返回值#
torch.Tensor:注意力计算结果,形状为 (total, nheads, headdim)。
使用示例#
import torch
from mindiesd import attention_forward_varlen
q = torch.randn(8192, 24, 128, device="npu", dtype=torch.float16)
k = torch.randn(8192, 24, 128, device="npu", dtype=torch.float16)
v = torch.randn(8192, 24, 128, device="npu", dtype=torch.float16)
cu_seqlens_q = torch.tensor([0, 2048, 4096, 6144, 8192], dtype=torch.int32, device="npu")
cu_seqlens_k = torch.tensor([0, 2048, 4096, 6144, 8192], dtype=torch.int32, device="npu")
out = attention_forward_varlen(q, k, v, cu_seqlens_q, cu_seqlens_k, causal=False)
迁移指南#
从
flash_attn.flash_attn_varlen_func迁移时,接口参数基本一致,可直接替换调用。
sparse_attention#
稀疏注意力前向计算接口,支持 RainFusion(rf_v2 / rf_v3)和自适应块稀疏(ada_bsa)两种稀疏策略。
from mindiesd import sparse_attention
函数签名#
sparse_attention(
q, k, v,
attn_mask=None,
scale=None,
is_causal=False,
head_num=1,
input_layout="BNSD",
inner_precise=0,
sparse_type=None,
txt_len=0,
block_size=128,
latent_shape_q=None,
latent_shape_k=None,
keep_sink=True,
keep_recent=True,
cdf_threshold=1.0,
sparsity=0.0,
**kwargs
) -> torch.Tensor
参数说明#
参数 |
类型 |
必选 |
默认值 |
说明 |
|---|---|---|---|---|
|
|
是 |
- |
查询张量,4D,布局由 |
|
|
是 |
- |
键张量,4D,布局由 |
|
|
是 |
- |
值张量,4D,布局由 |
|
|
否 |
|
注意力掩码,预留参数 |
|
|
否 |
|
缩放因子,为 |
|
|
否 |
|
是否使用因果注意力掩码 |
|
|
否 |
|
注意力头数量 |
|
|
否 |
|
张量布局,支持 |
|
|
否 |
|
计算精度模式, |
|
|
否 |
|
稀疏类型,支持 |
|
|
否 |
|
文本序列长度,仅在 |
|
|
否 |
|
块大小,当前仅支持 |
|
|
否 |
|
查询的潜空间形状 |
|
|
否 |
|
键的潜空间形状 |
|
|
否 |
|
是否保留 sink token,仅在 |
|
|
否 |
|
是否保留 recent token,仅在 |
|
|
否 |
|
CDF 阈值,仅在 |
|
|
否 |
|
稀疏率,取值范围 |
返回值#
torch.Tensor:注意力计算结果,布局与输入一致。
使用示例#
import torch
from mindiesd import sparse_attention
q = torch.randn(2, 24, 4096, 128, device="npu", dtype=torch.float16)
k = torch.randn(2, 24, 4096, 128, device="npu", dtype=torch.float16)
v = torch.randn(2, 24, 4096, 128, device="npu", dtype=torch.float16)
out = sparse_attention(
q, k, v,
head_num=24,
input_layout="BNSD",
sparse_type="ada_bsa",
sparsity=0.5
)
融合算子#
融合算子系列接口提供昇腾高性能融合算子,涵盖位置编码、归一化和激活函数等基础计算。
接口名 |
类型 |
功能描述 |
|---|---|---|
|
函数 |
旋转位置编码(RoPE)融合算子 |
|
类 |
RMS 归一化融合算子 |
|
函数 |
高性能 LayerNorm 融合算子 |
|
函数 |
自适应 LayerNorm(AdaLayerNorm)融合算子 |
|
函数 |
获取激活函数实例(含 NPU 加速版本) |
rotary_position_embedding#
旋转位置编码(RoPE)融合算子,将位置信息通过旋转矩阵注入到查询和键张量中。
from mindiesd import rotary_position_embedding
函数签名#
rotary_position_embedding(
x, cos, sin,
rotated_mode="rotated_half",
head_first=False,
fused=True
) -> torch.Tensor
参数说明#
参数 |
类型 |
必选 |
默认值 |
说明 |
|---|---|---|---|---|
|
|
是 |
- |
查询或键张量,4D,支持布局 |
|
|
是 |
- |
预计算的余弦频率张量,2D |
|
|
是 |
- |
预计算的正弦频率张量,维度与 |
|
|
否 |
|
旋转模式: |
|
|
否 |
|
头维度是否在序列维度之前 |
|
|
否 |
|
是否使用融合算子 |
返回值#
torch.Tensor:应用了旋转位置编码的张量,形状与输入 x 一致。
使用示例#
import torch
from mindiesd import rotary_position_embedding
x = torch.randn(2, 4096, 24, 128, device="npu", dtype=torch.float16)
cos = torch.randn(1, 4096, 1, 128, device="npu", dtype=torch.float16)
sin = torch.randn(1, 4096, 1, 128, device="npu", dtype=torch.float16)
out = rotary_position_embedding(x, cos, sin, rotated_mode="rotated_half", head_first=False, fused=True)
旋转模式说明#
rotated_half:适用于 OpenSoraPlan、Stable Audio 等模型,将
x拆分为前后两半进行旋转。rotated_interleaved:适用于 HunyuanDiT、OpenSora、Flux、CogVideox 等模型,将
x按相邻元素交错进行旋转。
RMSNorm#
RMS 归一化融合算子,等效于 T5LayerNorm,不涉及均值计算,专注于输入张量的根均方值。
from mindiesd import RMSNorm
类签名#
RMSNorm(hidden_size, eps=1e-6)
构造参数#
参数 |
类型 |
必选 |
默认值 |
说明 |
|---|---|---|---|---|
|
|
是 |
- |
隐藏层维度大小 |
|
|
否 |
|
数值稳定性参数 |
forward 方法#
forward(hidden_states, if_fused=True) -> torch.Tensor
参数 |
类型 |
必选 |
默认值 |
说明 |
|---|---|---|---|---|
|
|
是 |
- |
输入张量,维度范围为 2~8 |
|
|
否 |
|
是否使用 NPU 融合算子 |
使用示例#
import torch
from mindiesd import RMSNorm
norm = RMSNorm(1024, eps=1e-6)
x = torch.randn(2, 4096, 1024, device="npu", dtype=torch.float16)
out = norm(x)
fast_layernorm#
高性能 LayerNorm 融合算子,支持多种计算精度模式。
from mindiesd import fast_layernorm
函数签名#
fast_layernorm(
norm, x,
impl_mode=0,
fused=True
) -> torch.Tensor
参数说明#
参数 |
类型 |
必选 |
默认值 |
说明 |
|---|---|---|---|---|
|
|
是 |
- |
PyTorch LayerNorm 实例 |
|
|
是 |
- |
输入张量,3D,布局为 |
|
|
否 |
|
计算模式: |
|
|
否 |
|
是否使用融合算子, |
返回值#
torch.Tensor:LayerNorm 计算结果,形状与输入 x 一致。
使用示例#
import torch
import torch.nn as nn
from mindiesd import fast_layernorm
norm = nn.LayerNorm(1024, eps=1e-5)
x = torch.randn(2, 4096, 1024, device="npu", dtype=torch.float16)
out = fast_layernorm(norm, x, impl_mode=0, fused=True)
layernorm_scale_shift#
自适应 LayerNorm(AdaLayerNorm)融合算子,在 LayerNorm 基础上添加自适应缩放和偏移。
计算公式:out = layernorm(x) * (1 + scale) + shift
from mindiesd import layernorm_scale_shift
函数签名#
layernorm_scale_shift(
layernorm, x, scale, shift,
fused=True
) -> torch.Tensor
参数说明#
参数 |
类型 |
必选 |
默认值 |
说明 |
|---|---|---|---|---|
|
|
是 |
- |
PyTorch LayerNorm 实例 |
|
|
是 |
- |
输入张量,3D,布局为 |
|
|
是 |
- |
自适应缩放参数,2D |
|
|
是 |
- |
自适应偏移参数,2D |
|
|
否 |
|
是否使用融合算子 |
返回值#
torch.Tensor:AdaLayerNorm 计算结果,形状与输入 x 一致。
使用示例#
import torch
import torch.nn as nn
from mindiesd import layernorm_scale_shift
norm = nn.LayerNorm(1024, eps=1e-5)
x = torch.randn(2, 4096, 1024, device="npu", dtype=torch.float16)
scale = torch.randn(2, 1024, device="npu", dtype=torch.float16)
shift = torch.randn(2, 1024, device="npu", dtype=torch.float16)
out = layernorm_scale_shift(norm, x, scale, shift, fused=True)
约束条件#
x的最后一维必须与scale、shift的最后一维相等。若
scale或shift为 3D 张量,则第二维必须为 1 或与x的第二维(序列长度)相等。
get_activation_layer#
获取指定类型的激活函数实例,部分激活函数提供 NPU 加速版本。
from mindiesd import get_activation_layer
函数签名#
get_activation_layer(act_type: str) -> nn.Module
参数说明#
参数 |
类型 |
必选 |
默认值 |
说明 |
|---|---|---|---|---|
|
|
是 |
- |
激活函数名称,不区分大小写 |
支持的激活函数#
名称 |
对应实现 |
说明 |
|---|---|---|
|
|
Swish 激活函数 |
|
|
SiLU 激活函数(与 swish 等价) |
|
|
Mish 激活函数 |
|
|
标准 GELU |
|
|
ReLU 激活函数 |
|
|
tanh 近似 GELU |
|
|
快速 GELU,使用 NPU 的 |
返回值#
nn.Module:对应激活函数的实例。
使用示例#
from mindiesd import get_activation_layer
act = get_activation_layer("gelu-fast")
out = act(hidden_states)
Linear#
自定义线性层,与 PyTorch 的 nn.Linear 用法一致,但新增 op_type 参数用于选择底层算子实现。
from mindiesd import Linear
构造参数#
参数 |
类型 |
必选 |
默认值 |
说明 |
|---|---|---|---|---|
|
|
是 |
- |
输入特征维度 |
|
|
是 |
- |
输出特征维度 |
|
|
否 |
|
是否使用偏置 |
|
|
否 |
|
权重存储设备 |
|
|
否 |
|
权重数据类型 |
|
|
否 |
|
算子类型,支持 |
forward#
forward(input) -> torch.Tensor
参数 |
类型 |
必选 |
说明 |
|---|---|---|---|
|
|
是 |
输入张量,最后一维须等于 |