უპირატესობის ოპტიმიზაცია ფართოდ გამოიყენება ენობრივი მოდელების დამატებითი წვრთნისთვის (fine-tuning), თუმცა მისი გამოყენება ასევე შესაძლებელია ვიზუალურ-ენობრივი მოდელებისთვის (VLM). მოხარულნი ვართ გაცნობოთ, რომ TRL ბიბლიოთეკა ახლა უკვე მხარს უჭერს პირდაპირი უპირატესობის ოპტიმიზაციას (DPO) VLMs-ისთვის. ეს სტატია დაგეხმარებათ VLMs-ის წვრთნის პროცესში TRL-ისა და DPO-ს გამოყენებით. უპირატესობის ოპტიმიზაცია საჭიროებს მონაცემებს, რომლებიც მომხმარებლის უპირატესობებს ასახავს. ორობითი არჩევანის პარამეტრში, თითოეული მაგალითი შედგება მოთხოვნისგან (prompt) და ორი კანდიდატი პასუხისგან: ერთი, რომელიც არჩეულია და ერთი, რომელიც უარყოფილია. მოდელის მიზანია ისწავლოს არჩეული პასუხის პროგნოზირება უარყოფილ პასუხზე. მაგალითად, საჭიროა გქონდეთ შემდეგი ტიპის ნიმუშები: ❔ შეკითხვა: რამდენი ოჯახი? გაითვალისწინეთ, რომ არჩეული მესიჯი სულაც არ არის აუცილებლად სწორი. მაგალითად, არჩეული პასუხი, რომელიც ამბობს "18,000 ოჯახი", მაინც არასწორია, მაგრამ ის ნაკლებად არასწორია უარყოფილ პასუხთან შედარებით. ამ ბლოგპოსტისთვის გამოვიყენებთ openbmb/RLAIF-V-Dataset-ს, რომელიც 83,000-ზე მეტ ანოტირებულ რიგს მოიცავს. მოდით, უფრო ახლოს დავაკვირდეთ მონაცემთა ნაკრებს: ჩვენს მოდელს სჭირდება როგორც ტექსტი, ასევე სურათები შეტანის სახით, ამიტომ პირველი ნაბიჯი არის მონაცემთა ნაკრების ფორმატირება ამ მოთხოვნის შესაბამისად. მონაცემები ისე უნდა იყოს სტრუქტურირებული, რომ მომხმარებელსა და ასისტენტს შორის საუბარი სიმულირდეს. მომხმარებელი აწვდის მოთხოვნას, რომელიც მოიცავს სურათს და შეკითხვას, ხოლო ასისტენტი პასუხობს. ასე ხდება ეს ფორმატირება: ჩვენი მონაცემთა ნაკრები უკვე ფორმატირებულია. მოდით, გადავხედოთ პირველ მაგალითს: მოამზადეთ თქვენი GPU-ები, მონაცემთა ნაკრები მზადაა წვრთნისთვის! მაგალითისთვის, ჩვენ ავარჯიშებთ Idefics2-8b მოდელს, მაგრამ გაითვალისწინეთ, რომ TRL-ში DPO-ის იმპლემენტაცია მხარს უჭერს სხვა მოდელებსაც, როგორიცაა Llava 1.5 და PaliGemma. დამატებითი ინფორმაცია მოცემულია განყოფილებაში „Llava 1.5, PaliGemma და სხვების დამატებითი წვრთნა“. წვრთნის პროცესის განხილვამდე, პირველ რიგში დავრწმუნდებით, რომ ყველაფერი შეუფერხებლად ჯდება მეხსიერებაში. მაქვს GPU 80GB VRAM-ით. საკმარისია თუ არა ეს ჩემი Idefics2-8b მოდელის გასაწვრთნელად? ქვემოთ მოცემულია გამოთვლის ნაბიჯები საჭირო მეხსიერების სავარაუდო შეფასებისთვის. დაე, N იყოს პარამეტრების რაოდენობა, P კი სიზუსტე. შემდეგი კომპონენტები ერთად უნდა მოთავსდეს მეხსიერებაში: Idefics2-8b-ს აქვს 8 მილიარდი პარამეტრი, და ჩვენ ვიყენებთ float32 სიზუსტეს, რომელიც მოითხოვს 4 ბაიტს თითო float-ზე. ასე რომ, საჭირო მთლიანი მეხსიერება არის: ეს გაცილებით აღემატება ჩემი GPU-ს მეხსიერების შესაძლებლობებს. საბედნიეროდ, ისეთი ტექნიკების გამოყენებით, როგორიცაა კვანტიზაცია (quantization) და LoRA, ჩვენ შეგვიძლია მნიშვნელოვნად შევამციროთ მეხსიერების მოთხოვნები და წვრთნა რეალისტური გავხადოთ. ვნახოთ, როგორ გავაკეთოთ ეს. კვანტიზაცია არის ტექნიკა, რომელიც ამცირებს მოდელის წონებისა და აქტივაციების სიზუსტეს. float32 სიზუსტიდან bfloat16 სიზუსტეზე გადართვა შუაზე ამცირებს თითოეული პარამეტრის შესანახ მოთხოვნას 4 ბაიტიდან 2 ბაიტამდე. ეს ოპტიმიზაცია ზოგავს მეხსიერებას, ამავდროულად აჩქარებს გამოთვლებს, რაც უზრუნველყოფს მაღალ წარმადობას მინიმალური კომპრომისით. bfloat16 სიზუსტის მოდელში დასანერგად: bfloat16 სიზუსტე ასევე შეიძლება გამოყენებულ იქნას ოპტიმიზატორზე, თუ bf16=True დაყენდება წვრთნის არგუმენტებში: LoRA არის მეთოდი, რომელიც ამცირებს წვრთნადი პარამეტრების რაოდენობას რანგის დაშლის მატრიცების წყვილების სწავლით, ორიგინალური წონების გაყინვისას (frozen). ეს მნიშვნელოვნად ამცირებს შენახვის საჭიროებებს სპეციფიკურ ამოცანებზე ადაპტირებული დიდი ენობრივი მოდელებისთვის (LLM). LoRA ინტეგრირებულია PEFT-ში და მისი დაყენება უმალვე შეგიძლიათ: PEFT მოქმედებს როგორც შეფუთვა (ე.წ. ადაპტერი) მოდელის გარშემო. სწორედ ეს ადაპტერი გაიწვრთნება, სანამ შიდა მოდელი გაყინული იქნება. რამდენად ამცირებს LoRA წვრთნადი პარამეტრების რაოდენობას? ის ამცირებს წვრთნადი პარამეტრების რაოდენობას 8 მილიარდიდან 55 მილიონამდე, რაც უზარმაზარი სხვაობაა და მნიშვნელოვნად შეამცირებს მეხსიერების მოთხოვნებს. ახლა, როდესაც მეხსიერების მოთხოვნები შემცირდა, მოდით, ხელახლა გამოვთვალოთ საჭირო მეხსიერება: ამჯერად, ჩვენ გვჭირდება დაახლოებით 32 GB მეხსიერება ჩვენი Idefics2-8b მოდელის დამატებითი წვრთნისთვის, რაც გაცილებით გონივრულია და ჯდება ჩემი GPU-ს შესაძლებლობებში! LoRA-სა და QLoRA-ს გამოყენებით მეხსიერების მოხმარების ოპტიმიზაციის შესახებ დამატებითი ინფორმაციისთვის, იხილეთ PEFT-ის დოკუმენტაცია ან Google-ის რეკომენდაციები LoRA-სა და QLoRA-სთვის LLM-ებისთვის. ჩვენი მეხსიერების გაანგარიშება ზუსტი არ არის, რადგან ის არ ითვალისწინებს აქტივაციებს. აქტივაციები არის ქსელის ფენების შუალედური გამოსავლები და მათი მეხსიერების მოთხოვნები დამოკიდებულია მოდელის სტრუქტურაზე და პაკეტის ზომაზე (batch size). აქტივაციებისთვის საჭირო მეხსიერების ზუსტი გამოთვლა რთულია, ამიტომ ემპირიულ დაკვირვებებს დავეყრდნობით. შესაბამისი წვრთნის პაკეტის ზომის (per_device_train_batch_size) შესარჩევად, დაიწყეთ თქვენთვის სასურველი პაკეტის ზომით (მაგ., 64). ეს სავარაუდოდ გამოიწვევს მეხსიერების ამოწურვის (OOM) შეცდომას. თუ ასე მოხდა, შეამცირეთ პაკეტის ზომა შუაზე და გააორმაგეთ გრადიენტის აკუმულაციის ნაბიჯები (gradient_accumulation_steps) იგივე ეფექტური პაკეტის ზომის შესანარჩუნებლად. გაიმეორეთ ეს პროცესი მანამ, სანამ მეხსიერება თქვენს GPU-ში არ მოთავსდება. ჩვენს შემთხვევაში, საბოლოოდ მივიღეთ პაკეტის ზომა 2 და გრადიენტის აკუმულაციის ნაბიჯები 32. დამატებითი ოპტიმიზაცია არის გრადიენტის საკონტროლო წერტილების (gradient checkpointing) გამოყენება აქტივაციებისთვის საჭირო მეხსიერების შესამცირებლად. ეს ტექნიკა ანაცვლებს გამოთვლას მეხსიერებაზე ხელახალი გამოთვლით...