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]