Phase 19: Capstone Projects

पाइपलाइन समानांतर और बुलबुला विश्लेषण

टेंसर समानांतरता मैट्रिक्स को रैंक में गुणा करती है। पाइपलाइन समानांतरता मॉडल को रैंक में विभाजित करती है, प्रत्येक रैंक में एक चरण। माइक्रोबैच पाइपलाइन के माध्यम से बहते हैं। शुरुआत और अंत में खाली समय बबल है; इसे न्यूनतम करना पूरे शिल्प है।

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 अंत-से-अंत डेमो पर डीडीपी + जेआरओ + पाइपलाइन बनाता है (आत्मा में; डेमो रनटाइम के लिए पाइपलाइन को सिमुलेट करता है) ।

व्यायाम

  1. 1F1B लागू करें और जांचें कि बुलबुला अंश GPipe से मेल खाता है लेकिन सक्रियण स्मृति सीमित है।
  2. गहरे मॉडल पर वास्तविक प्रति चरण समय का प्रोफाइल बनाएं और मापी गई दीवार घड़ी द्वारा चरणों को पुनः संतुलित करें।
  3. पाइपलाइन माइक्रो बैचों में ग्रेडिएंट जमाव जोड़ें और ग्रेडिएंट को बराबर की जांच करें कि ग्रेडिएंट समकक्ष पूर्ण बैच आगे के ग्रेडिएंट के बराबर है।
  4. सक्रियण चेकपोइंटिंग के साथ पाइपलाइन को जोड़ा और स्मृति की गिरावट को गणना लागत के मुकाबले मापें।
  5. पाइपलाइन को डीडीपी (प्रत्येक पाइपलाइन रैंक को डेटा-समान समूह में दोहराया जाता है) के साथ जोड़ें और 2 डी शेड्यूल के माध्यम से तर्क दें।

प्रमुख शर्तें

TermWhat people sayWhat 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

आगे पढ़ना

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.