AscendQuant【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit产品支持情况Ascend 950PR/Ascend 950DT支持Atlas A3 训练系列产品/Atlas A3 推理系列产品支持Atlas A2 训练系列产品/Atlas A2 推理系列产品支持Atlas 200I/500 A2 推理产品不支持Atlas 推理系列产品AI Core支持Atlas 推理系列产品Vector Core不支持Atlas 训练系列产品支持Kirin X90支持Kirin 9030支持功能说明按元素做量化计算比如将half/float数据类型量化为int8_t数据类型。计算公式如下round表示四舍六入五成双取整cast表示舍入模式PER_TENSOR量化整个srcTensor对应一个量化参数量化参数的shape为[1]。PER_CHANNEL量化srcTensor的shape为[m, n],每个channel维度对应一个量化参数量化参数的shape为[n]。PER_TOKEN量化srcTensor的每组tokentoken为n方向共有m组token中的元素共享一组scale和offset参数srcTensor的shape为[m, n]时scale和offset的shape为[m, 1]。offset是可选输入。PER_GROUP量化这里定义group的计算方向为k方向srcTensor在k方向上每groupSize个元素共享一组scale和offset。srcTensor的shape为[m, n]时如果kDim0表示k是m方向scale和offset的shape为[(m groupSize - 1) / groupSize, n]如果kDim1表示k是n方向scale和offset的shape为[m(n groupSize - 1) / groupSize]。offset是可选输入。根据输出数据类型的不同当前PER_GROUP分为两种场景fp4x2_e2m1_t/fp4x2_e1m2_t场景后续内容中简称为float4场景和int8_t/hifloat8_t/fp8_e5m2_t/fp8_e4m3fn_t场景后续内容中简称为b8场景。fp4x2_e2m1_t/float4_e1m2场景float4场景kDim 0:kDim 1:int8_t/hifloat8_t/fp8_e5m2_t/fp8_e4m3fn_t场景b8场景kDim0kDim1实现原理图1AscendQuant算法框图scale和offset都是scalar图2AscendQuant算法框图scale和offset都是Tensor图3AscendQuant算法框图scale是Tensoroffset是Scalar如上图所示是AscendQuant内部算法框图计算过程大致描述为如下几步均在Vector上进行精度转换当输入的srcscale或者offset是float类型时将其转换为half类型broadcast当输入的scale或者offset是向量时将其broadcast成和src相同维度计算scale当src和scale为向量时做Mul计算当scale是scalar时做Muls计算得到Tmp1计算offset当Tmp1和offset为向量时做Add计算当offset是scalar时做Adds计算得到Tmp2精度转换将Tmp2从half转换成int8_t类型得到output。图4AscendQuant算法框图PER_TOKEN/PER_GROUP场景scale和offset都是tensor图5AscendQuant算法框图PER_TOKEN/PER_GROUP场景scale是tensoroffset是scalarPER_TOKEN/PER_GROUP场景的计算逻辑如下读取数据连续读取输入src根据不同的场景对输入scale和offset采用不同的读取方式例如PER_TOKEN场景做Broadcast处理PER_GROUP场景做Gather处理精度转换根据不同输入的数据类型组合对src/scale/offset进行相应的数据类型转换计算对类型转换后的数据做乘加操作精度转换将上述乘加操作得到的计算结果转换成dstT类型得到最终输出。函数原型dstTensor为int8_t数据类型PER_TENSOR量化通过sharedTmpBuffer入参传入临时空间源操作数Tensor全部/部分参与计算template typename T, bool isReuseSource false, const AscendQuantConfig config ASCEND_QUANT_DEFAULT_CFG __aicore__ inline void AscendQuant(const LocalTensorint8_t dstTensor, const LocalTensorT srcTensor, const LocalTensoruint8_t sharedTmpBuffer, const float scale, const float offset, const uint32_t calCount)源操作数Tensor全部参与计算template typename T, bool isReuseSource false, const AscendQuantConfig config ASCEND_QUANT_DEFAULT_CFG __aicore__ inline void AscendQuant(const LocalTensorint8_t dstTensor, const LocalTensorT srcTensor, const LocalTensoruint8_t sharedTmpBuffer, const float scale, const float offset)接口框架申请临时空间源操作数Tensor全部/部分参与计算template typename T, bool isReuseSource false, const AscendQuantConfig config ASCEND_QUANT_DEFAULT_CFG __aicore__ inline void AscendQuant(const LocalTensorint8_t dstTensor, const LocalTensorT srcTensor, const float scale, const float offset, const uint32_t calCount)源操作数Tensor全部参与计算template typename T, bool isReuseSource false, const AscendQuantConfig config ASCEND_QUANT_DEFAULT_CFG __aicore__ inline void AscendQuant(const LocalTensorint8_t dstTensor, const LocalTensorT srcTensor, const float scale, const float offset)PER_CHANNEL量化通过sharedTmpBuffer入参传入临时空间源操作数Tensor全部/部分参与计算template typename T, bool isReuseSource false, const AscendQuantConfig config ASCEND_QUANT_DEFAULT_CFG __aicore__ inline void AscendQuant(const LocalTensorint8_t dstTensor, const LocalTensorT srcTensor, const LocalTensoruint8_t sharedTmpBuffer, const LocalTensorT scaleTensor, const T offset, const uint32_t scaleCount, const uint32_t calCount)template typename T, bool isReuseSource false, const AscendQuantConfig config ASCEND_QUANT_DEFAULT_CFG __aicore__ inline void AscendQuant(const LocalTensorint8_t dstTensor, const LocalTensorT srcTensor, const LocalTensoruint8_t sharedTmpBuffer, const LocalTensorT scaleTensor, const LocalTensorT offsetTensor, const uint32_t scaleCount, const uint32_t offsetCount, const uint32_t calCount)源操作数Tensor全部参与计算template typename T, bool isReuseSource false, const AscendQuantConfig config ASCEND_QUANT_DEFAULT_CFG __aicore__ inline void AscendQuant(const LocalTensorint8_t dstTensor, const LocalTensorT srcTensor, const LocalTensoruint8_t sharedTmpBuffer, const LocalTensorT scaleTensor, const T offset)template typename T, bool isReuseSource false, const AscendQuantConfig config ASCEND_QUANT_DEFAULT_CFG __aicore__ inline void AscendQuant(const LocalTensorint8_t dstTensor, const LocalTensorT srcTensor, const LocalTensoruint8_t sharedTmpBuffer, const LocalTensorT scaleTensor, const LocalTensorT offsetTensor)接口框架申请临时空间源操作数Tensor全部/部分参与计算template typename T, bool isReuseSource false, const AscendQuantConfig config ASCEND_QUANT_DEFAULT_CFG __aicore__ inline void AscendQuant(const LocalTensorint8_t dstTensor, const LocalTensorT srcTensor, const LocalTensorT scaleTensor, const T offset, const uint32_t scaleCount, const uint32_t calCount)template typename T, bool isReuseSource false, const AscendQuantConfig config ASCEND_QUANT_DEFAULT_CFG __aicore__ inline void AscendQuant(const LocalTensorint8_t dstTensor, const LocalTensorT srcTensor, const LocalTensorT scaleTensor, const LocalTensorT offsetTensor, const uint32_t scaleCount, const uint32_t offsetCount, const uint32_t calCount)源操作数Tensor全部参与计算template typename T, bool isReuseSource false, const AscendQuantConfig config ASCEND_QUANT_DEFAULT_CFG __aicore__ inline void AscendQuant(const LocalTensorint8_t dstTensor, const LocalTensorT srcTensor, const LocalTensorT scaleTensor, const T offset)template typename T, bool isReuseSource false, const AscendQuantConfig config ASCEND_QUANT_DEFAULT_CFG __aicore__ inline void AscendQuant(const LocalTensorint8_t dstTensor, const LocalTensorT srcTensor, const LocalTensorT scaleTensor, const LocalTensorT offsetTensor)dstTensor非固定数据类型仅支持Ascend 950PR/Ascend 950DT。PER_TENSOR量化通过sharedTmpBuffer入参传入临时空间源操作数Tensor全部/部分参与计算template typename dstT, typename srcT, bool isReuseSource false __aicore__ inline void AscendQuant(const LocalTensordstT dstTensor, const LocalTensorsrcT srcTensor, const LocalTensoruint8_t sharedTmpBuffer, const float scale, const float offset, const uint32_t calCount)源操作数Tensor全部参与计算template typename dstT, typename srcT, bool isReuseSource false __aicore__ inline void AscendQuant(const LocalTensordstT dstTensor, const LocalTensorsrcT srcTensor, const LocalTensoruint8_t sharedTmpBuffer, const float scale, const float offset)接口框架申请临时空间源操作数Tensor全部/部分参与计算template typename dstT, typename srcT, bool isReuseSource false __aicore__ inline void AscendQuant(const LocalTensordstT dstTensor, const LocalTensorsrcT srcTensor, const float scale, const float offset, const uint32_t calCount)源操作数Tensor全部参与计算template typename dstT, typename srcT, bool isReuseSource false __aicore__ inline void AscendQuant(const LocalTensordstT dstTensor, const LocalTensorsrcT srcTensor, const float scale, const float offset)PER_CHANNEL量化通过sharedTmpBuffer入参传入临时空间源操作数Tensor全部/部分参与计算template typename dstT, typename srcT, bool isReuseSource false __aicore__ inline void AscendQuant(const LocalTensordstT dstTensor, const LocalTensorsrcT srcTensor, const LocalTensoruint8_t sharedTmpBuffer, const LocalTensorsrcT scaleTensor, const srcT offset, const uint32_t scaleCount, const uint32_t calCount)template typename dstT, typename srcT, bool isReuseSource false __aicore__ inline void AscendQuant(const LocalTensordstT dstTensor, const LocalTensorsrcT srcTensor, const LocalTensoruint8_t sharedTmpBuffer, const LocalTensorsrcT scaleTensor, const LocalTensorsrcT offsetTensor, const uint32_t scaleCount, const uint32_t offsetCount, const uint32_t calCount)源操作数Tensor全部参与计算template typename dstT, typename srcT, bool isReuseSource false __aicore__ inline void AscendQuant(const LocalTensordstT dstTensor, const LocalTensorsrcT srcTensor, const LocalTensoruint8_t sharedTmpBuffer, const LocalTensorsrcT scaleTensor, const srcT offset)template typename dstT, typename srcT, bool isReuseSource false __aicore__ inline void AscendQuant(const LocalTensordstT dstTensor, const LocalTensorsrcT srcTensor, const LocalTensoruint8_t sharedTmpBuffer, const LocalTensorsrcT scaleTensor, const LocalTensorsrcT offsetTensor)接口框架申请临时空间源操作数Tensor全部/部分参与计算template typename dstT, typename srcT, bool isReuseSource false __aicore__ inline void AscendQuant(const LocalTensordstT dstTensor, const LocalTensorsrcT srcTensor, const LocalTensorsrcT scaleTensor, const srcT offset, const uint32_t scaleCount, const uint32_t calCount)template typename dstT, typename srcT, bool isReuseSource false __aicore__ inline void AscendQuant(const LocalTensordstT dstTensor, const LocalTensorsrcT srcTensor, const LocalTensorsrcT scaleTensor, const LocalTensorsrcT offsetTensor, const uint32_t scaleCount, const uint32_t offsetCount, const uint32_t calCount)源操作数Tensor全部参与计算template typename dstT, typename srcT, bool isReuseSource false __aicore__ inline void AscendQuant(const LocalTensordstT dstTensor, const LocalTensorsrcT srcTensor, const LocalTensorsrcT scaleTensor, const srcT offset)template typename dstT, typename srcT, bool isReuseSource false __aicore__ inline void AscendQuant(const LocalTensordstT dstTensor, const LocalTensorsrcT srcTensor, const LocalTensorsrcT scaleTensor, const LocalTensorsrcT offsetTensor)PER_TOKEN/PER_GROUP量化通过sharedTmpBuffer入参传入临时空间offset操作数类型为Tensortemplate typename dstT, typename srcT, typename scaleT, bool isReuseSource false, const AscendQuantConfig config, const AscendQuantPolicy policy __aicore__ inline void AscendQuant(const LocalTensordstT dstTensor, const LocalTensorsrcT srcTensor, const LocalTensoruint8_t sharedTmpBuffer, const LocalTensorscaleT scaleTensor, const LocalTensorscaleT offsetTensor, const AscendQuantParam para)offset操作数类型为scalartemplate typename dstT, typename srcT, typename scaleT, bool isReuseSource false, const AscendQuantConfig config, const AscendQuantPolicy policy __aicore__ inline void AscendQuant(const LocalTensordstT dstTensor, const LocalTensorsrcT srcTensor, const LocalTensoruint8_t sharedTmpBuffer, const LocalTensorscaleT scaleTensor,const scaleT offset, const AscendQuantParam para)接口框架申请临时空间offset操作数类型为Tensortemplate typename dstT, typename srcT, typename scaleT, bool isReuseSource false, const AscendQuantConfig config, const AscendQuantPolicy policy __aicore__ inline void AscendQuant(const LocalTensordstT dstTensor, const LocalTensorsrcT srcTensor, const LocalTensorscaleT scaleTensor, const LocalTensorscaleT offsetTensor, const AscendQuantParam para)offset操作数类型为scalartemplate typename dstT, typename srcT, typename scaleT, bool isReuseSource false, const AscendQuantConfig config, const AscendQuantPolicy policy __aicore__ inline void AscendQuant(const LocalTensordstT dstTensor, const LocalTensorsrcT srcTensor, const LocalTensorscaleT scaleTensor, const scaleT offset, const AscendQuantParam para)由于该接口的内部实现中涉及复杂的数学计算需要额外的临时空间来存储计算过程中的中间变量。临时空间支持接口框架申请和开发者通过sharedTmpBuffer入参传入两种方式。接口框架申请临时空间开发者无需申请但是需要预留临时空间的大小。通过sharedTmpBuffer入参传入使用该tensor作为临时空间进行处理接口框架不再申请。该方式开发者可以自行管理sharedTmpBuffer内存空间并在接口调用完成后复用该部分内存内存不会反复申请释放灵活性较高内存利用率也较高。接口框架申请的方式开发者需要预留临时空间通过sharedTmpBuffer传入的情况开发者需要为sharedTmpBuffer申请空间。临时空间大小BufferSize的获取方式如下通过GetAscendQuantMaxMinTmpSize中提供的GetAscendQuantMaxMinTmpSize接口获取需要预留空间的范围大小。需要注意的是在PER_TOKEN/PER_GROUP量化场景内部实现不需要临时空间Buffer对应的接口中sharedTmpBuffer为预留参数。参数说明表1模板参数说明参数名描述T操作数的数据类型。支持的数据类型为half、float。isReuseSource是否允许修改源操作数。该参数预留传入默认值false即可。config结构体模板参数此参数可选配AscendQuantConfig类型定义如下方代码所示其中参数的含义如下。calcCount实际计算数据元素个数。calcCount∈[0, srcTensor.GetSize()]在调用带有scaleCount入参的接口时calcCount若取非零值则必须是scaleCount的整数倍。offsetCount实际量化参数元素个数。offsetCount∈[0, offsetTensor.GetSize()]offsetCount与scaleCount的取值必须相等要求是32的整数倍。若调用的接口不含offsetCount入参取值为0即可。scaleCount实际量化参数元素个数。scaleCount∈[0, scaleTensor.GetSize()]要求是32的整数倍。若调用的接口不含scaleCount入参取值为0即可。workLocalSize临时缓存sharedTmpBuffer的大小sharedTmpBuffer的大小/workLocalSize的获取方式请参考GetAscendQuantMaxMinTmpSize。该参数取值不能大于sharedTmpBuffer的大小。若调用的接口不含sharedTmpBuffer入参取值为0即可。当上述参数的取值满足如下任一种场景将开启参数常量化即编译过程中使用常量化的相关参数从而减少Scalar计算。若调用的接口不含scaleCount入参calcCount和workLocalSize取值为非0时开启参数常量化。若调用的接口带有scaleCount入参scaleCount、calcCount和workLocalSize取值为非0时开启参数常量化。struct AscendQuantConfig { uint32_t calcCount 0; uint32_t offsetCount 0; uint32_t scaleCount 0; uint32_t workLocalSize 0; };默认参数的配置示例如下。constexpr AscendQuantConfig ASCEND_QUANT_DEFAULT_CFG {0, 0, 0, 0};表2dstTensor非固定数据类型的模板参数说明参数名描述dstT目的操作数的数据类型。支持的数据类型为int8_t、fp8_e4m3fn_t、fp8_e5m2_t、hifloat8_t、fp4x2_e1m2_t、fp4x2_e2m1_t。注意对于fp4x2_e1m2_t、fp4x2_e2m1_t数据类型仅在PER_GROUP场景下支持。srcT源操作数的数据类型。支持的数据类型为half、bfloat16_t、float。isReuseSource是否允许修改源操作数。该参数预留传入默认值false即可。表3PER_TOKEN/PER_GROUP场景特有模板参数说明参数名描述scaleT量化参数scale和offset的数据类型。支持的数据类型为half、bfloat16_t、float。config量化接口配置参数AscendQuantConfig类型定义如下方代码所示其中参数的含义如下。hasOffset量化参数offset是否参与计算。True表示offset参数参与计算。False表示offset参数不参与计算。kDimgroup的计算方向即k方向。仅在PER_GROUP场景有效支持的取值如下0k轴是第0轴即m方向为group的计算方向1k轴是第1轴即n方向为group的计算方向。roundMode量化过程中数据由高精度数据类型转换为低精度数据类型的舍入模式支持的取值有CAST_NONE、CAST_RINT、CAST_ROUND、CAST_FLOOR、CAST_CEIL、CAST_TRUNC、CAST_HYBRID各个舍入模式的详细介绍请参考精度转换规则。不同数据类型的量化支持不同的舍入模式当量化过程中使用了不支持的舍入模式时将回退到默认的舍入模式例如bfloat16_t数据类型量化为hifloat8_t数据类型时如果配置的roundMode为不支持的CAST_RINT实际执行量化时将回退到默认的roundModeCAST_ROUND。不同数据类型支持的舍入模式请见表4。policy量化策略配置参数AscendQuantPolicy枚举类型可取值如下PER_TENSOR预留参数暂不支持。PER_CHANNEL预留参数暂不支持。PER_TOKEN配置为PER_TOKEN场景。PER_GROUP配置为PER_GROUP场景。PER_CHANNEL_PER_GROUP预留参数暂不支持。PER_TOKEN_PER_GROUP预留参数暂不支持。struct AscendQuantConfig { bool hasOffset; int32_t kDim 1; RoundMode roundMode RoundMode::CAST_RINT; };表4PER_TOKEN/PER_GROUP场景支持的数据类型组合srcDtypescaleDtype/offsetDtypedstDtyperoundModehalfhalffp8_e5m2_t/fp8_e4m3fn_tCAST_RINT默认bfloat16_tbfloat16_tfp8_e5m2_t/fp8_e4m3fn_tCAST_RINT默认floatfloatfp8_e5m2_t/fp8_e4m3fn_tCAST_RINT默认halffloatfp8_e5m2_t/fp8_e4m3fn_tCAST_RINT默认bfloat16_tfloatfp8_e5m2_t/fp8_e4m3fn_tCAST_RINT默认halfhalfhifloat8_tCAST_ROUND默认CAST_HYBRIDbfloat16_tbfloat16_thifloat8_tCAST_ROUND默认CAST_HYBRIDfloatfloathifloat8_tCAST_ROUND默认CAST_HYBRIDhalffloathifloat8_tCAST_ROUND默认CAST_HYBRIDbfloat16_tfloathifloat8_tCAST_ROUND默认CAST_HYBRIDhalfhalfint8_tCAST_RINT默认CAST_ROUNDCAST_FLOORCAST_CEILCAST_TRUNCbfloat16_tbfloat16_tint8_tCAST_RINT默认CAST_ROUNDCAST_FLOORCAST_CEILCAST_TRUNCfloatfloatint8_tCAST_RINT默认CAST_ROUNDCAST_FLOORCAST_CEILCAST_TRUNChalffloatint8_tCAST_RINT默认CAST_ROUNDCAST_FLOORCAST_CEILCAST_TRUNCbfloat16_tfloatint8_tCAST_RINT默认CAST_ROUNDCAST_FLOORCAST_CEILCAST_TRUNChalfhalffp4x2_e1m2_t/fp4x2_e2m1_t当前均只支持PER_GROUP场景CAST_RINT默认CAST_ROUNDCAST_FLOORCAST_CEILCAST_TRUNChalffloatfp4x2_e1m2_t/fp4x2_e2m1_t当前均只支持PER_GROUP场景CAST_RINT默认CAST_ROUNDCAST_FLOORCAST_CEILCAST_TRUNCbfloat16_tbfloat16_tfp4x2_e1m2_t/fp4x2_e2m1_t当前均只支持PER_GROUP场景CAST_RINT默认CAST_ROUNDCAST_FLOORCAST_CEILCAST_TRUNCbfloat16_tfloatfp4x2_e1m2_t/fp4x2_e2m1_t当前均只支持PER_GROUP场景CAST_RINT默认CAST_ROUNDCAST_FLOORCAST_CEILCAST_TRUNC表5PER_TENSOR接口参数说明参数名输入/输出描述dstTensor输出目的操作数。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。srcTensor输入源操作数。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。sharedTmpBuffer输入临时缓存。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。临时空间大小BufferSize的获取方式请参考GetAscendQuantMaxMinTmpSize。scale输入量化参数。类型为Scalar支持的数据类型为float。offset输入量化参数。类型为Scalar支持的数据类型为float。calCount输入参与计算的元素个数。表6PER_CHANNEL接口参数说明参数名输入/输出描述dstTensor输出目的操作数。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。srcTensor输入源操作数。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。sharedTmpBuffer输入临时缓存。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。临时空间大小BufferSize的获取方式请参考GetAscendQuantMaxMinTmpSize。scaleTensor输入量化参数。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。offsetTensor输入量化参数。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。scaleCount输入实际量化参数元素个数且scaleCount∈[0, min(scaleTensor.GetSize(),dstTensor.GetSize())]要求是32的整数倍。offsetCount输入实际量化参数元素个数且offsetCount∈[0, min(offsetTensor.GetSize(),dstTensor.GetSize())]并且和scaleCount必须相等要求是32的整数倍。calCount输入参与计算的元素个数。calCount必须是scaleCount的整数倍。表7PER_TOKEN/PER_GROUP接口参数说明参数名输入/输出描述dstTensor输出目的操作数。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。srcTensor输入源操作数。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。sharedTmpBuffer输入临时缓存。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。临时空间大小BufferSize的获取方式请参考GetAscendQuantMaxMinTmpSize。scaleTensor输入量化参数scale。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。offsetTensor/offset输入量化参数offset。offsetTensor类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。offset类型为Scalar。数据类型和scaleTensor保持一致。对于float4场景offsetTensor/offset不生效。para输入量化接口的参数AscendQuantParam类型定义如下方代码所示其中参数的含义如下。mm方向元素个数。nn方向元素个数。n值对应的数据大小需满足32B对齐的要求即shape最后一维为n的输入输出均需要满足该维度上32B对齐的要求。calCount:参与计算的元素个数。calCount必须是n的整数倍。groupSizePER_GROUP场景有效表示groupSize行/列数据共用一个scale/offset。groupSize的取值必须大于0且是32的整倍数。struct AscendQuantParam { uint32_t m; uint32_t n; uint32_t calCount; uint32_t groupSize 0; };返回值说明无约束说明源操作数与目的操作数可以复用。操作数地址对齐要求请参见通用地址对齐约束。输入输出操作数参与计算的数据长度要求32B对齐。当Scale为float类型时其取值范围仍为half类型的取值范围。dstTensor非固定数据类型的函数原型支持情况如下Ascend 950PR/Ascend 950DT支持。Atlas A3 训练系列产品/Atlas A3 推理系列产品不支持。Atlas A2 训练系列产品/Atlas A2 推理系列产品不支持。Atlas 推理系列产品AI Core不支持。Atlas 训练系列产品不支持。Atlas 训练系列产品仅支持PER_TENSOR量化不支持PER_CHANNEL量化、PER_TOKEN量化、PER_GROUP量化。PER_TOKEN/PER_GROUP量化场景支持情况如下Ascend 950PR/Ascend 950DT支持。Atlas A3 训练系列产品/Atlas A3 推理系列产品不支持。Atlas A2 训练系列产品/Atlas A2 推理系列产品不支持。Atlas 推理系列产品AI Core不支持。Atlas 训练系列产品不支持。PER_TOKEN/PER_GROUP场景连续计算方向即n方向的数据量要求32B对齐。调用示例PER_TENSOR量化场景调用示例如下// dstLocal: 存放量化计算的结果Tensorshape为1024 // srcLocal: 存放量化计算的输入Tensorshape为1024类型为float/half // sharedTmpBuffer: 存放量化计算过程中临时缓存的Tensor const float scale 0.02; // 量化参数 const float offset 0.9; // 量化参数dstLocal[i] srcLocal[i] * scale offset uint32_t calCount 1022; // srcTensor的前calCount个元素参与计算 // dstTensor为int8_t数据类型通过sharedTmpBuffer入参传入临时空间 AscendC::AscendQuantsrcType(dstLocal, srcLocal, sharedTmpBuffer, scale, offset, calCount); // dstTensor非固定数据类型 AscendC::AscendQuantdstType, srcType(dstLocal, srcLocal, scale, offset, calCount);结果示例如下输入数据srcLocal: [-512. -511. -510. ... 509. 510. 511.] 输入量化参数scale: 0.02 输入量化参数offset: 0.9 输出数据dstLocal: [-9 -9 -9 ... 11 51. 51.1]PER_CHANNEL量化场景调用示例如下// dstLocal: 存放量化计算的结果Tensorshape为1024 // srcLocal: 存放量化计算的输入Tensorshape为1024类型为float/half // scaleLocal存放量化参数的输入Tensor // offsetLocal存放量化参数的输入Tensor // sharedTmpBuffer: 存放量化计算过程中临时缓存的Tensor uint32_t scaleCount 64; // 量化参数要求是32的整数倍 uint32_t offsetCount 64; // 量化参数要求与scaleCount相等 uint32_t calCount 1022; // srcTensor的前calCount个元素参与计算 // dstTensor为int8_t数据类型通过sharedTmpBuffer入参传入临时空间 AscendC::AscendQuantsrcType( dstLocal, srcLocal, sharedTmpBuffer, scaleLocal, offsetLocal, scaleCount, offsetCount, calCount); // dstTensor非固定数据类型 AscendC::AscendQuantdstType, srcType(dstLocal, srcLocal, scaleLocal, offsetLocal, scaleCount, offsetCount, calCount);结果示例如下输入数据srcLocal: [-512. -511. -510. ... 509. 510. 511.] 输入量化参数scale: [0.02 0.02 0.02 ... 0.02] 输入量化参数offset: [1.01 1.02 1.03 ... 1.32] 输出数据dstLocal: [-9 -9 -9 ... 11 510. 511.]PER_TOKEN/PER_GROUP场景调用示例如下。未配置参数AscendQuantConfig的舍入模式roundMode使用默认配置RoundMode::CAST_RINT。// 注意m,n需从外部传入 constexpr static bool isReuseSource false; constexpr static AscendQuantConfig config {has_offset, 1}; constexpr static AscendQuantPolicy policy AscendQuantPolicy::PER_TOKEN; // 可修改枚举值以开启PER_GROUP LocalTensoruint8_t sharedTmpBuffer inQueue.AllocTensoruint8_t(); AscendQuantParam para; para.m m; para.n n; para.calCount calCount; AscendQuantdstType, srcType, scaleType, isReuseSource, config, policy( dstLocal, srcLocal, sharedTmpBuffer, scaleLocal, offsetLocal, para);主动配置参数AscendQuantConfig的舍入模式roundMode。// 注意m,n需从外部传入 constexpr static bool isReuseSource false; constexpr static AscendQuantConfig config {has_offset, 1, RoundMode::CAST_ROUND}; constexpr static AscendQuantPolicy policy AscendQuantPolicy::PER_TOKEN; // 可修改枚举值以开启PER_GROUP LocalTensoruint8_t sharedTmpBuffer inQueue.AllocTensoruint8_t(); AscendQuantParam para; para.m m; para.n n; para.calCount calCount; AscendQuantdstType, srcType, scaleType, isReuseSource, config, policy( dstLocal, srcLocal, sharedTmpBuffer, scaleLocal, offsetLocal, para);【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
CANN Ascend量化API文档
AscendQuant【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit产品支持情况Ascend 950PR/Ascend 950DT支持Atlas A3 训练系列产品/Atlas A3 推理系列产品支持Atlas A2 训练系列产品/Atlas A2 推理系列产品支持Atlas 200I/500 A2 推理产品不支持Atlas 推理系列产品AI Core支持Atlas 推理系列产品Vector Core不支持Atlas 训练系列产品支持Kirin X90支持Kirin 9030支持功能说明按元素做量化计算比如将half/float数据类型量化为int8_t数据类型。计算公式如下round表示四舍六入五成双取整cast表示舍入模式PER_TENSOR量化整个srcTensor对应一个量化参数量化参数的shape为[1]。PER_CHANNEL量化srcTensor的shape为[m, n],每个channel维度对应一个量化参数量化参数的shape为[n]。PER_TOKEN量化srcTensor的每组tokentoken为n方向共有m组token中的元素共享一组scale和offset参数srcTensor的shape为[m, n]时scale和offset的shape为[m, 1]。offset是可选输入。PER_GROUP量化这里定义group的计算方向为k方向srcTensor在k方向上每groupSize个元素共享一组scale和offset。srcTensor的shape为[m, n]时如果kDim0表示k是m方向scale和offset的shape为[(m groupSize - 1) / groupSize, n]如果kDim1表示k是n方向scale和offset的shape为[m(n groupSize - 1) / groupSize]。offset是可选输入。根据输出数据类型的不同当前PER_GROUP分为两种场景fp4x2_e2m1_t/fp4x2_e1m2_t场景后续内容中简称为float4场景和int8_t/hifloat8_t/fp8_e5m2_t/fp8_e4m3fn_t场景后续内容中简称为b8场景。fp4x2_e2m1_t/float4_e1m2场景float4场景kDim 0:kDim 1:int8_t/hifloat8_t/fp8_e5m2_t/fp8_e4m3fn_t场景b8场景kDim0kDim1实现原理图1AscendQuant算法框图scale和offset都是scalar图2AscendQuant算法框图scale和offset都是Tensor图3AscendQuant算法框图scale是Tensoroffset是Scalar如上图所示是AscendQuant内部算法框图计算过程大致描述为如下几步均在Vector上进行精度转换当输入的srcscale或者offset是float类型时将其转换为half类型broadcast当输入的scale或者offset是向量时将其broadcast成和src相同维度计算scale当src和scale为向量时做Mul计算当scale是scalar时做Muls计算得到Tmp1计算offset当Tmp1和offset为向量时做Add计算当offset是scalar时做Adds计算得到Tmp2精度转换将Tmp2从half转换成int8_t类型得到output。图4AscendQuant算法框图PER_TOKEN/PER_GROUP场景scale和offset都是tensor图5AscendQuant算法框图PER_TOKEN/PER_GROUP场景scale是tensoroffset是scalarPER_TOKEN/PER_GROUP场景的计算逻辑如下读取数据连续读取输入src根据不同的场景对输入scale和offset采用不同的读取方式例如PER_TOKEN场景做Broadcast处理PER_GROUP场景做Gather处理精度转换根据不同输入的数据类型组合对src/scale/offset进行相应的数据类型转换计算对类型转换后的数据做乘加操作精度转换将上述乘加操作得到的计算结果转换成dstT类型得到最终输出。函数原型dstTensor为int8_t数据类型PER_TENSOR量化通过sharedTmpBuffer入参传入临时空间源操作数Tensor全部/部分参与计算template typename T, bool isReuseSource false, const AscendQuantConfig config ASCEND_QUANT_DEFAULT_CFG __aicore__ inline void AscendQuant(const LocalTensorint8_t dstTensor, const LocalTensorT srcTensor, const LocalTensoruint8_t sharedTmpBuffer, const float scale, const float offset, const uint32_t calCount)源操作数Tensor全部参与计算template typename T, bool isReuseSource false, const AscendQuantConfig config ASCEND_QUANT_DEFAULT_CFG __aicore__ inline void AscendQuant(const LocalTensorint8_t dstTensor, const LocalTensorT srcTensor, const LocalTensoruint8_t sharedTmpBuffer, const float scale, const float offset)接口框架申请临时空间源操作数Tensor全部/部分参与计算template typename T, bool isReuseSource false, const AscendQuantConfig config ASCEND_QUANT_DEFAULT_CFG __aicore__ inline void AscendQuant(const LocalTensorint8_t dstTensor, const LocalTensorT srcTensor, const float scale, const float offset, const uint32_t calCount)源操作数Tensor全部参与计算template typename T, bool isReuseSource false, const AscendQuantConfig config ASCEND_QUANT_DEFAULT_CFG __aicore__ inline void AscendQuant(const LocalTensorint8_t dstTensor, const LocalTensorT srcTensor, const float scale, const float offset)PER_CHANNEL量化通过sharedTmpBuffer入参传入临时空间源操作数Tensor全部/部分参与计算template typename T, bool isReuseSource false, const AscendQuantConfig config ASCEND_QUANT_DEFAULT_CFG __aicore__ inline void AscendQuant(const LocalTensorint8_t dstTensor, const LocalTensorT srcTensor, const LocalTensoruint8_t sharedTmpBuffer, const LocalTensorT scaleTensor, const T offset, const uint32_t scaleCount, const uint32_t calCount)template typename T, bool isReuseSource false, const AscendQuantConfig config ASCEND_QUANT_DEFAULT_CFG __aicore__ inline void AscendQuant(const LocalTensorint8_t dstTensor, const LocalTensorT srcTensor, const LocalTensoruint8_t sharedTmpBuffer, const LocalTensorT scaleTensor, const LocalTensorT offsetTensor, const uint32_t scaleCount, const uint32_t offsetCount, const uint32_t calCount)源操作数Tensor全部参与计算template typename T, bool isReuseSource false, const AscendQuantConfig config ASCEND_QUANT_DEFAULT_CFG __aicore__ inline void AscendQuant(const LocalTensorint8_t dstTensor, const LocalTensorT srcTensor, const LocalTensoruint8_t sharedTmpBuffer, const LocalTensorT scaleTensor, const T offset)template typename T, bool isReuseSource false, const AscendQuantConfig config ASCEND_QUANT_DEFAULT_CFG __aicore__ inline void AscendQuant(const LocalTensorint8_t dstTensor, const LocalTensorT srcTensor, const LocalTensoruint8_t sharedTmpBuffer, const LocalTensorT scaleTensor, const LocalTensorT offsetTensor)接口框架申请临时空间源操作数Tensor全部/部分参与计算template typename T, bool isReuseSource false, const AscendQuantConfig config ASCEND_QUANT_DEFAULT_CFG __aicore__ inline void AscendQuant(const LocalTensorint8_t dstTensor, const LocalTensorT srcTensor, const LocalTensorT scaleTensor, const T offset, const uint32_t scaleCount, const uint32_t calCount)template typename T, bool isReuseSource false, const AscendQuantConfig config ASCEND_QUANT_DEFAULT_CFG __aicore__ inline void AscendQuant(const LocalTensorint8_t dstTensor, const LocalTensorT srcTensor, const LocalTensorT scaleTensor, const LocalTensorT offsetTensor, const uint32_t scaleCount, const uint32_t offsetCount, const uint32_t calCount)源操作数Tensor全部参与计算template typename T, bool isReuseSource false, const AscendQuantConfig config ASCEND_QUANT_DEFAULT_CFG __aicore__ inline void AscendQuant(const LocalTensorint8_t dstTensor, const LocalTensorT srcTensor, const LocalTensorT scaleTensor, const T offset)template typename T, bool isReuseSource false, const AscendQuantConfig config ASCEND_QUANT_DEFAULT_CFG __aicore__ inline void AscendQuant(const LocalTensorint8_t dstTensor, const LocalTensorT srcTensor, const LocalTensorT scaleTensor, const LocalTensorT offsetTensor)dstTensor非固定数据类型仅支持Ascend 950PR/Ascend 950DT。PER_TENSOR量化通过sharedTmpBuffer入参传入临时空间源操作数Tensor全部/部分参与计算template typename dstT, typename srcT, bool isReuseSource false __aicore__ inline void AscendQuant(const LocalTensordstT dstTensor, const LocalTensorsrcT srcTensor, const LocalTensoruint8_t sharedTmpBuffer, const float scale, const float offset, const uint32_t calCount)源操作数Tensor全部参与计算template typename dstT, typename srcT, bool isReuseSource false __aicore__ inline void AscendQuant(const LocalTensordstT dstTensor, const LocalTensorsrcT srcTensor, const LocalTensoruint8_t sharedTmpBuffer, const float scale, const float offset)接口框架申请临时空间源操作数Tensor全部/部分参与计算template typename dstT, typename srcT, bool isReuseSource false __aicore__ inline void AscendQuant(const LocalTensordstT dstTensor, const LocalTensorsrcT srcTensor, const float scale, const float offset, const uint32_t calCount)源操作数Tensor全部参与计算template typename dstT, typename srcT, bool isReuseSource false __aicore__ inline void AscendQuant(const LocalTensordstT dstTensor, const LocalTensorsrcT srcTensor, const float scale, const float offset)PER_CHANNEL量化通过sharedTmpBuffer入参传入临时空间源操作数Tensor全部/部分参与计算template typename dstT, typename srcT, bool isReuseSource false __aicore__ inline void AscendQuant(const LocalTensordstT dstTensor, const LocalTensorsrcT srcTensor, const LocalTensoruint8_t sharedTmpBuffer, const LocalTensorsrcT scaleTensor, const srcT offset, const uint32_t scaleCount, const uint32_t calCount)template typename dstT, typename srcT, bool isReuseSource false __aicore__ inline void AscendQuant(const LocalTensordstT dstTensor, const LocalTensorsrcT srcTensor, const LocalTensoruint8_t sharedTmpBuffer, const LocalTensorsrcT scaleTensor, const LocalTensorsrcT offsetTensor, const uint32_t scaleCount, const uint32_t offsetCount, const uint32_t calCount)源操作数Tensor全部参与计算template typename dstT, typename srcT, bool isReuseSource false __aicore__ inline void AscendQuant(const LocalTensordstT dstTensor, const LocalTensorsrcT srcTensor, const LocalTensoruint8_t sharedTmpBuffer, const LocalTensorsrcT scaleTensor, const srcT offset)template typename dstT, typename srcT, bool isReuseSource false __aicore__ inline void AscendQuant(const LocalTensordstT dstTensor, const LocalTensorsrcT srcTensor, const LocalTensoruint8_t sharedTmpBuffer, const LocalTensorsrcT scaleTensor, const LocalTensorsrcT offsetTensor)接口框架申请临时空间源操作数Tensor全部/部分参与计算template typename dstT, typename srcT, bool isReuseSource false __aicore__ inline void AscendQuant(const LocalTensordstT dstTensor, const LocalTensorsrcT srcTensor, const LocalTensorsrcT scaleTensor, const srcT offset, const uint32_t scaleCount, const uint32_t calCount)template typename dstT, typename srcT, bool isReuseSource false __aicore__ inline void AscendQuant(const LocalTensordstT dstTensor, const LocalTensorsrcT srcTensor, const LocalTensorsrcT scaleTensor, const LocalTensorsrcT offsetTensor, const uint32_t scaleCount, const uint32_t offsetCount, const uint32_t calCount)源操作数Tensor全部参与计算template typename dstT, typename srcT, bool isReuseSource false __aicore__ inline void AscendQuant(const LocalTensordstT dstTensor, const LocalTensorsrcT srcTensor, const LocalTensorsrcT scaleTensor, const srcT offset)template typename dstT, typename srcT, bool isReuseSource false __aicore__ inline void AscendQuant(const LocalTensordstT dstTensor, const LocalTensorsrcT srcTensor, const LocalTensorsrcT scaleTensor, const LocalTensorsrcT offsetTensor)PER_TOKEN/PER_GROUP量化通过sharedTmpBuffer入参传入临时空间offset操作数类型为Tensortemplate typename dstT, typename srcT, typename scaleT, bool isReuseSource false, const AscendQuantConfig config, const AscendQuantPolicy policy __aicore__ inline void AscendQuant(const LocalTensordstT dstTensor, const LocalTensorsrcT srcTensor, const LocalTensoruint8_t sharedTmpBuffer, const LocalTensorscaleT scaleTensor, const LocalTensorscaleT offsetTensor, const AscendQuantParam para)offset操作数类型为scalartemplate typename dstT, typename srcT, typename scaleT, bool isReuseSource false, const AscendQuantConfig config, const AscendQuantPolicy policy __aicore__ inline void AscendQuant(const LocalTensordstT dstTensor, const LocalTensorsrcT srcTensor, const LocalTensoruint8_t sharedTmpBuffer, const LocalTensorscaleT scaleTensor,const scaleT offset, const AscendQuantParam para)接口框架申请临时空间offset操作数类型为Tensortemplate typename dstT, typename srcT, typename scaleT, bool isReuseSource false, const AscendQuantConfig config, const AscendQuantPolicy policy __aicore__ inline void AscendQuant(const LocalTensordstT dstTensor, const LocalTensorsrcT srcTensor, const LocalTensorscaleT scaleTensor, const LocalTensorscaleT offsetTensor, const AscendQuantParam para)offset操作数类型为scalartemplate typename dstT, typename srcT, typename scaleT, bool isReuseSource false, const AscendQuantConfig config, const AscendQuantPolicy policy __aicore__ inline void AscendQuant(const LocalTensordstT dstTensor, const LocalTensorsrcT srcTensor, const LocalTensorscaleT scaleTensor, const scaleT offset, const AscendQuantParam para)由于该接口的内部实现中涉及复杂的数学计算需要额外的临时空间来存储计算过程中的中间变量。临时空间支持接口框架申请和开发者通过sharedTmpBuffer入参传入两种方式。接口框架申请临时空间开发者无需申请但是需要预留临时空间的大小。通过sharedTmpBuffer入参传入使用该tensor作为临时空间进行处理接口框架不再申请。该方式开发者可以自行管理sharedTmpBuffer内存空间并在接口调用完成后复用该部分内存内存不会反复申请释放灵活性较高内存利用率也较高。接口框架申请的方式开发者需要预留临时空间通过sharedTmpBuffer传入的情况开发者需要为sharedTmpBuffer申请空间。临时空间大小BufferSize的获取方式如下通过GetAscendQuantMaxMinTmpSize中提供的GetAscendQuantMaxMinTmpSize接口获取需要预留空间的范围大小。需要注意的是在PER_TOKEN/PER_GROUP量化场景内部实现不需要临时空间Buffer对应的接口中sharedTmpBuffer为预留参数。参数说明表1模板参数说明参数名描述T操作数的数据类型。支持的数据类型为half、float。isReuseSource是否允许修改源操作数。该参数预留传入默认值false即可。config结构体模板参数此参数可选配AscendQuantConfig类型定义如下方代码所示其中参数的含义如下。calcCount实际计算数据元素个数。calcCount∈[0, srcTensor.GetSize()]在调用带有scaleCount入参的接口时calcCount若取非零值则必须是scaleCount的整数倍。offsetCount实际量化参数元素个数。offsetCount∈[0, offsetTensor.GetSize()]offsetCount与scaleCount的取值必须相等要求是32的整数倍。若调用的接口不含offsetCount入参取值为0即可。scaleCount实际量化参数元素个数。scaleCount∈[0, scaleTensor.GetSize()]要求是32的整数倍。若调用的接口不含scaleCount入参取值为0即可。workLocalSize临时缓存sharedTmpBuffer的大小sharedTmpBuffer的大小/workLocalSize的获取方式请参考GetAscendQuantMaxMinTmpSize。该参数取值不能大于sharedTmpBuffer的大小。若调用的接口不含sharedTmpBuffer入参取值为0即可。当上述参数的取值满足如下任一种场景将开启参数常量化即编译过程中使用常量化的相关参数从而减少Scalar计算。若调用的接口不含scaleCount入参calcCount和workLocalSize取值为非0时开启参数常量化。若调用的接口带有scaleCount入参scaleCount、calcCount和workLocalSize取值为非0时开启参数常量化。struct AscendQuantConfig { uint32_t calcCount 0; uint32_t offsetCount 0; uint32_t scaleCount 0; uint32_t workLocalSize 0; };默认参数的配置示例如下。constexpr AscendQuantConfig ASCEND_QUANT_DEFAULT_CFG {0, 0, 0, 0};表2dstTensor非固定数据类型的模板参数说明参数名描述dstT目的操作数的数据类型。支持的数据类型为int8_t、fp8_e4m3fn_t、fp8_e5m2_t、hifloat8_t、fp4x2_e1m2_t、fp4x2_e2m1_t。注意对于fp4x2_e1m2_t、fp4x2_e2m1_t数据类型仅在PER_GROUP场景下支持。srcT源操作数的数据类型。支持的数据类型为half、bfloat16_t、float。isReuseSource是否允许修改源操作数。该参数预留传入默认值false即可。表3PER_TOKEN/PER_GROUP场景特有模板参数说明参数名描述scaleT量化参数scale和offset的数据类型。支持的数据类型为half、bfloat16_t、float。config量化接口配置参数AscendQuantConfig类型定义如下方代码所示其中参数的含义如下。hasOffset量化参数offset是否参与计算。True表示offset参数参与计算。False表示offset参数不参与计算。kDimgroup的计算方向即k方向。仅在PER_GROUP场景有效支持的取值如下0k轴是第0轴即m方向为group的计算方向1k轴是第1轴即n方向为group的计算方向。roundMode量化过程中数据由高精度数据类型转换为低精度数据类型的舍入模式支持的取值有CAST_NONE、CAST_RINT、CAST_ROUND、CAST_FLOOR、CAST_CEIL、CAST_TRUNC、CAST_HYBRID各个舍入模式的详细介绍请参考精度转换规则。不同数据类型的量化支持不同的舍入模式当量化过程中使用了不支持的舍入模式时将回退到默认的舍入模式例如bfloat16_t数据类型量化为hifloat8_t数据类型时如果配置的roundMode为不支持的CAST_RINT实际执行量化时将回退到默认的roundModeCAST_ROUND。不同数据类型支持的舍入模式请见表4。policy量化策略配置参数AscendQuantPolicy枚举类型可取值如下PER_TENSOR预留参数暂不支持。PER_CHANNEL预留参数暂不支持。PER_TOKEN配置为PER_TOKEN场景。PER_GROUP配置为PER_GROUP场景。PER_CHANNEL_PER_GROUP预留参数暂不支持。PER_TOKEN_PER_GROUP预留参数暂不支持。struct AscendQuantConfig { bool hasOffset; int32_t kDim 1; RoundMode roundMode RoundMode::CAST_RINT; };表4PER_TOKEN/PER_GROUP场景支持的数据类型组合srcDtypescaleDtype/offsetDtypedstDtyperoundModehalfhalffp8_e5m2_t/fp8_e4m3fn_tCAST_RINT默认bfloat16_tbfloat16_tfp8_e5m2_t/fp8_e4m3fn_tCAST_RINT默认floatfloatfp8_e5m2_t/fp8_e4m3fn_tCAST_RINT默认halffloatfp8_e5m2_t/fp8_e4m3fn_tCAST_RINT默认bfloat16_tfloatfp8_e5m2_t/fp8_e4m3fn_tCAST_RINT默认halfhalfhifloat8_tCAST_ROUND默认CAST_HYBRIDbfloat16_tbfloat16_thifloat8_tCAST_ROUND默认CAST_HYBRIDfloatfloathifloat8_tCAST_ROUND默认CAST_HYBRIDhalffloathifloat8_tCAST_ROUND默认CAST_HYBRIDbfloat16_tfloathifloat8_tCAST_ROUND默认CAST_HYBRIDhalfhalfint8_tCAST_RINT默认CAST_ROUNDCAST_FLOORCAST_CEILCAST_TRUNCbfloat16_tbfloat16_tint8_tCAST_RINT默认CAST_ROUNDCAST_FLOORCAST_CEILCAST_TRUNCfloatfloatint8_tCAST_RINT默认CAST_ROUNDCAST_FLOORCAST_CEILCAST_TRUNChalffloatint8_tCAST_RINT默认CAST_ROUNDCAST_FLOORCAST_CEILCAST_TRUNCbfloat16_tfloatint8_tCAST_RINT默认CAST_ROUNDCAST_FLOORCAST_CEILCAST_TRUNChalfhalffp4x2_e1m2_t/fp4x2_e2m1_t当前均只支持PER_GROUP场景CAST_RINT默认CAST_ROUNDCAST_FLOORCAST_CEILCAST_TRUNChalffloatfp4x2_e1m2_t/fp4x2_e2m1_t当前均只支持PER_GROUP场景CAST_RINT默认CAST_ROUNDCAST_FLOORCAST_CEILCAST_TRUNCbfloat16_tbfloat16_tfp4x2_e1m2_t/fp4x2_e2m1_t当前均只支持PER_GROUP场景CAST_RINT默认CAST_ROUNDCAST_FLOORCAST_CEILCAST_TRUNCbfloat16_tfloatfp4x2_e1m2_t/fp4x2_e2m1_t当前均只支持PER_GROUP场景CAST_RINT默认CAST_ROUNDCAST_FLOORCAST_CEILCAST_TRUNC表5PER_TENSOR接口参数说明参数名输入/输出描述dstTensor输出目的操作数。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。srcTensor输入源操作数。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。sharedTmpBuffer输入临时缓存。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。临时空间大小BufferSize的获取方式请参考GetAscendQuantMaxMinTmpSize。scale输入量化参数。类型为Scalar支持的数据类型为float。offset输入量化参数。类型为Scalar支持的数据类型为float。calCount输入参与计算的元素个数。表6PER_CHANNEL接口参数说明参数名输入/输出描述dstTensor输出目的操作数。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。srcTensor输入源操作数。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。sharedTmpBuffer输入临时缓存。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。临时空间大小BufferSize的获取方式请参考GetAscendQuantMaxMinTmpSize。scaleTensor输入量化参数。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。offsetTensor输入量化参数。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。scaleCount输入实际量化参数元素个数且scaleCount∈[0, min(scaleTensor.GetSize(),dstTensor.GetSize())]要求是32的整数倍。offsetCount输入实际量化参数元素个数且offsetCount∈[0, min(offsetTensor.GetSize(),dstTensor.GetSize())]并且和scaleCount必须相等要求是32的整数倍。calCount输入参与计算的元素个数。calCount必须是scaleCount的整数倍。表7PER_TOKEN/PER_GROUP接口参数说明参数名输入/输出描述dstTensor输出目的操作数。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。srcTensor输入源操作数。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。sharedTmpBuffer输入临时缓存。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。临时空间大小BufferSize的获取方式请参考GetAscendQuantMaxMinTmpSize。scaleTensor输入量化参数scale。类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。offsetTensor/offset输入量化参数offset。offsetTensor类型为LocalTensor支持的TPosition为VECIN/VECCALC/VECOUT。offset类型为Scalar。数据类型和scaleTensor保持一致。对于float4场景offsetTensor/offset不生效。para输入量化接口的参数AscendQuantParam类型定义如下方代码所示其中参数的含义如下。mm方向元素个数。nn方向元素个数。n值对应的数据大小需满足32B对齐的要求即shape最后一维为n的输入输出均需要满足该维度上32B对齐的要求。calCount:参与计算的元素个数。calCount必须是n的整数倍。groupSizePER_GROUP场景有效表示groupSize行/列数据共用一个scale/offset。groupSize的取值必须大于0且是32的整倍数。struct AscendQuantParam { uint32_t m; uint32_t n; uint32_t calCount; uint32_t groupSize 0; };返回值说明无约束说明源操作数与目的操作数可以复用。操作数地址对齐要求请参见通用地址对齐约束。输入输出操作数参与计算的数据长度要求32B对齐。当Scale为float类型时其取值范围仍为half类型的取值范围。dstTensor非固定数据类型的函数原型支持情况如下Ascend 950PR/Ascend 950DT支持。Atlas A3 训练系列产品/Atlas A3 推理系列产品不支持。Atlas A2 训练系列产品/Atlas A2 推理系列产品不支持。Atlas 推理系列产品AI Core不支持。Atlas 训练系列产品不支持。Atlas 训练系列产品仅支持PER_TENSOR量化不支持PER_CHANNEL量化、PER_TOKEN量化、PER_GROUP量化。PER_TOKEN/PER_GROUP量化场景支持情况如下Ascend 950PR/Ascend 950DT支持。Atlas A3 训练系列产品/Atlas A3 推理系列产品不支持。Atlas A2 训练系列产品/Atlas A2 推理系列产品不支持。Atlas 推理系列产品AI Core不支持。Atlas 训练系列产品不支持。PER_TOKEN/PER_GROUP场景连续计算方向即n方向的数据量要求32B对齐。调用示例PER_TENSOR量化场景调用示例如下// dstLocal: 存放量化计算的结果Tensorshape为1024 // srcLocal: 存放量化计算的输入Tensorshape为1024类型为float/half // sharedTmpBuffer: 存放量化计算过程中临时缓存的Tensor const float scale 0.02; // 量化参数 const float offset 0.9; // 量化参数dstLocal[i] srcLocal[i] * scale offset uint32_t calCount 1022; // srcTensor的前calCount个元素参与计算 // dstTensor为int8_t数据类型通过sharedTmpBuffer入参传入临时空间 AscendC::AscendQuantsrcType(dstLocal, srcLocal, sharedTmpBuffer, scale, offset, calCount); // dstTensor非固定数据类型 AscendC::AscendQuantdstType, srcType(dstLocal, srcLocal, scale, offset, calCount);结果示例如下输入数据srcLocal: [-512. -511. -510. ... 509. 510. 511.] 输入量化参数scale: 0.02 输入量化参数offset: 0.9 输出数据dstLocal: [-9 -9 -9 ... 11 51. 51.1]PER_CHANNEL量化场景调用示例如下// dstLocal: 存放量化计算的结果Tensorshape为1024 // srcLocal: 存放量化计算的输入Tensorshape为1024类型为float/half // scaleLocal存放量化参数的输入Tensor // offsetLocal存放量化参数的输入Tensor // sharedTmpBuffer: 存放量化计算过程中临时缓存的Tensor uint32_t scaleCount 64; // 量化参数要求是32的整数倍 uint32_t offsetCount 64; // 量化参数要求与scaleCount相等 uint32_t calCount 1022; // srcTensor的前calCount个元素参与计算 // dstTensor为int8_t数据类型通过sharedTmpBuffer入参传入临时空间 AscendC::AscendQuantsrcType( dstLocal, srcLocal, sharedTmpBuffer, scaleLocal, offsetLocal, scaleCount, offsetCount, calCount); // dstTensor非固定数据类型 AscendC::AscendQuantdstType, srcType(dstLocal, srcLocal, scaleLocal, offsetLocal, scaleCount, offsetCount, calCount);结果示例如下输入数据srcLocal: [-512. -511. -510. ... 509. 510. 511.] 输入量化参数scale: [0.02 0.02 0.02 ... 0.02] 输入量化参数offset: [1.01 1.02 1.03 ... 1.32] 输出数据dstLocal: [-9 -9 -9 ... 11 510. 511.]PER_TOKEN/PER_GROUP场景调用示例如下。未配置参数AscendQuantConfig的舍入模式roundMode使用默认配置RoundMode::CAST_RINT。// 注意m,n需从外部传入 constexpr static bool isReuseSource false; constexpr static AscendQuantConfig config {has_offset, 1}; constexpr static AscendQuantPolicy policy AscendQuantPolicy::PER_TOKEN; // 可修改枚举值以开启PER_GROUP LocalTensoruint8_t sharedTmpBuffer inQueue.AllocTensoruint8_t(); AscendQuantParam para; para.m m; para.n n; para.calCount calCount; AscendQuantdstType, srcType, scaleType, isReuseSource, config, policy( dstLocal, srcLocal, sharedTmpBuffer, scaleLocal, offsetLocal, para);主动配置参数AscendQuantConfig的舍入模式roundMode。// 注意m,n需从外部传入 constexpr static bool isReuseSource false; constexpr static AscendQuantConfig config {has_offset, 1, RoundMode::CAST_ROUND}; constexpr static AscendQuantPolicy policy AscendQuantPolicy::PER_TOKEN; // 可修改枚举值以开启PER_GROUP LocalTensoruint8_t sharedTmpBuffer inQueue.AllocTensoruint8_t(); AscendQuantParam para; para.m m; para.n n; para.calCount calCount; AscendQuantdstType, srcType, scaleType, isReuseSource, config, policy( dstLocal, srcLocal, sharedTmpBuffer, scaleLocal, offsetLocal, para);【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考