Использование вычислений Dask приводит к зависанию выполнения

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

Почему использование вычислений Dask приводит к зависанию выполнения ниже? Вот фрагмент рабочего кода:

#Suppose you created a scheduler at the ip address of 111.111.11.11:8786


from dask.distributed import Client
import dask.array as da

# client1
client1 = Client("111.111.11.11:8786")
x = da.ones(10000000, chunks=(100000,))  # 1e7 size array cut into 1e5 size chunks
x = x.persist()
client1.publish_dataset(x=x)

# client2
client2 = Client("111.111.11.11:8786")
x = client2.get_dataset('x')  #get the lazy collection x
result = x[0].compute() #code execution hangs here
print(result)

person sudouser2010    schedule 02.08.2017    source источник


Ответы (1)


persist ведет себя по-разному, в зависимости от того, активен ли у вас распределенный клиент или нет. В вашем случае вы вызываете его перед созданием какого-либо клиента, в результате чего все данные упаковываются в описание графика. Такое поведение нормально для многопоточного планировщика, где память распределяется между рабочими, но когда вы публикуете, вы отправляете все это планировщику, и, по-видимому, он задыхается.

Если вы сначала сделаете client1, вы заметите, что persist происходит очень быстро (в этом случае планировщик получает только указатели на данные), и цикл публикации-выборки будет работать должным образом.

person mdurant    schedule 02.08.2017
comment
Привет, MDurant, когда я определяю client1 перед сохранением, задержка все равно возникает. Я обновил код в приведенном выше примере для единообразия. - person sudouser2010; 03.08.2017
comment
Отставание - это нормально - вы все еще создаете данные в воркерах, когда продолжаете, - но теперь это удается? Ваш код запускается для меня почти мгновенно на моем ноутбуке. - person mdurant; 03.08.2017
comment
Я смог заставить его работать. У меня было две проблемы. Во-первых, вместо 111.111.11.11:8786 мне пришлось использовать tcp: //111.111.11.11: 8786. Во-вторых, я не создавал рабочих для планировщика. Что интересно, мне удалось заставить код работать при определении клиента после использования persist. - person sudouser2010; 03.08.2017