Я пытаюсь настроить среду для поддержки исследовательского анализа данных в кластере. Основываясь на первоначальном обзоре того, что там есть, моя цель — использовать Scala/Spark с Amazon EMR для предоставления кластера.
В настоящее время я просто пытаюсь запустить несколько базовых примеров, чтобы убедиться, что у меня все настроено правильно. Проблема, с которой я столкнулся, заключается в том, что я не вижу той производительности, которую ожидаю от библиотек Atlas BLAS на экземпляре машины Amazon.
Ниже приведен фрагмент кода моего простого теста. Это просто умножение квадратной матрицы, за которым следует умножение короткой толстой и высокой тонкой, чтобы получить маленькую матрицу, которую можно распечатать (я хотел быть уверенным, что Scala не пропустит какую-либо часть вычислений из-за ленивых вычислений).
Я использую Breeze для библиотеки линейной алгебры и netlib-java для загрузки локальных собственных библиотек для BLAS/LAPACK.
import breeze.linalg.{DenseMatrix, DenseVector}
import org.apache.spark.annotation.DeveloperApi
import org.apache.spark.rdd.RDD
import org.apache.spark.{Partition, SparkContext, TaskContext}
import org.apache.spark.SparkConf
import com.github.fommil.netlib.BLAS.{getInstance => blas}
import scala.reflect.ClassTag
object App {
def NaiveMultiplication(n: Int) : Unit = {
val vl = java.text.NumberFormat.getIntegerInstance.format(n)
println(f"Naive Multipication with vector length " + vl)
println(blas.getClass().getName())
val sm: DenseMatrix[Double] = DenseMatrix.rand(n, n)
val a: DenseMatrix[Double] = DenseMatrix.rand(2,n)
val b: DenseMatrix[Double] = DenseMatrix.rand(n,3)
val c: DenseMatrix[Double] = sm * sm
val cNormal: DenseMatrix[Double] = (a * c) * b
println(s"Dot product of a and b is \n$cNormal")
}
Основываясь на веб-обзоре тестов, я ожидаю, что умножение матрицы 3000x3000 займет прибл. 2-4 с использованием собственной оптимизированной библиотеки BLAS. Когда я запускаю локально на своем MacBook Air, этот тест завершается за 1,8 с. Когда я запускаю это в EMR, оно завершается примерно через 11s (с использованием экземпляра g2.2xlarge, хотя аналогичные результаты были получены на экземпляре m3.xlarge). В качестве еще одной перекрестной проверки я запустил готовый AMI EC2 из проекта BIDMach на том же экземпляре EC2. type, g2.2xlarge и получил 2,2 с (обратите внимание, тест GPU для того же расчета дал 0,047 с).
На данный момент я подозреваю, что netlib-java не загружает правильную библиотеку, но здесь я застрял. Я просмотрел README netlib-java много раз и кажется, что библиотеки ATLAS уже установлены по мере необходимости (см. ниже)
[hadoop@ip-172-31-3-69 ~]$ ls /usr/lib64/atlas/
libatlas.a libcblas.a libclapack.so libf77blas.so liblapack.so libptcblas.so libptf77blas.so
libatlas.so libcblas.so libclapack.so.3 libf77blas.so.3 liblapack.so.3 libptcblas.so.3 libptf77blas.so.3
libatlas.so.3 libcblas.so.3 libclapack.so.3.0 libf77blas.so.3.0 liblapack.so.3.0 libptcblas.so.3.0 libptf77blas.so.3.0
libatlas.so.3.0 libcblas.so.3.0 libf77blas.a liblapack.a libptcblas.a libptf77blas.a
[hadoop@ip-172-31-3-69 ~]$ cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
[hadoop@ip-172-31-3-69 ~]$ ls /etc/ld.so.conf.d
atlas-x86_64.conf kernel-4.4.11-23.53.amzn1.x86_64.conf kernel-4.4.8-20.46.amzn1.x86_64.conf mysql55-x86_64.conf R-x86_64.conf
[hadoop@ip-172-31-3-69 ~]$ cat /etc/ld.so.conf.d/atlas-x86_64.conf
/usr/lib64/atlas
Ниже я покажу 2 примера запуска эталонного теста на инстансе Amazon EMR. Первый показывает, когда родная система BLAS якобы загружается корректно. Второй показывает, когда собственный BLAS не загружается и пакет возвращается к эталонной реализации. Таким образом, похоже, что он загружает собственный BLAS на основе сообщений и времени. По сравнению с локальным запуском на моем Mac, случай без BLAS выполняется примерно за то же время, но собственный вариант BLAS выполняется на моем Mac за 1,8 с по сравнению с 15 с в приведенном ниже случае. Информационные сообщения для моего Mac одинаковы по сравнению с EMR (кроме конкретных имен каталогов/файлов и т. д.).
[hadoop@ip-172-31-3-69 ~]$ spark-submit --class "com.cyberatomics.simplespark.App" --conf "spark.driver.extraClassPath=/home/hadoop/simplespark-0.0.1-SNAPSHOT-jar-with-dependencies.jar" --master local[4] simplespark-0.0.1-SNAPSHOT-jar-with-dependencies.jar 3000 naive
Naive Multipication with vector length 3,000
Jun 16, 2016 12:30:39 AM com.github.fommil.jni.JniLoader liberalLoad
INFO: successfully loaded /tmp/jniloader2856061049061057802netlib-native_system-linux-x86_64.so
com.github.fommil.netlib.NativeSystemBLAS
Dot product of a and b is
1.677332076284315E9 1.6768329748988206E9 1.692150656424957E9
1.6999000993276503E9 1.6993872020220244E9 1.7149145239563465E9
Elapsed run time: 15.1s
[hadoop@ip-172-31-3-69 ~]$
[hadoop@ip-172-31-3-69 ~]$ spark-submit --class "com.cyberatomics.simplespark.App" --master local[4] simplespark-0.0.1-SNAPSHOT-jar-with-dependencies.jar 3000 naive
Naive Multipication with vector length 3,000
Jun 16, 2016 12:31:32 AM com.github.fommil.netlib.BLAS <clinit>
WARNING: Failed to load implementation from: com.github.fommil.netlib.NativeSystemBLAS
Jun 16, 2016 12:31:32 AM com.github.fommil.netlib.BLAS <clinit>
WARNING: Failed to load implementation from: com.github.fommil.netlib.NativeRefBLAS
com.github.fommil.netlib.F2jBLAS
Dot product of a and b is
1.6640545115052865E9 1.6814609592261212E9 1.7062846398842275E9
1.64471099826913E9 1.6619129531594608E9 1.6864479674870768E9
Elapsed run time: 28.7s
На данный момент я думаю, что на самом деле он загружает нативную библиотеку, но загружает универсальную. Любые предложения о том, как я могу проверить, какую общую библиотеку он выбирает во время выполнения? Я попробовал «ldd», но, похоже, это не работает с spark-submit. Или, может быть, мои ожидания от Atlas неверны, но мне трудно поверить, что AWS будет предварительно устанавливать библиотеки, если они не будут работать с достаточно конкурентоспособными скоростями.
Если вы видите, что библиотеки неправильно подключены к EMR, дайте мне указания о том, что мне нужно сделать, чтобы библиотеки Atlas были подобраны netlib-java.
спасибо Тим