2014-10-28 6 views
6

के बीच खराब प्रदर्शन अंतर मैं sklearn.decomposition.TruncatedSVD() को 2 अलग-अलग कंप्यूटरों पर चलाने और प्रदर्शन अंतर को समझने की कोशिश कर रहा हूं।लिनक्स और विंडोज

कंप्यूटर 1 (विंडोज 7, भौतिक कंप्यूटर)

OS Name Microsoft Windows 7 Professional 
System Type x64-based PC 
Processor Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz, 3401 Mhz, 4 Core(s), 
8 Logical Installed Physical Memory (RAM) 8.00 GB 
Total Physical Memory 7.89 GB 

कंप्यूटर 2 (Debian, अमेज़न बादल पर)

Architecture:   x86_64 
CPU op-mode(s):  32-bit, 64-bit 
Byte Order:   Little Endian 
CPU(s):    8 

width: 64 bits 
capabilities: ldt16 vsyscall32 
*-core 
    description: Motherboard 
    physical id: 0 
*-memory 
    description: System memory 
    physical id: 0 
    size: 29GiB 
*-cpu 
    product: Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz 
    vendor: Intel Corp. 
    physical id: 1 
    bus info: [email protected] 
    width: 64 bits 

कंप्यूटर 3 (विंडोज 2008R2, अमेज़न पर बादल)

OS Name Microsoft Windows Server 2008 R2 Datacenter 
Version 6.1.7601 Service Pack 1 Build 7601 
System Type x64-based PC 
Processor Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz, 2500 Mhz, 
4 Core(s), 8 Logical Processor(s) 
Installed Physical Memory (RAM) 30.0 GB 

दोनों कंप्यूटर अजगर 3.2 और समान sklearn, numpy, साथ चल रहे हैं scipy संस्करणों

इस प्रकार मैं cProfile भाग गया:

print(vectors.shape) 
>>> (7500, 2042) 

_decomp = TruncatedSVD(n_components=680, random_state=1) 
global _o 
_o = _decomp 
cProfile.runctx('_o.fit_transform(vectors)', globals(), locals(), sort=1) 

कंप्यूटर 1 उत्पादन

>>> 833 function calls in 1.710 seconds 
Ordered by: internal time 

ncalls tottime percall cumtime percall filename:lineno(function) 
    1 0.767 0.767 0.782 0.782 decomp_svd.py:15(svd) 
    1 0.249 0.249 0.249 0.249 {method 'enable' of '_lsprof.Profiler' objects} 
    1 0.183 0.183 0.183 0.183 {method 'normal' of 'mtrand.RandomState' objects} 
    6 0.174 0.029 0.174 0.029 {built-in method csr_matvecs} 
    6 0.123 0.021 0.123 0.021 {built-in method csc_matvecs} 
    2 0.110 0.055 0.110 0.055 decomp_qr.py:14(safecall) 
    1 0.035 0.035 0.035 0.035 {built-in method dot} 
    1 0.020 0.020 0.589 0.589 extmath.py:185(randomized_range_finder) 
    2 0.018 0.009 0.019 0.010 function_base.py:532(asarray_chkfinite) 
    24 0.014 0.001 0.014 0.001 {method 'ravel' of 'numpy.ndarray' objects} 
    1 0.007 0.007 0.009 0.009 twodim_base.py:427(triu) 
    1 0.004 0.004 1.710 1.710 extmath.py:232(randomized_svd) 

कंप्यूटर 2 आउटपुट

>>> 858 function calls in 40.145 seconds 
Ordered by: internal time 
ncalls tottime percall cumtime percall filename:lineno(function) 
    2 32.116 16.058 32.116 16.058 {built-in method dot} 
    1 6.148 6.148 6.156 6.156 decomp_svd.py:15(svd) 
    2 0.561 0.281 0.561 0.281 decomp_qr.py:14(safecall) 
    6 0.561 0.093 0.561 0.093 {built-in method csr_matvecs} 
    1 0.337 0.337 0.337 0.337 {method 'normal' of 'mtrand.RandomState' objects} 
    6 0.202 0.034 0.202 0.034 {built-in method csc_matvecs} 
    1 0.052 0.052 1.633 1.633 extmath.py:183(randomized_range_finder) 
    1 0.045 0.045 0.054 0.054 _methods.py:73(_var) 
    1 0.023 0.023 0.023 0.023 {method 'argmax' of 'numpy.ndarray' objects} 
    1 0.023 0.023 0.046 0.046 extmath.py:531(svd_flip) 
    1 0.016 0.016 40.145 40.145 <string>:1(<module>) 
    24 0.011 0.000 0.011 0.000 {method 'ravel' of 'numpy.ndarray' objects} 
    6 0.009 0.002 0.009 0.002 {method 'reduce' of 'numpy.ufunc' objects} 
    2 0.008 0.004 0.009 0.004 function_base.py:532(asarray_chkfinite) 

कंप्यूटर 3 उत्पादन

>>>   858 function calls in 2.223 seconds 
Ordered by: internal time 
ncalls tottime percall cumtime percall filename:lineno(function) 
    1 0.956 0.956 0.972 0.972 decomp_svd.py:15(svd) 
    2 0.306 0.153 0.306 0.153 {built-in method dot} 
    1 0.274 0.274 0.274 0.274 {method 'normal' of 'mtrand.RandomState' objects} 
    6 0.205 0.034 0.205 0.034 {built-in method csr_matvecs} 
    6 0.151 0.025 0.151 0.025 {built-in method csc_matvecs} 
    2 0.133 0.067 0.133 0.067 decomp_qr.py:14(safecall) 
    1 0.032 0.032 0.043 0.043 _methods.py:73(_var) 
    1 0.030 0.030 0.030 0.030 {method 'argmax' of 'numpy.ndarray' objects} 
    24 0.026 0.001 0.026 0.001 {method 'ravel' of 'numpy.ndarray' objects} 
    2 0.019 0.010 0.020 0.010 function_base.py:532(asarray_chkfinite) 
    1 0.019 0.019 0.773 0.773 extmath.py:183(randomized_range_finder) 
    1 0.019 0.019 0.049 0.049 extmath.py:531(svd_flip) 

सूचना {निर्मित विधि डॉट} 0.035s/कॉल से 16.058s/कॉल करने के लिए अंतर है, 450 गुना धीमी !!

------+---------+---------+---------+---------+--------------------------------------- 
ncalls| tottime | percall | cumtime | percall | filename:lineno(function) HARDWARE 
------+---------+---------+---------+---------+--------------------------------------- 
1  | 0.035 | 0.035 | 0.035 | 0.035 | {built-in method dot}  Computer 1 
2  | 32.116 | 16.058 | 32.116 | 16.058 | {built-in method dot}  Computer 2 
2  | 0.306 | 0.153 | 0.306 | 0.153 | {built-in method dot}  Computer 3 

मैं समझता हूँ कि प्रदर्शन अंतर होना चाहिए, लेकिन मैं यह है कि उच्च किया जाना चाहिए?

क्या कोई तरीका है कि मैं इस प्रदर्शन मुद्दे को और डीबग कर सकता हूं?

संपादित

मैं एक नया कंप्यूटर परीक्षण किया है, कंप्यूटर 3 जो अपने HW कंप्यूटर से 2 और विभिन्न ओएस

साथ इसी तरह की है परिणाम {निर्मित विधि के लिए 0.153s/कॉल कर रहे हैं डॉट} लिनक्स फिर भी 100 गुना तेजी से !!

संपादित 2

कंप्यूटर 1 numpy config

>>> np.__config__.show() 
lapack_opt_info: 
    libraries = ['mkl_lapack95_lp64', 'mkl_blas95_lp64', 'mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'libiomp5md', 'libifportmd', 'mkl_lapack95_lp64', 'mkl_blas95_lp64', 'mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'libiomp5md', 'libifportmd'] 
    library_dirs = ['C:/Program Files (x86)/Intel/Composer XE/mkl/lib/intel64'] 
    define_macros = [('SCIPY_MKL_H', None)] 
    include_dirs = ['C:/Program Files (x86)/Intel/Composer XE/mkl/include'] 
blas_opt_info: 
    libraries = ['mkl_lapack95_lp64', 'mkl_blas95_lp64', 'mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'libiomp5md', 'libifportmd'] 
    library_dirs = ['C:/Program Files (x86)/Intel/Composer XE/mkl/lib/intel64'] 
    define_macros = [('SCIPY_MKL_H', None)] 
    include_dirs = ['C:/Program Files (x86)/Intel/Composer XE/mkl/include'] 
openblas_info: 
    NOT AVAILABLE 
lapack_mkl_info: 
    libraries = ['mkl_lapack95_lp64', 'mkl_blas95_lp64', 'mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'libiomp5md', 'libifportmd', 'mkl_lapack95_lp64', 'mkl_blas95_lp64', 'mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'libiomp5md', 'libifportmd'] 
    library_dirs = ['C:/Program Files (x86)/Intel/Composer XE/mkl/lib/intel64'] 
    define_macros = [('SCIPY_MKL_H', None)] 
    include_dirs = ['C:/Program Files (x86)/Intel/Composer XE/mkl/include'] 
blas_mkl_info: 
    libraries = ['mkl_lapack95_lp64', 'mkl_blas95_lp64', 'mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'libiomp5md', 'libifportmd'] 
    library_dirs = ['C:/Program Files (x86)/Intel/Composer XE/mkl/lib/intel64'] 
    define_macros = [('SCIPY_MKL_H', None)] 
    include_dirs = ['C:/Program Files (x86)/Intel/Composer XE/mkl/include'] 
mkl_info: 
    libraries = ['mkl_lapack95_lp64', 'mkl_blas95_lp64', 'mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'libiomp5md', 'libifportmd'] 
    library_dirs = ['C:/Program Files (x86)/Intel/Composer XE/mkl/lib/intel64'] 
    define_macros = [('SCIPY_MKL_H', None)] 
    include_dirs = ['C:/Program Files (x86)/Intel/Composer XE/mkl/include'] 

कंप्यूटर 2 numpy config

>>> np.__config__.show() 
lapack_info: 
    NOT AVAILABLE 
lapack_opt_info: 
    NOT AVAILABLE 
blas_info: 
    libraries = ['blas'] 
    library_dirs = ['/usr/lib'] 
    language = f77 
atlas_threads_info: 
    NOT AVAILABLE 
atlas_blas_info: 
    NOT AVAILABLE 
lapack_src_info: 
    NOT AVAILABLE 
openblas_info: 
    NOT AVAILABLE 
atlas_blas_threads_info: 
    NOT AVAILABLE 
blas_mkl_info: 
    NOT AVAILABLE 
blas_opt_info: 
    libraries = ['blas'] 
    library_dirs = ['/usr/lib'] 
    language = f77 
    define_macros = [('NO_ATLAS_INFO', 1)] 
atlas_info: 
    NOT AVAILABLE 
lapack_mkl_info: 
    NOT AVAILABLE 
mkl_info: 
    NOT AVAILABLE 
+0

कृपया प्रत्येक नोड से 'पायथन - संस्करण' के आउटपुट को भी शामिल करें। –

+2

एनपी के रूप में 'पायथन-सी' आयात numpy की तुलना करें; एनपी .__ config __। शो() ' '। –

+4

आपने numpy कैसे स्थापित किया? इसका उपयोग कौन सा बीएलएएस है?यदि विंडोज़ बॉक्स एमकेएल का उपयोग करते हैं और लिनक्स एक डिफ़ॉल्ट बीएलएएस का इस्तेमाल करता है, तो शायद यह बहुत समझाएगा। ('' Np .__ config __। शो() '' इस जानकारी को उत्पन्न करता है) –

उत्तर

4

{built-in method dot}np.dot समारोह है, जो चारों ओर मैट्रिक्स मैट्रिक्स, मैट्रिक्स वेक्टर और वेक्टर वेक्टर गुणन के लिए CBLAS दिनचर्या एक NumPy आवरण है। आपकी विंडोज मशीन सीबीएलएएस के भारी ट्यून किए गए Intel MKL संस्करण का उपयोग करती है। लिनक्स मशीन धीमी पुरानी संदर्भ कार्यान्वयन का उपयोग कर रही है।

यदि आप ATLAS या OpenBLAS (दोनों लिनक्स पैकेज प्रबंधक के माध्यम से उपलब्ध हैं) स्थापित करते हैं, या वास्तव में, इंटेल एमकेएल, तो आपको भारी गति दिखाई देने की संभावना है। sudo apt-get install libatlas-dev आज़माएं, यह देखने के लिए कि क्या उसने ATLAS उठाया है, और फिर मापें, NumPy कॉन्फ़िगरेशन को फिर से जांचें।

एक बार जब आपने सही सीबीएलएएस लाइब्रेरी पर फैसला किया है, तो आप विज्ञान-सीखने को फिर से तैयार करना चाहेंगे। इसमें से अधिकांश अपनी रैखिक बीजगणित आवश्यकताओं के लिए न्यूमपी का उपयोग करता है, लेकिन कुछ एल्गोरिदम (विशेष रूप से के-साधन) सीधे सीबीएलएएस का उपयोग करते हैं।

ओएस के साथ इसका कोई संबंध नहीं है।

1

Noti 0.035s से कॉल {अंतर्निहित विधि डॉट} अंतर/कॉल 16.058s/कॉल, 450 गुना धीमा !!

घड़ी की गति और कैश हिट अनुपात पर विचार करने के लिए दो बड़े कारक हैं। कोर i7-3770 की तुलना में ज़ीऑन ई 5-2670 में बहुत अधिक कैश है। और i7-3770 में टर्बो मोड के साथ उच्च चोटी की घड़ी की गति है। जबकि आपके ज़ीऑन में हार्डवेयर में एक बड़ा कैश है, ईसी 2 पर आप अन्य ग्राहकों के साथ उस कैश को प्रभावी ढंग से साझा कर सकते हैं।

क्या कोई तरीका है कि मैं इस प्रदर्शन मुद्दे को और डीबग कर सकता हूं?

ठीक है, आपके पास अलग-अलग माप (आउटपुट) और इनपुट (ओएस और हार्डवेयर) पर कई अंतर हैं। अलग-अलग इनपुट को देखते हुए, इन अलग-अलग आउटपुट की संभावना है।

सीपीयू प्रदर्शन काउंटर विभिन्न प्रणालियों पर आपके एल्गोरिदम के प्रदर्शन के प्रभाव को बेहतर ढंग से अलग कर देगा। ज़ीन्स में समृद्ध प्रदर्शन काउंटर हैं, लेकिन उनमें सभी को CPU_CLK_UNHALTED और LLC_MISSES होना चाहिए। कोड निर्देश निष्पादित या कैश मिस जैसी घटनाओं के लिए निर्देश सूचक को मैप करके ये काम करते हैं। इसलिए आप देख सकते हैं कि कोड के कौन से हिस्से सीपीयू और कैश बाध्य हैं। चूंकि घड़ी के गति और कैश आकार आपके लक्ष्यों के बीच भिन्न होते हैं, इसलिए आप पाएंगे कि एक कैश बाध्य है और दूसरा CPU है।

लिनक्स में perf नामक एक उपकरण है (कभी-कभी perf_events)। यह भी देखें http://www.brendangregg.com/perf.html

लिनक्स और विंडोज पर आप इंटेल वीट्यून का भी उपयोग कर सकते हैं।

+0

मैंने अपना प्रश्न संपादित किया, विभिन्न एचडब्ल्यू समस्या को खत्म करने के लिए कंप्यूटर 3 जोड़ा –

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