2016-06-16 34 views
23

पर ब्रीज़ के लिए उच्च प्रदर्शन BLAS/LAPACK को कॉन्फ़िगर कैसे करें मैं क्लस्टर पर अन्वेषक डेटा विश्लेषण का समर्थन करने के लिए एक वातावरण स्थापित करने की कोशिश कर रहा हूं। क्लस्टर के प्रावधान के लिए अमेज़ॅन ईएमआर के साथ मेरा लक्ष्य स्काला/स्पार्क का उपयोग करने के शुरुआती सर्वेक्षण के आधार पर है।अमेज़ॅन ईएमआर, ईसी 2

वर्तमान में मैं कुछ बुनियादी उदाहरणों को प्राप्त करने और यह सत्यापित करने के लिए दौड़ रहा हूं कि मुझे सब कुछ ठीक से कॉन्फ़िगर किया गया है। मेरी समस्या यह है कि मैं अमेज़ॅन मशीन इंस्टेंस पर एटलस बीएलएस पुस्तकालयों से अपेक्षित प्रदर्शन को नहीं देख रहा हूं।

नीचे मेरे सरल बेंचमार्क का एक कोड स्निपेट है। यह केवल एक स्क्वायर मैट्रिक्स गुणा करता है जिसके बाद छोटी वसा गुणा होती है और एक छोटा पतला गुणा होता है जो मुद्रित किया जा सकता है (मैं यह सुनिश्चित करना चाहता था कि स्काला आलसी मूल्यांकन के कारण गणना के किसी हिस्से को छोड़ नहीं पाएगा)।

मैं रेखीय बीजगणित पुस्तकालय और netlib-जावा के लिए हवा का उपयोग कर रहा 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 मैट्रिक्स की उम्मीद कर रहा हूँ लगभग लेने के लिए गुणा करें। देशी, अनुकूलित BLAS लाइब्रेरी का उपयोग करके 2-4s। जब मैं अपने मैकबुक एयर पर स्थानीय रूप से चलाता हूं तो यह बेंचमार्क 1.8s में पूरा हो जाता है। जब मैं इसे ईएमआर पर चलाता हूं तो यह लगभग पूरा हो जाता है। 11s (एक g2.2xlarge उदाहरण का उपयोग करते हुए, हालांकि इसी तरह के परिणाम m3.xlarge उदाहरण पर प्राप्त किए गए थे)। एक और क्रॉस चेक के रूप में मैंने BIDMach project से उसी ईसी 2 इंस्टेंस प्रकार, जी 2.2xlarge पर एक प्रीबिल्ट ईसी 2 एएमआई चलाया, और 2.2s (नोट, उसी गणना के लिए जीपीयू बेंचमार्क 0.047s उत्पन्न हुआ) मिला।

इस बिंदु पर मुझे संदेह है कि नेटलिब-जावा सही lib लोड नहीं कर रहा है, लेकिन यह वह जगह है जहां मैं फंस गया हूं। मैं कई times netlib-जावा README पूरी कर चुके हैं और यह एटलस libs पहले से ही स्थापित कर रहे हैं के रूप में आवश्यक लगता है (नीचे देखें)

[[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 

नीचे मैं इस शो है 2 उदाहरण अमेज़न ईएमआर उदाहरण पर बेंचमार्क चल रहा है। पहला दिखाता है जब मूल प्रणाली बीएलएएस माना जाता है कि सही ढंग से लोड होता है। दूसरा दिखाता है जब मूल बीएलएएस लोड नहीं होता है और पैकेज संदर्भ कार्यान्वयन पर वापस आ जाता है। तो यह संदेश और समय के आधार पर मूल बीएलएएस लोड हो रहा प्रतीत होता है। मेरे मैक पर स्थानीय रूप से चलने की तुलना में, कोई भी बीएलएएस केस लगभग एक ही समय में चलता नहीं है, लेकिन मूल बीएलएएस केस मेरे मैक पर 1.8s में चलता है, जो नीचे दिए गए मामले में 15 एस की तुलना में चलता है। ईएमआर की तुलना में मेरे मैक के लिए जानकारी संदेश समान हैं (विशिष्ट डीआईआर/फ़ाइल नामों के अलावा, आदि)।

[[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 

इस बिंदु पर मेरे सबसे अच्छे अनुमान है कि यह वास्तव में एक देशी lib लोड कर रहा है, लेकिन यह एक सामान्य से एक लोड कर रहा है है। इस बात पर कोई सुझाव है कि मैं किस समय साझा की गई लाइब्रेरी को रन टाइम पर उठा रहा हूं? मैंने 'ldd' की कोशिश की लेकिन ऐसा लगता है कि स्पार्क-सबमिट के साथ काम नहीं करना है। या शायद एटलस के लिए मेरी अपेक्षाएं गलत हैं, लेकिन ऐसा लगता है कि एडब्ल्यूएस libs को पूर्व-स्थापित करेगा यदि वे एक उचित प्रतिस्पर्धी गति नहीं चला रहे थे।

यदि आप देखते हैं कि libs ईएमआर पर सही ढंग से लिंक नहीं हैं, तो नेटलाब-जावा द्वारा एटलस libs को उठाए जाने के लिए मुझे क्या करना है, इस पर मार्गदर्शन प्रदान करें।

धन्यवाद टिम

+1

आप सका कन्वर्ट "अनुवर्ती" एक उत्तर में? यह उपयोगी अंतर्दृष्टि प्रदान करता है और यदि कोई अन्य उत्तर नहीं दिया जाएगा तो मैं बक्षीस देना चाहता हूं। अग्रिम में धन्यवाद! –

+0

मैं पहले उदाहरण को फिर से नहीं बना सकता जहां आप डिफ़ॉल्ट ईएमआर एटलस देशी lib में खींचते हैं। क्या आपने अन्य चीजों को अलग-अलग किया है (आपकी पोस्ट में सूचीबद्ध नहीं है) जिसके कारण मूल lib को F2jBLAS के बजाय उपयोग किया जा सकता है? कोई फर्क नहीं पड़ता कि मैं क्या कोशिश करता हूं, मुझे लगता है कि अभी भी एफ 2 जे मिल रहा है। –

+0

जब मैंने इसे देखा तो यह काफी समय हो गया है। मुझे लगता है कि जिस तरह से नेटलिब को ब्रीज़ के साथ एकीकृत किया गया है, वह थोड़ा सा बदल गया है। लेकिन जैसा कि मुझे याद है, आपकी समस्या को दूर करने की कुंजी उस .jar को शामिल करना था जिसमें देशी लाइब्रेरी स्टब्स शामिल हैं। उस समय जब मैंने उपर्युक्त पोस्ट किया था, तो जार एचएडी को अतिरिक्त पथ चर के साथ स्पष्ट रूप से शामिल किया जाना चाहिए। यह मेरे आवेदन के साथ वसा जार में शामिल नहीं किया गया था। यहां बीएलएएस https://datasciencemadesimpler.wordpress.com/tag/blas/ –

उत्तर

10

अप का पालन करें:

मेरे जांच निष्कर्ष है कि एटलस libs अमेज़न ईएमआर उदाहरण पर डिफ़ॉल्ट रूप से स्थापित बस धीमी है। या तो यह एक सामान्य निर्माण है जिसे विशिष्ट मशीन प्रकार के लिए अनुकूलित नहीं किया गया है, या यह मूल रूप से अन्य पुस्तकालयों की तुलना में धीमी है।इस script का उपयोग एक मार्गदर्शिका के रूप में मैंने विशिष्ट मशीन प्रकार के लिए ओपनबीएलएस बनाया और स्थापित किया जहां मैं बेंचमार्क चला रहा था (मुझे कुछ उपयोगी जानकारी here भी मिली)। एक बार ओपनबीएलएस स्थापित हो गया था, मेरे 3000x3000 मैट्रिक्स गुणा बेंचमार्क 3.9s में पूरा हुआ (डिफ़ॉल्ट एटलस libs का उपयोग करते समय ऊपर सूचीबद्ध 15.1 की तुलना में)। यह अभी भी मेरे मैक (x2 के कारक द्वारा) के समान बेंचमार्क रन से धीमा है, लेकिन यह अंतर एक सीमा में पड़ता है जो विश्वसनीय रूप से अंतर्निहित एच/डब्ल्यू प्रदर्शन के कारण हो सकता है।

यहाँ आदेशों मैं अमेज़न के ईएमआर पर OpenBLAS libs स्थापित करने के लिए प्रयोग किया जाता है की एक पूरी सूची है, उदाहरण के स्पार्क है:

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

एडब्ल्यूएस में चल रहे कदम अभी भी दावा करते हैं कि मैं एफ 2 जे चला रहा हूं। इस देशी lib को हवा को इंगित करने के लिए आपने क्या कदम उठाए? क्या आपने हवा-देशी डीपी शामिल किया? आपके प्रश्न में अतिरिक्त कक्षापैथ शामिल करने का क्या महत्व है? आपके उदाहरण में ऐसा लगता है कि मूल lib को चुनना और F2J नहीं था। –

संबंधित मुद्दे