Почему нативные библиотеки blas / lapack для netlib-java не дают улучшения производительности? - PullRequest
0 голосов
/ 24 декабря 2018

Я использую этот кусок кода для расчета рекомендаций по свечам:

    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

Теперь я пытаюсь включить netlib-java, добавив эту зависимость в maven:

    <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.

Разве это не должно быть быстрее с нативными библиотеками?Можно ли сделать это быстрее?

1 Ответ

0 голосов
/ 27 февраля 2019
  1. сначала вы можете проверить версию Centos, поскольку Centos 6 может не использовать собственные библиотеки, установите флажок this

  2. НасколькоПонятно, что алгоритм ALS был улучшен с версии 2.0, вы можете проверить Основные моменты в 2.2

    И исходный код от 2.2 в качестве удара:

    enter image description here

    , поэтому родные библиотеки не помогают!

...