Низкая производительность Dask по сравнению с родным sklearn - PullRequest
0 голосов
/ 15 ноября 2018

Я новичок в использовании Dask, но испытал мучительно низкую производительность при попытке переписать собственные функции sklearn в Dask. Я максимально упростил сценарий использования в надежде получить некоторую помощь.

Используя стандартные sklearn / numpy / pandas и т.д., у меня есть следующее:

df = pd.read_csv(location, index_col=False) # A ~75MB CSV
# Build feature list and dependent variables, code irrelevant

from sklearn import linear_model
model = linear_model.Lasso(alpha=0.1, normalize=False, max_iter=100, tol=Tol)
model.fit(features.values, dependent)
print(model.coef_)
print(model.intercept_)

Это займет несколько секунд, чтобы вычислить. Затем у меня есть в Dask следующее:

# Read in CSV and prepare params like before but using dask arrays/dataframes instead

with joblib.parallel_backend('dask'):
    from dask_glm.estimators import LinearRegression
    # Coerce data
    X = self.features.to_dask_array(lengths=True)
    y = self.dependents

    # Build regression
    lr = LinearRegression(fit_intercept=True, solver='admm', tol=self.tolerance, regularizer='l1', max_iter=100, lamduh=0.1)
    lr.fit(X, y)

    print(lr.coef_)
    print(lr.intercept_)

Что требует времени для расчета (около 30 минут). У меня есть только 1 рабочий Dask в моем кластере разработки, но у него есть 16 ГБ оперативной памяти и неограниченный процессор.

Кто-нибудь знает, почему это так медленно?

Надеюсь, мои пропуски в коде несущественны!

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

1 Ответ

0 голосов
/ 18 ноября 2018

Цитата из документации, которую вы, возможно, захотите рассмотреть:

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

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

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

...