Я пытался добиться чего-то похожего на эти вопросы ( Инициализация состояния для работников, распределенных по dask , Настройка работника Dask с переменной ), где у меня (относительно) большое модель, которую я хочу предварительно инициализировать на подмножестве работников, которые будут принимать задачи, требующие модели. В идеале я не хочу, чтобы на клиентской машине была даже модель.
Моя первая попытка, прежде чем найти эти вопросы, состояла в том, чтобы определить задачу delayed
в общем модуле worker_task.model
и назначить глобальную переменную модуля (например, worker_tasks.model.model
) в рабочем сценарии --preload
для эту задачу использовать; однако по какой-то причине это не сработало - переменная задается в скрипте предварительной загрузки, но при вызове задачи она все равно None
.
init_model_worker.py:
import logging
from uuid import uuid4
from worker_tasks import model
def dask_setup(worker):
model.model = f'<mock model {uuid4()}>'
logger = logging.getLogger('distributed')
logger.warning(f'model = {model.model}')
worker_tasks / model.py:
import logging
import random
from time import sleep
from uuid import uuid4
import dask
model = None
@dask.delayed
def compute_clinical(inp):
if model is None:
raise RuntimeError('Model not initialized.')
sleep(random.uniform(3, 17))
return {
'result': random.choice((True, False)),
'confidence': random.uniform(0, 1)
}
Это рабочий журнал, когда я запускаю его и отправляю что-то в планировщик:
> dask-worker --preload init_model_worker.py tcp://scheduler:8786 --name model-worker
distributed.utils - INFO - Reload module init_model_worker from .py file
distributed.nanny - INFO - Start Nanny at: 'tcp://172.28.0.4:41743'
distributed.diskutils - INFO - Found stale lock file and directory '/worker-epptq9sh', purging
distributed.utils - INFO - Reload module init_model_worker from .py file
distributed - WARNING - model = <mock model faa41af0-d925-46ef-91c9-086093d37c71>
distributed.worker - INFO - Start worker at: tcp://172.28.0.4:37973
distributed.worker - INFO - Listening to: tcp://172.28.0.4:37973
distributed.worker - INFO - nanny at: 172.28.0.4:41743
distributed.worker - INFO - bokeh at: 172.28.0.4:37766
distributed.worker - INFO - Waiting to connect to: tcp://scheduler:8786
distributed.worker - INFO - -------------------------------------------------
distributed.worker - INFO - Threads: 4
distributed.worker - INFO - Memory: 1.93 GB
distributed.worker - INFO - Local Directory: /worker-mhozo9ru
distributed.worker - INFO - -------------------------------------------------
distributed.worker - INFO - Registered to: tcp://scheduler:8786
distributed.worker - INFO - -------------------------------------------------
distributed.core - INFO - Starting established connection
distributed.worker - WARNING - Compute Failed
Function: compute_clinical
args: ('mock')
kwargs: {}
Exception: RuntimeError('Model not initialized.')
Вы можете видеть, что после перезагрузки сценария предварительной загрузки, model
равен <mock model faa41af0-d925-46ef-91c9-086093d37c71>
; но когда я пытаюсь вызвать его из задачи, я получаю None
.
Я постараюсь реализовать решение, основанное на ответах на другие вопросы, но у меня есть несколько вопросов, связанных с предварительной загрузкой работника:
- Почему модель
None
, когда я вызываю задачу, после того, как я назначил ее в сценарии предварительной загрузки?
- Как правило, рекомендуется избегать подобных действий в рабочем
--preload
скрипте? Лучше ли вызывать инициализацию рабочего состояния от клиента? Если так, то почему ?