Низкая производительность Dask на одном ядре - PullRequest
0 голосов
/ 09 января 2020

Я реализовал функцию карты, которая разбирает строки в дерево XML, пересекает это дерево и извлекает некоторую информацию. Множество вещей типа if-then-else, без дополнительного кода ввода-вывода.

Ускорение, которое мы получили от Dask, было не очень удовлетворительным, поэтому мы более подробно рассмотрели необработанную производительность выполнения для одного, но большого элемента ( 580 МБ XML строки) в одном разделе.

Вот код:

def timedMap(x):
  start = time.time()
  # computation, no IO or access to Dask variables, no threading or multiprocessing
  ...
  return time.time() - start

print("Direct Execution")
print(timedMap(xml_string))

print("Dask Distributed")
import dask
from dask.distributed import Client
client = Client(threads_per_worker=1, n_workers=1)
print(client.submit(timedMap, xml_string).result())
client.close()

print("Dask Multiprocessing")
import dask.bag as db
bag = db.from_sequence([xml_string], npartitions=1)
print(bag.map(timedMap).compute()[0])

Вывод (это время без издержек до / после):

Direct Execution
54.59478211402893
Dask Distributed
91.79525017738342
Dask Multiprocessing
86.94628381729126

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

Почему вычисления в Dask намного медленнее? Я заподозрил профилировщик и увеличил интервал профилирования с 10 до 1000 мс, который сбил 5 секунд. Но все же ... Тогда я подозревал, что давление памяти, но работник не достигает своего предела, даже 50%.

С точки зрения накладных расходов (измерение общего времени отправки + результат и карта + вычисления), Dask добавляет 18 секунд для распределенного случая и 3 секунды для многопроцессорного случая. Я счастлив заплатить эти накладные расходы, но мне не нравится, что фактические вычисления занимают намного больше времени. У вас есть подсказка, почему это так? Что я могу настроить, чтобы ускорить это?

Примечание: когда я удваиваю вычислительную нагрузку, все длительности примерно удваиваются.

Всего наилучшего, Борис

1 Ответ

0 голосов
/ 14 января 2020

Вы не должны ожидать никакого ускорения, потому что у вас есть только один раздел.

Вы должны ожидать некоторого замедления, потому что вы перемещаете 500 МБ между процессами в Python. Я рекомендую вам прочитать следующее: https://docs.dask.org/en/latest/best-practices.html#load -data-with-dask

...