ბიტების რაოდენობის შემცირება ნიშნავს, რომ მიღებული მოდელი საჭიროებს ნაკლებ მეხსიერებას, რაც გადამწყვეტია მსხვილი ენობრივი მოდელების (LLM) სამომხმარებლო მოწყობილობებზე განლაგებისთვის. ის ასევე იძლევა საშუალებას სპეციფიკური ოპტიმიზაციების დაბალი ბიტური სიგანის მონაცემთა ტიპებისთვის, როგორიცაა int8 ან float8 მატრიცული გამრავლებები CUDA მოწყობილობებზე. უამრავი ღია კოდის ბიბლიოთეკაა ხელმისაწვდომი PyTorch-ის ღრმა სწავლების მოდელების კვანტიზაციისთვის, თითოეული მათგანი გთავაზობთ მძლავრ ფუნქციებს, თუმცა ხშირად შეზღუდულია კონკრეტული მოდელის კონფიგურაციებითა და მოწყობილობებით. ასევე, მიუხედავად იმისა, რომ ისინი ეფუძნება იგივე დიზაინის პრინციპებს, ისინი სამწუხაროდ ხშირად შეუთავსებელია ერთმანეთთან. დღეს ჩვენ მოხარული ვართ წარმოგიდგინოთ quanto, PyTorch-ის კვანტიზაციის ბეკენდი Optimum-ისთვის. ის შექმნილია მრავალმხრივობისა და სიმარტივის გათვალისწინებით: ბოლო დროს კვანტიზაციის მეთოდები, როგორც ჩანს, კონცენტრირებულია მსხვილი ენობრივი მოდელების (LLM) კვანტიზაციაზე, მაშინ როცა quanto მიზნად ისახავს უკიდურესად მარტივი კვანტიზაციის პრიმიტივების მიწოდებას მარტივი კვანტიზაციის სქემებისთვის (ხაზოვანი კვანტიზაცია, ჯგუფის მიხედვით კვანტიზაცია), რომლებიც ადაპტირებადია ნებისმიერ მოდალობაზე. Quanto ხელმისაწვდომია როგორც pip პაკეტი. ტიპიური კვანტიზაციის სამუშაო პროცესი შემდეგი ნაბიჯებისგან შედგება: 1. **კვანტიზაცია**: პირველი ნაბიჯი სტანდარტულ float მოდელს დინამიურად კვანტიზირებულ მოდელად გარდაქმნის. ამ ეტაპზე, მხოლოდ მოდელის ინფერენცია მოდიფიცირდება წონების დინამიურად კვანტიზაციისთვის. 2. **დაკალიბრება** (არასავალდებულოა, თუ აქტივაციები არ არის კვანტიზირებული): Quanto მხარს უჭერს კალიბრაციის რეჟიმს, რომელიც იძლევა აქტივაციის დიაპაზონების ჩაწერის საშუალებას კვანტიზირებულ მოდელში წარმომადგენლობითი ნიმუშების გატარებისას. ეს ავტომატურად ააქტიურებს აქტივაციების კვანტიზაციას კვანტიზირებულ მოდულებში. 3. **ოპტიმიზაცია**, იგივე კვანტიზაცია-აგებული სწავლება (არასავალდებულო): თუ მოდელის წარმადობა ზედმეტად ეცემა, მისი ოპტიმიზაცია შესაძლებელია რამდენიმე ეპოქის განმავლობაში float მოდელის წარმადობის აღსადგენად. 4. **მთელი რიცხვითი წონების გაყინვა**: მოდელის გაყინვისას, მისი float წონები იცვლება კვანტიზირებული წონებით. 5. **კვანტიზირებული მოდელის სერიალიზაცია**: კვანტიზირებული მოდელების წონები შესაძლებელია სერიალიზდეს state_dict-ში და შეინახოს ფაილში. მხარდაჭერილია როგორც pickle, ასევე safetensors (რეკომენდებულია). ამ წონების ხელახლა ჩასატვირთად, ასევე საჭიროა კვანტიზირებული მოდელების კვანტიზაციის რუკის (quantization map) შენახვა. 6. **კვანტიზირებული მოდელის ხელახლა ჩატვირთვა**: სერიალიზებული კვანტიზირებული მოდელის ხელახლა ჩატვირთვა შესაძლებელია state_dict-დან და quantization_map-დან requantize დამხმარე ფუნქციის გამოყენებით. გაითვალისწინეთ, რომ ჯერ ცარიელი მოდელი უნდა ინსტანცირდეს. გთხოვთ, იხილოთ მაგალითები კვანტიზაციის სამუშაო პროცესის ინსტანცირებისთვის. ასევე შეგიძლიათ ნახოთ ეს ნოუთბუქი, სადაც ჩვენ გაჩვენებთ, თუ როგორ უნდა მოახდინოთ BLOOM მოდელის კვანტიზაცია quanto-ს გამოყენებით! ქვემოთ მოცემულია ორი გრაფიკი, რომელიც აფასებს meta-llama/Meta-Llama-3.1-8B-სთვის სხვადასხვა კვანტიზირებული კონფიგურაციის სიზუსტეს. შენიშვნა: თითოეულ ჯგუფში პირველი სვეტი ყოველთვის შეესაბამება არაკვანტიზირებულ მოდელს. ეს შედეგები მიღებულია ყოველგვარი სწავლის შემდგომი ოპტიმიზაციის ალგორითმის, როგორიცაა hqq ან AWQ, გამოყენების გარეშე. ქვემოთ მოცემული გრაფიკი გვიჩვენებს ლატენტურობას თითოეული ტოკენისთვის, გაზომილს NVIDIA A10 GPU-ზე. დაელოდეთ განახლებულ შედეგებს, რადგან ჩვენ მუდმივად ვაუმჯობესებთ quanto-ს ოპტიმიზატორებითა და ოპტიმიზირებული ბირთვებით. გთხოვთ, იხილოთ quanto-ს ბენჩმარკები სხვადასხვა მოდელის არქიტექტურისა და კონფიგურაციის დეტალური შედეგებისთვის. Quanto შეუფერხებლად ინტეგრირებულია Hugging Face transformers ბიბლიოთეკაში. თქვენ შეგიძლიათ ნებისმიერი მოდელის კვანტიზაცია QuantoConfig-ის გადაცემით from_pretrained ფუნქციაში! ამჟამად, საჭიროა accelerate-ის უახლესი ვერსიის გამოყენება იმის უზრუნველსაყოფად, რომ ინტეგრაცია სრულად თავსებადია. თქვენ შეგიძლიათ წონების და/ან აქტივაციების კვანტიზაცია int8, float8, int4 ან int2-ში, უბრალოდ შესაბამისი არგუმენტის გადაცემით QuantoConfig-ში. აქტივაციები შეიძლება იყოს როგორც int8, ასევე float8. float8-ისთვის საჭიროა float8 სიზუსტესთან თავსებადი აპარატურა, წინააღმდეგ შემთხვევაში quanto ჩუმად გაზრდის წონების და აქტივაციების ტიპს torch.float32-მდე ან torch.float16-მდე (მოდელის თავდაპირველი მონაცემთა ტიპის მიხედვით), როდესაც ვასრულებთ matmul-ს (მხოლოდ მაშინ, როდესაც წონა კვანტიზირებულია). თუ float8-ის გამოყენებას შეეცდებით MPS მოწყობილობებზე, torch ამჟამად შეცდომას გამოიწვევს. Quanto არის მოწყობილობისგან დამოუკიდებელი, რაც იმას ნიშნავს, რომ თქვენ შეგიძლიათ მოდელის კვანტიზაცია და გაშვება მიუხედავად იმისა, იყენებთ თუ არა CPU/GPU/MPS-ს (Apple Silicon). Quanto ასევე თავსებადია torch.compile-თან. თქვენ შეგიძლიათ მოდელის კვანტიზაცია quanto-თი და გამოიძახოთ torch.compile მოდელზე მისი უფრო სწრაფი გენერაციისთვის კომპილაციის მიზნით. ეს ფუნქცია შეიძლება არ იმუშაოს სტანდარტულად, თუ ჩართულია დინამიური კვანტიზაცია (ანუ კვანტიზაცია-აგებული სწავლება ან კვანტიზირებული აქტივაციები). დარწმუნდით, რომ activations=None დატოვეთ QuantoConfig-ის შექმნისას, თუ იყენებთ transformers-ის ინტეგრაციას. ასევე შესაძლებელია ნებისმიერი მოდელის კვანტიზაცია, მიუხედავად მოდალობისა, quanto-ს გამოყენებით! ჩვენ ვაჩვენებთ, თუ როგორ უნდა მოახდინოთ openai/whisper-large-v3 მოდელის კვანტიზაცია int8-ში quanto-ს გამოყენებით. იხილეთ ეს ნოუთბუქი სრული გაკვეთილისთვის, თუ როგორ უნდა გამოიყენოთ quanto სწორად transformers-ის ინტეგრაციასთან ერთად! quanto-ს განვითარებაში შეტანილი წვლილი მისასალმებელია, განსაკუთრებით შემდეგ სფეროებში.