在pytorch,如果我做了

import torch
x = torch.randn(3)
y = x + 5

默认情况下,所有张量都对应于"cpu"设备.是否有某种方法可以使其在默认情况下,所有张量都位于另一个设备上(例如"cuda:0")?

我知道,每当创建张量时,我总是可以小心地添加.cuda()或指定cuda,但如果我可以在程序开始时直接更改默认设备并使用它,那么就太好了,这样torch.randn(3)来自所需的设备,而不必每次都指定它.

或者出于某种原因,这样做是件坏事吗?E、 g.有什么理由我不希望在默认情况下在cuda上完成所有张量/操作吗?

推荐答案

Pytorch有一个可选函数来更改默认类型的张量set_default_tensor_type.在主脚本上应用默认类型:

>>> import torch
>>>
>>> if __name__ == '__main__':
...     cuda = torch.cuda.is_available()
...     if cuda:
...         torch.set_default_tensor_type('torch.cuda.FloatTensor')
...     a = torch.randn(3,3)
...     print(a.device)
...
cuda:0

或者出于某种原因,这样做是件坏事吗?E、 g.有什么理由我不希望在默认情况下在cuda上完成所有张量/操作吗?

我找不到任何参考资料或文件来回答这个问题.然而,在我看来,这是为了避免GPU内存中的memory fragmentation.

我不是专家,但内存中的数据应该以有效的方式进行安排,否则,冗余空间会导致OOM.这就是为什么在默认情况下,无论模型有多少个参数,Tensorflow都会占用GPU的所有内存.只需将张量形状倍数设置为8 amp documents,即可提高空间和速度.

实际上,当A和B维度是8的倍数时,可以实现更高的性能.

总之,我认为最好是手动控制tensor设备,而不是将其设置为默认gpu.

Python相关问答推荐

对于一个给定的数字,找出一个整数的最小和最大可能的和

什么相当于pytorch中的numpy累积ufunc

如何将多进程池声明为变量并将其导入到另一个Python文件

将pandas导出到CSV数据,但在此之前,将日期按最小到最大排序

在两极中过滤

为什么np. exp(1000)给出溢出警告,而np. exp(—100000)没有给出下溢警告?

AES—256—CBC加密在Python和PHP中返回不同的结果,HELPPP

Python—为什么我的代码返回一个TypeError

当单元测试失败时,是否有一个惯例会抛出许多类似的错误消息?

使用Python异步地持久跟踪用户输入

使用tqdm的进度条

高效生成累积式三角矩阵

分解polars DataFrame列而不重复其他列值

普洛特利express 发布的人口普查数据失败

奇怪的Base64 Python解码

在不降低分辨率的情况下绘制一组数据点的最外轮廓

如何定义一个将类型与接收该类型的参数的可调用进行映射的字典?

使代码更快地解决哪个字母代表给定公式中的哪个数字

在Python Polar中从一个函数调用添加多个列

使用Mysql Connector通过Python创建Mysql Storec过程