与本地sklearn相比,Dask性能较慢

时间:2018-11-15 13:32:54

标签: python scikit-learn dask

我是使用Dask的新手,但是在尝试重新编写Dask的本机sklearn函数时遇到了令人痛苦的缓慢性能。我已经尽可能简化了用例,希望能得到一些帮助。

使用标准的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工作程序,但是具有16GB内存和无限制的CPU。

有人知道为什么这么慢吗?

希望我的代码遗漏并不重要!

注意:这是最简单的用例,在人们问为什么甚至使用Dask之前-这是一种概念验证活动,用以检查事物是否按预期运行。

1 个答案:

答案 0 :(得分:2)

您可能需要考虑的文档报价:

  

对于由多个任务使用的大参数,将数据预分散到每个工作程序中比将每个任务序列化一次更有效。可以使用scatter关键字参数来完成此操作,该参数将可迭代的对象发送给每个工作人员。

但是,总的来说,Dask有很多诊断程序可供您使用,尤其是调度程序的仪表板,可帮助您弄清您的工人在做什么以及如何花费时间-您最好进行调查。与任何计算一样,其他系统范围内的因素也非常重要:例如,您的存储容量有多接近?

但是,通常来说,Dask不是魔术,当数据无论如何适合内存时,肯定会出现dask增加大量开销的情况。仔细阅读文档,以了解您正在考虑的方法的预期用途-是应该加快速度,还是仅允许您处理比系统正常容纳的数据更多的数据?