aclnnGroupedMatmul
支持的产品型号
Atlas A2训练系列产品。
接口原型
每个算子分为两段式接口,必须先调用“aclnnGroupedMatmulGetWorkspaceSize”接口获取入参并根据计算流程计算所需workspace大小,再调用“aclnnGroupedMatmul”接口执行计算。
aclnnStatus aclnnGroupedMatmulGetWorkspaceSize(const aclTensorList *x, const aclTensorList *weight, const aclTensorList *bias, const aclTensorList *scale, const aclTensorList *offset, const aclTensorList *antiquantScale, const aclTensorList *antiquantOffset, const aclIntArray *groupListOptional, int64_t splitItemOptional, const aclTensorList *y, uint64_t *workspaceSize, aclOpExecutor **executor)
aclnnStatus aclnnGroupedMatmul(void *workspace, uint64_t workspaceSize, aclOpExecutor *executor, const aclrtStream stream)
功能描述
- 算子功能:实现分组矩阵乘计算,每组矩阵乘的维度大小可以不同。根据x、weight、y的Tensor数量支持如下4种场景:
- x、weight、y的Tensor数量等于组数,即每组的数据对应的Tensor是独立的。
- x的Tensor数量为1,weight/y的Tensor数量等于组数,此时需要通过可选参数group_list说明x在行上的分组情况,如group_list[0]=10说明x的前10行参与第一组矩阵乘计算。
- x、weight的Tensor数量等于组数,y的Tensor数量为1,此时每组矩阵乘的结果放在同一个Tensor中连续存放。
- x、y的Tensor数量为1,weight数量等于组数,属于前两种情况的组合。
- 计算公式:
- 非量化场景:
- 量化场景:
- 反量化场景:
- 伪量化场景:
aclnnGroupedMatmulGetWorkspaceSize
参数说明:
- x(aclTensorList*,计算输入):必选参数,Device侧的aclTensorList,公式中的输入x,数据类型支持FLOAT16、BFLOAT16、INT8,数据格式支持ND,支持的最大长度为128个。
- weight(aclTensorList*,计算输入):必选参数,Device侧的aclTensorList,公式中的weight,数据类型支持FLOAT16、BFLOAT16、INT8,数据格式支持ND,支持的最大长度为128个。
- bias(aclTensorList*,计算输入)可选参数,Device侧的aclTensorList,公式中的bias,数据类型支持FLOAT16、FLOAT32、INT32,数据格式支持ND,长度与weight相同。
- scale(aclTensorList*,计算输入)可选参数,Device侧的aclTensorList,代表量化参数中的缩放因子,数据类型支持UINT64,数据格式支持ND,长度与weight相同。
- offset(aclTensorList*,计算输入)可选参数,Device侧的aclTensorList,代表量化参数中的偏移量,数据类型支持FLOAT32,数据格式支持ND,长度与weight相同。
- antiquant_scale(aclTensorList*,计算输入)可选参数,Device侧的aclTensorList,代表伪量化参数中的缩放因子,数据类型支持FLOAT16、BFLOAT16,数据格式支持ND,长度与weight相同。
- antiquant_offset(aclTensorList*,计算输入)可选参数,Device侧的aclTensorList,代表伪量化参数中的偏移量,数据类型支持FLOAT16、BFLOAT16,数据格式支持ND,长度与weight相同。
- groupListOptional(aclIntArray*,计算输入):可选参数,Host侧的aclIntArray类型,代表输入和输出M方向的matmul索引情况,数据类型支持INT64,数据格式支持ND,长度与weight相同。
- splitItemOptional(int64_t,计算输入):可选属性,代表输入和输出是否要做tensor切分,0代表输入和输出都不用切分;1代表输入需要切分,输出不需要切分;2代表输入不需要切分,输出需要切分;3代表输入和输出都需要切分,默认值为0。
- y(aclTensorList*,计算输出):Device侧的aclTensorList,公式中的输出y,数据类型支持FLOAT16、BFLOAT16、INT8,数据格式支持ND,支持的最大长度为128个。
- workspaceSize(uint64_t*,出参):返回用户需要在Device侧申请的workspace大小。
- executor(aclOpExecutor**,出参):返回op执行器,包含了算子计算流程。
返回值:
说明: 第一段接口完成入参校验,若出现以下错误码,则对应原因为:
- 返回161001(ACLNN_ERR_PARAM_NULLPTR):如果传入参数是必选输入、输出或者必选属性,且是空指针;传入参数weight的元素存在空指针;传入参数x的元素为空指针,且传出参数y的元素不为空指针;传入参数x的元素不为空指针,且传出参数y的元素为空指针。
- 返回161002(ACLNN_ERR_PARAM_INVALID):x、weight、bias、scale、offset、antiquant_scale、antiquant_offset、groupListOptional、splitItemOptional、y的数据类型和数据格式不在支持的范围内;weight的长度大于128;若bias不为空,bias的长度不等于weight的长度;splitItemOptional为1、3的场景,x的长度不等于1或groupListOptional长度不等于weight的长度;splitItemOptional为0、2的场景,x的长度不等于weight的长度,y的长度不等于1或groupListOptional不为空;splitItemOptional为2、3的场景,y的长度不等于1;splitItemOptional为0、1的场景,y的长度不等于weight的长度。
aclnnGroupedMatmul
参数说明:
- workspace(void*,入参):在Device侧申请的workspace内存地址。
- workspaceSize(uint64_t,入参):在Device侧申请的workspace大小,由第一段接口aclnnGroupedMatmulGetWorkspaceSize获取。
- executor(aclOpExecutor*,入参):op执行器,包含了算子计算流程。
- stream(aclrtStream,入参):指定执行任务的AscendCL stream流。
返回值:
约束与限制
- 非量化场景支持的输入类型为:
- x为FLOAT16、weight为FLOAT16、bias为FLOAT16、scale为空、offset为空、antiquant_scale为空、antiquant_offset为空、y为FLOAT16;
- x为BFLOAT16、weight为BFLOAT16、bias为FLOAT32、scale为空、offset为空、antiquant_scale为空、antiquant_offset为空、y为BFLOAT16;
- 量化场景支持的输入类型为:
- x为INT8、weight为INT8、bias为INT32、scale为UINT64、offset为空、antiquant_scale为空、antiquant_offset为空、y为INT8;
- 伪量化场景支持的输入类型为:
- x为FLOAT16、weight为INT8、bias为FLOAT16、scale为空,offset为空,antiquant_scale为FLOAT16、antiquant_offset为FLOAT16、y为FLOAT16;
- x为BFLOAT16、weight为INT8、bias为FLOAT32、scale为空,offset为空,antiquant_scale为BFLOAT16、antiquant_offset为BFLOAT16、y为BFLOAT16;
- 当splitItemOptional为0时,x支持输入维度为2维-6维,y支持输出维度为2维-6维;当splitItemOptional为1/2/3时,x支持输入维度为2维,y支持输出维度为2维;splitItemOptional为0/1/2/3时,weight支持输入维度为2维。
调用示例
[object Object]