我是使用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之前-这是一种概念验证活动,用以检查事物是否按预期运行。
答案 0 :(得分:2)
您可能需要考虑的文档报价:
对于由多个任务使用的大参数,将数据预分散到每个工作程序中比将每个任务序列化一次更有效。可以使用scatter关键字参数来完成此操作,该参数将可迭代的对象发送给每个工作人员。
但是,总的来说,Dask有很多诊断程序可供您使用,尤其是调度程序的仪表板,可帮助您弄清您的工人在做什么以及如何花费时间-您最好进行调查。与任何计算一样,其他系统范围内的因素也非常重要:例如,您的存储容量有多接近?
但是,通常来说,Dask不是魔术,当数据无论如何适合内存时,肯定会出现dask增加大量开销的情况。仔细阅读文档,以了解您正在考虑的方法的预期用途-是应该加快速度,还是仅允许您处理比系统正常容纳的数据更多的数据?