我想并行上2个GPU简单下面的表达式:C = A^n + B^n
通过计算A^n
在GPU 0和B^n
对结果求和之前对GPU 1.
在TensorFlow中我会像:
with tf.device('/gpu:0'):
An = matpow(A, n)
with tf.device('/gpu:1'):
Bn = matpow(B, n)
with tf.Session() as sess:
C = sess.run(An + Bn)
Run Code Online (Sandbox Code Playgroud)
但是,由于PyTorch是动态的,我在做同样的事情时遇到了麻烦.我尝试了以下但只需要更多时间.
with torch.cuda.device(0):
A = A.cuda()
with torch.cuda.device(1):
B = B.cuda()
C = matpow(A, n) + matpow(B, n).cuda(0)
Run Code Online (Sandbox Code Playgroud)
我知道有一个模块可以在批量维度上并行化模型,torch.nn.DataParallel
但在这里我尝试做一些更基本的事情.
我正在寻求通过奇异值分解来反向传播渐变以用于正则化目的.PyTorch目前不支持通过奇异值分解进行反向传播.
我知道我可以编写自己的自定义函数来操作变量; 获取其.data张量,将torch.svd应用于它,将变量包围在其奇异值周围并在前向传递中返回,并在向后传递中将适当的雅可比矩阵应用于传入渐变.
但是,我想知道是否有一个更优雅(并且可能更快)的解决方案,我可以覆盖"类型变量没有实现无状态方法svd"错误直接,调用Lapack等?
如果有人可以指导我完成我需要查看的相应步骤和源文件,我将非常感激.我认为这些步骤同样适用于当前没有相关后向方法的其他线性代数运算.
非常感谢
我是Pytorch的新手,我不太明白的一件事就是使用nn.ModuleList
和nn.Sequential
.我可以知道何时应该使用一个而不是另一个?谢谢.
有没有一种方法可以为特定Pytorch实例强制提供我想使用的GPU内存量的最大值?例如,我的GPU可能有12Gb可用,但是我想为特定进程分配最大4Gb。
我有一个关于torch.stack的问题
我有2个张量,a.shape =(2,3,4)和b.shape =(2,3)。 如何在不进行就地操作的情况下堆叠它们?
1-如果num_workers
为2,是否意味着将2批放入RAM中并将其中1批发送到GPU或将3批放入RAM中然后将其中1批发送到GPU?
2-当工作程序的数量大于CPU内核的数量时,实际上会发生什么?我尝试了一下,但效果很好,但是它如何工作?(我认为我可以选择的最大工人数是核心数)
3-如果我设置num_workers
为3,并且在训练过程中内存中没有批次用于GPU,主进程是在等待其工作人员读取批次还是在读取单个批次(不等待工作人员)?
我了解register_buffer 的作用以及register_buffer 和 register_parameters之间的区别。
但是 PyTorch 中缓冲区的准确定义是什么?
所以我很难理解一些关于 Pytorch 集合的术语。我不断遇到关于我的张量范围不正确的相同类型的错误,当我尝试谷歌寻找解决方案时,解释往往更加混乱。
下面是一个例子:
m = torch.nn.LogSoftmax(dim=1)
input = torch.tensor([0.3300, 0.3937, -0.3113, -0.2880])
output = m(input)
Run Code Online (Sandbox Code Playgroud)
我没有发现上面的代码有什么问题,我已经定义LogSoftmax
了接受一维输入。所以根据我使用其他编程语言的经验,集合[0.3300, 0.3937, -0.3113, -0.2880]
是一个单一的维度。
以上触发了以下错误m(input)
:
IndexError: Dimension out of range (expected to be in range of [-1, 0], but got 1)
Run Code Online (Sandbox Code Playgroud)
这意味着什么?
我传入了一个一维张量,但它告诉我它期望的范围是[-1, 0], but got 1
.
1
to的维度会出现错误[-1, 0]
?[-1, 0]
是什么意思?我搜索了这个错误的解释,我发现像这个链接这样的东西对我作为一个程序员来说毫无意义:
https://github.com/pytorch/pytorch/issues/5554#issuecomment-370456868
因此,我能够通过向张量数据添加另一个维度来修复上述代码。
IndexError: Dimension out of range (expected to be in range of …
Run Code Online (Sandbox Code Playgroud) 我在询问NLLLoss损失函数的C 类。
该文件指出:
负对数似然损失。用 C 类训练分类问题很有用。
基本上在那之后的一切都取决于你是否知道 C 类是什么,我以为我知道 C 类是什么,但文档对我来说没有多大意义。特别是当它描述 的预期输入时(N, C) where C = number of classes
。这就是我感到困惑的地方,因为我认为 C 类仅指输出。我的理解是,C 类是一个热门的分类向量。我经常在教程中发现NLLLoss
经常与 a 配对LogSoftmax
来解决分类问题。
我期待NLLLoss
在以下示例中使用:
# Some random training data
input = torch.randn(5, requires_grad=True)
print(input) # tensor([-1.3533, -1.3074, -1.7906, 0.3113, 0.7982], requires_grad=True)
# Build my NN (here it's just a LogSoftmax)
m = nn.LogSoftmax(dim=0)
# Train my NN with the data
output = m(input)
print(output) # tensor([-2.8079, -2.7619, …
Run Code Online (Sandbox Code Playgroud) 是否pytorch
支持在不分配更多内存的情况下重复张量?
假设我们有一个张量
t = torch.ones((1,1000,1000))
t10 = t.repeat(10,1,1)
Run Code Online (Sandbox Code Playgroud)
重复t
10 次需要占用 10 倍的内存。有没有办法在t10
不分配更多内存的情况下创建张量?
这是一个相关的问题,但没有答案。