昇腾社区首页
中文
注册

aclnnSwinTransformerLnQkvQuant

支持的产品型号

  • Atlas 推理系列产品。

接口原型

每个算子分为undefined,必须先调用“aclnnSwinTransformerLnQkvQuantGetWorkspaceSize”接口获取计算所需workspace大小以及包含了算子计算流程的执行器,再调用“aclnnSwinTransformerLnQkvQuant”接口执行计算。

  • aclnnStatus aclnnSwinTransformerLnQkvQuantGetWorkspaceSize(const aclTensor *x, const aclTensor *gamma, aclTensor *beta, aclTensor *weight, aclTensor *bias, aclTensor *quantScale, aclTensor *quantOffset, aclTensor *dequantScale, int64_t headNum, int64_t seqLength, float epsilon, int64_t oriHeight, int64_t oriWeight, int64_t hWinSize, int64_t wWinSize, bool weightTranspose, aclTensor *queryOutput, aclTensor *keyOutput, aclTensor *valueOutput, uint64_t *workspaceSize, aclOpExecutor **executor)
  • aclnnStatus aclnnSwinTransformerLnQkvQuant(void *workspace, uint64_t workspaceSize, aclOpExecutor *executor, aclrtStream stream)

功能描述

  • 算子功能:Swin Transformer 网络模型 完成 Q K V 的计算。

  • 计算公式:

    q/k/v = (Quant(Layernorm(x).transpose) * weight).dequant.transpose.split 其中,weight 是 Q K V 三个矩阵权重的拼接。

aclnnSwinTransformerLnQkvQuantGetWorkspaceSize

  • 参数说明
    • x(const aclTensor*,计算输入): Device侧的aclTensor,数据类型支持FLOAT16。undefined支持ND。只支持维度为[B,S,H],其中B只支持[1,32],S需等于oriHeight * oriWeight,H = headNum * seqLength且小于等于1024。
    • gamma(const aclTensor*,计算输入): Device侧的aclTensor,数据类型支持FLOAT16。undefined支持ND。维度需为[H]。
    • beta(const aclTensor*,计算输入): Device侧的aclTensor,数据类型支持FLOAT16。undefined支持ND。维度需为[H]。
    • weight(const aclTensor*,计算输入): Device侧的aclTensor,数据类型支持INT8。undefined支持ND。维度需为[3 * H, H]。
    • bias(const aclTensor*,计算输入): Device侧的aclTensor,数据类型支持INT32。undefined支持ND。维度需为[3 * H]。
    • quantScale(const aclTensor*,计算输入): Device侧的aclTensor,数据类型支持FLOAT16。undefined支持ND。维度需为[H]。
    • quantOffset(const aclTensor*,计算输入): Device侧的aclTensor,数据类型支持FLOAT16。undefined支持ND。维度需为[H]。
    • dequantScale(const aclTensor*,计算输入): Device侧的aclTensor,数据类型支持UINT64。undefined支持ND。维度需为[3 * H]。
    • headNum(int,计算输入): 通道数;只支持[1,32]范围;
    • seqLength(int,计算输入): 通道深度。只支持32/64两种;
    • epsilon(float,计算输入): layernrom 计算除0保护值;为了保证精度,建议小于等于1e-4;
    • oriHeight(int,计算输入): layernrom 中S轴transpose的维度;oriHeight*oriWeight需等于输入x的第二维S的大小,且为hWinSize的整数倍;
    • oriWeight(int,计算输入): layernrom 中S轴transpose的维度;oriHeight*oriWeight需等于输入x的第二维S的大小,且为wWinSize的整数倍;
    • hWinSize(int,计算输入): 窗大小;支持范围[7-32];
    • wWinSize(int,计算输入): 窗大小;支持范围[7-32];
    • weightTranspose(bool,计算输入): weight矩阵需要转置,当前不支持不转置场景;
    • queryOutput(const aclTensor*, 计算输出):Device侧的aclTensor,数据类型支持FLOAT16。undefined支持ND。
    • keyOutput(const aclTensor*, 计算输出):Device侧的aclTensor,数据类型支持FLOAT16。undefined支持ND。
    • valueOutput(const aclTensor*, 计算输出):Device侧的aclTensor,数据类型支持FLOAT16。undefined支持ND。
    • workspaceSize(uint64_t*,出参):返回需要在Device侧申请的workspace大小。
    • executor(aclOpExecutor**,出参):返回op执行器,包含了算子计算流程。
  • 返回值: aclnnStatus:返回状态码,具体参见undefined
    [object Object]

aclnnSwinTransformerLnQkvQuant

  • 参数说明

    • workspace(void *, 入参):在Device侧申请的workspace内存地址。
    • workspaceSize(uint64_t, 入参):在Device侧申请的workspace大小,由第一段接口aclnnSwinTransformerLnQkvQuantGetWorkspaceSize获取。
    • executor(aclOpExecutor *, 入参):op执行器,包含了算子计算流程。
    • stream(aclrtStream, 入参):指定执行任务的 AscendCL Stream流。
  • 返回值: aclnnStatus:返回状态码,具体参见undefined

约束与限制

  • seqLength 只支持32/64
  • oriHeight * oriWeight = 输入x Tensor的第二维度,且oriHeight为hWinSize的整数倍,oriWeight为wWinSize的整数倍
  • hWinSize和wWinSize 只支持7 - 32
  • 输入x Tensor的第一维度B只支持1 - 32
  • weight需要转置

调用示例

示例代码如下,仅供参考,具体编译和执行过程请参考undefined

[object Object]