Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Numba表示Pytorch张量?_Pytorch_Tensor_Numba - Fatal编程技术网

如何使用Numba表示Pytorch张量?

如何使用Numba表示Pytorch张量?,pytorch,tensor,numba,Pytorch,Tensor,Numba,我是Numba新手,我需要使用Numba来加速一些Pytorch函数。但我发现即使是一个非常简单的函数也不起作用:( 但是出现了以下错误 def vec_添加_奇数_位置(a、b): res=0。 ^ 此错误可能是由以下参数引起的: 参数0:无法确定参数的类型 参数1:无法确定一种类型的 有人能帮我吗?如果能提供更多示例的链接,我们将不胜感激。谢谢。numba支持numpy数组,但不支持torch张量。不过,有一个桥: 以NumPy数组形式返回自张量。此张量和返回的 ndarray共享相同的

我是Numba新手,我需要使用Numba来加速一些Pytorch函数。但我发现即使是一个非常简单的函数也不起作用:(

但是出现了以下错误 def vec_添加_奇数_位置(a、b): res=0。 ^

此错误可能是由以下参数引起的:

  • 参数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()))