昇腾AI原生创新算子挑战赛(S1赛季)复盘- ClipByValue算子
发表于2024-05-09 02:07:06
0 查看
- 正文前感谢昇腾各位工作人员,没有你们的辛勤就没有我们的进步
- 本文立意交流大赛ClipByValue算子编译过程
- 算子实现不难,就是将数据限制在[min,max]之间

- 个人认为重点在于两点
- Min,max二值的接入并转换标量参与计算
- python 验证函数的重写支持torch
- 其实都比较简单
- 通过class KernelClipByValue中植入来转换标量进行计算
- 官方提供的测试案例使用的是tf,但是8.0.RC2.alpha001镜像并不支持tf,只支持torch
- 重新安装tf 感觉太过麻烦,所以使用torch.clamp来替代tf.clip_by_value
- 另外torch.clamp不支持half类型计算,最好先转换成float参与clamp,计算完再转换成所需类型






input_x = input_x.astype(float) input_clip_value_min = input_clip_value_min.astype(former_out) input_clip_value_max = input_clip_value_max.astype(former_out) input_xtorch = torch.from_numpy(input_x) golden = input_xtorch.clamp(input_clip_value_min[0], input_clip_value_max[0]) y =golden.numpy() y = y.astype(former_out)__aicore__ inline void Compute(int32_t progress) { LocalTensor<DTYPE_X> inLocal = inQueueIN.DeQue<DTYPE_X>(); LocalTensor<DTYPE_X> xLocal = inLocal; LocalTensor<DTYPE_Y> outLocal = outQueueOUT.AllocTensor<DTYPE_Y>(); Maxs(outLocal,xLocal,this->clip_value_min,this->tileLength); Mins(outLocal,outLocal,this->clip_value_max,this->tileLength); outQueueOUT.EnQue<DTYPE_Y>(outLocal); inQueueIN.FreeTensor(inLocal); }