核心加速API#

本文档描述 mindiesd 包通过 layers 模块对外暴露的接口。所有接口均可通过 from mindiesd import <接口名> 直接导入使用。

FA 系列#

FA(Flash Attention)系列接口提供昇腾亲和的注意力计算能力,涵盖标准注意力、变长序列注意力和稀疏注意力场景。

接口名

类型

功能描述

attention_forward

函数

标准注意力前向计算,支持自动算子寻优

attention_forward_varlen

函数

变长序列注意力前向计算

sparse_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

参数说明#

参数

类型

必选

默认值

说明

query

torch.Tensor

-

查询张量,4D,布局为 [B,S,N,D][B,N,S,D]

key

torch.Tensor

-

键张量,4D,布局与 query 一致

value

torch.Tensor

-

值张量,4D,布局与 query 一致

attn_mask

torch.Tensor

None

注意力掩码

scale

float

None

缩放因子,为 None 时自动取 head_dim ** -0.5

fused

bool

True

是否使用融合算子,False 时回退到原生计算

head_first

bool

False

头维度是否在序列维度之前,True 表示 [B,N,S,D]False 表示 [B,S,N,D]

kwargs.opt_mode

str

"runtime"

算子调度模式,支持 "runtime""static""manual"

kwargs.op_type

str

"fused_attn_score"

算子类型,仅在 opt_mode="manual" 时生效,支持 "prompt_flash_attn""fused_attn_score""ascend_laser_attention"

kwargs.layout

str

"BNSD"

算子布局,仅在 opt_mode="manual" 时生效,支持 "BNSD""BSND""BSH"

返回值#

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

参数说明#

参数

类型

必选

默认值

说明

q

torch.Tensor

-

查询张量,3D,布局为 [T, N, D](T 为所有序列 token 总数)

k

torch.Tensor

-

键张量,3D,布局为 [T, N, D]

v

torch.Tensor

-

值张量,3D,布局为 [T, N, D]

cu_seqlens_q

torch.Tensor

-

查询序列的累积长度,1D 张量,形状为 (batch_size + 1,),dtype 为 torch.int32

cu_seqlens_k

torch.Tensor

-

键序列的累积长度,1D 张量,形状为 (batch_size + 1,),dtype 为 torch.int32

max_seqlen_q

int

None

预留参数

max_seqlen_k

int

None

预留参数

dropout_p

float

0.0

Dropout 概率,当前仅支持 0.0

softmax_scale

float

None

缩放因子,为 None 时自动取 head_dim ** -0.5

causal

bool

False

是否使用因果注意力掩码

window_size

int

None

预留参数

softcap

float

None

预留参数

alibi_slopes

torch.Tensor

None

预留参数

deterministic

bool

None

预留参数

return_attn_probs

bool

None

预留参数

block_table

torch.Tensor

None

预留参数

返回值#

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

参数说明#

参数

类型

必选

默认值

说明

q

torch.Tensor

-

查询张量,4D,布局由 input_layout 决定

k

torch.Tensor

-

键张量,4D,布局由 input_layout 决定

v

torch.Tensor

-

值张量,4D,布局由 input_layout 决定

attn_mask

torch.Tensor

None

注意力掩码,预留参数

scale

float

None

缩放因子,为 None 时自动取 head_dim ** -0.5

is_causal

bool

False

是否使用因果注意力掩码

head_num

int

1

注意力头数量

input_layout

str

"BNSD"

张量布局,支持 "BNSD""BSND"

inner_precise

int

0

计算精度模式,0 为高精度,1 为高性能

sparse_type

str

None

稀疏类型,支持 None"rf_v2""rf_v3""ada_bsa"

txt_len

int

0

文本序列长度,仅在 sparse_type="rf_v2" 时生效

block_size

int

128

块大小,当前仅支持 128

latent_shape_q

list

None

查询的潜空间形状 [t, h, w]t*h*w = qseqlen,仅在 sparse_type="rf_v2" 时生效

latent_shape_k

list

None

键的潜空间形状 [t, h, w]t*h*w = kseqlen,仅在 sparse_type="rf_v2" 时生效

keep_sink

bool

True

是否保留 sink token,仅在 sparse_type="ada_bsa" 时生效

keep_recent

bool

True

是否保留 recent token,仅在 sparse_type="ada_bsa" 时生效

cdf_threshold

float

1.0

CDF 阈值,仅在 sparse_type="ada_bsa" 时生效

sparsity

float

0.0

稀疏率,取值范围 [0, 1]0 表示不使用稀疏算法

返回值#

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
)

融合算子#

融合算子系列接口提供昇腾高性能融合算子,涵盖位置编码、归一化和激活函数等基础计算。

接口名

类型

功能描述

rotary_position_embedding

函数

旋转位置编码(RoPE)融合算子

RMSNorm

RMS 归一化融合算子

fast_layernorm

函数

高性能 LayerNorm 融合算子

layernorm_scale_shift

函数

自适应 LayerNorm(AdaLayerNorm)融合算子

get_activation_layer

函数

获取激活函数实例(含 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

参数说明#

参数

类型

必选

默认值

说明

x

torch.Tensor

-

查询或键张量,4D,支持布局 [B,N,S,D][B,S,N,D][S,B,N,D]

cos

torch.Tensor

-

预计算的余弦频率张量,2D [S,D] 或 4D [1,1,S,D]/[1,S,1,D]/[S,1,1,D]

sin

torch.Tensor

-

预计算的正弦频率张量,维度与 cos 一致

rotated_mode

str

"rotated_half"

旋转模式:"rotated_half" 为半旋转,"rotated_interleaved" 为交错旋转

head_first

bool

False

头维度是否在序列维度之前

fused

bool

True

是否使用融合算子

返回值#

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)

构造参数#

参数

类型

必选

默认值

说明

hidden_size

int

-

隐藏层维度大小

eps

float

1e-6

数值稳定性参数

forward 方法#

forward(hidden_states, if_fused=True) -> torch.Tensor

参数

类型

必选

默认值

说明

hidden_states

torch.Tensor

-

输入张量,维度范围为 2~8

if_fused

bool

True

是否使用 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

参数说明#

参数

类型

必选

默认值

说明

norm

torch.nn.LayerNorm

-

PyTorch LayerNorm 实例

x

torch.Tensor

-

输入张量,3D,布局为 [B,S,H]

impl_mode

int

0

计算模式:0 高精度、1 高性能、2 float16 模式(仅当所有输入均为 float16 时可用)

fused

bool

True

是否使用融合算子,False 时回退到标准 torch.nn.LayerNorm 计算

返回值#

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

参数说明#

参数

类型

必选

默认值

说明

layernorm

torch.nn.LayerNorm

-

PyTorch LayerNorm 实例

x

torch.Tensor

-

输入张量,3D,布局为 [B,S,H]

scale

torch.Tensor

-

自适应缩放参数,2D [B,H] 或 3D [B,1,H]

shift

torch.Tensor

-

自适应偏移参数,2D [B,H] 或 3D [B,1,H]

fused

bool

True

是否使用融合算子

返回值#

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 的最后一维必须与 scaleshift 的最后一维相等。

  • scaleshift 为 3D 张量,则第二维必须为 1 或与 x 的第二维(序列长度)相等。


get_activation_layer#

获取指定类型的激活函数实例,部分激活函数提供 NPU 加速版本。

from mindiesd import get_activation_layer

函数签名#

get_activation_layer(act_type: str) -> nn.Module

参数说明#

参数

类型

必选

默认值

说明

act_type

str

-

激活函数名称,不区分大小写

支持的激活函数#

名称

对应实现

说明

"swish"

nn.SiLU

Swish 激活函数

"silu"

nn.SiLU

SiLU 激活函数(与 swish 等价)

"mish"

nn.Mish

Mish 激活函数

"gelu"

GELU

标准 GELU

"relu"

nn.ReLU

ReLU 激活函数

"gelu-tanh"

GELU(approximate="tanh")

tanh 近似 GELU

"gelu-fast"

GELU(approximate="fast")

快速 GELU,使用 NPU 的 npu_fast_gelu 算子加速

返回值#

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

构造参数#

参数

类型

必选

默认值

说明

in_features

int

-

输入特征维度

out_features

int

-

输出特征维度

bias

bool

True

是否使用偏置

device

str

None

权重存储设备

dtype

torch.dtype

None

权重数据类型

op_type

str

"matmulv2"

算子类型,支持 "matmulv2""batchmatmulv2""batchmatmulv3"

forward#

forward(input) -> torch.Tensor

参数

类型

必选

说明

input

torch.Tensor

输入张量,最后一维须等于 in_features