我有一个张量形状,例如:[4,10]其中4是批处理大小,而10是我的输入样本缓冲区的长度。现在,我知道它的确是[4,5 + 5],即输入样本缓冲区由两个长度为5的窗口组成,可以独立处理,最好并行处理。我正在做的是,在模型的forward()内部,首先将张量重塑为[8,5],在其上运行各层,然后将其重塑为[4,-1]并返回。我希望从中得到的是Pytorch可以在每个窗口(各种子批处理)上并行运行我的模型,从而有效地产生并行for循环。它运行正常,Pytorch没有抱怨或其他任何东西,但是我得到了奇怪的结果。我想知道Pytorch是否可以以这种方式工作,然后再进行模型调试。
答案 0 :(得分:0)
好吧,它没有。原因是 pytorch 用于张量整形的排序。这可以通过运行下面的小复制代码看到。 如果在 pytorch 中有一个类似于“rebatch”的函数,它会处理适当的内存布局,作为并行结构的基础(假设它甚至可以在一般情况下以内存效率方式完成)。
import torch
conv = torch.nn.Conv1d(1,3,1)
def conv_batch(t, conv, window):
batch = t.shape[0]
t = t.view(-1, t.shape[1], window)
t = conv(t)
t = t.view(batch, t.shape[1], -1)
return t
batch = 1
channels = 1
width = 4
window = 2
x = torch.arange(batch*channels*width)
x = x.view(batch,channels,width).float()
r1 = conv(x)
r2 = conv_batch(x, conv, window)
print(r1)
print(r2)
print(r1==r2)