本样例介绍了调用AscendQuant高阶API实现QuantCustom单算子,并按照不同的算子调用方式分别给出了对应的端到端实现。
直调:使用核函数直调QuantCustom自定义算子。
核函数的基础调用方式,开发者完成算子核函数的开发和Tiling实现后,即可通过AscendCL运行时接口,完成算子的调用。
框架调用:使用框架调用QuantCustom自定义算子。
按照工程创建->算子实现->编译部署->算子调用的流程完成算子开发。整个过程都依赖于算子工程:基于工程代码框架完成算子核函数的开发和Tiling实现,通过工程编译脚本完成算子的编译部署,继而实现单算子调用或第三方框架中的算子调用。
本样例中包含如下调用方式:
调用方式 | 目录 | 描述 |
---|---|---|
直调 | kernel_launch_method_by_direct | host侧的核函数调用程序,包含CPU侧、NPU侧、仿真侧三种运行验证方法。 |
框架调用 | kernel_launch_method_by_framework | 通过aclnn调用的方式调用QuantCustom算子。 |
目录 | 描述 |
---|---|
kernel_launch_method_by_direct | 通过kernel直调的方式调用自定义算子工程样例目录 |
kernel_launch_method_by_framework | 通过aclnn调用的方式调用自定义算子工程样例目录 |
host_tiling | 本样例tiling代码实现 |
kernel_impl | 本样例kernel侧代码实现 |
QuantCustom单算子,对输入tensor按元素做量化计算,将half/float数据类型量化为int8_t数据类型。
QuantCustom算子规格:
算子类型(OpType) | QuantCustom | |||
算子输入 | ||||
name | shape | data type | format | |
inputGm | 1024 | float | ND | |
算子输出 | ||||
outputGm | 1024 | int8_t | ND | |
核函数名 | quant_custom |
本样例实现了QuantCustom算子,其中输入inputGm为固定shape[1024]。
kernel实现
计算逻辑是:Ascend C提供的矢量计算接口的操作元素都为LocalTensor,输入数据需要先搬运进片上存储,然后使用AscendQuant高阶API接口完成量化计算,得到最终结果,再搬出到外部存储上。
QuantCustom算子的实现流程分为3个基本任务:CopyIn,Compute,CopyOut。CopyIn任务负责将Global Memory上的输入Tensor inputGm存储在srcLocal中,Compute任务负责对srcLocal执行量化计算,计算结果存储在dstLocal中,CopyOut任务负责将输出数据从dstLocal搬运至Global Memory上的输出Tensor outputGm。
tiling实现
QuantCustom算子的tiling实现流程如下:首先获取AscendQuant接口能完成计算所需最大/最小临时空间大小,根据该范围结合实际的内存使用情况设置合适的空间大小,然后根据输入长度dataLength确定所需tiling参数。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。