gpt4 book ai didi

apache-spark - svd 性能 pyspark 与 scipy

转载 作者:行者123 更新时间:2023-11-30 08:39:30 26 4
gpt4 key购买 nike

使用 pyspark 计算 SVD:

rdd = MLUtils.convertVectorColumnsFromML(df.select("ID", "TF_IDF")).rdd
index_mat = IndexedRowMatrix(rdd)

print('index_mat rows = {}'.format(index_mat.numRows()))
print('index_mat columns = {}'.format(index_mat.numCols()))

svd = index_mat.computeSVD(k=100, computeU=True)

输出:

index_mat rows = 2000

index_mat columns = 6000

spark df 有 100 个分区,我正在使用 20 个执行程序运行此作业。

这需要一个多小时。而使用 scipy 的类似代码只需 1 分钟即可运行。

from scipy.sparse.linalg import svds

u, s, vt = svds(tfidf_sparse, k=100)

最佳答案

对于小型数据集,像 Spark 这样的分布式系统有一个缺点。当您要处理的数据无法容纳在单个机器的内存中时,它们就开始有用。

以下是 Spark 比 scipy 慢的其他潜在原因的不完整列表:

  1. 首先是因为网络通信时间:

    对于适合单个机器内存的小型数据集,使用单个节点的 pandas、numpy 和 scipy 等工具将花费更少的时间移动数据并专注于实际计算。而您在 Spark 中使用的 20 个执行程序将不得不花费更多时间通过网络移动数据。因此,对于分布式系统,网络速度、带宽和拥塞程度等其他因素也会影响性能。

  2. 与使用最佳设置安装 Spark 相比,使用最佳设置安装 scipy 更容易:

    与为 Spark 安装相同的依赖项相比,使用 BLAS(一组加速线性代数例程)安装/配置 Scipy 更容易。例如,如果您通过 conda 使用 Scipy(来自 anaconda 发行版),它已经带有配置良好的 blas 依赖项。然而,Spark 默认使用线性代数运算的普通 java 实现,并要求您自己配置 blas(在每个执行器上)以获得更好的性能(查看mllib dependencies以获取更多信息)。您的系统可能没有安装 BLAS 依赖项。

  3. 您正在使用旧的基于 RDD 的机器学习库:mllib API。

    您应该使用较新的 ML API 版本。多个堆栈溢出线程解释了为什么您应该迁移到较新的 API。您可以查看此内容以了解总体思路:What's the difference between Spark ML and MLLIB packages

    一般来说,您应该使用 pyspark.ml 中的 API 而不是 pypsark.mllib(如果您使用的是 scala,则应该使用 org.apache.spark.ml 而不是 org.apache.spark.mllib)。因此,请尝试使用 ml API 重写您的代码。并再次进行基准测试。

更不用说 Spark 在每次执行开始时都会等待资源,这可能会减慢作业的整体时间,具体取决于集群的容量。

如果您需要更多详细信息,请提供可重现的示例,包括数据和有关数据集大小的更多信息(观测值数量和大小(以 GB 为单位))。

关于apache-spark - svd 性能 pyspark 与 scipy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58731901/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com