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

cke_457.png

  • 个人认为重点在于两点
    • Min,max二值的接入并转换标量参与计算
    • python 验证函数的重写支持torch
    • 其实都比较简单
  • 通过class KernelClipByValue中植入来转换标量进行计算
this->clip_value_min = *(reinterpret_cast<__gm__ DTYPE_CLIP_VALUE_MIN*>(clip_value_min));
this->clip_value_max = *(reinterpret_cast<__gm__ DTYPE_CLIP_VALUE_MAX*>(clip_value_max));

  • 官方提供的测试案例使用的是tf,但是8.0.RC2.alpha001镜像并不支持tf,只支持torch
  • 重新安装tf 感觉太过麻烦,所以使用torch.clamp来替代tf.clip_by_value
  • 另外torch.clamp不支持half类型计算,最好先转换成float参与clamp,计算完再转换成所需类型

cke_136577.png

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)

  • compute函数如下
__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);
  }

  • 测试案例测试结果如下
  • 第一个案例

cke_138055.png

  • 第二个案例

cke_147707.png

  • 第三个案例

cke_157646.png

  • 第四个案例

cke_167533.png

  • 第五个案例

cke_178914.png

我要发帖子