【taichi】利用 taichi 编写深度学习算子 —— 以提取右上三角阵为例

本文以取 (bs, n, n) 张量的右上三角阵并展平为向量 (bs, n*(n+1)//2)) 为例,展示如何用 taichi 编写深度学习算子。

在这里插入图片描述
如图,要把形状为 ( b s , n , n ) (bs,n,n) (bs,n,n) 的张量,转化为 ( b s , n ( n + 1 ) 2 ) (bs,\frac{n(n+1)}{2}) (bs,2n(n+1)) 的向量。我们先写一个最简单的最慢的纯 python 循环实现方法

纯 python for 循环

def get_tensor_up_right_tri_slow(t):
    # t shape (bs, n, n)
    # out shape (bs, n*(n+1)//2)
    out = torch.zeros(t.shape[0], t.shape[1]*(t.shape[1]+1)//2)
    n = t.shape[1]
    # k = i*n + j - i*(i+1)//2
    for b in range(t.shape[0]):
        # 遍历右上三角阵,包括主对角线
        for i in range(t.shape[1]):
            for j in range(i, t.shape[1]):
                k = i*n + j - i*(i+1)//2
                out[b, k] = t[b, i, j]
    return out

可想而知,三层 python for 循环,必然是极慢的了。

转化为 taichi

在此基础上,稍微做一些修改,就可以得到我们的 taichi 版本函数

import taichi as ti

ti.init(arch=ti.gpu)

@ti.kernel
def get_tensor_up_right_tri(t: ti.types.ndarray(ndim=3, dtype=ti.f32), out: ti.types.ndarray(ndim=2, dtype=ti.f32)):
    # t shape (bs, n, n)
    # out shape (bs, n*(n+1)//2)
    n = t.shape[1]
    for b, i, j in t:
        # 遍历右上三角阵,包括主对角线
        if i <= j:
            k = i*n + j - i*(i+1)//2
            out[b, k] = t[b, i, j]

taichi 支持同时遍历多层循环,将三层循环改为一层循环后,和 python for 循环版本基本没有什么差别。taichi 将此函数转化为 CUDA 版本进行加速,从而提高运算速度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值