OOM შეცდომები წარსულს ჩაბარდა: დიდი მოდელების ვარჯიში DeepSpeed ZeRO-სა და Accelerate-ით
სტატია განმარტავს, თუ როგორ შეიძლება თავიდან ავიცილოთ მეხსიერების უკმარისობის (OOM) შეცდომები დიდი ხელოვნური ინტელექტის მოდელების ვარჯიშისას. იგი აღწერს DeepSpeed ZeRO ოპტიმიზატორის გამოყენებას Accelerate ბიბლიოთეკასთან ერთად, რაც საშუალებას იძლევა, ეფექტურად გამოვიყენოთ არსებული აპარატურა, გავზარდოთ პაკეტის ზომა და დავაჩქაროთ ვარჯიშის პროცესი. წარმოდგენილია შედარებები DDP-სა და DeepSpeed ZeRO Stage-2-ს შორის, რაც აჩვენებს მნიშვნელოვან გაუმჯობესებას შესრულებაში.
დაიღალეთ მეხსიერების უკმარისობის (OOM) შეცდომებით დიდი მოდელების ვარჯიშის მცდელობისას? ჩვენ გვაქვს გამოსავალი. დიდი მოდელები ძალიან ეფექტურია [1], მაგრამ რთულია მათი ავარჯიშება არსებული აპარატურით. დიდი მოდელების ვარჯიშისთვის არსებული აპარატურის მაქსიმალურად გამოსაყენებლად, შესაძლებელია მონაცემთა პარალელიზმის (Data Parallelism) გამოყენება ZeRO - Zero Redundancy Optimizer-ის [2] მეშვეობით. ქვემოთ მოცემულია ZeRO-ის გამოყენებით მონაცემთა პარალელიზმის (Data Parallelism) მოკლე აღწერა, დიაგრამით ამ ბლოგპოსტიდან (წყარო: link).
ა. ეტაპი 1: ოპტიმიზატორის მდგომარეობების გადანაწილება (Sharding) მონაცემთა პარალელურ მუშაკებს/GPU-ებს შორის.
ბ. ეტაპი 2: ოპტიმიზატორის მდგომარეობები + გრადიენტების გადანაწილება მონაცემთა პარალელურ მუშაკებს/GPU-ებს შორის.
გ. ეტაპი 3: ოპტიმიზატორის მდგომარეობები + გრადიენტები + მოდელის პარამეტრების გადანაწილება მონაცემთა პარალელურ მუშაკებს/GPU-ებს შორის.
დ. ოპტიმიზატორის Offload: გრადიენტები + ოპტიმიზატორის მდგომარეობების გადატვირთვა CPU/დისკზე, ZeRO ეტაპი 2-ის საფუძველზე.
ე. პარამეტრების Offload: მოდელის პარამეტრების გადატვირთვა CPU/დისკზე, ZeRO ეტაპი 3-ის საფუძველზე.
ამ ბლოგპოსტში განვიხილავთ, თუ როგორ გამოვიყენოთ მონაცემთა პარალელიზმი (Data Parallelism) ZeRO-ის მეშვეობით Accelerate-ის გამოყენებით. DeepSpeed-მა, FairScale-მა და PyTorch FullyShardedDataParallel (FSDP)-მა განახორციელეს ZeRO ნაშრომის ძირითადი იდეები. ისინი უკვე ინტეგრირებულია 🤗 transformers Trainer-სა და 🤗 accelerate-ში, რასაც თან ახლავს შესანიშნავი ბლოგები: Fit More and Train Faster With ZeRO via DeepSpeed and FairScale [4] და Accelerate Large Model Training using PyTorch Fully Sharded Data Parallel [5]. ჩვენ ამ ბლოგებს ვუტოვებთ იმის ახსნას, თუ რა ხდება კულისებში და ძირითადად ფოკუსირებას ვახდენთ DeepSpeed ZeRO-ის გამოყენებაზე Accelerate-ის მეშვეობით.
აპარატურის კონფიგურაცია: 2X24GB NVIDIA Titan RTX GPU. 60GB RAM. განვიხილავთ ტექსტის კლასიფიკაციისთვის მხოლოდ ენკოდერის (encoder-only) მოდელის ფაინთიუნინგის (finetuning) ამოცანას. გამოვიყენებთ წინასწარ გაწვრთნილ microsoft/deberta-v2-xlarge-mnli (900M პარამეტრი) მოდელს MRPC GLUE მონაცემთა ნაკრებზე ფაინთიუნინგისთვის. კოდი ხელმისაწვდომია აქ run_cls_no_trainer.py. ის ჰგავს ოფიციალურ ტექსტის კლასიფიკაციის მაგალითს აქ, დამატებული ლოგიკით ვარჯიშისა და შეფასების დროის გასაზომად. მოდით, შევადაროთ Distributed Data Parallel (DDP) და DeepSpeed ZeRO Stage-2-ის მუშაობა მრავალ-GPU კონფიგურაციაში. DeepSpeed ZeRO Stage-2-ის ჩასართავად კოდის ყოველგვარი ცვლილების გარეშე, გთხოვთ, გაუშვით accelerate config და გამოიყენეთ Accelerate DeepSpeed Plugin.
ZeRO Stage-2 DeepSpeed Plugin-ის მაგალითი ახლა, გაუშვით ქვემოთ მოცემული ბრძანება ვარჯიშისთვის:
ჩვენს ერთკვანძოვან მრავალ-GPU კონფიგურაციაში (Single-Node Multi-GPU setup), DDP-ის მიერ მხარდაჭერილი მაქსიმალური პაკეტის ზომა (batch size) OOM შეცდომის გარეშე არის 8. ამის საპირისპიროდ, DeepSpeed Zero-Stage 2 საშუალებას იძლევა, გამოვიყენოთ 40-იანი პაკეტის ზომა OOM შეცდომების გარეშე. შესაბამისად, DeepSpeed საშუალებას იძლევა, 5-ჯერ მეტი მონაცემი მოთავსდეს თითოეულ GPU-ზე DDP-სთან შედარებით. ქვემოთ მოცემულია wandb-ის გაშვების გრაფიკების სკრინშოტი, DDP-სა და DeepSpeed-ის შედარების ბენჩმარკინგის ცხრილთან ერთად.
ცხრილი 1: DeepSpeed ZeRO Stage-2-ის ბენჩმარკინგი DeBERTa-XL (900M) მოდელზე
ამ უფრო დიდი პაკეტის ზომით, ჩვენ ვაკვირდებით ვარჯიშის საერთო დროის ~3.5-ჯერ აჩქარებას შესრულების მეტრიკაში რაიმე ვარდნის გარეშე, ყოველივე ეს კოდის შეცვლის გარეშე. მშვენიერია! 🤗.
უფრო მეტი პარამეტრის დასაზუსტებლად, დაგჭირდებათ DeepSpeed კონფიგურაციის ფაილის და მინიმალური კოდის ცვლილებების გამოყენება. ვნახოთ, როგორ გავაკეთოთ ეს. პირველ რიგში, განვიხილავთ sequence-to-sequence მოდელის ფაინთიუნინგის ამოცანას ჩვენი საკუთარი ჩატბოტის გასავარჯიშებლად. კონკრეტულად, ჩვენ მოვახდენთ facebook/blenderbot-400M-distill-ის ფაინთიუნინგს smangrul/MuDoConv (მრავალდომენიანი საუბარი) მონაცემთა ნაკრებზე. მონაცემთა ნაკრები შეიცავს საუბრებს 10 სხვადასხვა წყაროდან, რომელიც მოიცავს პერსონებს, სპეციფიკურ ემოციურ კონტექსტებს, მიზანზე ორიენტირებულ (მაგ., რესტორნის დაჯავშნა) და ზოგად ვიკიპედიის თემებს (მაგ., კრიკეტი). კოდი ხელმისაწვდომია აქ run_seq2seq_no_trainer.py. ჩატბოტების მიმზიდველობისა და ადამიანურობის ეფექტურად გასაზომად ამჟამინდელი პრაქტიკაა ადამიანის შეფასებები (Human evaluations), რაც ძვირია [6]. აქედან გამომდინარე, ამ მაგალითისთვის, თვალყური ადევნებული მეტრიკა არის BLEU ქულა (რაც არ არის იდეალური, მაგრამ არის ჩვეულებრივი მეტრიკა ასეთი ამოცანებისთვის). შესაძლებელია კოდის ადაპტირება უფრო დიდი T5 მოდელების ვარჯიშისთვის, თუ გაქვთ წვდომა GPU-ებზე, რომლებიც მხარს უჭერენ bfloat16 სიზუსტეს, წინააღმდეგ შემთხვევაში თქვენ წააწყდებით NaN დანაკარგის (loss) მნიშვნელობებს. ჩვენ სწრაფ ბენჩმარკს ჩავატარებთ 10000 საწვრთნელ ნიმუშზე და 1000 შესაფასებელ ნიმუშზე, რადგან გვაინტერესებს DeepSpeed-ისა და DDP-ის შედარება. ვარჯიშისთვის გამოვიყენებთ DeepSpeed Zero Stage-2 კონფიგურაციას zero2_config_accelerate.json (მოცემულია ქვემოთ). კონფიგურაციის სხვადასხვა მახასიათებლების დეტალური ინფორმაციისთვის, გთხოვთ, მიმართოთ DeepSpeed-ის დოკუმენტაციას. DeepSpeed ZeRO Stage-2-ის ზემოთ მოცემული კონფიგურაციით ჩასართავად, გთხოვთ, გაუშვით accelerate config და მოთხოვნისას მიუთითეთ კონფიგურაციის ფაილის გზა. დამატებითი დეტალებისთვის, იხილეთ 🤗 accelerate-ის ოფიციალური დოკუმენტაცია DeepSpeed კონფიგურაციის ფაილისთვის.
ZeRO Stage-2 DeepSpeed კონფიგურაციის ფაილის მაგალითი ახლა, გაუშვით ქვემოთ მოცემული ბრძანება ვარჯიშისთვის:
DeepSpeed კონფიგურაციის გამოყენებისას, თუ მომხმარებელმა კონფიგურაციაში მიუთითა ოპტიმიზატორი და განრიგის შემქმნელი (scheduler), მომხმარებელმა უნდა გამოიყენოს accelerate.utils.DummyOptim და accelerate.utils.DummyScheduler. ეს არის ერთადერთი მცირე ცვლილებები, რაც მომხმარებელმა უნდა გააკეთოს. ქვემოთ მოცემულია DeepSpeed კონფიგურაციის გამოყენებისას საჭირო მინიმალური ცვლილებების მაგალითი:
ცხრილი 2: DeepSpeed ZeRO Stage-2-ის ბენჩმარკინგი BlenderBot (400M) მოდელზე
ჩვენს ერთკვანძოვან მრავალ-GPU კონფიგურაციაში (Single-Node Multi-GPU setup), DDP-ის მიერ მხარდაჭერილი მაქსიმალური პაკეტის ზომა
თეგები:
#ხელოვნური ინტელექტი
#მანქანური სწავლება
#ღრმა სწავლება
#hugging face
#pytorch
#nlp
#deepspeed
#accelerate
#მონაცემთა პარალელიზმი
#zero
#დიდი მოდელები
#gpu ვარჯიში
#oom შეცდომები
წყარო: huggingface.co
AI-ით გადამუშავებული
მსგავსი სტატიები
ტექნოლოგიები
Honor Magic V6: უთხელესი დასაკეცი ტელეფონი? პირველი შთაბეჭდილებები
ტექნოლოგიები
Honor Magic V6: ყველაზე თხელი დასაკეცი სმარტფონი და მისი შთამბეჭდავი შესაძლებლობები
ტექნოლოგიები