2016-06-16 41 views
23

ü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

+1

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! –

+0

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. –

+0

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/ –

cevap

10

Takip:

Benim belirsiz bir sonuç Amazon EMR örneğinde varsayılan olarak yüklü Atlas kütüphanelerini sadece yavaş olmasıdır. Ya belirli makine tipi için optimize edilmemiş veya diğer kütüphanelerden temel olarak daha yavaş olan jenerik bir yapıdır.Ben kriterler koşuyordu belirli makine türü için ben inşa rehber ve kurulu OpenBLAS olarak bu script Kullanma (Ayrıca bazı faydalı bilgiler here bulundu). OpenBLAS yüklendiği kez (varsayılan Atlas kütüphanelerini kullanırken yukarıda listelenen 15.1s kıyasla) benim 3000x3000 matris çarpma kriter 3.9s tamamlanmıştır. Bu (x2 bir faktör) benim Mac aynı performans testinin göre hala daha düşük olmakla birlikte, bu fark inandırıcı nedeniyle performans ağırlık/h altta yatan olabilir bir aralığı içine düşmektedir.

Burada Amazon'un EMR hakkında OpenBLAS kütüphanelerini yüklemek için kullanılan komutların tam bir listesi örneği Spark geçerli:

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 
+0

AWS'de çalıştırdığım Adımlar hala F2J'yi çalıştırdığımı iddia ediyor. Esintiyi bu yerel kitaplığa yönlendirmek için başka hangi adımları attınız? Esintisiz yerel deponuzu dahil ettiniz mi? Sorunuza ekstra bir classPath eklemenin önemi nedir? Örneğinizde, F2J'yi değil, yerel kütüphaneyi almayı bekleyen şey buydu. –