DataParallel
разделяет пакет и отправляет каждое разделение в другой графический процессор, каждый графический процессор имеет копию модели, затем прямой проход вычисляется независимо, а затем выходные данные каждого графического процессора собираются обратно в один графический процессор вместо вычисленияпотери независимо в каждом графическом процессоре.
Если вы хотите устранить эту проблему, вы можете включить вычисление потерь в модуль DataParallel
.
Если это все еще остается проблемой, то вы можете захотетьпараллелизм модели вместо параллелизма данных: переместите разные части вашей модели на разные графические процессоры, используя .cuda(gpu_id)
.Это полезно, когда вес вашей модели довольно большой.