Есть ли преимущество в предварительном рассеянии объектов данных в Dask? - PullRequest
0 голосов
/ 25 октября 2018

Если я предварительно распределю объект данных по рабочим узлам, будет ли он полностью скопирован в каждый из рабочих узлов?Есть ли преимущество в этом, если этот объект данных большой?

Используя в качестве примера интерфейс futures:

client.scatter(data, broadcast=True)
results = dict()
for i in tqdm_notebook(range(replicates)):
    results[i] = client.submit(nn_train_func, data, **params)

Используя в качестве примера интерфейс delayed:

client.scatter(data, broadcast=True)
results = dict()
for i in tqdm_notebook(range(replicates)):
    results[i] = delayed(nn_train_func, data, **params)

Причина, по которой я спрашиваю, заключается в том, что я заметил следующие явления:

  1. Если я предварительно разбрасываю данные, появляется delayed для повторной отправки данных на рабочие узлыТаким образом, примерно удвоение использования памяти.Похоже, что предварительное рассеяние не выполняет то, что я ожидал, что позволяет рабочим узлам ссылаться на предварительно рассеянные данные.
  2. Интерфейсу futures требуется много времени для итерации попетля (значительно длиннее).В настоящее время я не уверен, как определить, где находится узкое место.
  3. Используя интерфейс delayed, с момента вызова функции compute() и до времени, когда активность отражается на панели мониторинга, существуетБольшая задержка, которая, как я подозревал, была связана с копированием данных.

1 Ответ

0 голосов
/ 25 октября 2018

Предварительное рассеяние разработано, чтобы избежать размещения больших данных объекта в графе задач.

x = np.array(lots_of_data)
a = client.submit(add, x, 1)  # have to send all of x to the scheduler
b = client.submit(add, x, 2)  # again
c = client.submit(add, x, 3)  # and again

Вы почувствуете эту боль, потому что client.submit будет медленно возвращаться, и Dask может даже выдать предупреждение.

Поэтому вместо этого мы разбрасываем наши данные, получая будущее вreturn

x = np.array(lots_of_data)
x_future = client.scatter(x)
a = client.submit(add, x_future, 1)  # Only have to send the future/pointer
b = client.submit(add, x_future, 2)  # so this is fast
c = client.submit(add, x_future, 3)  # and this

В вашей ситуации вы почти делаете это, с той лишь разницей, что вы разбрасываете свои данные, затем забываете о будущем, которое они возвращают, и отправляете ваши данные снова.

client.scatter(data, broadcast=True)  # whoops!  forgot to capture the output
data = client.scatter(data, broadcast=True)  # data is now a future pointing to its remote value

Вы можете выбрать broadcast или нет.Если вы знаете, что все ваши работники будут нуждаться в этих данных, то это не плохая вещь, но все будет хорошо, независимо от того.

...