我一直在阅读一篇论文,其中包含以下机器学习模型,我想在PyTorch中复制
的数据
从本质上讲,输入被分成n个大小相等的向量,每个向量都被传递给一个单独的本地模型。然后本地模型的所有输出都被连接起来,并通过下一层运行。(x与我的问题无关,所以我们忽略它)
到目前为止,我想到了这个:
class GlobalModel(torch.nn.Module):
def __init__(self, n_local_models):
super(GlobalModel, self).__init__()
self.local_models = [LocalModel() for _ in range(n_local_models)]
self.linear = torch.nn.Linear(100, 100)
self.activation = torch.nn.ReLU()
字符串
LocalModel是其他的torch.nn.Module.线性层大小只是一个虚拟的,我会在后面的局部模型中动态地改变它。
我的问题是,在连接所有本地模型并将它们传递给线性层和激活函数之前,我如何编写一个最好的forward()函数来并行运行所有本地模型。因为我能想到的唯一实现方法是迭代本地模型列表并按顺序执行每个模型。但这似乎相当慢,我觉得应该有一个更优雅的解决方案。
2条答案
按热度按时间bq3bfh9z1#
要并行运行多个模块,你通常需要多个进程(和多个GPU)。Python不太擅长多线程(由于GIL)。
即使没有Python,GPU编程也是高度优化的,用于并行化在Tensor上执行的大型单个操作,而不是并行执行多个单独的操作。要在单个GPU上并行执行单独的操作,您需要将它们发送到不同的GPU执行器(“流”)。
你没有链接到这篇论文,但有时候也会把一个操作分成多个并行模块,只是为了更好地利用多个GPU。
nimxete22#
一些澄清的问题。
您可以访问多少GPU?
本地模型是预先训练的还是在线训练的?如果是预先训练的,是否需要通过它们进行反向传播?
GPU真的不喜欢在单个卡中并行处理。如果你可以访问多个卡,你可以考虑在多个卡上并行本地模型。如果你没有足够的GPU,你最好串行运行本地模型。多模型并行处理与卡共享将是一个巨大的痛苦,而且很可能比串行运行慢。
如果本地模型是预先训练的,并且您不需要通过它们进行反向传播,则可以考虑构建一个特征提取管道,在训练之前计算本地模型输出。