zmq.error.ZMQError: адрес уже используется при выполнении многопроцессорной обработки с несколькими записными книжками с помощью papermill.

Я использую библиотеку papermill для одновременного запуска нескольких ноутбуков с использованием многопроцессорной обработки.

Это происходит в Python 3.6.6, Red Hat 4.8.2-15 в контейнере Docker.

Однако, когда я запускаю скрипт python, около 5% моих записных книжек не работают сразу (не запускаются ячейки Jupyter Notebook) из-за того, что я получаю эту ошибку:

Traceback (most recent call last):
  File "/opt/conda/lib/python3.6/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/opt/conda/lib/python3.6/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/opt/conda/lib/python3.6/site-packages/ipykernel_launcher.py", line 16, in <module>
    app.launch_new_instance()
  File "/opt/conda/lib/python3.6/site-packages/traitlets/config/application.py", line 657, in launch_instance
    app.initialize(argv)
  File "<decorator-gen-124>", line 2, in initialize
  File "/opt/conda/lib/python3.6/site-packages/traitlets/config/application.py", line 87, in catch_config_error
    return method(app, *args, **kwargs)
  File "/opt/conda/lib/python3.6/site-packages/ipykernel/kernelapp.py", line 469, in initialize
    self.init_sockets()
  File "/opt/conda/lib/python3.6/site-packages/ipykernel/kernelapp.py", line 238, in init_sockets
    self.shell_port = self._bind_socket(self.shell_socket, self.shell_port)
  File "/opt/conda/lib/python3.6/site-packages/ipykernel/kernelapp.py", line 180, in _bind_socket
    s.bind("tcp://%s:%i" % (self.ip, port))
  File "zmq/backend/cython/socket.pyx", line 547, in zmq.backend.cython.socket.Socket.bind
  File "zmq/backend/cython/checkrc.pxd", line 25, in zmq.backend.cython.checkrc._check_rc
zmq.error.ZMQError: Address already in use

вместе с:

Traceback (most recent call last):
  File "/opt/conda/lib/python3.6/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/opt/conda/lib/python3.6/multiprocessing/process.py", line 93, in run
    self._target(*self._args, **self._kwargs)
  File "main.py", line 77, in run_papermill
    pm.execute_notebook(notebook, output_path, parameters=config)
  File "/opt/conda/lib/python3.6/site-packages/papermill/execute.py", line 104, in execute_notebook
    **engine_kwargs
  File "/opt/conda/lib/python3.6/site-packages/papermill/engines.py", line 49, in execute_notebook_with_engine
    return self.get_engine(engine_name).execute_notebook(nb, kernel_name, **kwargs)
  File "/opt/conda/lib/python3.6/site-packages/papermill/engines.py", line 304, in execute_notebook
    nb = cls.execute_managed_notebook(nb_man, kernel_name, log_output=log_output, **kwargs)
  File "/opt/conda/lib/python3.6/site-packages/papermill/engines.py", line 372, in execute_managed_notebook
    preprocessor.preprocess(nb_man, safe_kwargs)
  File "/opt/conda/lib/python3.6/site-packages/papermill/preprocess.py", line 20, in preprocess
    with self.setup_preprocessor(nb_man.nb, resources, km=km):
  File "/opt/conda/lib/python3.6/contextlib.py", line 81, in __enter__
    return next(self.gen)
  File "/opt/conda/lib/python3.6/site-packages/nbconvert/preprocessors/execute.py", line 345, in setup_preprocessor
    self.km, self.kc = self.start_new_kernel(**kwargs)
  File "/opt/conda/lib/python3.6/site-packages/nbconvert/preprocessors/execute.py", line 296, in start_new_kernel
    kc.wait_for_ready(timeout=self.startup_timeout)
  File "/opt/conda/lib/python3.6/site-packages/jupyter_client/blocking/client.py", line 104, in wait_for_ready
    raise RuntimeError('Kernel died before replying to kernel_info')
RuntimeError: Kernel died before replying to kernel_info

Пожалуйста, помогите мне с этой проблемой, так как я рыскал по сети, пробуя разные решения, ни одно из которых пока не помогло в моем случае.

Эта частота ошибок в 5% возникает независимо от количества ноутбуков, которые я запускаю одновременно, или количества ядер на моем компьютере, что делает его очень любопытным.

Я пробовал изменить метод запуска и обновить библиотеки, но безуспешно.

Версии моих библиотек:

papermill==1.2.1
ipython==7.14.0
jupyter-client==6.1.3

Спасибо!


person Dan    schedule 06.06.2020    source источник


Ответы (1)


Явная проблема указывает на то, что ZeroMQ не может успешно .bind()

Нам нужно немного деталей, чтобы говорить на общем языке и синхронизироваться:

Если вы никогда не работали с ZeroMQ ,
здесь можно сначала посмотреть на
" ZeroMQ: Принципы менее чем за пять секунд "< / a>
перед тем, как углубиться в подробности



Сообщение об ошибке: zmq.error.ZMQError: Address already in use проще объяснить. Принимая во внимание, что точки доступа ZeroMQ могут по очевидным причинам свободно пытаться .connect() обращаться ко многим аналогам, но один и только один может .bind() на адресную цель определенного транспортного класса.

Это может происходить по трем возможным причинам:

1) случайный вызов некоторого кода (без знания внутренних деталей)
через созданные { multiprocessing.Process | joblib.Parallel | Docker-wrapped | ... } реплики, каждая из которых пытается получить право собственности на адрес какого-либо адреса транспортного класса ZeroMQ, который по очевидным причинам не увенчается успехом ни при одной попытке после того, как первая удалась.

2) довольно фатальная ситуация, когда некоторый "ранее" запущенный процесс не смог освободить такой адрес конкретного транспортного класса для дальнейшего использования (не помните, что ZeroMQ может быть лишь одним из других заинтересованных кандидатов - ошибка управления конфигурацией), или в таких случаях, когда предыдущие запуски не смогли корректно прекратить такое использование ресурсов и остались Context() -экземпляр, все еще ожидающий (в некоторых случаях бесконечно до перезагрузки ОС) прислушиваясь к чему-то, чего никогда не случится.

3) действительно плохая инженерная практика в разработке программного обеспечения модулей, не обрабатывать документированную ошибку / исключение EADDRINUSE API ZeroMQ менее жестоко, чем просто разбить весь цирк (вообще связанный затраты на это)


Другое сообщение об ошибке: RuntimeError: Kernel died before replying to kernel_info связано с состоянием, в котором ядро ​​ноутбука так долго пыталось установить все внутренние соединения со своими собственными компонентами (одноранговыми узлами), что потребовалось больше времени, чем настроенное или жестко запрограммированное timeout, и процесс ядра просто перестал ждать и бросился в необработанное исключение, которое вы наблюдали и о котором сообщали.


Решение :

Сначала проверьте наличие зависших владельцев адресов, перезагрузите все узлы, если сомневаетесь в этом, затем убедитесь, что в вашем собственном коде / { multiprocessing.Process() | joblib.Parallel() | ... the likes }-вызовах нет попыток столкновения, которые после распределения могут попытаться .bind() на ту же цель. Если ни один из этих шагов не решит проблему в вашей области контроля, обратитесь в службу поддержки используемых модулей, чтобы проанализировать и помочь вам в рефакторинге и проверке вашего все еще конфликтующего варианта использования.

person user3666197    schedule 07.06.2020