我们的设置涉及网络的初始部分(输入接口),该部分在单独的GPU卡上运行。每个GPU都有自己的数据部分(模型并行性)并分别进行处理。
每个输入接口本身又是一个复杂的nn.Module。每个输入接口可以占用一张或几张卡(例如,interface_1在GPU 0和1上运行,interface_2在GPU 2和3上运行,依此类推)。
在整个培训过程中,我们需要使这些输入界面的权重保持相同。我们还需要它们并行运行以节省培训时间,对于我们的情况而言,培训时间已经是数周了。
我们能想到的最好的主意是初始化具有相同权重的接口,然后平均它们的梯度。由于界面相同,因此使用相同的梯度更新相同的权重应该使它们在整个训练过程中保持相同,从而实现所需的“共享权重”模式。
但是,我找不到改变这些权重及其梯度(在PyTorch中以参数表示)的任何好方法。显然,PyTorch不允许这样做。
我们的当前状态是:如果我们复制.deepcopy“主”接口的“ parameter.data”并将其分配给“从属”接口的“ parameter.data”,则值的确已更改,但是.to( device_id)无效,并将其保留在“主”设备上。但是,我们需要它们转移到“从属”设备。
有人可以告诉我是否有可能,如果没有,是否有更好的方法来实现共享权重以及针对我们的方案进行并行执行?