Tim*_*yan 27 amazon-ec2 amazon-emr scala-breeze apache-spark jblas
我正在尝试设置一个环境来支持群集上的探索性数据分析.根据对该项目的初步调查,我的目标是使用Scala/Spark和Amazon EMR来配置群集.
目前我只想尝试一些基本的例子,以确认我已经正确配置了所有内容.我遇到的问题是我没有看到我期望从亚马逊机器实例上的Atlas BLAS库获得的性能.
下面是我简单基准测试的代码片段.它只是一个方形矩阵乘法,然后是短脂肪乘法和高瘦乘法,以产生一个可以打印的小矩阵(我想确保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")
}
Run Code Online (Sandbox Code Playgroud)
根据基准测试的网络调查,我预计3000x3000矩阵乘以约.2-4s使用原生的优化BLAS库.当我在MacBook Air上本地运行时,此基准测试在1.8秒内完成.当我在EMR上运行时它大约完成了.11s(使用g2.2xlarge实例,尽管在m3.xlarge实例上获得了类似的结果).作为另一个交叉检查,我在相同的EC2实例类型g2.2xlarge上运行了BIDMach项目的预构建EC2 AMI ,并获得了2.2s(注意,相同计算的GPU基准测试产生了0.047s).
此时我怀疑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
Run Code Online (Sandbox Code Playgroud)
下面我将展示在Amazon EMR实例上运行基准测试的2个示例.第一个显示本机系统BLAS应该正确加载的时间.第二个显示当未加载本机BLAS并且包退回到参考实现时.所以它确实似乎是根据消息和时间加载本机BLAS.与在我的Mac上本地运行相比,无BLAS案例大致在同一时间运行,但本机BLAS案例在我的Mac上以1.8s运行,而在下面的情况下为15s.与EMR相比,我的Mac的信息消息是相同的(除了特定的目录/文件名等).
[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
Run Code Online (Sandbox Code Playgroud)
在这一点上,我最好的猜测是它实际上正在加载一个本机库,但它正在加载一个通用库.有关如何验证它在运行时获取哪个共享库的任何建议?我试过'ldd',但这似乎不适用于spark-submit.或许我对Atlas的期望是错误的,但似乎很难相信如果他们没有运行相当具有竞争力的速度,AWS会预安装这些库.
如果您发现在EMR上没有正确链接库,请提供有关我需要做什么的指导,以便netlib-java获取Atlas库.
谢谢蒂姆
Tim*_*yan 11
跟进:
我的初步结论是默认情况下在Amazon EMR实例上安装的Atlas库很慢.它是一个未针对特定机器类型进行优化的通用构建,或者它基本上比其他库慢.使用此脚本作为指南,我为运行基准测试的特定机器类型构建并安装了OpenBLAS(我还在这里找到了一些有用的信息).一旦安装了OpenBLAS,我的3000x3000矩阵乘法基准测试在3.9s内完成(与上面列出的使用默认Atlas libs时的15.1s相比).这仍然比在我的Mac上运行相同的基准测试速度慢(x2倍),但是这个差异可以归因于潜在的黑客性能.
以下是我用于在Amazon的EMR,Spark实例上安装OpenBLAS库的命令的完整列表:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2151 次 |
| 最近记录: |