მანქანური სწავლების (ML) მოდელების მუდმივად მზარდი მასშტაბი, ზომა და პარამეტრები სირთულეებს უქმნის ML სპეციალისტებს, რათა ავარჯიშონ ან თუნდაც ჩატვირთონ ასეთი დიდი მოდელები საკუთარ აპარატურაზე. ერთი მხრივ, დადგინდა, რომ დიდი მოდელები სწრაფად სწავლობენ (მონაცემთა და გამოთვლითი ეფექტურობით) და მნიშვნელოვნად უკეთესად მუშაობენ მცირე მოდელებთან შედარებით [1]; მეორე მხრივ, ასეთი მოდელების სწავლება აკრძალული ხდება არსებული აპარატურის უმეტესობაზე. ასეთი დიდი ML მოდელების სწავლისთვის განაწილებული სწავლება გადამწყვეტია. ბოლო დროს მნიშვნელოვანი მიღწევებია განაწილებული სწავლების სფეროში. ქვემოთ მოცემულია რამდენიმე ყველაზე აღსანიშნავი წინსვლა: ამ პოსტში ჩვენ განვიხილავთ მონაცემთა პარალელიზმს ZeRO-ს გამოყენებით და, უფრო კონკრეტულად, PyTorch-ის უახლეს ფუნქციას FullyShardedDataParallel (FSDP). DeepSpeed-მა და FairScale-მა დანერგეს ZeRO ნაშრომის ძირითადი იდეები. ისინი უკვე ინტეგრირებულია `transformers Trainer`-ში და თან ახლავს შესანიშნავი ბლოგი "Fit More and Train Faster With ZeRO via DeepSpeed and FairScale" [10]. PyTorch-მა ცოტა ხნის წინ Fairscale FSDP ჩააშენა PyTorch Distributed-ში დამატებითი ოპტიმიზაციებით. ჩვენ განვიხილავთ მიზეზობრივი ენის მოდელირების ამოცანას GPT-2 Large (762M) და XL (1.5B) მოდელის ვარიანტების გამოყენებით. ქვემოთ მოცემულია GPT-2 მოდელის წინასწარი სწავლების კოდი. ის ჰგავს ოფიციალურ მიზეზობრივი ენის მოდელირების მაგალითს, დამატებული აქვს 2 არგუმენტი `n_train` (2000) და `n_val` (500), რათა თავიდან იქნას აცილებული მთლიანი მონაცემების წინასწარი დამუშავება/სწავლება სწრაფი კონცეფციის დასამტკიცებელი ბენჩმარკების შესასრულებლად. `run_clm_no_trainer.py` FSDP-ის კონფიგურაციის ნიმუში `accelerate config` ბრძანების გაშვების შემდეგ: აქ ჩვენ ვატარებთ ექსპერიმენტებს ერთი კვანძის მრავალ-GPU-ს პირობებში. ჩვენ ვადარებთ განაწილებული მონაცემთა პარალელიზმის (DDP) და FSDP-ის წარმადობას სხვადასხვა კონფიგურაციებში. პირველ რიგში, გამოიყენება GPT-2 Large (762M) მოდელი, რომლის დროსაც DDP მუშაობს გარკვეული პაკეტის ზომებით მეხსიერებიდან გამოსვლის (OOM) შეცდომების გარეშე. შემდეგ, გამოიყენება GPT-2 XL (1.5B) მოდელი, რომლის დროსაც DDP ვერ მუშაობს OOM შეცდომით, თუნდაც 1-ის ტოლი პაკეტის ზომით. ჩვენ ვაკვირდებით, რომ FSDP საშუალებას აძლევს უფრო დიდი პაკეტის ზომებს GPT-2 Large მოდელისთვის და ის შესაძლებელს ხდის GPT-2 XL მოდელის სწავლებას მისაღები პაკეტის ზომით, DDP-სგან განსხვავებით. აპარატურის კონფიგურაცია: 2X24GB NVIDIA Titan RTX GPU. GPT-2 Large მოდელის (762M პარამეტრი) სწავლების ბრძანება: FSDP-ის გაშვების ნიმუში: ცხრილი 1: FSDP-ის ბენჩმარკინგი GPT-2 Large (762M) მოდელზე DDP-სთან შედარებით, ცხრილი 1-დან შეგვიძლია დავასკვნათ, რომ FSDP საშუალებას იძლევა უფრო დიდი პაკეტის ზომების გამოყენებას, 2X-3X-მდე, შესაბამისად, CPU-ს გადმოტვირთვის გარეშე და მასთან ერთად. სწავლების დროის თვალსაზრისით, DDP შერეული სიზუსტით ყველაზე სწრაფია, რასაც მოსდევს FSDP ZeRO Stage 2 და Stage 3-ის გამოყენებით. ვინაიდან მიზეზობრივი ენის მოდელირების ამოცანას ყოველთვის აქვს ფიქსირებული კონტექსტის თანმიმდევრობის სიგრძე (`--block_size`), FSDP-ით სწავლების დროის დაჩქარება არ იყო ისეთი შთამბეჭდავი. დინამიური პაკეტირების მქონე აპლიკაციებისთვის, FSDP, რომელიც უფრო დიდი პაკეტის ზომებს ააქტიურებს, სავარაუდოდ, მნიშვნელოვნად დააჩქარებს სწავლების დროს. FSDP-ის შერეული სიზუსტის მხარდაჭერას ამჟამად აქვს რამდენიმე პრობლემა ტრანსფორმერთან. მას შემდეგ, რაც ეს მხარდაჭერილი იქნება, სწავლების დროის დაჩქარება კიდევ უფრო გაუმჯობესდება. GPT-2 XL მოდელის (1.5B პარამეტრი) სწავლების ბრძანება: ცხრილი 2: FSDP-ის ბენჩმარკინგი GPT-2 XL (1.5B) მოდელზე ცხრილი 2-დან შეგვიძლია დავასკვნათ, რომ DDP (fp16-ით და მის გარეშე) არც კი მუშაობს 1-ის ტოლი პაკეტის ზომით და იწვევს CUDA OOM შეცდომას. FSDP Zero-Stage 3-ით შესაძლებელია 2 GPU-ზე გაშვება 5-ის ტოლი პაკეტის ზომით (ეფექტური პაკეტის ზომა = 10 (5 X 2)). FSDP CPU-ს გადმოტვირთვით შეუძლია კიდევ უფრო გაზარდოს მაქსიმალური პაკეტის ზომა 14-მდე თითო GPU-ზე 2 GPU-ს გამოყენებისას. FSDP CPU-ს გადმოტვირთვით შესაძლებელს ხდის GPT-2 1.5B მოდელის სწავლებას ერთ GPU-ზე 10-ის ტოლი პაკეტის ზომით. ეს საშუალებას აძლევს ML სპეციალისტებს მინიმალური გამოთვლითი რესურსებით ავარჯიშონ ასეთი დიდი მოდელები, რითაც ხდება დიდი მოდელის სწავლების დემოკრატიზაცია. მოდით, ჩავუღრმავდეთ Accelerate-ის ამჟამინდელ მხარდაჭერას FSDP ინტეგრაციისთვის და ცნობილ შეზღუდვებს. FSDP მხარდაჭერისთვის საჭირო PyTorch ვერსია: PyTorch Nightly (ან 1.12.0, თუ ამას წაიკითხავთ მისი გამოშვების შემდეგ), რადგან FSDP-ით გააქტიურებული მოდელის შენახვა ხელმისაწვდომია მხოლოდ ბოლო გამოსწორებებით. კონფიგურაცია CLI-ს საშუალებით: მეტი კონტროლისთვის, მომხმარებლებს შეუძლიათ გამოიყენონ `FullyShardedDataParallelPlugin`, სადაც მათ შეუძლიათ მიუთითონ `auto_wrap_policy`, `backward_prefetch` და `ignored_modules`. ამ კლასის ინსტანციის შექმნის შემდეგ, მომხმარებლებს შეუძლიათ მისი გადაცემა Accelerator ობიექტის შექმნისას. ამ პარამეტრების შესახებ დამატებითი ინფორმაციისთვის იხილეთ PyTorch FullyShardedDataParallel კოდი. შემდეგში, ჩვენ განვიხილავთ `min_num_params` კონფიგურაციის მნიშვნელობას. ქვემოთ მოცემულია ამონარიდი [8]-დან, რომელიც დეტალურად აღწერს FSDP ავტომატური შეფუთვის პოლიტიკის მნიშვნელობას. (წყარო: ბმული) `default_auto_wrap_policy`-ის გამოყენებისას, ფენა იფუთება FSDP მოდულში, თუ ამ ფენაში პარამეტრების რაოდენობა აღემატება `min_num_params`-ს. BERT-Large (330M) მოდელის GLUE MRPC ამოცანაზე ფაინთიუნინგის კოდი არის ოფიციალური სრული NLP მაგალითი, რომელიც აღწერს, თუ როგორ გამოიყენება სწორად FSDP ფუნქცია, დამატებული აქვს კომუნალური საშუალებები მეხსიერების პიკური გამოყენების თვალთვალისთვის. `fsdp_with_peak_mem_tracking.py` ჩვენ ვიყენებთ თვალთვალის ფუნქციონალურობის მხარდაჭერას