ახლახან, DeepSpeed-ისა და PyTorch FSDP-ის გამოყენებით, ჩვენ ვცადეთ ტრენინგის კონვეიერის გაშვება. ჩვენ შევამჩნიეთ, რომ მიღებული შედეგები განსხვავდებოდა. კონკრეტული მოდელი იყო Mistral-7B base და ის ნახევრად სიზუსტით (bfloat16) იყო ჩატვირთული. მიუხედავად იმისა, რომ DeepSpeed-ის (ლურჯი) დანაკარგი კარგად კონვერგირდა, FSDP-ის (ნარინჯისფერი) დანაკარგი არ მცირდებოდა, როგორც ეს სურათზე 1 ჩანს. ჩვენ ვივარაუდეთ, რომ სწავლის სიჩქარეს შესაძლოა დასჭირვებოდა მასშტაბირება GPU-ების რაოდენობის მიხედვით და 4-ჯერ გავზარდეთ სწავლის სიჩქარე, რადგან ვიყენებდით 4 GPU-ს. შემდეგ, ჩვენ დავინახეთ დანაკარგის შემდეგი ქცევა, ნაჩვენები სურათზე 2. როგორც ჩანს, სასურველი ქცევა მიღწეული იყო FSDP-ის სწავლის სიჩქარის GPU-ების რაოდენობაზე მასშტაბირებით! თუმცა, როდესაც ვცადეთ განსხვავებული სწავლის სიჩქარე (1e-5) მასშტაბირების გარეშე, ჩვენ დავაკვირდით მსგავს დანაკარგს და გრადიენტის ნორმის მახასიათებლებს ორივე ჩარჩოსთვის, ნაჩვენები სურათზე 3. DeepSpeed-ის კოდის ბაზაში, კერძოდ DeepSpeedZeroOptimizer_Stage3-ის იმპლემენტაციაში (როგორც სახელი გულისხმობს, ის მართავს მე-3 ეტაპის ოპტიმიზატორის გაყოფას), ჩვენ შევამჩნიეთ, რომ trainable_param_groups, ანუ პარამეტრების ჯგუფები, რომლებზეც ტრენინგი მიმდინარეობს, გადიან შიდა _setup_for_real_optimizer ფუნქციის გამოძახებით, რომელიც თავის მხრივ იძახებს სხვა ფუნქციას სახელწოდებით _create_fp32_partitions. როგორც fp32 სახელიდან ჩანს, DeepSpeed შიდა წესით ასრულებდა upcasting-ს და ის ყოველთვის ინარჩუნებს თავის მასტერ წონებს fp32-ში დიზაინის მიხედვით. ეს upcasting სრულ სიზუსტეზე ნიშნავდა, რომ ოპტიმიზატორს შეეძლო კონვერგირება სწავლის სიჩქარით, რომლითაც ის ვერ კონვერგირდებოდა დაბალ სიზუსტეზე. ადრინდელი დაკვირვებები ამ სიზუსტის განსხვავების არტეფაქტები იყო. FSDP-ში, სანამ მოდელი და ოპტიმიზატორის პარამეტრები გადანაწილდება GPU-ებზე, ისინი ჯერ "გაბრტყელდება" ერთგანზომილებიან ტენსორად. FSDP და DeepSpeed იყენებენ სხვადასხვა dtypes-ს ამ "გაბრტყელებული" პარამეტრებისთვის, რასაც შედეგები აქვს PyTorch ოპტიმიზატორებისთვის. ცხრილი 1 ასახავს ორივე ჩარჩოს პროცესებს; "ლოკალური" სვეტი მიუთითებს GPU-ზე მიმდინარე პროცესს, ამიტომ upcasting-ის მეხსიერების ხარჯი ამორტიზებულია GPU-ების რაოდენობის მიხედვით. ცხრილი 1: FSDP-ისა და DeepSpeed-ის მიერ შერეული სიზუსტის დამუშავების შეჯამება. რამდენიმე ძირითადი დასკვნა: DeepSpeed-ისა და FSDP-ის უკეთ შესათანხმებლად 🤗 Accelerate-ში, ჩვენ შეგვიძლია ავტომატურად შევასრულოთ upcasting FSDP-ისთვის, როდესაც შერეული სიზუსტე ჩართულია. ჩვენ შევქმენით pull request ამ ცვლილებით, რომელიც შევიდა 0.30.0 ვერსიაში. ამ PR-ის შედეგია FSDP-ისთვის ორი რეჟიმით მუშაობის დაშვება: FSDP-ის ორი ახალი რეჟიმი შეჯამებულია ცხრილში 2 და შედარებულია DeepSpeed-თან. ცხრილი 2: FSDP-ის ორი ახალი რეჟიმის შეჯამება და შედარებები DeepSpeed-თან. გამტარუნარიანობის შედარებისთვის ჩვენ ვიყენებთ IBM Granite 7B მოდელს (რომელიც მიჰყვება Meta Llama2 არქიტექტურას). ჩვენ ვადარებთ მოდელის Flops-ის გამოყენებას (MFU) და tokens/წმ/GPU მაჩვენებლებს და ვაჩვენებთ მათ FSDP-სთვის (სრული გაყოფა) და DeepSpeed-ისთვის (Zero3). ჩვენ გამოვიყენეთ ოთხი A100 GPU, როგორც ადრე, შემდეგი ჰიპერპარამეტრებით: ცხრილი 3 აჩვენებს, რომ FSDP და DeepSpeed მსგავსად უნდა მუშაობდნენ. ჩვენ ვაპირებთ მოგვიანებით წარმოვადგინოთ გამტარუნარიანობის ყოვლისმომცველი შედარება და მიდგომები გამტარუნარიანობის გასაუმჯობესებლად (მაგ., 4D ნიღბები შეფუთვით, torch.compile, სელექციური აქტივაციის შემოწმება), რადგან მასშტაბური განლაგების ტექნიკები, როგორიცაა InstructLab და GLAN, პოპულარული ხდება. ცხრილი 3: სავარაუდო გამტარუნარიანობის შედარებები FSDP-სა და DeepSpeed-ს შორის ოთხ A100 GPU-ზე. ჩვენ შევქმენით ახალი კონცეპტუალური სახელმძღვანელო მომხმარებლებისთვის, რათა დავეხმაროთ მათ ორ ჩარჩოს შორის მიგრაციაში. სახელმძღვანელო ეხმარება მომხმარებლებს უპასუხონ კითხვებს, როგორიცაა: ჩვენ განვიხილავთ ამ ჩარჩოების კონფიგურაციის სხვადასხვა რეჟიმს 🤗 Accelerate-ში. 🤗 Accelerate თითქმის ტრივიალურს ხდის FSDP-სა და DeepSpeed-ს შორის გადართვას, რომლის უმეტესი ნაწილი Accelerate-ის კონფიგურაციის ფაილის ცვლილებაა (იხილეთ ახალი კონცეპტუალური სახელმძღვანელო ინსტრუქციებისთვის). კონფიგურაციის ცვლილების გარდა, სხვა მოსაზრებები (ასევე აღწერილია სახელმძღვანელოში) მოიცავს განსხვავებებს, თუ როგორ ხდება checkpoints-ის დამუშავება და ა.შ. ამ ბლოგში მოცემული ყველა ექსპერიმენტი შეიძლება განმეორდეს ორიგინალური 🤗 Accelerate-ის გამოშვების კოდით. ჩვენ ვაპირებთ მოგვიანებით წარმოვადგინოთ გამტარუნარიანობის შედარებები მასშტაბით და ტექნიკები, რათა უკეთ გამოვიყენოთ ეს GPU-ები ტუნინგისა და განლაგების სამუშაოებისთვის მოდელის ხარისხის შენარჩუნებით. ეს არის ძალისხმევა, რომელშიც ჩართული იყო რამდენიმე გუნდი მრავალი ორგანიზაციიდან. ეს დაიწყო IBM Research-ში, კონკრეტულად ალდო პარეხასგან (Aldo Pareja), რომელმაც აღმოაჩინა პრობლემა, და ფაბიან ლიმისგან (Fabian Lim), რომელმაც დაადგინა სიზუსტის ხარვეზები და გამოასწორა ეს პრობლემა. ზაკ მიულერმა (Zach Mueller) და სტას ბეკმანმა (Stas Bekman) ფენომენალური წვლილი შეიტანეს უკუკავშირისა და Accelerate-ისთვის გამოსწორებების მიწოდებაში. ლეს რაიტი (Less Wright) Meta-ს PyTorch გუნდიდან ძალიან დამეხმარა FSDP პარამეტრებთან დაკავშირებულ კითხვებში. და ბოლოს, გვსურს მადლობა გადავუხადოთ DeepSpeed-ის გუნდს ამ ბლოგზე გამოხმაურებისთვის. მეტი სტატია ჩვენი ბლოგიდან · დარეგისტრირდით ან შეხვიდეთ კომენტარისთვის.