Распределенный Dask.планировщик — ОШИБКА — не удалось собрать ключи

#python #dask #dask-distributed #dask-ml

#python #dask #dask-распределенный #dask-ml

Вопрос:

 import joblib

from sklearn.externals.joblib import parallel_backend
with joblib.parallel_backend('dask'):
 
    from dask_ml.model_selection import GridSearchCV
    import xgboost
    from xgboost import XGBRegressor
    grid_search = GridSearchCV(estimator= XGBRegressor(), param_grid = param_grid, cv = 3, n_jobs = -1)
    grid_search.fit(df2,df3)
  

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

 client = dask.distributed.client('tcp://191.xxx.xx.xxx:8786')
  

Я пытаюсь найти наилучшие параметры, используя dask gridsearchcv. Я столкнулся со следующей ошибкой.

 istributed.scheduler - ERROR - Couldn't gather keys {"('xgbregressor-fit-score-7cb7087b3aff75a31f487cfe5a9cedb0', 1202, 2)": ['tcp://127.0.0.1:3738']} state: ['processing'] workers: ['tcp://127.0.0.1:3738']
NoneType: None
distributed.scheduler - ERROR - Workers don't have promised key: ['tcp://127.0.0.1:3738'], ('xgbregressor-fit-score-7cb7087b3aff75a31f487cfe5a9cedb0', 1202, 2)
NoneType: None
distributed.client - WARNING - Couldn't gather 1 keys, rescheduling {"('xgbregressor-fit-score-7cb7087b3aff75a31f487cfe5a9cedb0', 1202, 2)": ('tcp://127.0.0.1:3738',)}
distributed.nanny - WARNING - Restarting worker
distributed.scheduler - ERROR - Couldn't gather keys {"('xgbregressor-fit-score-7cb7087b3aff75a31f487cfe5a9cedb0', 1, 2)": ['tcp://127.0.0.1:3730']} state: ['processing'] workers: ['tcp://127.0.0.1:3730']
NoneType: None
distributed.scheduler - ERROR - Couldn't gather keys {"('xgbregressor-fit-score-7cb7087b3aff75a31f487cfe5a9cedb0', 0, 1)": ['tcp://127.0.0.1:3730'], "('xgbregressor-fit-score-7cb7087b3aff75a31f487cfe5a9cedb0', 5, 1)": ['tcp://127.0.0.1:3729'], "('xgbregressor-fit-score-7cb7087b3aff75a31f487cfe5a9cedb0', 4, 2)": ['tcp://127.0.0.1:3729'], "('xgbregressor-fit-score-7cb7087b3aff75a31f487cfe5a9cedb0', 2, 1)": ['tcp://127.0.0.1:3730']} state: ['processing', 'processing', 'processing', 'processing'] workers: ['tcp://127.0.0.1:3730', 'tcp://127.0.0.1:3729']
NoneType: None
distributed.scheduler - ERROR - Couldn't gather keys {'cv-n-samples-7cb7087b3aff75a31f487cfe5a9cedb0': ['tcp://127.0.0.1:3729']} state: ['processing'] workers: ['tcp://127.0.0.1:3729']
NoneType: None
distributed.scheduler - ERROR - Couldn't gather keys {"('xgbregressor-fit-score-7cb7087b3aff75a31f487cfe5a9cedb0', 4, 0)": ['tcp://127.0.0.1:3729'], "('xgbregressor-fit-score-7cb7087b3aff75a31f487cfe5a9cedb0', 2, 0)": ['tcp://127.0.0.1:3729'], "('xgbregressor-fit-score-7cb7087b3aff75a31f487cfe5a9cedb0', 0, 0)": ['tcp://127.0.0.1:3729']} state: ['processing', 'processing', 'processing'] workers: ['tcp://127.0.0.1:3729']
NoneType: None
distributed.scheduler - ERROR - Couldn't gather keys {"('xgbregressor-fit-score-7cb7087b3aff75a31f487cfe5a9cedb0', 0, 2)": ['tcp://127.0.0.1:3729'], "('xgbregressor-fit-score-7cb7087b3aff75a31f487cfe5a9cedb0', 2, 2)": ['tcp://127.0.0.1:3729']} state: ['processing', 'processing'] workers: ['tcp://127.0.0.1:3729']
NoneType: None
distributed.scheduler - ERROR - Workers don't have promised key: ['tcp://127.0.0.1:3730'], ('xgbregressor-fit-score-7cb7087b3aff75a31f487cfe5a9cedb0', 1, 2)
NoneType: None
  

Я надеюсь, что кто-нибудь поможет в решении этой проблемы. Заранее спасибо.

Ответ №1:

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

Предположим, у нас есть две машины: 191.168.1.1 для планировщика и 191.168.1.2 для рабочего.

Когда мы запускаем планировщик, мы можем получить следующую информацию:

 distributed.scheduler - INFO - -----------------------------------------------
distributed.http.proxy - INFO - To route to workers diagnostics web server please install jupyter-server-proxy: python -m pip install jupyter-server-proxy
distributed.scheduler - INFO - -----------------------------------------------
distributed.scheduler - INFO - Clear task state
distributed.scheduler - INFO -   Scheduler at:  tcp://191.168.1.1:8786
distributed.scheduler - INFO -   dashboard at:                   :8787

  

итак, для планировщика мы должны подтвердить это port 8786 и port 8786 получить доступ.

Аналогично, мы можем проверить информацию о работнике:

 istributed.nanny - INFO -         Start Nanny at: 'tcp://191.168.1.2:39042'
distributed.diskutils - INFO - Found stale lock file and directory '/root/dask-worker-space/worker-39rf_n28', purging
distributed.worker - INFO -       Start worker at:  tcp://191.168.1.2:39040
distributed.worker - INFO -          Listening to:  tcp://191.168.1.2:39040
distributed.worker - INFO -          dashboard at:        191.168.1.2:39041
distributed.worker - INFO - Waiting to connect to:   tcp://191.168.1.1:8786
distributed.worker - INFO - -------------------------------------------------
  

порт няни 39042 , рабочий порт 39040 и порт приборной 39041 панели.

установите эти порты открытыми как для 191.168.1.1, так и для 191.168.1.2:

 firewall-cmd --permanent --add-port=8786/tcp
firewall-cmd --permanent --add-port=8787/tcp
firewall-cmd --permanent --add-port=39040/tcp
firewall-cmd --permanent --add-port=39041/tcp
firewall-cmd --permanent --add-port=39042/tcp
firewall-cmd --reload
  

и задача может быть выполнена успешно.

Наконец, Dask мы выберем порты для worker случайным образом, мы также можем запустить worker с настроенными портами:

 dask-worker 191.168.1.1:8786 --worker-port 39040 --dashboard-address 39041 --nanny-port 39042
  

Дополнительные параметры можно найти здесь .

Ответ №2:

Я столкнулся с той же проблемой, когда устал запускать dask локально на экземпляре ec2. Чтобы решить это, я использовал:

 from distributed import Client
from dask import config
config.set({'interface': 'lo'}) #<---found out to use 'lo' by running ifconfig in shell
client = Client()
  

Эта проблема помогла мне найти решение: https://github.com/dask/distributed/issues/1281