首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为Amazon,EC2上的Breeze配置高性能BLAS/LAPACK

如何为Amazon,EC2上的Breeze配置高性能BLAS/LAPACK
EN

Stack Overflow用户
提问于 2016-06-16 01:01:23
回答 1查看 2.8K关注 0票数 27

我正在尝试建立一个环境来支持集群上的探索性数据分析。根据对目前情况的初步调查,我的目标是使用Scala/Spark和Amazon提供集群。

目前,我只是尝试建立和运行一些基本的例子,以验证我已经配置好了所有的东西。我遇到的问题是,我没有看到我期望的亚马逊机器实例上的Atlas BLAS库的性能。

下面是我的简单基准测试的代码片段。它只是一个平方矩阵乘,然后是短脂肪乘和一个很高的瘦乘,以得到一个可以打印的小矩阵(我想确保Scala不会因为延迟的评估而跳过计算的任何部分)。

我使用Breeze作为线性代数库和netlib-java来为BLAS/LAPACK引入本地本地库。

代码语言:javascript
复制
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矩阵乘以大约。使用本机优化的BLAS库的2-4s。当我在MacBook Air上本地运行时,这个基准测试将在1.8s内完成。当我在EMR上运行它时,它大约完成了。11s (使用g2.2xlarge实例,尽管在m3.xlarge实例上获得了类似的结果)。作为另一次交叉检查,我在同一个EC2实例类型g2.2xlarge上从BIDMach项目上运行了一个预构建的EC2 AMI,得到了2.2s (注意,相同计算的GPU基准测试结果为0.047s)。

此时,我怀疑netlib-java没有加载正确的lib,但这正是我陷入困境的地方。我已经浏览过netlib-java自述--许多《时代》,而且看起来ATLAS库已经按要求安装了(参见下面)

代码语言:javascript
复制
[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

下面我展示了在Amazon实例上运行基准测试的两个例子。第一个显示本机系统BLAS何时正确加载。第二个显示了当本机BLAS不加载并且包返回到引用实现时。因此,它看起来确实是根据消息和时间加载一个本机BLAS。与在我的Mac上本地运行的情况相比,no BLAS情况在大约相同的时间内运行,但是本机BLAS情况在我的Mac上运行在1.8s,而在下面的情况下是15。与EMR相比,我的Mac的信息消息是相同的(除了特定的dir/文件名等)。

代码语言:javascript
复制
[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‘,但这似乎不适用于火花提交。或者我对阿特拉斯的期望是错误的,但似乎很难相信AWS会预先安装如果他们没有运行一个合理的竞争速度的lib。

如果您看到EMR上的lib没有正确地链接起来,请提供指导,说明我需要做什么才能让netlib-java获取Atlas库。

谢谢蒂姆

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-24 17:54:18

后续行动:

我的初步结论是,默认情况下安装在Amazon实例上的Atlas库非常慢。它要么是一个没有针对特定计算机类型进行优化的通用构建,要么根本上比其他库慢。使用这个脚本作为指南,我为运行基准测试的特定计算机类型构建并安装了OpenBLAS (我还找到了一些有用的信息这里)。一旦安装了OpenBLAS,我的3000x3000矩阵乘基准将在3.9中完成(与使用默认Atlas库时列出的15.1个基准相比)。这仍然比在我的Mac上运行的相同基准测试要慢(以x2的一倍),但是这种差异在一个范围内下降,这可以可信地归因于底层的h/w性能。

以下是我用来在亚马逊的EMR实例上安装OpenBLAS库的命令的完整列表:

代码语言:javascript
复制
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
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37848216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档