Как реплицировать данные, если их вычислить быстрее, чем передать в распределенных dask?

У меня есть большой объект (150 МБ), который мне нужно передать всем распределенным рабочим dask, чтобы его можно было использовать в будущих задачах. Я пробовал несколько подходов:

  • Client.scatter(broadcast=True): Это требовало отправки всех данных с одного компьютера (на котором я запускаю клиент и планировщик), что создает узкое место в полосе пропускания.
  • Client.submit, за которым следует Client.replicate: Эти воркеры совместно используют файловую систему, поэтому вместо отправки данных я могу запланировать задачу, которая загружает данные, а затем реплицировать данные всем воркерам. Похоже, что для распределения данных используется древовидная стратегия, которая быстрее, чем предыдущий вариант.

Однако потенциально быстрее заставить каждого рабочего запускать функцию загрузки данных локально, чем загружать данные на одного рабочего и сериализовать их от одного рабочего к другому. Есть ли способ сделать это? Client.run кажется частью того, что я хочу, но мне нужно вернуть будущее для загруженных данных, которые я могу передать другим задачам позже.


person Stan Seibert    schedule 25.06.2018    source источник


Ответы (2)


Короткий ответ здесь - «нет», простого способа добиться этого не существует. Можно что-нибудь взломать вместе, если вам удобно использовать внутренний код (который может меняться без предупреждения).

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

person MRocklin    schedule 25.06.2018

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

person user8871302    schedule 29.08.2018