与原生 sklearn 相比,Dask 性能较慢

Slow Dask performance compared to native sklearn

我是 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 worker,但它有 16GB 内存和无限 CPU.

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

希望我的代码遗漏不是很大!

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

您可能要考虑的文档引述:

For large arguments that are used by multiple tasks, it may be more efficient to pre-scatter the data to every worker, rather than serializing it once for every task. This can be done using the scatter keyword argument, which takes an iterable of objects to send to each worker.

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

不过,总的来说,Dask 并不神奇,当数据适合内存时,肯定会出现 dask 增加大量开销的情况。仔细阅读有关您正在考虑的方法的预期用途的文档 - 它应该加快速度,还是仅仅允许您处理比系统通常适合的更多数据?