【CANN训练营2023年第二季】我玩的就是真实!!Sinh工程解析以及解题思路
PS:巨量时间,不断踩坑,悲凉血泪史,总结成的小小见解。
如果各位觉得写的还行,劳请各位老师们三连一波!!各位老师的鼓励是我坚持写作的动力!!
我玩的就是真实!!!我玩的就是真实!!!我玩的就是真实!!!
问:什么是Sinh?
遇到问题不要慌,首先问下度娘或者GPT。
本质上就是要实现z=(e^x -e^(-x))/2这个函数
兄弟们,老师们看到这,可能会嗤之以鼻,就这?就这?
如果,x和z是标量计算,确实用脚和计算器都能计算出来,
但是!这个公式里面的x还有z都是tensor
那么就不一样了,当然用脚和计算器同样也能计算出来,但是会慢很多
问:看到这个sinh算子目标,第一步要想到的是什么??
急着着手去堆API吗?不是的,第一步我建议去关注下变量类型,是half,float,int32
根据half的范围(-65504 , 65504),根据公式z=(e^x -e^(-x))/2
z有可能会超过half类型的范围吗??毫无疑问是可能的。
虽然说整个算子支持half的输入,但输出如果是half类型,存在输出误差。
个人认为,为保证精度要求,那么就需要进行类型的转换了
参照tensorflow的算子,算子input,output需要是同type的
可以设计一个输入类同于tensorflow,支持多种类型,输出可以是float类型的自定义高精度算子
问:需要怎么解读sinh的计算公式呢,如何堆叠AscendAPI呢??
这个问题的关键在于如何处理e^(-x)
1.使用Reciprocal(bufLocal1, bufLocal2, this->tileLength);这个API进行求取倒数
2.使用Duplicate<float>(bufLocal1, inputVal1,this->tileLength);填充tensor
使用Div(bufLocal3, bufLocal1, bufLocal2, this->tileLength);进行除法求取倒数
理论上这两种方案都可以处理,但是,要注意Reciprocal具有局限性
使用Reciprocal时,half的算子结果对比误差是不满足双千分之一的要求,
float的算子结果对比误差不满足双万分之一的要求,如果需要高精度,建议使用Div替代实现
问:能够提供computer一个大概思路吗??
当然这只是个人思路,如果各位老师有更好的做法,可以在评论区写出
Cast(bufLocal1, xLocal, RoundMode::CAST_NONE ,this->tileLength);
Exp(bufLocal2, bufLocal1, this->tileLength);
// Reciprocal(bufLocal1, bufLocal2, this->tileLength);//精度问题
Duplicate<float>(bufLocal1, inputVal1,this->tileLength);
Div(bufLocal3, bufLocal1, bufLocal2, this->tileLength);
Sub(zLocal, bufLocal2, bufLocal3, this->tileLength);
Duplicate<float>(bufLocal1, inputVal2,this->tileLength);
Mul(zLocal, zLocal, bufLocal1, this->tileLength);复制
问:怎么看待一个完整的sinh算子的文件夹定位吗??
1.aclnn_online_model是使用aclnn API调用的方式文件夹
2.kernel_direct_call 是进行cpu ,npu_simulator,npu_onboard的验证文件
3.SinhCustom是核心中的核心,host,kernel 核心代码文件夹
首先要通过kernel_direct_call 对SinhCustom的核心代码进行cpu ,npu的逻辑验证
再通过SinhCustom生成aclnn可调用的cpp文件aclnn_sinh_custom.cpp
使用aclnn_online_model进行aclnn API调用并进行误差结果判断
PS:巨量时间,不断踩坑,悲凉血泪史,总结成的小小见解。
如果各位觉得写的还行,劳请各位老师们三连一波!!各位老师的鼓励是我坚持写作的动力!!
我玩的就是真实!!!我玩的就是真实!!!我玩的就是真实!!!
- 点赞
- 收藏
- 关注作者
评论(0)