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

спасибо Тим


person Tim Ryan    schedule 16.06.2016    source источник
comment
Не могли бы вы преобразовать продолжение в ответ? Он дает полезную информацию, и если другого ответа не будет, я хотел бы присудить награду. Заранее спасибо!   -  person    schedule 13.08.2016
comment
Я даже не могу воссоздать первый экземпляр, в котором вы используете собственную библиотеку EMR Atlas по умолчанию. Делали ли вы другие вещи по-другому (не перечисленные в вашем посте), из-за которых вместо F2jBLAS использовалась нативная библиотека? Что бы я ни пытался, я, кажется, все еще получаю F2J.   -  person Nathaniel Wendt    schedule 06.12.2017
comment
Прошло много времени с тех пор, как я смотрел на это. Я думаю, что способ интеграции netlib с Breeze немного изменился. Но, насколько я помню, ключ к решению вашей проблемы заключался в том, чтобы включить .jar, содержащий заглушки родной библиотеки. В то время, когда я впервые опубликовал вышеизложенное, jar ДОЛЖЕН быть включен явно с дополнительной переменной пути. Он НЕ попал в толстую банку с моим приложением. Вот хороший пост о настройке netlib для использования BLAS datasciencemadesimpler.wordpress.com/tag/blas   -  person Tim Ryan    schedule 10.12.2017
comment
Да, я смог, наконец, понять это из вышеизложенного и нескольких других случайных тем, которые я нашел. Ваш пост и ответ были очень полезны в моем процессе, ценю это!   -  person Nathaniel Wendt    schedule 11.12.2017


Ответы (1)


Следовать за:

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

Вот полный список команд, которые я использовал для установки библиотек 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
person Tim Ryan    schedule 24.08.2016
comment
Шаги, которые я запускаю в AWS, по-прежнему утверждают, что я использую F2J. Какие еще шаги вы предприняли, чтобы указать ветер на эту нативную библиотеку? Вы включили бриз-родной деп? Каково значение включения дополнительного classPath в ваш вопрос? В вашем примере это то, что, казалось, подобрало родную библиотеку, а не F2J. - person Nathaniel Wendt; 06.12.2017