Я пытаюсь настроить среду для поддержки аналитической аналитики данных в кластере. Исходя из первоначального обзора того, что там моя цель использует 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). В качестве другой проверки перекрестных ссылок я запустил предварительно сконфигурированный EC2 AMI из проекта BIDMach на том же экземпляре экземпляра EC2, g2.2xlarge и получил 2.2s (примечание, показатель GPU для одного и того же расчета дал 0,047 с).
На этом этапе я подозреваю, что netlib-java не загружает правильную библиотеку lib, но это то место, где я застрял. Я прошел через netlib-java README много раз, и кажется, что библиотеки ATLAS уже установлены по мере необходимости (см. Ниже)
[[email protected] ~]$ 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
[[email protected] ~]$ cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
[[email protected] ~]$ 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
[[email protected] ~]$ cat /etc/ld.so.conf.d/atlas-x86_64.conf
/usr/lib64/atlas
Ниже я показываю 2 примера, в которых используется эталонный тест на экземпляре Amazon EMR. Первое показывает, когда собственная система BLAS якобы загружается правильно. Второй показывает, когда нативный BLAS не загружается, и пакет возвращается к эталонной реализации. Таким образом, похоже, что загружается собственный BLAS на основе сообщений и времени. По сравнению с запуском локально на моем Mac, случай BLAS не работает примерно в одно и то же время, но собственный BLAS-код работает в 1,8 с на моем Mac по сравнению с 15 секундами в приведенном ниже примере. Информационные сообщения одинаковы для моего Mac по сравнению с EMR (кроме определенных имен файлов/файлов и т.д.).
[[email protected] ~]$ 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
[[email protected] ~]$
[[email protected] ~]$ 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
В этот момент я думаю, что на самом деле загружает собственный lib, но он загружает общий. Любые предложения о том, как я могу проверить, какую библиотеку он собирает во время выполнения? Я пробовал "ldd", но это, похоже, не работает с spark-submit. Или, может быть, мои ожидания в отношении Atlas ошибочны, но, похоже, сложно поверить, что AWS предварительно установит libs, если они не будут работать на достаточно конкурентных скоростях.
Если вы видите, что libs не правильно связаны с EMR, пожалуйста, предоставьте указания относительно того, что мне нужно сделать, чтобы библиотеки Atlas могли быть захвачены netlib-java.
спасибо тим