Подтвердить что ты не робот

Как настроить высокопроизводительный BLAS/LAPACK для бриза на 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-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.

спасибо тим

4b9b3361

Ответ 1

Последующие действия:

Мой предварительный вывод состоит в том, что установленные Atlas libs по умолчанию на экземпляре Amazon EMR просто медленны. Либо это общая сборка, которая не была оптимизирована для конкретного типа машины, либо она существенно медленнее, чем другие библиотеки. Используя этот script в качестве руководства, я построил и установил OpenBLAS для конкретного типа машины, где я запускал тесты (я также нашел полезную информацию здесь). После установки OpenBLAS мой тест умножения матрицы 3000x3000 был завершен в 3,9 раза (по сравнению с приведенными выше 15.1 при использовании стандартных Atlas-библиотек по умолчанию). Это все еще медленнее, чем тот же тест производительности на моем Mac (в два раза), но это различие попадает в диапазон, который может быть достоверным из-за низкой производительности h/w.

Вот полный список команд, которые я использовал для установки библиотек OpenBLAS на Amazon EMR, экземпляр Spark:

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