Phase 19: Capstone Projects

تجزیه و تحلیل موازی لوله و فقره

موازی گرایی تنسور ماتریس را در میان صف ها تقسیم می کند. موازی خط لوله مدل را در میان صف ها تقسیم می کند، یک مرحله در هر رتبه. میکروباتش ها از طریق خط لوله جریان دارند. زمان خالی در آغاز و پایان فلفل است؛ به حداقل رساندن آن کل کشتی است.

Type: Build

Languages: Python

Prerequisites: Phase 19 Track C lessons 42-49

Time: ~90 min

اهداف یادگیری

  • یک مدل متوالی را به مراحل N تقسیم کنید و یک خط لوله جلو در صف های N را شبیه سازی کنید.
  • برنامه M میکروباتش ها را با استفاده از برنامه GPipe از طریق خط لوله (تنها به جلو و سپس به عقب) پر کنید و بخش فقرات را محاسبه کنید.
  • با برنامه 1F1B که در Megatron-LM و PipeDream استفاده شده است مقایسه کنید.
  • تعیین مرحله دفاع: محاسبه برابر در هر مرحله مهم تر از تعداد پارامترهای برابر در هر مرحله است.

مشکل

یک مدل 70B-پارامتر در fp16 تنها به 140 جی بی پارامتر نیاز دارد. هیچ 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

برنامه GPipe

لوله را با تمام میکروباتش های M قبل از شروع به عقب پر کنید؛ سپس به عقب به عقب ریز کنید. فعاليت هاي هر ميکروباتچ بايد تا عقب نگه داشته بشه، تا حافظه خطي با M رشد کنه پیش روی چرخه های M+N-1 و عقب چرخه های دیگر M+N-1 است. کار مفید در هر مرحله دو میلیون چرخه است؛ هر مرحله حباب دو چرخه است. شکاف فقرات (N-1) / ((M+N-1) است وقتی هر یک از پیش و عقب یک واحد زمان را می گیرد. انتخاب M بزرگتر از N، حباب را پنهان می کند.

برنامه 1F1B

فاصله: به محض اینکه مایکروباتچ به مرحله آخر برسد، به عقب حرکت کند و اجازه دهد به عقب حرکت کند. برنامه ای که در هر مرحله به طور متناوب انجام می شود، یک مرحله به جلو و یک مرحله به عقب است. حباب هنوز N-1 هست ولي حافظه فعاليت با عمق لوله محدود شده نه با تعداد میکروباتش لوله های تولید از 1F1B (Megatron، PipeDream) استفاده می کنند. درسی GPipe را اول اجرا می کند زیرا ساده تر است و 1F1B را به عنوان یک تمرین انجام می دهد.

چرا محاسبه برابر در هر مرحله مهم است

اگر مرحله 0 50 ms و مرحله 1 100 ms طول بکشد، هر چرخه در مرحله 1 قرار می گیرد. مراحل دیگر 50 ms در چرخه منتظر مرحله 1 برای آزاد شدن هستند. تعداد پارامتر برابر محور اشتباه است: محاسبه یک ترانسفورماتور توسط توجه به علاوه MLP در هر لایه تسلط دارد و لایه های گنجانده شده دارای پارامترهای بسیاری هستند اما محاسبه کمی هستند. اختصاص مرحله باید FLOPs در هر مرحله را برابر کند، نه وزن در هر مرحله.

میکروباتش در مقابل دسته

یک خط لوله M میکروباتچ اندازه B را اجرا می کند. اندازه موثر دسته MB است. گرادینت در پایان مرحله لوله گرادینت در مثال های ترکیبی MB است. شکاف فقرات به M بستگی دارد؛ بهینه کننده M*B را می بیند. تنظیم M به معنای تجارت فقرات (کمتر با M بالا) با حافظه per-microbatch (مم حافظه فعال سازی بالاتر با M بالا برای GPipe) است.

آن را بسازید

code/main.pyابزار:

  • PipelineStage: یه کوچکnn.Moduleکه پارامترات یک مرحله را در خود نگه دارد و نشان می دهدforward(activation). .
  • Pipeline(stages, num_microbatches): برنامه GPipe را در مراحل شبیه سازی با استفاده از ساعت دیواری شبیه سازی شده در هر مرحله تنظیم می کند.
  • bubble_fraction(num_stages, num_microbatches): شکل بسته (N-1) / M+N-1
  • یک نمایشنامه چهار مرحله ای که ردیابی هر میکروباتش و بخش حباب اندازه گیری شده را چاپ می کند.

اجرا کن

bashpython3 code/main.py

خروجی: نمودار گانت مرحله به مرحله و درصد حباب در برابر پیش بینی شکل بسته.

الگوهای تولید در طبیعت

سه الگوي سخت تر ميکنن لوله به اندازه ي کافي همراهي براي ارسال

Activation checkpointing pairs with pipeline.با M میکروباتش در پرواز در GPipe، حافظه فعال سازی M × یک میکروباتش است. چکپینت فعال سازی به عقب زمان را محاسبه می کند، محاسبه برای حافظه را تغییر می دهد. ترکیبی این است که باعث می شود لوله برای دنباله های طولانی قابل کنترل باشد.

Stage balance is measured, not assumed.تیم های تولید یک مرور پروفایل را اجرا می کنند که محاسبه واقعی هر لایه (FLOPs و دیوار ساعت) را در سخت افزار هدف، سپس تقسیم با آن اندازه گیری.--num-layers-per-stageپرچم یک لیست را قبول می کند تا زمانی که مراحل هزینه های هر لایه متفاوت باشد، تعداد لایه های نابرابری را مجاز سازد.

Send-recv schedule must avoid deadlock.یک خط لوله که هر مرحله را ارسال می کند قبل از دریافت قفل های خونده در سیم. راه حل استاندارد این است که متقابل باشد: مراحل صف برابر ابتدا ارسال می شود و سپس recv، مراحل صف غیر معتاد ابتدا ارسال می شود. برنامه های درس به طور صریح مرتب می شوند تا الگوی قابل مشاهده باشد.

ازش استفاده کن

الگوهای تولید:

  • Megatron-LM.مرجع برای خط لوله موازی در مقیاس. از 1F1B استفاده می کند و از تنسور + خط لوله + داده های موازی در مجموع پشتیبانی می کند.
  • DeepSpeed Pipeline.یکپارچه با ZeRO؛ خط لوله ZeRO-1 + یک ترکیب مشترک برای بزرگترین مدل های باز است.
  • PyTorch Pipe.بسته بندی لوله های بومی PyTorch، ساخته شده استtorch.distributed.pipeline.sync.Pipe. .

-باده

درس 80 پارامتر های هر مرحله را در نقطه بازرسی پاره شده ذخیره می کند. درس 81 DDP + ZeRO + خط لوله را در دموکراسی پایان به پایان (در روحیه؛ دموکراسی خط لوله را برای زمان اجرا شبیه سازی می کند) تشکیل می دهد.

تمرینات

  1. اجرا کن 1F1B و بررسی کن که بخش فقرات با GPipe مطابقت داره اما حافظه فعال کردن محدوده
  2. زمان واقعی هر مرحله را در یک مدل عمیق تر مشخص کنید و مراحل را با ساعت دیوار اندازه گیری کنید.
  3. جمع آوری گرادینت در میان میکروباتش های لوله و بررسی کنید که گرادینت برابر گرادینت مجموعه کامل معادل به جلو است.
  4. خط لوله را با چک پوائنتینگ فعال سازی جفت کنید و کاهش حافظه را در مقابل هزینه محاسبه اندازه گیری کنید.
  5. ترکیب خط لوله با DDP (هر خط لوله در یک گروه موازی داده ها تکرار می شود) و استدلال از طریق جدول 2D.

اصطلاحات کلیدی

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.