Я провел прошлый день, пытаясь понять, как использовать несколько графических процессоров.Теоретически, распараллеливание моделей между несколькими графическими процессорами должно быть таким же простым, как простое объединение моделей с nn.DataParallel
.Тем не менее, я обнаружил, что это не работает для меня.Чтобы использовать самую простую и каноническую вещь, которую я смог найти для доказательства этого, я запустил код в учебнике Параллелизм данных , строка за строкой.
Я попробовал все, только имеяконкретная перестановка моих графических процессоров будет видна CUDA для переустановки всего, что связано с CUDA, но не может понять, почему я не могу работать с несколькими графическими процессорами.Некоторая информация о моей машине: Операционная система: Ubuntu 16.04 GPUS: 4 1080tis Версия Pytorch: 1.01 Версия CUDA: 10.0
Код ошибки:
---------------------------------------------------------------------------
KeyboardInterrupt Traceback (most recent call last)
<ipython-input-3-0f0d83e9ef13> in <module>
1 for data in rand_loader:
2 input = data.to(device)
----> 3 output = model(input)
4 print("Outside: input size", input.size(),
5 "output_size", output.size())
/usr/local/lib/python3.6/site-packages/torch/nn/modules/module.py in __call__(self, *input, **kwargs)
487 result = self._slow_forward(*input, **kwargs)
488 else:
--> 489 result = self.forward(*input, **kwargs)
490 for hook in self._forward_hooks.values():
491 hook_result = hook(self, input, result)
/usr/local/lib/python3.6/site-packages/torch/nn/parallel/data_parallel.py in forward(self, *inputs, **kwargs)
141 return self.module(*inputs[0], **kwargs[0])
142 replicas = self.replicate(self.module, self.device_ids[:len(inputs)])
--> 143 outputs = self.parallel_apply(replicas, inputs, kwargs)
144 return self.gather(outputs, self.output_device)
145
/usr/local/lib/python3.6/site-packages/torch/nn/parallel/data_parallel.py in parallel_apply(self, replicas, inputs, kwargs)
151
152 def parallel_apply(self, replicas, inputs, kwargs):
--> 153 return parallel_apply(replicas, inputs, kwargs, self.device_ids[:len(replicas)])
154
155 def gather(self, outputs, output_device):
/usr/local/lib/python3.6/site-packages/torch/nn/parallel/parallel_apply.py in parallel_apply(modules, inputs, kwargs_tup, devices)
73 thread.start()
74 for thread in threads:
---> 75 thread.join()
76 else:
77 _worker(0, modules[0], inputs[0], kwargs_tup[0], devices[0])
/usr/local/lib/python3.6/threading.py in join(self, timeout)
1054
1055 if timeout is None:
-> 1056 self._wait_for_tstate_lock()
1057 else:
1058 # the behavior of a negative timeout isn't documented, but
/usr/local/lib/python3.6/threading.py in _wait_for_tstate_lock(self, block, timeout)
1070 if lock is None: # already determined that the C code is done
1071 assert self._is_stopped
-> 1072 elif lock.acquire(block, timeout):
1073 lock.release()
1074 self._stop()
KeyboardInterrupt:
Любое понимание этой ошибкибудет очень ценится.Исходя из моих относительно ограниченных систем и знаний CUDA, это связано с какой-то блокировкой, но я не могу понять, как это исправить.