üzerinde Breeze için yüksek performanslı BLAS/LAPACK nasıl yapılandırılır Kümedeki açıklayıcı veri analizini desteklemek için bir ortam kurmaya çalışıyorum. Orada ne var bir ilk ankete dayanarak hedefimi kümelenmeyi sağlamak için Amazon EMR ile Scala/Spark kullanın.Amazon EMR, EC2
Şu anda yalnızca düzgün bir şekilde yapılandırılmış olan herşeyi doğrulamak için bazı temel örnekleri hazırlamaya çalışıyorum. Sorun şu ki, Amazon makinesi örneğindeki Atlas BLAS kütüphanelerinden beklediğim performansı görmüyorum.
Aşağıda, basit karşılaştırmamın bir kod snippet'i var. Bu sadece bir kare matrisin çoğalması ve ardından kısa şişman çoğalması ve yazdırılabilen küçük bir matris elde etmek için çok uzun bir ince çarpım (Scala'nın tembel değerlendirmeden dolayı hesaplamanın herhangi bir bölümünü atlamayacağından emin olmak istedim).
Ben 3000x3000 matrisi bekliyorum kriterler bir web araştırmasına dayanarak 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")
}
için yerel yerli kütüphanelerde çekmeye lineer cebir kütüphane ve netlib-java için Breeze kullanıyorum yakl. Yerli, optimize edilmiş bir BLAS kütüphanesi kullanarak 2-4s. MacBook Air'ım üzerinde yerel olarak çalıştığımda bu değerlendirme 1.8s'de tamamlanıyor. Bunu EMR'de çalıştırdığımda yakl. 11s (bir g2.2xlarge örneği kullanarak, m3.xlarge örneğinde benzer sonuçlar elde edilmiştir). Başka bir çapraz kontrol olarak, aynı EC2 örnek tipi, g2.2xlarge üzerinde BIDMach project'dan önceden oluşturulmuş bir EC2 AMI çalıştırdım ve 2.2s aldım (not, aynı hesaplama için GPU benchmark değeri 0.047).
Bu noktada, netlib-java'nın doğru lib'i yüklemediğinden şüpheleniyorum, ama burası sıkışıp kaldım. Ben times birçok netlib-java README geçtiniz ve onu gerektiği gibi ATLAS kütüphanelerini zaten yüklü görünüyor ben göstereceğim Amazon EMR örneğinde kıyaslama sistemi 2 örneklerini ettik Aşağıda
[[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
(aşağıya bakınız). İlk, yerel sistem BLAS'ın doğru bir şekilde yüklendiği zamanı gösterir. İkincisi, yerel BLAS'ın yüklenmediğini ve paketin referans uygulamasına geri döndüğünü gösterir. Bu yüzden mesajlara ve zamanlamaya göre yerel bir BLAS yükleniyor gibi görünüyor. Mac'imde yerel olarak çalışmayla karşılaştırıldığında, hiçbir BLAS vakası yaklaşık olarak aynı anda çalışmıyor, ancak yerel BLAS durumu Mac'imde 1,8 saniyede çalışıyor. Bilgi mesajları Mac'im için EMR ile aynıdır (belirli dir/dosya adları, vb. Dışında). Bu noktada
[[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
en iyi tahmin aslında bir yerli lib yüklenirken, ancak genel bir tane yükleniyor olmasıdır. Hangi paylaşılan kitaplığın çalışma zamanında teslim alındığını nasıl doğrulayabileceğime dair herhangi bir öneriniz var mı? Ben 'ldd' denedim ama bu spark-submit ile çalışmak için değil gibi görünüyor. Ya da belki de Atlas için beklentilerim yanlıştır, ancak AWS'nin makul bir rekabet hızına sahip olmadıkları takdirde lib'leri önceden kurması gerektiğine inanmak zor görünmektedir.
Eğer lib'lerin EMR'de doğru şekilde bağlanmadığını görüyorsanız, lütfen Atlas lib'lerinin netlib-java tarafından alınabilmesi için ne yapmam gerektiği konusunda rehberlik sağlayın.
sayesinde tim
Olabilir dönüştürmek "takip" ı cevap olarak? Faydalı bilgiler sağlar ve başka bir cevap olmazsa, ödül vermeyi isterim. Şimdiden teşekkürler! –
Hatta varsayılan EMR Atlas yerli lib çekmek ilk örneğini yeniden oluşturamazsınız. yerine F2jBLAS arasında kullanılmak üzere yerli lib neden farklı (yazınıza yer almayan) başka şeyler yaptı mı? Ne denediğim önemli değil, hala F2J'yi elde ettim. –
Buna baktığımdan çok uzun zaman geçti. Netlib'in Breeze ile entegre olmasının yolu biraz değişti. Ancak, hatırladığım gibi, sorununuzu aşmanın anahtarı, yerel kitaplık taslaklarını içeren .jar eklemekti. Yukarıdakileri ilk gönderdiğimde, ek bir yol değişkeniyle açıkça içerilen kavanoz HAD'ı. Benim uygulama ile yağ kavanoza dahil DEĞİLDİ. İşte nihayet yukarıda ve buldum birkaç diğer rasgele ipliklerden bu anlamaya başardı Evet BLAS https://datasciencemadesimpler.wordpress.com/tag/blas/ –