如何使用Numba表示Pytorch张量?
我是Numba新手,我需要使用Numba来加速一些Pytorch函数。但我发现即使是一个非常简单的函数也不起作用:( 但是出现了以下错误 def vec_添加_奇数_位置(a、b): res=0。 ^ 此错误可能是由以下参数引起的:如何使用Numba表示Pytorch张量?,pytorch,tensor,numba,Pytorch,Tensor,Numba,我是Numba新手,我需要使用Numba来加速一些Pytorch函数。但我发现即使是一个非常简单的函数也不起作用:( 但是出现了以下错误 def vec_添加_奇数_位置(a、b): res=0。 ^ 此错误可能是由以下参数引起的: 参数0:无法确定参数的类型 参数1:无法确定一种类型的 有人能帮我吗?如果能提供更多示例的链接,我们将不胜感激。谢谢。numba支持numpy数组,但不支持torch张量。不过,有一个桥: 以NumPy数组形式返回自张量。此张量和返回的 ndarray共享相同的
- 参数0:无法确定参数的类型
- 参数1:无法确定一种类型的
有人能帮我吗?如果能提供更多示例的链接,我们将不胜感激。谢谢。
numba
支持numpy数组,但不支持torch张量。不过,有一个桥:
以NumPy数组形式返回自张量。此张量和返回的
ndarray共享相同的底层存储。对自张量的更改将
应反映在数据表中,反之亦然
这意味着您必须调用jitted函数,如下所示:
...
z = vec_add_odd_pos(x.numpy(), y.numpy())
如果z
应该是火炬,那么张量也是我们需要的:
从numpy.ndarray创建张量
返回的张量和ndarray共享相同的内存。修改
与张量的关系将反映在nArray中,反之亦然
返回的张量不可调整大小。
对于我们的代码来说,这意味着
...
z = torch.from_numpy(vec_add_odd_pos(x.numpy(), y.numpy()))
应该调用。正如其他人所提到的,numba目前不支持torch张量,只支持numpy张量。但是,有一个类似的目标。然后可以将函数重写为:
导入火炬
@torch.jit.script
def vec_添加_奇数_位置(a、b):
res=0。
对于范围内的位置(len(a)):
如果位置%2==0:
res+=a[pos]+b[pos]
返回res
x=火炬张量([3,4,5.]))
y=火炬张量([-2,0,1.])
z=向量加奇数位置(x,y)
注意:尽管您说您的代码片段只是一个简单的示例,但由于循环速度非常慢,运行TorchScript可能对您没有多大帮助,您应该不惜一切代价避免它们,并且只在不存在其他解决方案的情况下使用它们。也就是说,以下是如何以更高效的方式实现您的函数:
def向量添加奇数位置(a、b):
evenids=torch.arange(len(a))%2==0
返回(a[evenids]+b[evenids]).sum()
Pytorch现在在GPU张量上公开了一个接口,numba可以直接使用该接口:
numba.cuda.as\u cuda\u数组(张量)
测试脚本提供了一些使用示例:很好,谢谢!您有更复杂的示例吗?否则我建议torch.sum(x[::2]+y[::2])
。
...
z = torch.from_numpy(vec_add_odd_pos(x.numpy(), y.numpy()))