Многопроцессорная обработка, файл не найден

#python #sockets #import #path #pytorch

#python #сокеты #импорт #путь #pytorch

Вопрос:

Я использую AlphaPose из GitHub, и я хотел бы запустить скрипт script/demo_inference.py из другого скрипта, который я создал в AlphaPose root, вызывается run.py . В run.py Я импортировал demo_inference.py как ap, используя этот скрипт:

 def import_module_by_path(path): 
  name = os.path.splitext(os.path.basename(path))[0] spec = 
  importlib.util.spec_from_file_location(name, path) mod = 
  importlib.util.module_from_spec(spec) spec.loader.exec_module(mod) return mod
 

и

 ap = import_module_by_path('./scripts/demo_inference.py')
 

Затем в demo_inference.py Я заменил

 if __name__ == "__main__": 
 

с

 def startAlphapose(): 
 

и в run.py Я написал

 ap.StartAlphapose().
 

Теперь я получил эту ошибку:

 Load SE Resnet...
Loading YOLO model..
Process Process-3:
Traceback (most recent call last):
  File "/usr/lib/python3.6/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/usr/lib/python3.6/multiprocessing/process.py", line 93, in run
    self._target(*self._args, **self._kwargs)
  File "/home/vislab/guerri/alphagastnet/insieme/alphapose/utils/detector.py", line 251, in image_postprocess
    (orig_img, im_name, boxes, scores, ids, inps, cropped_boxes) = self.wait_and_get(self.det_queue)
  File "/home/vislab/guerri/alphagastnet/insieme/alphapose/utils/detector.py", line 121, in wait_and_get
    return queue.get()
  File "/usr/lib/python3.6/multiprocessing/queues.py", line 113, in get
    return _ForkingPickler.loads(res)
  File "/home/vislab/guerri/alphagastnet/lib/python3.6/site-packages/torch/multiprocessing/reductions.py", line 284, in rebuild_storage_fd
    fd = df.detach()
  File "/usr/lib/python3.6/multiprocessing/resource_sharer.py", line 57, in detach
    with _resource_sharer.get_connection(self._id) as conn:
  File "/usr/lib/python3.6/multiprocessing/resource_sharer.py", line 87, in get_connection
    c = Client(address, authkey=process.current_process().authkey)
  File "/usr/lib/python3.6/multiprocessing/connection.py", line 487, in Client
    c = SocketClient(address)
  File "/usr/lib/python3.6/multiprocessing/connection.py", line 614, in SocketClient
    s.connect(address)
FileNotFoundError: [Errno 2] No such file or directory
 

Что это значит?

Комментарии:

1. Что-то не удается, когда он пытается открыть сокет. Может быть много причин, вызывающих это: github.com/python/cpython/blob/3.6/Lib/multiprocessing /…

2. Нужно увидеть больше кода или большую трассировку стека

3. @AlexW я обновился с полной ошибкой

4. Весь этот стек состоит из файлов в библиотеке многопроцессорной обработки, за исключением /home/vislab/guerri/alphagastnet/insieme/alphapose/utils/detector.py того, что я бы проверил строки 121 и 251 в этом файле и посмотрел, видите ли вы какие-либо проблемы, или проверил библиотеку torch . Похоже, что дескриптор файла пытаются восстановить, но он его не находит, есть некоторые заметки , которые могут пролить свет, но мало что знают о том, что вы пытаетесь сделать

Ответ №1:

Мы столкнулись с такой же проблемой в нашем кластере.

При использовании многопроцессорной обработки в PyTorch (обычно для запуска нескольких рабочих элементов DataLoader) подпроцессы создают сокеты в /tmp каталоге для связи друг с другом. Все эти сокеты сохраняются в именованных папках pymp-###### и выглядят как 0-байтовые файлы. Удаление этих файлов или папок, пока ваши скрипты PyTorch все еще работают, вызовет указанную выше ошибку.

В нашем случае проблема заключалась в скрипте обслуживания с ошибками, который удалял файлы из /tmp папки, пока они все еще были нужны. Возможно, есть другие способы вызвать эту ошибку. Но вы должны начать с поиска этих сокетов и убедиться, что они случайно не удаляются.

Если это не решит проблему, посмотрите на свой /var/log/syslog файл в точное время, когда произошла ошибка. Скорее всего, вы найдете причину этого там.