ამ ბლოგში დეტალურად განვიხილავთ, თუ როგორ მივაღწიეთ ამას. ჩვენ შევძელით საჯარო Diffusion მოდელებზე დაფუძნებული საჯარო LoRA-ებისთვის ჰაბში ინფერენსის სიჩქარის მკვეთრი გაზრდა. ამან მოგვცა საშუალება დაგვეზოგა გამოთვლითი რესურსები და შეგვეთავაზებინა უფრო სწრაფი და უკეთესი მომხმარებლის გამოცდილება. მოცემულ მოდელზე ინფერენსის შესასრულებლად ორი ნაბიჯია საჭირო: გაუმჯობესებების წყალობით, ჩვენ შევძელით გაშვების საწყისი დროის (warm up time) შემცირება 25 წამიდან 3 წამამდე. ახლა ჩვენ შეგვიძლია ასობით განსხვავებული LoRA-სთვის ინფერენსის მომსახურება, 5-ზე ნაკლები A10G GPU-ს გამოყენებით, მაშინ როცა მომხმარებლის მოთხოვნებზე პასუხის დრო 35 წამიდან 13 წამამდე შემცირდა. მოდით, უფრო მეტი ვისაუბროთ იმაზე, თუ როგორ შეგვიძლია გამოვიყენოთ Diffusers ბიბლიოთეკაში შემუშავებული უახლესი ფუნქციები, რათა მრავალი განსხვავებული LoRA დინამიურად მოვემსახუროთ ერთი სერვისით. LoRA არის დახვეწის (fine-tuning) ტექნიკა, რომელიც მიეკუთვნება "პარამეტრულად ეფექტური" (PEFT) მეთოდების ოჯახს, რომლებიც ცდილობენ შეამცირონ მოსამზადებელი პარამეტრების რაოდენობა, რაზეც გავლენას ახდენს დახვეწის პროცესი. ის ზრდის დახვეწის სიჩქარეს და ამცირებს დახვეწილი ჩექპოინტების ზომას. მოდელის ყველა წონაში მცირე ცვლილებების შეტანით დახვეწის ნაცვლად, ჩვენ ვყინავთ (freeze) ფენების უმეტესობას და ვამზადებთ მხოლოდ რამდენიმე კონკრეტულს ყურადღების ბლოკებში (attention blocks). გარდა ამისა, ჩვენ თავიდან ავიცილებთ ამ ფენების პარამეტრების შეცვლას ორი პატარა მატრიცის ნამრავლის ორიგინალურ წონებზე დამატებით. ეს პატარა მატრიცები არის ისეთები, რომელთა წონები განახლდება დახვეწის პროცესში და შემდეგ ინახება დისკზე. ეს ნიშნავს, რომ მოდელის ყველა ორიგინალური პარამეტრი შენარჩუნებულია და ჩვენ შეგვიძლია LoRA-ს წონების ჩატვირთვა ადაპტაციის მეთოდის გამოყენებით. LoRA-ს სახელი (Low Rank Adaptation) მოდის ჩვენ მიერ ნახსენები პატარა მატრიცებიდან. მეთოდის შესახებ დამატებითი ინფორმაციისთვის, გთხოვთ, იხილოთ ეს პოსტი ან ორიგინალური ნაშრომი. ზემოთ მოცემული დიაგრამა გვიჩვენებს ორ პატარა ნარინჯისფერ მატრიცას, რომლებიც ინახება LoRA ადაპტერის ნაწილად. მოგვიანებით შეგვიძლია LoRA ადაპტერის ჩატვირთვა და მისი ლურჯ საბაზო მოდელთან შერწყმა, რათა მივიღოთ ყვითელი, დახვეწილი მოდელი. მნიშვნელოვანია, რომ ადაპტერის გადმოტვირთვაც შესაძლებელია, რათა ნებისმიერ დროს დავუბრუნდეთ ორიგინალურ საბაზო მოდელს. სხვა სიტყვებით რომ ვთქვათ, LoRA ადაპტერი არის საბაზო მოდელის ერთგვარი დანამატი, რომლის დამატება და მოცილება შესაძლებელია მოთხოვნისამებრ. ხოლო A და B მცირე რანგების გამო, ის ძალიან მსუბუქია მოდელის ზომასთან შედარებით. აქედან გამომდინარე, ჩატვირთვა გაცილებით სწრაფია, ვიდრე მთელი საბაზო მოდელის ჩატვირთვა. თუ შეხედავთ, მაგალითად, Stable Diffusion XL Base 1.0 მოდელის რეპოზიტორიუმს, რომელიც ფართოდ გამოიყენება მრავალი LoRA ადაპტერის საბაზო მოდელად, დაინახავთ, რომ მისი ზომა დაახლოებით 7 GB-ია. თუმცა, ტიპიური LoRA ადაპტერები, როგორიცაა ეს, მხოლოდ 24 MB ადგილს იკავებს! ჰაბზე გაცილებით ნაკლებია ლურჯი საბაზო მოდელი, ვიდრე ყვითელი. თუ შეგვიძლია სწრაფად გადავიდეთ ლურჯიდან ყვითელზე და პირიქით, მაშინ გვაქვს საშუალება, მოვემსახუროთ ბევრ განსხვავებულ ყვითელ მოდელს მხოლოდ რამდენიმე განსხვავებული ლურჯი დეპლოიმენტით. იმის შესახებ, თუ რა არის LoRA, უფრო ამომწურავი პრეზენტაციისთვის, გთხოვთ, იხილოთ შემდეგი ბლოგ პოსტი: Using LoRA for Efficient Stable Diffusion Fine-Tuning, ან პირდაპირ მიმართეთ ორიგინალურ ნაშრომს. ჰაბზე გვაქვს დაახლოებით 2500 განსხვავებული საჯარო LoRA. მათი აბსოლუტური უმრავლესობა (~92%) არის Stable Diffusion XL Base 1.0 მოდელზე დაფუძნებული LoRA-ები. ამ ურთიერთგაზიარებამდე (mutualization), ეს ნიშნავდა მათთვის გამოყოფილი სერვისის განთავსებას (მაგ. დიაგრამაზე მოცემული ყველა ყვითელი შერწყმული მატრიცისთვის); მინიმუმ ერთი ახალი GPU-ს გამოშვებას + რეზერვირებას. სერვისის გაშვებისა და კონკრეტული მოდელისთვის მოთხოვნების მომსახურებისთვის მზადყოფნის დრო დაახლოებით 25 წამია, შემდეგ ამას ემატება ინფერენსის დრო (დაახლოებით 10 წამი 1024x1024 SDXL ინფერენსის დიფუზიისთვის 25 ინფერენსის ნაბიჯით A10G-ზე). თუ ადაპტერი მხოლოდ ზოგჯერ მოითხოვება, მისი სერვისი ჩერდება რესურსების გასათავისუფლებლად, რომლებიც სხვა სერვისებს სჭირდებათ. თუ თქვენ ითხოვდით არც ისე პოპულარულ LoRA-ს, თუნდაც ის SDXL მოდელზე ყოფილიყო დაფუძნებული, როგორც ჰაბზე ნაპოვნი ადაპტერების აბსოლუტური უმრავლესობა, დასჭირდებოდა 35 წამი მის გასათბობად და პირველ მოთხოვნაზე პასუხის მისაღებად (შემდგომ მოთხოვნებს დასჭირდებოდა ინფერენსის დრო, მაგ. 10 წამი). ახლა: მოთხოვნის დრო შემცირდა 35 წამიდან 13 წამამდე, რადგან ადაპტერები გამოიყენებენ მხოლოდ რამდენიმე განსხვავებულ "ლურჯ" საბაზო მოდელს (მაგ. 2 მნიშვნელოვანი Diffusion-ისთვის). მაშინაც კი, თუ თქვენი ადაპტერი არც ისე პოპულარულია, დიდია ალბათობა, რომ მისი "ლურჯი" სერვისი უკვე გააქტიურებულია. სხვა სიტყვებით რომ ვთქვათ, დიდია ალბათობა, რომ თავიდან აიცილოთ 25 წამიანი გაშვების დრო, მაშინაც კი, თუ თქვენს მოდელს არც ისე ხშირად ითხოვთ. ლურჯი მოდელი უკვე გადმოწერილია და მზადაა, ჩვენ მხოლოდ წინა ადაპტერის გადმოტვირთვა და ახლის ჩატვირთვა გვჭირდება, რასაც 3 წამი სჭირდება, როგორც ქვემოთ ვხედავთ. საერთო ჯამში, ეს მოითხოვს ნაკლებ GPU-ს ყველა განსხვავებული მოდელის მომსახურებისთვის, მიუხედავად იმისა, რომ უკვე გვქონდა GPU-ების გაზიარების გზა დეპლოიმენტებს შორის მათი გამოთვლითი გამოყენების მაქსიმიზაციისთვის. 2 წუთიან მონაკვეთში დაახლოებით 10 განსხვავებული LoRA-ს წონა მოითხოვება. 10 დეპლოიმენტის გაშვებისა და მათი მზადყოფნაში შენარჩუნების ნაცვლად, ჩვენ უბრალოდ ვემსახურებით მათ ყველას 1-დან 2 GPU-ით (ან მეტით, თუ მოთხოვნების აფეთქებაა). ჩვენ დავნერგეთ LoRA-ს ურთიერთგაზიარება ინფერენსში