სანამ ჩავუღრმავდებით ტექნიკურ დეტალებს, თუ როგორ მუშაობს კვანტიზაციის სხვადასხვა ბეკენდი Hugging Face Diffusers-ში, რატომ არ გამოსცდით საკუთარ აღქმას? ჩვენ შევქმენით სისტემა, სადაც შეგიძლიათ მიუთითოთ მოთხოვნა და ჩვენ შევქმნით შედეგებს როგორც ორიგინალური, მაღალი სიზუსტის მოდელის (მაგ., Flux-dev BF16-ში) ასევე რამდენიმე კვანტიზებული ვერსიის (BnB 4-ბიტიანი, BnB 8-ბიტიანი) გამოყენებით. შემდეგ გენერირებული სურათები წარმოგიდგებათ და თქვენი გამოწვევაა, ამოიცნოთ, რომელი მათგანი შეიქმნა კვანტიზებული მოდელების გამოყენებით. სცადეთ აქ ან ქვემოთ! ხშირად, განსაკუთრებით 8-ბიტიანი კვანტიზაციის დროს, განსხვავებები უმნიშვნელოა და შესაძლოა არ იყოს შესამჩნევი ახლო შემოწმების გარეშე. უფრო აგრესიული კვანტიზაცია, როგორიცაა 4-ბიტიანი ან უფრო დაბალი, შესაძლოა უფრო შესამჩნევი იყოს, მაგრამ შედეგები მაინც შეიძლება იყოს კარგი, განსაკუთრებით მეხსიერების მასიური დაზოგვის გათვალისწინებით. თუმცა, NF4 ხშირად იძლევა საუკეთესო კომპრომისს. ახლა, ჩავუღრმავდეთ. ჩვენს წინა პოსტზე დაყრდნობით, სახელწოდებით „მეხსიერების ეფექტური დიფუზიური ტრანსფორმატორები Quanto-სა და Diffusers-ით“, ეს პოსტი იკვლევს კვანტიზაციის მრავალფეროვან ბეკენდებს, რომლებიც უშუალოდ Hugging Face Diffusers-შია ინტეგრირებული. ჩვენ განვიხილავთ, თუ როგორ აქცევს bitsandbytes, GGUF, torchao, Quanto და მშობლიური FP8 მხარდაჭერა დიდ და მძლავრ მოდელებს უფრო ხელმისაწვდომს, რაც მათი გამოყენებას Flux-თან ერთად აჩვენებს. სანამ კვანტიზაციის ბეკენდებში ჩავუღრმავდებით, მოდით წარმოვადგინოთ FluxPipeline (black-forest-labs/FLUX.1-dev ჩეკპოინტის გამოყენებით) და მისი კომპონენტები, რომლებსაც ჩვენ კვანტიზაციას გავუკეთებთ. სრული FLUX.1-dev მოდელის BF16 სიზუსტით ჩატვირთვა მოითხოვს დაახლოებით 31.447 GB მეხსიერებას. ძირითადი კომპონენტებია: bitsandbytes არის პოპულარული და მოსახერხებელი ბიბლიოთეკა 8-ბიტიანი და 4-ბიტიანი კვანტიზაციისთვის, რომელიც ფართოდ გამოიყენება LLM-ებისთვის და QLoRA ფაინ-ტიუნინგისთვის. მისი გამოყენება შესაძლებელია ტრანსფორმატორებზე დაფუძნებული დიფუზიური და ნაკადის მოდელებისთვისაც. ყველა ბენჩმარკი ჩატარდა 1x NVIDIA H100 80GB GPU-ზე. შენიშვნა: PipelineQuantizationConfig-ის bitsandbytes-თან გამოყენებისას, საჭიროა ცალკე მოხდეს DiffusersBitsAndBytesConfig-ის იმპორტი diffusers-დან და TransformersBitsAndBytesConfig-ის იმპორტი transformers-დან. ეს იმიტომ ხდება, რომ ეს კომპონენტები სხვადასხვა ბიბლიოთეკიდან მოდის. თუ უპირატესობას ანიჭებთ უფრო მარტივ დაყენებას ამ განსხვავებული იმპორტების მართვის გარეშე, შეგიძლიათ გამოიყენოთ ალტერნატიული მიდგომა პაიპლაინის დონის კვანტიზაციისთვის; ამ მეთოდის მაგალითი მოცემულია Diffusers-ის დოკუმენტაციაში პაიპლაინის დონის კვანტიზაციის შესახებ. დამატებითი ინფორმაციისთვის იხილეთ bitsandbytes-ის დოკუმენტაცია. torchao არის PyTorch-ის მშობლიური ბიბლიოთეკა არქიტექტურის ოპტიმიზაციისთვის, რომელიც გვთავაზობს კვანტიზაციას, სპარსულობას და საბაჟო მონაცემთა ტიპებს, შექმნილია torch.compile-თან და FSDP-თან თავსებადობისთვის. Diffusers მხარს უჭერს torchao-ს ეგზოტიკური მონაცემთა ტიპების ფართო სპექტრს, რაც უზრუნველყოფს მოდელის ოპტიმიზაციაზე წვრილმარცვლოვან კონტროლს. დამატებითი ინფორმაციისთვის იხილეთ torchao-ს დოკუმენტაცია. Quanto არის კვანტიზაციის ბიბლიოთეკა, რომელიც ინტეგრირებულია Hugging Face-ის ეკოსისტემასთან optimum ბიბლიოთეკის მეშვეობით. შენიშვნა: ამ სტატიის დაწერის მომენტში, Quanto-სთან float8 მხარდაჭერისთვის, დაგჭირდებათ optimum-quanto<0.2.5 და უშუალოდ quanto-ს გამოყენება. ჩვენ ვიმუშავებთ ამის გამოსწორებაზე. დამატებითი ინფორმაციისთვის იხილეთ Quanto-ს დოკუმენტაცია. GGUF არის ფაილის ფორმატი, რომელიც პოპულარულია llama.cpp საზოგადოებაში კვანტიზებული მოდელების შესანახად. დამატებითი ინფორმაციისთვის იხილეთ GGUF-ის დოკუმენტაცია. FP8 შრეობრივი ქასთინგი (Layerwise Casting) არის მეხსიერების ოპტიმიზაციის ტექნიკა. ის მუშაობს მოდელის წონების კომპაქტურ FP8 (8-ბიტიანი მცურავწერტილიანი) ფორმატში შენახვით, რომელიც იყენებს სტანდარტული FP16 ან BF16 სიზუსტის მეხსიერების დაახლოებით ნახევარს. შრემ გამოთვლების შესრულებამდე, მისი წონები დინამიურად გარდაიქმნება უფრო მაღალ გამოთვლით სიზუსტეზე (როგორიცაა FP16/BF16). დაუყოვნებლივ ამის შემდეგ, წონები ისევ გარდაიქმნება FP8-ში ეფექტური შენახვისთვის. ეს მიდგომა მუშაობს იმის გამო, რომ ძირითადი გამოთვლები ინარჩუნებს მაღალ სიზუსტეს, ხოლო კვანტიზაციის მიმართ განსაკუთრებით მგრძნობიარე შრეები (როგორიცაა ნორმალიზაცია) ჩვეულებრივ გამოტოვებულია. ეს ტექნიკა ასევე შეიძლება გაერთიანდეს ჯგუფურ გადმოტვირთვასთან მეხსიერების შემდგომი დაზოგვისთვის. დამატებითი ინფორმაციისთვის იხილეთ Layerwise casting-ის დოკუმენტაცია. ამ კვანტიზაციის ბეკენდების უმეტესობა შეიძლება გაერთიანდეს Diffusers-ის მიერ შემოთავაზებულ მეხსიერების ოპტიმიზაციის ტექნიკებთან. მოდით განვიხილოთ CPU-ზე გადმოტვირთვა, ჯგუფური გადმოტვირთვა და torch.compile. ამ ტექნიკების შესახებ მეტის გაგება შეგიძლიათ Diffusers-ის დოკუმენტაციაში. შენიშვნა: ამ სტატიის დაწერის მომენტში, bnb + torch.compile ასევე მუშაობს, თუ bnb დაყენებულია წყაროდან და გამოიყენება pytorch nightly ან fullgraph=False-ით. მოდელის CPU-ზე გადმოტვირთვა (enable_model_cpu_offload): ეს მეთოდი გადააქვს მოდელის მთლიან კომპონენტებს (როგორიცაა UNet, ტექსტის ენკოდერები ან VAE) CPU-სა და GPU-ს შორის დასკვნის პაიპლაინის დროს. ის უზრუნველყოფს VRAM-ის მნიშვნელოვან დაზოგვას და ზოგადად უფრო სწრაფია, ვიდრე უფრო დეტალური გადმოტვირთვა, რადგან ის გულისხმობს ნაკლებ, მაგრამ უფრო დიდ მონაცემთა გადაცემას. bnb + enable_model_cpu_offload: ჯგუფური გადმოტვირთვა (enable_group_offload Diffusers-ის კომპონენტებისთვის ან apply_group_offloading ზოგადი torch.nn.Modules-ისთვის): ის გადააქვს შიდა მოდელის შრეების ჯგუფებს (როგორიცაა torch.nn.ModuleList ან torch.nn.Sequential ინსტანციები) CPU-ზე. ეს მიდგომა, როგორც წესი, უფრო მეხსიერება-ეფექტურია, ვიდრე მოდელის სრული გადმოტვირთვა და უფრო სწრაფი, ვიდრე თანმიმდევრული გადმოტვირთვა. FP8 შრეობრივი ქასთინგი + ჯგუფური გადმოტვირთვა: შენიშვნა: torch.compile c