如何在 PyTorch 中使用多处理?

Wan*_*han 11 pytorch

我正在尝试使用具有复杂损失函数的 PyTorch。为了加速代码,我希望我可以使用 PyTorch 多处理包。

第一次试验,我将 10x1 的特征放入神经网络并得到 10x4 的输出。

之后,我想将 10x4 参数传递给一个函数来做一些计算。(以后的计算会很复杂。)

计算后,该函数将总共返回一个 10x1 的数组。该数组将设置为 NN_energy 并计算损失函数。

此外,我也想知道是否有另一种方法来创建一个向后数组来存储 NN_energy 数组,而不是使用

NN_energy = net(Data_in)[0:10,0]
Run Code Online (Sandbox Code Playgroud)

非常感谢。

完整代码:

import torch
import numpy as np
from torch.autograd import Variable 
from torch import multiprocessing

def func(msg,BOP):
    ans = (BOP[msg][0]+BOP[msg][1]/BOP[msg][2])*BOP[msg][3]
    return ans

class Net(torch.nn.Module):
    def __init__(self, n_feature, n_hidden_1, n_hidden_2, n_output):
        super(Net, self).__init__()
        self.hidden_1 = torch.nn.Linear(n_feature , n_hidden_1)  # hidden layer
        self.hidden_2 = torch.nn.Linear(n_hidden_1, n_hidden_2)  # hidden layer
        self.predict  = torch.nn.Linear(n_hidden_2, n_output  )  # output layer

    def forward(self, x):
        x = torch.tanh(self.hidden_1(x))      # activation function for hidden layer
        x = torch.tanh(self.hidden_2(x))      # activation function for hidden layer
        x = self.predict(x)                   # linear output
        return x

if __name__ == '__main__': # apply_async
    Data_in      = Variable( torch.from_numpy( np.asarray(list(range( 0,10))).reshape(10,1) ).float() )
    Ground_truth = Variable( torch.from_numpy( np.asarray(list(range(20,30))).reshape(10,1) ).float() )

    net = Net( n_feature=1 , n_hidden_1=15 , n_hidden_2=15 , n_output=4 )     # define the network
    optimizer = torch.optim.Rprop( net.parameters() )
    loss_func = torch.nn.MSELoss()  # this is for regression mean squared loss 
    NN_output = net(Data_in)   
    args = range(0,10)
    pool = multiprocessing.Pool()
    return_data = pool.map( func, zip(args, NN_output) )
    pool.close()
    pool.join()

    NN_energy = net(Data_in)[0:10,0]  
    for i in range(0,10):
        NN_energy[i] = return_data[i]

    loss = torch.sqrt( loss_func( NN_energy , Ground_truth ) )     # must be (1. nn output, 2. target) 
    print(loss)
Run Code Online (Sandbox Code Playgroud)

错误信息:

文件“C:\

RuntimeError:懦弱地拒绝序列化需要 grad 的非叶张量,因为 autograd 不支持跨越进程边界。如果您只想传输数据,请在序列化之前在张量上调用 detach() (例如,将其放入队列)。

mil*_*bar 1

首先,Torch VariableAPI 已经被弃用很长时间了,只是不要使用它。

接下来,torch.from_numpy( np.asarray(list(range( 0,10))).reshape(10,1) ).float()在很多层面上都是错误的:np.asarrayoflist是无用的,因为无论如何都会执行副本,并且按设计np.array作为list输入。然后,np.arange可以将范围作为 numpy 数组返回,并且也可以在Torch. 接下来,指定 的两个维度reshape是无用且容易出错的,您可以简单地执行reshape((-1, 1)),甚至更好unsqueeze(-1)。这是简化的表达式torch.arange(10, dtype=torch.float32, requires_grad=True).unsqueeze(-1)

如果可以使用批处理,那么使用多处理池是一个不好的做法。它将更加高效和可读。确实,并行执行 N 个小代数运算总是比较慢,而单个代数运算则较大,在 GPU 上更是如此。更重要的是,多重处理不支持计算梯度,因此会出现错误。然而,这部分是正确的,因为从 1.6.0 开始它就支持 cpu 上的张量。看看官方发布的变更日志

您能否发布一个更具代表性的示例来说明什么func方法可以确保您确实需要它?

注意:您正在寻找的分布式 autograd 现在可以在 Pytorch 中作为 1.6.0 版 Beta 版中的实验性功能使用。看一下官方文档