Была предпринята попытка запустить новый процесс до того, как текущий процесс завершит фазу начальной загрузки. - PullRequest
0 голосов
/ 08 марта 2019

Я новичок в dask, и мне было очень приятно иметь модуль, который облегчает параллелизацию.Я работаю над проектом, в котором мне удалось распараллелить на одной машине цикл как , который вы можете увидеть здесь .Тем не менее, я хотел бы перейти к dask.distributed.Я применил следующие изменения к классу, приведенному выше:

diff --git a/mlchem/fingerprints/gaussian.py b/mlchem/fingerprints/gaussian.py
index ce6a72b..89f8638 100644
--- a/mlchem/fingerprints/gaussian.py
+++ b/mlchem/fingerprints/gaussian.py
@@ -6,7 +6,7 @@ from sklearn.externals import joblib
 from .cutoff import Cosine
 from collections import OrderedDict
 import dask
-import dask.multiprocessing
+from dask.distributed import Client
 import time


@@ -141,13 +141,14 @@ class Gaussian(object):
         for image in images.items():
             computations.append(self.fingerprints_per_image(image))

+        client = Client()
         if self.scaler is None:
-            feature_space = dask.compute(*computations, scheduler='processes',
+            feature_space = dask.compute(*computations, scheduler='distributed',
                                          num_workers=self.cores)
             feature_space = OrderedDict(feature_space)
         else:
             stacked_features = dask.compute(*computations,
-                                            scheduler='processes',
+                                            scheduler='distributed',
                                             num_workers=self.cores)

             stacked_features = numpy.array(stacked_features)

Это приводит к возникновению этой ошибки:

 File "/usr/local/Cellar/python/3.7.2_2/Frameworks/Python.framework/Versions/3.7/lib/python3.7/multiprocessing/spawn.py", line 136, in _check_not_importing_main
    is not going to be frozen to produce an executable.''')
RuntimeError:
        An attempt has been made to start a new process before the
        current process has finished its bootstrapping phase.

        This probably means that you are not using fork to start your
        child processes and you have forgotten to use the proper idiom
        in the main module:

            if __name__ == '__main__':
                freeze_support()
                ...

Я пробовал разные способы добавления if __name__ == '__main__':, но безуспешно.Это можно воспроизвести , запустив этот пример .Я был бы признателен, если бы кто-нибудь мог помочь мне понять это.Я понятия не имею, как я должен изменить свой код, чтобы он работал.

Спасибо.

Редактировать: пример cu_training.py.

1 Ответ

2 голосов
/ 10 марта 2019

Команда Client запускает новые процессы, поэтому она должна находиться внутри блока if __name__ == '__main__':, как описано в этом SO вопросе или этой проблеме GitHub

Это то же самое, что и с многопроцессорным модулем

...