Как настроить высокопроизводительный BLAS / LAPACK для Breeze на Amazon EMR, EC2
Я пытаюсь настроить среду для поддержки разведочного анализа данных в кластере. Основываясь на первоначальном обзоре того, что там, моя цель-использовать 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-4s с использованием родной, оптимизированной библиотеки BLAS. Когда я запускаю локально на своем MacBook Air, этот тест завершается за 1.8 С. Когда я запускаю это на EMR, он завершается приблизительно. 11s (используя g2.Экземпляр 2xlarge, хотя аналогичные результаты были получены на m3.экстренный экземпляр). В качестве еще одной перекрестной проверки я запустил встроенный EC2 AMI из проект BIDMach на том же типе экземпляра EC2, g2.2xlarge, и получил 2.2 s (обратите внимание, GPU бенчмарк для того же расчета дал 0.047 с).
на данный момент я подозреваю, что netlib-java не загружает правильный lib, но здесь я застрял. Я прошел через netlib-java README много времени и кажется, что библиотеки 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 работает в 1.8 s на моем Mac по сравнению с 15s в случае ниже. Информационные сообщения одинаковы для моего Mac по сравнению с EMR (кроме конкретных имен dir/файлов и т. д.).
[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
на данный момент мое лучшее предположение заключается в том, что он фактически загружает собственный lib, но загружает общий. Любые предложения о том, как я могу проверить, какую общую библиотеку он собирает во время выполнения? Я пробовал "ldd", но это, похоже, не работает с spark-submit. Или, может быть, мои ожидания для Atlas ошибочны, но, похоже, трудно поверить, что AWS предварительно установит библиотеки, если они не будут работать с разумно конкурентоспособными скоростями.
Если вы видите, что libs не правильно связанный с EMR, пожалуйста, укажите, что мне нужно сделать, чтобы библиотеки Atlas были подобраны netlib-java.
спасибо Тим!--4-->
1 ответов
дальнейшие действия:
мой предварительный вывод заключается в том, что библиотеки Atlas, установленные по умолчанию на экземпляре Amazon EMR, просто медленные. Либо это универсальная сборка, не оптимизированная для конкретного типа машины, либо она существенно медленнее, чем другие библиотеки. Используя это скрипт в качестве руководства я построил и установил OpenBLAS для конкретного типа машины, где я запускал тесты (я также нашел некоторую полезную информацию здесь). Однажды OpenBLAS был установлен my 3000x3000 matrix multiply benchmark, завершенный в 3.9 s (по сравнению с 15.1 s, перечисленными выше, при использовании библиотек Atlas по умолчанию). Это все еще медленнее, чем тот же тест, выполняемый на моем Mac (в x2 раз), но эта разница падает в диапазоне, который может быть достоверно связан с базовой производительностью h/w.
вот полный список команд, которые я использовал для установки OpenBLAS libs на EMR Amazon, Spark instance:
sudo yum install git
git clone https://github.com/xianyi/OpenBlas.git
cd OpenBlas/
make clean
make -j4
sudo mkdir /usr/lib64/OpenBLAS
sudo chmod o+w,g+w /usr/lib64/OpenBLAS/
make PREFIX=/usr/lib64/OpenBLAS install
sudo rm /etc/ld.so.conf.d/atlas-x86_64.conf
sudo ldconfig
sudo ln -sf /usr/lib64/OpenBLAS/lib/libopenblas.so /usr/lib64/libblas.so
sudo ln -sf /usr/lib64/OpenBLAS/lib/libopenblas.so /usr/lib64/libblas.so.3
sudo ln -sf /usr/lib64/OpenBLAS/lib/libopenblas.so /usr/lib64/libblas.so.3.5
sudo ln -sf /usr/lib64/OpenBLAS/lib/libopenblas.so /usr/lib64/liblapack.so
sudo ln -sf /usr/lib64/OpenBLAS/lib/libopenblas.so /usr/lib64/liblapack.so.3
sudo ln -sf /usr/lib64/OpenBLAS/lib/libopenblas.so /usr/lib64/liblapack.so.3.5