Наша настройка включает начальную часть сети (интерфейс ввода), которая работает на отдельных картах GPU.Каждый графический процессор получает свою часть данных (параллелизм модели) и обрабатывает ее отдельно.
Каждый входной интерфейс, в свою очередь, сам по себе представляет собой сложный модуль nn.Module.Каждый входной интерфейс может занимать одну или несколько плат (скажем, interface_1 работает на GPU 0 и 1, interface_2 - на GPU 2 и 3 и т. Д.).
Нам нужно сохранять вес этих входных интерфейсов одинаковымна протяжении всего обучения.Нам также нужно, чтобы они работали параллельно, чтобы сэкономить время обучения, которое для нашего сценария уже составляет несколько недель.
Лучшей идеей, которую мы можем придумать, была инициализация интерфейсов с одинаковыми весами, а затем усреднение градиентов для них.Поскольку интерфейсы идентичны, обновление одинаковых весов с одинаковыми градиентами должно сохранять их одинаковыми на протяжении всего процесса обучения, и таким образом достигается режим «общих весов».
Однако я не могу найти какое-либо хорошее решение для изменения значенийэти веса и их градиенты представлены как параметр в PyTorch.По-видимому, PyTorch не позволяет этого делать.
Наше текущее состояние: если мы копируем.deepcopy «параметр.data» «главного» интерфейса и присваиваем его «параметру.data» из «подчиненный интерфейс, значения действительно изменены, но .to (device_id) не работает и сохраняет их на «главном» устройстве.Однако нам нужно, чтобы они перешли на «подчиненное» устройство.
Может, кто-нибудь подскажет, возможно ли это вообще или, если нет, если есть лучший способ реализации общих весов наряду с параллельнымисполнение по нашему сценарию?