მანქანური სწავლების (ML) მოდელების მასშტაბის, ზომისა და პარამეტრების მუდმივი ზრდის ფონზე, ML სპეციალისტებს უჭირთ ასეთი დიდი მოდელების ვარჯიში ან თუნდაც ჩატვირთვა მათ აპარატურაზე. ერთის მხრივ, დადგინდა, რომ დიდი მოდელები სწრაფად სწავლობენ (ეფექტურია მონაცემებისა და გამოთვლების თვალსაზრისით) და მნიშვნელოვნად უფრო პროდუქტიულები არიან მცირე მოდელებთან შედარებით [1]; მეორეს მხრივ, ასეთი მოდელების ვარჯიში არსებულ აპარატურაზე უმეტეს შემთხვევაში შეუძლებელია. განაწილებული სწავლება გადამწყვეტია ასეთი დიდი ML მოდელების ვარჯიშის უზრუნველსაყოფად. ბოლო დროს მნიშვნელოვანი მიღწევები იქნა გაკეთებული მასშტაბური განაწილებული სწავლების სფეროში. რამდენიმე ყველაზე გამორჩეული მიღწევა მოცემულია ქვემოთ: ამ პოსტში ჩვენ განვიხილავთ მონაცემთა პარალელიზმს ZeRO-ის გამოყენებით და, უფრო კონკრეტულად, PyTorch-ის უახლეს ფუნქციას FullyShardedDataParallel (FSDP)-ს. DeepSpeed-მა და FairScale-მა ZeRO-ის სტატიის ძირითადი იდეები განახორციელეს. ესენი უკვე ინტეგრირებულია ტრანსფორმერების ტრენერში (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 მოდელისთვის და, DDP-სგან განსხვავებით, საშუალებას აძლევს GPT-2 XL მოდელის ვარჯიშს ღირსეული პაკეტის ზომით. აპარატურის კონფიგურაცია: 2X24GB NVIDIA Titan RTX GPU. GPT-2 Large მოდელის (762M პარამეტრი) სავარჯიშო ბრძანება: FSDP გაშვების ნიმუში: ცხრილი 1: FSDP-ის ბენჩმარკინგი GPT-2 Large (762M) მოდელზე. DDP-სთან შედარებით, ცხრილი 1-დან შეგვიძლია დავინახოთ, რომ FSDP საშუალებას იძლევა უფრო დიდი პაკეტის ზომების გამოყენებას, 2X-3X-მდე, შესაბამისად, CPU offload-ის გარეშე და CPU offload-ის პარამეტრით. ვარჯიშის დროის თვალსაზრისით, 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 offload-ით შეუძლია კიდევ უფრო გაზარდოს მაქსიმალური პაკეტის ზომა 14-მდე თითო GPU-ზე 2 GPU-ის გამოყენებისას. FSDP CPU offload-ით საშუალებას იძლევა 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 Auto Wrap Policy-ის მნიშვნელობას. (წყარო: ბმული) `default_auto_wrap_policy`-ის გამოყენებისას, ფენა FSDP მოდულში შეფუთულია, თუ ამ ფენაში პარამეტრების რაოდენობა `min_num_params`-ზე მეტია. BERT-Large (330M) მოდელის დაზუსტების კოდი GLUE MRPC ამოცანაზე არის ოფიციალური სრული NLP (ბუნებრივი ენის დამუშავების) მაგალითი, რომელიც აღწერს FSDP ფუნქციის სწორად გამოყენებას მეხსიერების პიკური გამოყენების თვალთვალის ხელსაწყოების დამატებით. `fsdp_with_peak_mem_tracking.py` ჩვენ ვიყენებთ თვალთვალის ფუნქციონალურობას, რომელსაც მხარს უჭერს Accelerate.