Проблема импорта локальных файлов Python при отправке задачи в распределенный кластер Dask - PullRequest
0 голосов
/ 27 ноября 2018

У меня следующая проблема.Если мой код разделен на разные файлы, я не могу просто импортировать и отправить функцию в кластер, потому что мои локальные файлы отсутствуют на рабочих машинах.Чтобы решить проблему, мне нужно вручную объединить файлы в один.Это можно сделать относительно просто для небольших примеров, но большой проект, который разделен на несколько папок, занимает очень много времени.Пример:

localfile.py файл:

def custom():
  print("Remote run")
  return

Теперь давайте попробуем передать импортированную функцию в кластер, cluster.py файл:

import localfile

x = client.submit(localfile.custom)

x.result()
# Import error here, details below

-

# The protocol we write by default.  May be less than HIGHEST_PROTOCOL.
  File "/usr/local/lib/python3.6/site-packages/cloudpickle/cloudpickle.py", line 944, in subimport
ModuleNotFoundError: No module named 'localfile'

Как видите, рабочие не могут найти локальные файлы Python, поэтому задача не выполнена.

Можно ли как-нибудь отправить мой маринованный код с импортированными локальными файлами?Я понимаю, что возможное решение - просто загрузить локальные файлы рабочим, но когда код изменяется очень часто, а ваш кластер динамический, это не элегантное решение.Было бы здорово иметь возможность автоматически объединять ваш код client.py с localfile.py, выбирать его и отправлять в планировщик.Это как-то возможно?У вас есть другие идеи, как решить эту проблему?Спасибо!

1 Ответ

0 голосов
/ 29 ноября 2018

Как я думаю, вы знаете, клиентский API предоставляет upload_file , который может обрабатывать доставку вашего модуля рабочим в место, где его можно импортировать.

В ситуации, когда работникиприходите и уходите, вы не сможете убедиться, что у нового работника есть файл в нужном месте.Однако Pickle по своей природе отсылает объекты / функции к исходным файлам, предположительно для уменьшения размера данных.

Две неопределенные возможности:

  • Вы можете выполнять вычислительные операции специальнотолько на тех же рабочих (compute(workers=)), которые действительны на момент загрузки, вместе с перезапуском или другими перехватчиками importlib в выполняемой вами функции.
  • вы можете фактически распространять источник функции в виде текста, еслиВы хотите, и выполните определения или, опять же, используйте importlib, чтобы превратить его в модуль на рабочих.

В любом случае вам нужно будет изменить или обернуть свою функцию чем-то, чтобы иметь дело сдополнительный шаг.

...