पर ब्रीज़ के लिए उच्च प्रदर्शन 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 को उठाए जाने के लिए मुझे क्या करना है, इस पर मार्गदर्शन प्रदान करें।
धन्यवाद टिम
आप सका कन्वर्ट "अनुवर्ती" एक उत्तर में? यह उपयोगी अंतर्दृष्टि प्रदान करता है और यदि कोई अन्य उत्तर नहीं दिया जाएगा तो मैं बक्षीस देना चाहता हूं। अग्रिम में धन्यवाद! –
मैं पहले उदाहरण को फिर से नहीं बना सकता जहां आप डिफ़ॉल्ट ईएमआर एटलस देशी lib में खींचते हैं। क्या आपने अन्य चीजों को अलग-अलग किया है (आपकी पोस्ट में सूचीबद्ध नहीं है) जिसके कारण मूल lib को F2jBLAS के बजाय उपयोग किया जा सकता है? कोई फर्क नहीं पड़ता कि मैं क्या कोशिश करता हूं, मुझे लगता है कि अभी भी एफ 2 जे मिल रहा है। –
जब मैंने इसे देखा तो यह काफी समय हो गया है। मुझे लगता है कि जिस तरह से नेटलिब को ब्रीज़ के साथ एकीकृत किया गया है, वह थोड़ा सा बदल गया है। लेकिन जैसा कि मुझे याद है, आपकी समस्या को दूर करने की कुंजी उस .jar को शामिल करना था जिसमें देशी लाइब्रेरी स्टब्स शामिल हैं। उस समय जब मैंने उपर्युक्त पोस्ट किया था, तो जार एचएडी को अतिरिक्त पथ चर के साथ स्पष्ट रूप से शामिल किया जाना चाहिए। यह मेरे आवेदन के साथ वसा जार में शामिल नहीं किया गया था। यहां बीएलएएस https://datasciencemadesimpler.wordpress.com/tag/blas/ –