1 पॉइंट द्वारा GN⁺ 2024-07-05 | 1 टिप्पणियां | WhatsApp पर शेयर करें

सारांश

परिचय

  • मैट्रिक्स गुणन आधुनिक न्यूरल नेटवर्क का एक अनिवार्य हिस्सा है
  • NumPy बाहरी BLAS लाइब्रेरी का उपयोग करके उच्च प्रदर्शन हासिल करता है
  • यह लेख बताता है कि सरल, portable और scalable high-performance मैट्रिक्स गुणन कैसे implement किया जाए

NumPy प्रदर्शन

  • NumPy AMD CPU पर OpenBLAS का उपयोग करता है
  • प्रदर्शन का मापन FLOP/s में किया जाता है
  • Ryzen 7 7700 CPU पर NumPy के single-thread और multi-thread प्रदर्शन को मापा गया है

सैद्धांतिक सीमा

  • CPU की memory hierarchy और SIMD extension की व्याख्या की गई है
  • सैद्धांतिक रूप से single-thread में 163 GFLOPS और multi-thread में 1203 GFLOPS हासिल किए जा सकते हैं

सरल implementation

  • बुनियादी मैट्रिक्स गुणन एल्गोरिद्म की व्याख्या की गई है और सरल implementation के प्रदर्शन को मापा गया है
  • सरल implementation 2.7 GFLOPS हासिल करता है

kernel

  • मैट्रिक्स गुणन को छोटे subproblem में बाँटकर हल करने का तरीका बताया गया है
  • SIMD instruction का उपयोग करके kernel को optimize किया गया है
  • 16x6 kernel का उपयोग करके 147 GFLOPS हासिल किए गए हैं

masking और packing

  • मनमाने मैट्रिक्स आकार को संभालने के लिए boundary case को handle करने का तरीका बताया गया है
  • performance optimize करने के लिए masking और packing का उपयोग किया गया है
  • नई implementation 56 GFLOPS हासिल करती है

caching

  • CPU cache की memory system की व्याख्या की गई है
  • cache का उपयोग करके data reuse और cache management को optimize किया गया है

GN⁺ की राय

  • यह लेख high-performance मैट्रिक्स गुणन को implement करने का तरीका step-by-step समझाता है, इसलिए यह बहुत शिक्षाप्रद है
  • SIMD instruction और CPU cache का उपयोग करके optimization के तरीके सीखे जा सकते हैं
  • यह NumPy जैसी लाइब्रेरी के अंदरूनी कामकाज को समझने में मदद करता है
  • समान क्षमता वाले अन्य प्रोजेक्ट्स में Intel MKL, OpenBLAS आदि शामिल हैं
  • नई तकनीक या open source अपनाते समय performance और portability पर विचार करना चाहिए

1 टिप्पणियां

 
GN⁺ 2024-07-05
Hacker News टिप्पणियाँ
  • ज़्यादातर सॉफ़्टवेयर optimize नहीं होते, इसलिए performance सुधार की काफ़ी गुंजाइश रहती है

    • algorithm का चयन सबसे महत्वपूर्ण है
    • यह जाँचने की ज़रूरत है कि kernel call जैसे भारी operations को कम किया जा सकता है या नहीं
    • vectorization के ज़रिए performance बेहतर की जा सकती है
    • यह देखना चाहिए कि cache efficiency को optimize किया जा सकता है या नहीं
    • hardware-specific optimization की संभावना पर भी विचार करना चाहिए
  • BLIS repository में संदर्भित papers इस विषय को समझने के लिए प्रामाणिक सामग्री हैं

    • यह समझ नहीं आता कि कोई क्यों सोचता है कि optimized BLAS की performance अच्छी नहीं है
    • numpy के बजाय AMD का BLAS इस्तेमाल करना चाहिए
    • BLIS, OpenBLAS की तुलना में parallelization बेहतर तरीके से करता है
  • SIMD instructions, micro-kernel vectorization के लिए ज़रूरी नहीं हैं

    • सही block size का उपयोग करने पर BLIS का pure C micro-kernel हाथ से optimized implementation के 80% से अधिक performance दे सकता है
  • ज़्यादातर coding patterns पूरी तरह hardware-specific नहीं होते, इसलिए बहुत-सी performance छूट जाती है

    • "There's plenty of room at the top" नामक क्लासिक CS paper देखने लायक है
  • benchmark को आसानी से दोहराया जा सके, यह सराहनीय है

    • 16-core Xeon CPU पर matmul.c को gcc -O3 से compile करने पर 1.41 सेकंड, clang -O2 से compile करने पर 1.47 सेकंड लगे, जबकि NumPy को 1.07 सेकंड लगे
    • माना जा रहा है कि avx512 kernel अधिक तेज़ होगा
    • omp की जगह pthreads का इस्तेमाल कर thread pool को explicitly manage करने से overhead कम हो सकता है
  • यह सवाल उठता है कि numpy का implementation वास्तव में multithreading का उपयोग करता है या नहीं

  • यह जानने की जिज्ञासा है कि इसकी performance OpenBLAS से बेहतर क्यों है

    • इसमें caching जैसी details को संभाला गया है
    • यह भी सवाल है कि क्या यह किसी विशेष processor के लिए अधिक optimized है
  • एक तरफ Python और दूसरी तरफ C से तुलना करना उचित नहीं है

    • बेहतर होगा कि दोनों को C में लिखकर तुलना की जाए
  • mask generation की inefficiency खटकती है

    • global constant array बनाने या constant vector से तुलना करने जैसे अधिक efficient तरीके हैं
    • लेकिन यह एक मामूली मुद्दा है, और वास्तव में इससे बड़ा फ़र्क़ नहीं पड़ेगा
  • matrix multiplication को खुद multithreading करने की व्यावहारिकता पर सवाल है

    • multithreading, matrix multiplication का उपयोग करने वाले algorithms में अधिक उपयोगी हो सकती है
  • jart के tinyBLAS का उल्लेख

    • संबंधित लिंक दिया गया है