- GPU हज़ारों कोर वाला एक बड़े पैमाने का parallel processor है, जिसे एक साथ बहुत सारे काम प्रोसेस करने के लिए डिज़ाइन किया गया है
- CPU जटिल और sequential कामों में बेहतरीन होता है, लेकिन एक समय में प्रोसेस किए जा सकने वाले कामों की संख्या सीमित होती है
- इसके विपरीत, GPU हज़ारों threads के ज़रिए कामों को parallel में प्रोसेस करता है, इसलिए बड़े पैमाने के डेटा को तेज़ी से संभालने में इसकी खास ताकत होती है
- उदाहरण के लिए, NVIDIA RTX 4090 GPU में 16,384 CUDA cores होते हैं, जिसकी तुलना एक उन्नत CPU के 16~24 cores से की जा सकती है
- GPU का हर core CPU core से धीमा होता है, लेकिन बहुत बड़ी संख्या में cores की parallel processing की वजह से यह matrix operations जैसे बड़े पैमाने की गणनाओं के लिए उपयुक्त है
CUDA और Python
- NVIDIA का CUDA (Compute Unified Device Architecture) एक platform और C++ extension है, जो GPU पर चलने वाले programs लिखने की सुविधा देता है
- CUDA programming model और API उपलब्ध कराता है, जिससे डेवलपर्स ऐसा code लिख सकते हैं जो सीधे GPU पर execute हो
- इसके जरिए parallel processing वाले कामों को CPU से GPU पर offload करके performance बेहतर की जा सकती है
- Python डेवलपर्स Numba जैसे tools का उपयोग करके GPU acceleration का लाभ उठा सकते हैं
- Numba एक Python compiler है, जो Python code को CUDA-supported GPU पर चलने लायक compile करता है
- इससे Python डेवलपर्स बहुत कम नई syntax और terminology के साथ आसानी से GPU-accelerated computing शुरू कर सकते हैं
- CUDA Python, CUDA driver और runtime API के लिए Cython/Python wrappers देता है, जिससे Python डेवलपर्स GPU की parallel computing का उपयोग कर सकें
- CUDA Python को PIP और Conda के माध्यम से install किया जा सकता है
CUDA की thread और block संरचना
- CUDA में kernel वह function होता है जो GPU पर चलता है; kernel को execute करने पर सैकड़ों या हज़ारों parallel threads एक साथ चलती हैं और अलग-अलग डेटा प्रोसेस करती हैं
- इस मॉडल को SIMT (Single-Instruction Multiple-Thread) model कहा जाता है
- Threads, warp (32 threads का समूह) में व्यवस्थित होती हैं, और warps को blocks में group किया जाता है
- हर block streaming multiprocessor (SM) पर execute होता है, और SM के पास सीमित resources होते हैं, जैसे registers और shared memory
- Block size इन resources के allocation और एक साथ चल सकने वाले warps की संख्या (occupancy) को प्रभावित करती है
- Threads के blocks की संख्या और size को ठीक से सेट करके GPU resources का अधिक कुशल उपयोग किया जा सकता है
Memory management और optimization
- CUDA programming में CPU (host) और GPU (device) के बीच memory management को स्पष्ट रूप से संभालना पड़ता है
- सामान्य flow इस प्रकार होता है:
- GPU memory allocate करना (
cudaMalloc)
- Host से device पर data copy करना (
cudaMemcpy)
- Kernel execute करना
- Device से host पर result copy करना (
cudaMemcpy)
- GPU memory free करना (
cudaFree)
- Shared memory एक on-chip memory है, जो block के भीतर threads को तेज़ी से data share करने देती है; इससे memory access speed बेहतर हो सकती है
- Threads के बीच synchronization
__syncthreads() का उपयोग करके किया जाता है, जिससे race conditions से बचा जा सकता है
LLM के लिए custom CUDA kernels
- बड़े language model (LLM) workloads में memory overhead कम करने और efficiency बढ़ाने के लिए custom CUDA kernels विकसित किए जा रहे हैं, जो कई operations को एक ही kernel में जोड़ते हैं
- उदाहरण के लिए, FlashAttention Transformer के self-attention को optimize करता है और memory read/write कम करके efficiency को काफी बढ़ाता है
- FlashAttention shared memory का उपयोग करके operations को tile करता है, जिससे लंबे sequences में भी उच्च efficiency हासिल होती है
- ऐसी optimizations deep learning में memory bandwidth bottleneck की समस्या को हल करने में मदद कर सकती हैं
PyTorch और CUDA implementation की तुलना
- PyTorch में high-level abstraction की मदद से GPU operations को आसानी से किया जा सकता है
- उदाहरण के लिए, दो vectors का sum निकालने का operation इस तरह सरलता से implement किया जा सकता है:
import torch
# GPU에서 두 개의 큰 벡터 생성
a = torch.rand(1000000, device='cuda')
b = torch.rand(1000000, device='cuda')
# 요소별로 더하기
c = a + b
- लेकिन जब performance optimization की ज़रूरत हो, तब CUDA का सीधे उपयोग करके custom kernel लिखा जा सकता है
- CUDA के जरिए memory access patterns, thread configuration, shared memory के उपयोग आदि को बारीकी से tune करके performance को अधिकतम किया जा सकता है
- उदाहरण के लिए, FlashAttention का CUDA implementation memory access को optimize करता है और operations को shared memory में tile करके performance सुधारता है
- ऐसी low-level optimizations के जरिए PyTorch के high-level implementation से भी अधिक performance हासिल की जा सकती है
निष्कर्ष
- GPU की parallel processing क्षमता का उपयोग करके बड़े पैमाने के data processing और जटिल computations को कुशलतापूर्वक किया जा सकता है
- CUDA एक ऐसा platform है जो GPU की performance का अधिकतम उपयोग संभव बनाता है, और Python डेवलपर्स भी Numba जैसे tools के जरिए इसके फायदे उठा सकते हैं
- CUDA की thread और block संरचना, memory management techniques आदि को समझने से अधिक कुशल GPU programming संभव होती है
- खासकर deep learning जैसे क्षेत्रों में custom CUDA kernels लिखकर performance को अधिकतम किया जा सकता है
- PyTorch जैसे high-level frameworks का उपयोग करते हुए भी, ज़रूरत पड़ने पर low-level CUDA optimization के जरिए और बेहतर performance हासिल की जा सकती है
1 टिप्पणियां
Hacker News की राय
एक मूर्खतापूर्ण सवाल: क्या एक इंजीनियर के तौर पर AI के गणितीय पहलुओं को सीखे बिना CUDA या GPU आर्किटेक्चर के लो-लेवल हिस्सों में गहराई तक जाना संभव है? अगर हाँ, तो शुरुआत कैसे करनी चाहिए? लगता है कि ऑप्टिमाइज़ेशन और खास तरह की गणनाओं के लिए GPU क्यों इस्तेमाल किए जाते हैं, यह सीखना होगा
यह बहुत शानदार लेख है। AI द्वारा बनाए गए लगने वाले inline quiz (QnA) समझ की जाँच के लिए बहुत उपयोगी हैं। काश हर ट्यूटोरियल में यह फीचर शामिल होता
मैं जानना चाहता हूँ कि क्या सभी CUDA ट्यूटोरियल AI पर केंद्रित होते हैं, या फिर उदाहरण के लिए सामान्य scientific computing के लिए भी होते हैं। high-performance computing के लिए पंख के ऊपर हवा के प्रवाह जैसी चीज़ों को आज़माना मज़ेदार लग सकता है
इसे साझा करने के लिए धन्यवाद, पढ़कर अच्छा लगा। एक थोड़ा संबंधित सवाल है: क्या किसी के पास इस बारे में समझ है कि DeepSeek ने CUDA को बायपास करके execution को अधिक efficient कैसे बनाया?
Jensen दे, Guido ले ले
यह किताब: "Programming Massively Parallel Processors" उन लोगों के लिए विशेष रूप से उपयुक्त लगती है जो CPU से GPU आर्किटेक्चर की ओर जा रहे हैं
साथ ही https://github.com/rust-gpu/rust-gpu और https://github.com/rust-gpu/rust-cuda भी देखें
संबंधित लिंक: https://sakana.ai/ai-cuda-engineer/ और https://reddit.com/r/MachineLearning/…
मैं जानना चाहता हूँ कि हाल में क्या बदला है, जिससे वे simulation जो पहले केवल CPU पर संभव थे, अब GPU (जैसे isaac sim) पर पूरी तरह चलाए जा सकते हैं
चूँकि यह PySpur की वेबसाइट पर है, मैं यह भी जानना चाहता हूँ कि क्या किसी के पास PySpur और n8n जैसे AI agent के लिए UI tools का अनुभव है। मैं मज़े के लिए कुछ ideas का prototype बनाना चाहता हूँ, इसलिए कुछ मददगार ढूँढ़ रहा हूँ। इसे self-host करना होगा ($), इसलिए Open Hands जैसी अपेक्षाकृत आसानी से configure होने वाली चीज़ बेहतर लगेगी