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