【CANN训练营2023年第二季】我玩的就是真实!!Sinh工程解析以及解题思路

举报
yd_286753431 发表于 2023/12/19 04:44:36 2023/12/19
【摘要】 PS:巨量时间,不断踩坑,悲凉血泪史,总结成的小小见解。如果各位觉得写的还行,劳请各位老师们三连一波!!各位老师的鼓励是我坚持写作的动力!!我玩的就是真实!!!我玩的就是真实!!!我玩的就是真实!!!问:什么是Sinh?遇到问题不要慌,首先问下度娘或者GPT。本质上就是要实现z=(e^x -e^(-x))/2这个函数兄弟们,老师们看到这,可能会嗤之以鼻,就这?就这?如果,x和z是标量计算,确...

PS:巨量时间,不断踩坑,悲凉血泪史,总结成的小小见解。

如果各位觉得写的还行,劳请各位老师们三连一波!!各位老师的鼓励是我坚持写作的动力!!

我玩的就是真实!!!我玩的就是真实!!!我玩的就是真实!!!


问:什么是Sinh?

遇到问题不要慌,首先问下度娘或者GPT。

本质上就是要实现z=(e^x -e^(-x))/2这个函数

兄弟们,老师们看到这,可能会嗤之以鼻,就这?就这?

如果,x和z是标量计算,确实用脚和计算器都能计算出来,

但是!这个公式里面的x还有z都是tensor

那么就不一样了,当然用脚和计算器同样也能计算出来,但是会慢很多


cke_2377.png



问:看到这个sinh算子目标,第一步要想到的是什么??

急着着手去堆API吗?不是的,第一步我建议去关注下变量类型,是half,float,int32

根据half的范围(-65504 , 65504),根据公式z=(e^x -e^(-x))/2

z有可能会超过half类型的范围吗??毫无疑问是可能的。

虽然说整个算子支持half的输入,但输出如果是half类型,存在输出误差。

个人认为,为保证精度要求,那么就需要进行类型的转换了 

参照tensorflow的算子,算子input,output需要是同type的

可以设计一个输入类同于tensorflow,支持多种类型,输出可以是float类型的自定义高精度算子


cke_14270.png


问:需要怎么解读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替代实现


cke_234746.png


问:能够提供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调用并进行误差结果判断


cke_360594.png




PS:巨量时间,不断踩坑,悲凉血泪史,总结成的小小见解。

如果各位觉得写的还行,劳请各位老师们三连一波!!各位老师的鼓励是我坚持写作的动力!!

我玩的就是真实!!!我玩的就是真实!!!我玩的就是真实!!!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。