【问题标题】:Why netlib-java native blas/lapack libraries doesn't give performance improvement?为什么 netlib-java 本机 blas/lapack 库没有提高性能?
【发布时间】:2018-12-24 17:02:15
【问题描述】:

我正在使用这段代码来计算火花推荐:

    SparkSession spark = SparkSession
            .builder()
            .appName("SomeAppName")
            .config("spark.master", "local[" + args[2] + "]")
            .config("spark.local.dir",args[4])
            .getOrCreate();
    JavaRDD<Rating> ratingsRDD = spark
            .read().textFile(args[0]).javaRDD()
            .map(Rating::parseRating);
    Dataset<Row> ratings = spark.createDataFrame(ratingsRDD, Rating.class);
    ALS als = new ALS()
            .setMaxIter(Integer.parseInt(args[3]))
            .setRegParam(0.01)
            .setUserCol("userId")
            .setItemCol("movieId")
            .setRatingCol("rating").setImplicitPrefs(true);

    ALSModel model = als.fit(ratings);
    model.setColdStartStrategy("drop");
    Dataset<Row> rowDataset = model.recommendForAllUsers(50);

这些是使这段代码工作的 maven 依赖项:

    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_2.11</artifactId>
        <version>2.4.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-sql_2.11</artifactId>
        <version>2.4.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-mllib_2.11</artifactId>
        <version>2.4.0</version>
    </dependency>
    <dependency>
        <groupId>org.scala-lang</groupId>
        <artifactId>scala-library</artifactId>
        <version>2.11.8</version>
    </dependency>

使用此代码计算建议大约需要 70 秒才能用于我的数据文件。此代码产生以下警告:

WARN BLAS: Failed to load implementation from: com.github.fommil.netlib.NativeSystemBLAS
WARN BLAS: Failed to load implementation from: com.github.fommil.netlib.NativeRefBLAS
WARN LAPACK: Failed to load implementation from: com.github.fommil.netlib.NativeSystemLAPACK
WARN LAPACK: Failed to load implementation from: com.github.fommil.netlib.NativeRefLAPACK

现在我尝试通过在 maven 中添加此依赖项来启用 netlib-java:

    <dependency>
        <groupId>com.github.fommil.netlib</groupId>
        <artifactId>all</artifactId>
        <version>1.1.2</version>
        <type>pom</type>
    </dependency>

为了避免这个新环境崩溃,我不得不做这个额外的技巧:

LD_PRELOAD=/usr/lib64/libopenblas.so

现在它也可以工作了,它不会发出警告,但它的工作速度较慢,执行相同的计算平均需要约 170 秒。我在 CentOS 上运行它。

本机库不应该更快吗?有没有可能让它更快?

【问题讨论】:

  • 我能够重现警告。但是,我能够在 8 秒内获得 Spark 示例(Spark 文档)中的结果和所有结果,即使使用 show() 我也能在 16 秒内获得它。 setMaxIter() 和 master"local[" + args[2] + "]" 使用什么参数?我分别使用10 and 2
  • 你能分享一下数据集吗?可能我用的是小一点的?
  • 例如,您可以将 maxiter 设置为 ~100,以获得长时间运行

标签: maven apache-spark-mllib recommender-systems netlib-java


【解决方案1】:
  1. 首先你可以检查你的centos版本,因为centos 6可能没有使用原生库,检查this

  2. 据我所知,ALS 算法从 2.0 版本开始有所改进,您可以查看 Highlights in 2.2

    和 2.2 的源代码一样吹:

    所以原生库没有帮助!

【讨论】:

    猜你喜欢
    • 2016-07-17
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 2021-07-24
    • 2010-11-29
    • 2016-09-29
    • 1970-01-01
    相关资源
    最近更新 更多