पाइपलाइन समानांतर और बुलबुला विश्लेषण
Type: Build
Languages: Python
Prerequisites: Phase 19 Track C lessons 42-49
Time: ~90 min
सीखने के लक्ष्य
- एक क्रमिक मॉडल को N चरणों में विभाजित करें और N रैंकों में आगे की पाइपलाइन का अनुकरण करें।
- जीपीआईपीई कार्यक्रम का उपयोग करके पाइपलाइन के माध्यम से अनुसूची एम माइक्रोबाश (केवल आगे भरें, फिर पीछे) और बुलबुला अंश की गणना करें।
- मेगाट्रॉन-एलएम और पाइपड्रीम में इस्तेमाल किए जाने वाले इंटरलेव्ड 1F1B शेड्यूल के साथ बुलबुला की तुलना करें।
- चरण अनुभाग का बचाव करेंः प्रत्येक चरण के लिए समान गणना प्रत्येक चरण के लिए समान पैरामीटर की संख्या से अधिक मायने रखती है।
समस्या
fp16 में 70B-पैरामीटर मॉडल को केवल 140 GB के पैरामीटर की आवश्यकता होती है। कोई उपभोक्ता GPU इसे पकड़ता है. ZeRO-3 रैंक के पार मापदंडों को छोटा करता है लेकिन फिर भी प्रत्येक रैंक को प्रत्येक कदम के लिए पूरी परत को इकट्ठा करने की आवश्यकता होती है, प्रति परत लॉग ((एन) हॉप्स का भुगतान करते हुए। पाइपलाइन समानांतर एक अलग मार्ग लेती हैः मॉडल को N चरणों में काटकर प्रत्येक रैंक पर एक चरण लगाएं। परत 1 के आगे रैंक 0 पर समाप्त होता है और सक्रियण टेंसर को रैंक 1 पर देता है; रैंक 1 परत 2 पर चलता है और हाथों को रैंक 2 पर देता है; और इसी तरह। पीछे की ओर बहती है। स्मृति रैखिक रूप से गिरती है क्योंकि प्रत्येक रैंक में केवल एक चरण होता है; गणना अनुक्रमिक है, जो बुलबुला समस्या है।
बुलबुला पाइपलाइन की शुरुआत में निष्क्रिय समय (पहले माइक्रो बैच के अंतिम चरण तक पहुंचने का इंतजार) और अंत में (पिछले माइक्रो बैच के फिर से बहने का इंतजार) है। M माइक्रोबैच और N चरणों के साथ प्रति चरण बुलबुला अंश (N-1) /(M+N-1 है। M=8, N=4 पर यह 27% है। M=64 पर, N=4 4.5% है। जब आपके पास प्रत्येक चरण में कई माइक्रो बैच होते हैं तो बुलबुला छोटा होता है, जिसका अर्थ है प्रति माइक्रो बैच बैच आकार, जो कि माइक्रो बैच डिजाइन को चलाता है।
अवधारणा
flowchart LR R0[rank 0: stage 0 / layer 0] --> R1[rank 1: stage 1 / layer 1] R1 --> R2[rank 2: stage 2 / layer 2] R2 --> R3[rank 3: stage 3 / loss] R3 -.backward.-> R2 R2 -.backward.-> R1 R1 -.backward.-> R0
जीपीआईपी कार्यक्रम
आगे की पाइपलाइन को सभी M माइक्रोबैच से भरें, इससे पहले कि कोई भी पीछे की ओर शुरू हो; फिर पीछे की ओर रिवर्स में ड्रेन करें। प्रत्येक माइक्रो बैच से सक्रियण को पीछे की ओर तक रखा जाना चाहिए, इसलिए स्मृति एम के साथ रैखिक रूप से बढ़ती है। आगे M+N-1 चक्र लेता है, पीछे एक और M+N-1 चक्र लेता है। प्रति चरण उपयोगी कार्य 2M चक्र है; प्रति चरण बुलबुला 2 ((N-1) चक्र है। बुलबुला अंश (N-1) /(M+N-1) है जब आगे और पीछे प्रत्येक समय की एक इकाई लेता है। N से अधिक M चुनना बुलबुला को छिपाता है।
1F1B अनुसूची
अंतरालः जैसे ही माइक्रोबैच का आगे की ओर अंतिम चरण तक पहुंच जाता है, उसे पीछे की ओर शुरू करें और उसे वापस बहने दें। कार्यक्रम प्रत्येक चरण में एक आगे और एक पीछे की ओर बदलता है। बुलबुला अभी भी N-1 है लेकिन सक्रियण स्मृति पाइपलाइन गहराई से सीमा है, माइक्रोबैच की संख्या नहीं. उत्पादन पाइपलाइनों में 1F1B (मेगाट्रॉन, पाइपड्रीम) का उपयोग किया जाता है। सबक पहले GPipe को लागू करता है क्योंकि यह सरल है, और 1F1B एक अभ्यास के रूप में।
क्यों समान गणना प्रति चरण मायने रखता है
यदि चरण 0 50 एमएस और चरण 1 100 एमएस लेता है, तो प्रत्येक चक्र चरण 1 पर बंद होता है। अन्य चरणों को चरण 1 के रिलीज के लिए प्रतीक्षा करने के लिए प्रति चक्र 50 एमएस निष्क्रिय होता है। समान पैरामीटर गिनती गलत अक्ष हैः एक ट्रांसफार्मर की गणना पर ध्यान और प्रति परत एमएलपी का वर्चस्व होता है, और एम्बेडिंग परतों में कई पैरामीटर होते हैं लेकिन कम गणना होती है। चरण असाइनमेंट को प्रत्येक चरण के लिए एफएलओपी के बराबर होना चाहिए, न कि प्रत्येक चरण के लिए वजन।
बैच बनाम बैच
एक पाइपलाइन में आकार B के M माइक्रोबैच चल रहे हैं। प्रभावी बैच आकार MB है। पाइपलाइन चरण के अंत में ग्रेडिएंट संयुक्त MB उदाहरणों पर ग्रेडिएंट है। बुलबुला अंश M पर निर्भर करता है; ऑप्टिमाइज़र M*B देखता है। ट्यूनिंग M का मतलब प्रति-microbatch मेमोरी (GPipe के लिए उच्च M के साथ उच्च सक्रियण मेमोरी) के खिलाफ बुलबुला (नीचे उच्च M के साथ) व्यापार करना है।
इसे बनाओ
code/main.pyकार्य करता हैः
PipelineStage: एक छोटाnn.Moduleजो एक चरण के मापदंडों को रखता है और उजागर करता हैforward(activation). .Pipeline(stages, num_microbatches): प्रति चरण सिमुलेट वॉल क्लॉक का उपयोग करके सिमुलेट चरणों पर जीपीआईपी कार्यक्रम को व्यवस्थित करता है।bubble_fraction(num_stages, num_microbatches): बंद-रूप (N-1) /(M+N-1) ।- एक 4 चरण डेमो जो प्रति माइक्रोबैच निशान और मापा हुआ बुलबुला अंश प्रिंट करता है।
इसे चलाओः
bashpython3 code/main.pyआउटपुटः चरण-दर-मिक्रोबैच गैन्ट चार्ट और बंद-रूप भविष्यवाणी के खिलाफ बुलबुला प्रतिशत।
जंगली में उत्पादन के पैटर्न
तीन पैटर्न पाइपलाइन को जहाज के लिए पर्याप्त समानांतर कठोर करते हैं।
Activation checkpointing pairs with pipeline.जीपीआईपी पर उड़ान में एम माइक्रोबैच के साथ, सक्रियण स्मृति एम गुना एक माइक्रोबैच है। सक्रियण चेकपॉइंटिंग आगे को पीछे के समय में पुनः गणना करता है, स्मृति के लिए गणना का व्यापार करता है; संयोजन है जो लंबे अनुक्रमों के लिए पाइपलाइन को ट्रेस करने योग्य बनाता है।
Stage balance is measured, not assumed.उत्पादन टीमों एक प्रोफाइलिंग पास चलाता है जो लक्ष्य हार्डवेयर पर वास्तविक प्रति-परत गणना (FLOPs और वॉल-घड़ी) को मापता है, फिर उस माप द्वारा विभाजन करता है।--num-layers-per-stageध्वज एक सूची को स्वीकार करता है ताकि चरणों की प्रति परत लागत अलग होने पर असमान परत गणना की अनुमति दी जा सके।
Send-recv schedule must avoid deadlock.एक पाइपलाइन जिसमें तार पर डेलॉक प्राप्त करने से पहले प्रत्येक चरण भेजने के लिए है। मानक फिक्स इंटरलेव करना हैः पहले समान-रैंक चरण भेजें फिर रिक्व, फिर पहले अपवाद-रैंक चरण भेजें। पाठ कार्यक्रम स्पष्ट रूप से रैंक करते हैं ताकि पैटर्न दिखाई दे।
इसका प्रयोग करें
उत्पादन के पैटर्नः
- Megatron-LM.पाइपलाइन समानांतर के लिए संदर्भ पैमाने पर। 1F1B का उपयोग करता है और संकेतक + पाइपलाइन + डेटा समानांतर संयुक्त समर्थन करता है।
- DeepSpeed Pipeline.ZeRO के साथ एकीकृत; ZeRO-1 + पाइपलाइन सबसे बड़े खुले मॉडल के लिए एक आम संयोजन है।
- PyTorch Pipe.पाइपलाइन के लिए PyTorch-निवासी रैपर, पर बनाया गया
torch.distributed.pipeline.sync.Pipe. .
इसे भेजें
पाठ 80 टुकड़े टुकड़े किए गए चेकपॉइंट में प्रत्येक चरण पैरामीटर स्कार्ट्स को संग्रहीत करता है। पाठ 81 अंत-से-अंत डेमो पर डीडीपी + जेआरओ + पाइपलाइन बनाता है (आत्मा में; डेमो रनटाइम के लिए पाइपलाइन को सिमुलेट करता है) ।
व्यायाम
- 1F1B लागू करें और जांचें कि बुलबुला अंश GPipe से मेल खाता है लेकिन सक्रियण स्मृति सीमित है।
- गहरे मॉडल पर वास्तविक प्रति चरण समय का प्रोफाइल बनाएं और मापी गई दीवार घड़ी द्वारा चरणों को पुनः संतुलित करें।
- पाइपलाइन माइक्रो बैचों में ग्रेडिएंट जमाव जोड़ें और ग्रेडिएंट को बराबर की जांच करें कि ग्रेडिएंट समकक्ष पूर्ण बैच आगे के ग्रेडिएंट के बराबर है।
- सक्रियण चेकपोइंटिंग के साथ पाइपलाइन को जोड़ा और स्मृति की गिरावट को गणना लागत के मुकाबले मापें।
- पाइपलाइन को डीडीपी (प्रत्येक पाइपलाइन रैंक को डेटा-समान समूह में दोहराया जाता है) के साथ जोड़ें और 2 डी शेड्यूल के माध्यम से तर्क दें।
प्रमुख शर्तें
| Term | What people say | What it actually means |
|---|---|---|
| Pipeline | "Model parallel along depth" | One stage per rank, activations flow stage to stage |
| Bubble | "Pipeline idle time" | (N-1) steps at start + end where some stages have no work |
| Microbatch | "Slice of the batch" | One forward/backward unit; bubble shrinks as M grows |
| GPipe | "Fill then drain" | All M forwards before any backward; high activation memory |
| 1F1B | "Interleaved schedule" | One forward one backward per stage; bounded activation memory |
आगे पढ़ना
- Huang et al, GPipe: Efficient Training of Giant Neural Networks
- Narayanan et al, PipeDream: Generalized Pipeline Parallelism for DNN Training
- Megatron-LM pipeline parallel docs
- चरण 19 पाठ 76 - अनुसूची में उपयोग किए जाने वाले भेज/पुनर्प्राप्त आदिम
- चरण 19 पाठ 78 - ज़ेरो पाइपलाइन के साथ सीधा है और अक्सर संयुक्त है
This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.
Browse the complete course catalog or open this lesson on GitHub.