Thanks for sending an requirement! Please fill in the following template to help quickly solve your problem.
使用AscendC对TBE实现的AscendAntiQuantV2算子进行重构,完成对Atlas A2 训练系列产品/Atlas 800I A2 推理系列产品的适配。
外部贡献
AscendAntiQuantV2 算子根据输入的scale和offset对输入x进行反量化。计算公式:
sqrtMode为false时,计算公式为:
y=(x+offset)∗scaley = (x+offset) * scale y=(x+offset)∗scale
sqrtMode为true时,计算公式为:
y=(x+offset)∗scale∗scaley = (x+offset) * scale * scale y=(x+offset)∗scale∗scale
支持设备:Atlas A2 训练系列产品/Atlas A2 推理系列产品 数据类型:输入x支持 int4、int8;输入scale和offset 支持 float32、bfloat16;输出y 支持 float16、bfloat16。
1 使能方式
Aclnn直调。
2 总体设计
2.1host侧设计
可以将host侧将数据视为一维向量,不需要考虑到排布对实现的影响,只需要考虑数据个数,不考虑数据维度信息。 任务均分:coreNum 根据输入长度和块大小动态调整,确保每个核心处理的数据块数均匀。 批量搬运:AscendAntiQuantV2BlockNum 和 AscendAntiQuantV2DataNum 计算单次搬运的数据量,通过 finalSmallAscendAntiQuantV2Num 和 finalBigAscendAntiQuantV2Num 确定小核/大核的搬运次数,将多次搬运合并为批量操作,减少冗余开销。尾块的处理逻辑确保不完整块也能被合并到计算流程中,避免数据碎片。
2.1.1分核策略
优先使用满核的原则。 如果核间能均分,可视作无大小核区分,大核小核数据块一致; 如果核间不能均分,需要将余出的数据块分配到前几个核上。 输入数据大小计算:通过GetInputShape和GetDataTypeLength函数获取输入数据的大小和类型长度,计算出输入数据的总字节数。 UB内存大小和核心数量获取:通过平台信息获取UB内存大小和核心数量,并根据这些信息调整核心数量。
2.1.2数据分块和内存优化策
充分使用UB空间的原则。 需要考虑不同硬件的UB大小不同、是否开启double buffer、kernel侧API实现过程中是否需要临时数据的储存,综合考虑单核内切分的大小。 UB内存大小获取:通过GetCoreMemSize函数获取UB内存的大小,用于后续的数据切分计算。 AscendAntiQuantV2块计算:根据UB内存大小和预定义的BLOCK_SIZE及BUFFER_NUM和不同类型下的ubDataNum,计算出每个AscendAntiQuantV2块的数据数量。 数据切分:将输入数据按照计算出的AscendAntiQuantV2块大小进行切分,计算出每个core需要处理的数据块数量和最后一个block的剩余数据量。 设置切分参数:将计算出的切分参数(如每个core的数据量、AscendAntiQuantV2块大小等)设置到AscendAntiQuantV2TilingData对象中。 这些策略确保了数据在多个核心之间的均匀分布,并且在单个核心内进行了合理的切分,以提高并行处理的效率。
2.1.3tilingKey规划策略
根据不同tilingkey,启动不同kernel。
2.2kernel侧设计
2.2.1kernel侧实现描述
kernel侧分为Init和Process两个阶段,其中Process包括数据搬入(CopyIn)、计算(Compute)、搬出(CopyOut)三个阶段。 1)将非fp32数据精度转换为fp32计算后,在转换为原始精度类型。
3 支持硬件
Atlas A2 训练系列产品/Atlas 800I A2 推理系列产品
我们会安排进行代码审核
Thanks for sending an requirement! Please fill in the following template to help quickly solve your problem.
Backgroud(背景信息)
使用AscendC对TBE实现的AscendAntiQuantV2算子进行重构,完成对Atlas A2 训练系列产品/Atlas 800I A2 推理系列产品的适配。
Origin(信息来源)
外部贡献
Benefit / Necessity (价值/作用)
AscendAntiQuantV2 算子根据输入的scale和offset对输入x进行反量化。计算公式:
sqrtMode为false时,计算公式为:
y=(x+offset)∗scale
sqrtMode为true时,计算公式为:
y=(x+offset)∗scale∗scale
支持设备:Atlas A2 训练系列产品/Atlas A2 推理系列产品
数据类型:输入x支持 int4、int8;输入scale和offset 支持 float32、bfloat16;输出y 支持 float16、bfloat16。
Design(设计方案)
1 使能方式
Aclnn直调。
2 总体设计
2.1host侧设计
可以将host侧将数据视为一维向量,不需要考虑到排布对实现的影响,只需要考虑数据个数,不考虑数据维度信息。
任务均分:coreNum 根据输入长度和块大小动态调整,确保每个核心处理的数据块数均匀。
批量搬运:AscendAntiQuantV2BlockNum 和 AscendAntiQuantV2DataNum 计算单次搬运的数据量,通过 finalSmallAscendAntiQuantV2Num 和 finalBigAscendAntiQuantV2Num 确定小核/大核的搬运次数,将多次搬运合并为批量操作,减少冗余开销。尾块的处理逻辑确保不完整块也能被合并到计算流程中,避免数据碎片。
2.1.1分核策略
优先使用满核的原则。
如果核间能均分,可视作无大小核区分,大核小核数据块一致;
如果核间不能均分,需要将余出的数据块分配到前几个核上。
输入数据大小计算:通过GetInputShape和GetDataTypeLength函数获取输入数据的大小和类型长度,计算出输入数据的总字节数。
UB内存大小和核心数量获取:通过平台信息获取UB内存大小和核心数量,并根据这些信息调整核心数量。
2.1.2数据分块和内存优化策
充分使用UB空间的原则。
需要考虑不同硬件的UB大小不同、是否开启double buffer、kernel侧API实现过程中是否需要临时数据的储存,综合考虑单核内切分的大小。
UB内存大小获取:通过GetCoreMemSize函数获取UB内存的大小,用于后续的数据切分计算。
AscendAntiQuantV2块计算:根据UB内存大小和预定义的BLOCK_SIZE及BUFFER_NUM和不同类型下的ubDataNum,计算出每个AscendAntiQuantV2块的数据数量。
数据切分:将输入数据按照计算出的AscendAntiQuantV2块大小进行切分,计算出每个core需要处理的数据块数量和最后一个block的剩余数据量。
设置切分参数:将计算出的切分参数(如每个core的数据量、AscendAntiQuantV2块大小等)设置到AscendAntiQuantV2TilingData对象中。
这些策略确保了数据在多个核心之间的均匀分布,并且在单个核心内进行了合理的切分,以提高并行处理的效率。
2.1.3tilingKey规划策略
根据不同tilingkey,启动不同kernel。
2.2kernel侧设计
2.2.1kernel侧实现描述
kernel侧分为Init和Process两个阶段,其中Process包括数据搬入(CopyIn)、计算(Compute)、搬出(CopyOut)三个阶段。
1)将非fp32数据精度转换为fp32计算后,在转换为原始精度类型。
3 支持硬件
Atlas A2 训练系列产品/Atlas 800I A2 推理系列产品