ენის მოდელები მუდმივად იზრდება ზომაში. ამჟამად, PaLM-ს აქვს 540 მილიარდი პარამეტრი, OPT-ს, GPT-3-ს და BLOOM-ს დაახლოებით 176 მილიარდი პარამეტრი, და ტენდენცია კიდევ უფრო დიდი მოდელებისკენ მიდის. ქვემოთ მოცემულია დიაგრამა, რომელიც ასახავს ზოგიერთი უახლესი ენის მოდელის ზომას. ამიტომ, ამ მოდელების გაშვება რთულია ადვილად ხელმისაწვდომ მოწყობილობებზე. მაგალითად, BLOOM-176B-ზე ინფერენსის (inference) შესასრულებლად დაგჭირდებათ 8x 80GB A100 GPU (თითო დაახლოებით $15 ათასი). BLOOM-176B-ის დასაზუსტებლად (fine-tune), დაგჭირდებათ 72 ასეთი GPU! ბევრად უფრო დიდი მოდელები, როგორიცაა PaLM, კიდევ უფრო მეტ რესურსს მოითხოვს. ვინაიდან ამ უზარმაზარ მოდელებს გასაშვებად ამდენი GPU სჭირდებათ, უნდა მოვძებნოთ გზები ამ მოთხოვნების შესამცირებლად, მოდელის მუშაობის შენარჩუნებით. შემუშავებულია სხვადასხვა ტექნოლოგია, რომლებიც ცდილობენ მოდელის ზომის შემცირებას; შესაძლოა გსმენიათ კვანტიზაციისა (quantization) და დისტილაციის (distillation) შესახებ, და არსებობს მრავალი სხვა. BLOOM-176B-ის წვრთნის დასრულების შემდეგ, ჩვენ, HuggingFace-სა და BigScience-ში, ვეძებდით გზებს, რათა ეს დიდი მოდელი უფრო ადვილად გაგვეშვა ნაკლებ GPU-ზე. ჩვენი BigScience საზოგადოების მეშვეობით შევიტყვეთ Int8 ინფერენსის კვლევის შესახებ, რომელიც არ აუარესებს დიდი მოდელების პროგნოზირების ხარისხს და ამცირებს დიდი მოდელების მეხსიერების კვალს (memory footprint) 2-ჯერ. მალე დავიწყეთ თანამშრომლობა ამ კვლევაზე, რამაც გამოიწვია Hugging Face-ის ტრანსფორმატორებში სრული ინტეგრაცია. ამ ბლოგპოსტით, ჩვენ გთავაზობთ LLM.int8() ინტეგრაციას ყველა Hugging Face მოდელისთვის, რასაც ქვემოთ უფრო დეტალურად განვმარტავთ. თუ გსურთ მეტი გაიგოთ ჩვენი კვლევის შესახებ, შეგიძლიათ წაიკითხოთ ჩვენი ნაშრომი: LLM.int8(): 8-ბიტიანი მატრიცული გამრავლება ტრანსფორმატორებისთვის დიდი მასშტაბით. ეს სტატია ფოკუსირებულია ამ კვანტიზაციის ტექნოლოგიის ზოგადი მიმოხილვის მიცემაზე, ტრანსფორმატორების ბიბლიოთეკაში მისი ინტეგრირების სირთულეების აღწერაზე და ამ პარტნიორობის გრძელვადიანი მიზნების დასახვაზე. აქ გაიგებთ, თუ კონკრეტულად რა იწვევს იმას, რომ დიდი მოდელი ამდენ მეხსიერებას მოიხმარს? რა ხდის BLOOM-ს 350GB-ს? დავიწყოთ რამდენიმე ძირითადი წინაპირობის თანდათანობით განხილვით. ჩვენ ვიწყებთ სხვადასხვა მცოცავწერტილიანი მონაცემთა ტიპების (floating point data types) ძირითადი გაგებით, რომლებსაც მანქანური სწავლების კონტექსტში ასევე უწოდებენ „სიზუსტეს“ (precision). მოდელის ზომა განისაზღვრება მისი პარამეტრების რაოდენობითა და მათი სიზუსტით, როგორც წესი, ეს არის float32, float16 ან bfloat16 (ქვემოთ მოცემული სურათი აღებულია: https://blogs.nvidia.com/blog/2020/05/14/tensorfloat-32-precision-format/). Float32 (FP32) ნიშნავს სტანდარტიზებულ IEEE 32-ბიტიან მცოცავწერტილიან წარმოდგენას. ამ მონაცემთა ტიპით შესაძლებელია მცოცავი რიცხვების ფართო დიაპაზონის წარმოდგენა. FP32-ში 8 ბიტი დაცულია „მაჩვენებლისთვის“ (exponent), 23 ბიტი „მანტისისთვის“ (mantissa) და 1 ბიტი რიცხვის ნიშნისთვის. გარდა ამისა, ტექნიკის უმეტესი ნაწილი მხარს უჭერს FP32 ოპერაციებსა და ინსტრუქციებს. float16 (FP16) მონაცემთა ტიპში 5 ბიტი დაცულია მაჩვენებლისთვის და 10 ბიტი მანტისისთვის. ეს FP16 რიცხვების წარმოდგენის დიაპაზონს გაცილებით დაბალს ხდის, ვიდრე FP32-შია. ეს FP16 რიცხვებს გადავსების (overflow - ძალიან დიდი რიცხვის წარმოდგენის მცდელობა) და არასაკმარისობის (underflow - ძალიან მცირე რიცხვის წარმოდგენა) რისკის ქვეშ აყენებს. მაგალითად, თუ გააკეთებთ 10k * 10k, მიიღებთ 100M-ს, რაც შეუძლებელია FP16-ში წარმოადგინოთ, რადგან უდიდესი შესაძლო რიცხვია 64k. შესაბამისად, მიიღებთ NaN (არ არის რიცხვი) შედეგს და თუ გაქვთ თანმიმდევრული გამოთვლები, როგორც ნერვულ ქსელებში, მთელი წინა ნამუშევარი განადგურდება. როგორც წესი, ამ პრობლემის დასაძლევად გამოიყენება დანაკარგის სკალირება (loss scaling), მაგრამ ის ყოველთვის კარგად არ მუშაობს. ამ შეზღუდვების თავიდან ასაცილებლად შეიქმნა ახალი ფორმატი, bfloat16 (BF16). BF16-ში 8 ბიტი დაცულია მაჩვენებლისთვის (რომელიც იგივეა, რაც FP32-ში) და 7 ბიტი წილადისთვის. ეს ნიშნავს, რომ BF16-ში შეგვიძლია შევინარჩუნოთ იგივე დინამიური დიაპაზონი, რაც FP32-შია. მაგრამ ვკარგავთ 3 ბიტ სიზუსტეს FP16-თან შედარებით. ახლა უკვე არანაირი პრობლემა არ არის უზარმაზარ რიცხვებთან, მაგრამ სიზუსტე აქ FP16-ზე უარესია. Ampere არქიტექტურაში NVIDIA-მ ასევე წარმოადგინა TensorFloat-32 (TF32) სიზუსტის ფორმატი, რომელიც აერთიანებს BF16-ის დინამიურ დიაპაზონს და FP16-ის სიზუსტეს, მხოლოდ 19 ბიტის გამოყენებით. ის ამჟამად მხოლოდ შიდა გამოყენებისთვის არის განკუთვნილი გარკვეული ოპერაციების დროს. მანქანური სწავლების ჟარგონში FP32-ს უწოდებენ სრულ სიზუსტეს (4 ბაიტი), ხოლო BF16-სა და FP16-ს – ნახევრად სიზუსტეს (2 ბაიტი). გარდა ამისა, int8 (INT8) მონაცემთა ტიპი შედგება 8-ბიტიანი წარმოდგენისგან, რომელსაც შეუძლია შეინახოს 2^8 სხვადასხვა მნიშვნელობა ([0, 255] ან [-128, 127] ნიშნიანი მთელი რიცხვებისთვის). მიუხედავად იმისა, რომ იდეალურ შემთხვევაში წვრთნა და ინფერენსი FP32-ში უნდა განხორციელდეს, ის ორჯერ ნელია FP16/BF16-თან შედარებით და, შესაბამისად, გამოიყენება შერეული სიზუსტის (mixed precision) მიდგომა, სადაც წონები ინახება FP32-ში, როგორც ზუსტი „ძირითადი წონების“ მითითება, ხოლო გამოთვლები წინ და უკან მიმართულებით სრულდება FP16/BF16-ში წვრთნის სიჩქარის გასაუმჯობესებლად. შემდეგ FP16/BF16 გრადიენტები გამოიყენება FP32 ძირითადი წონების განახლებისთვის. წვრთნის დროს, ძირითადი წონები ყოველთვის ინახება FP32-ში, მაგრამ პრაქტიკაში, ნახევრად სიზუსტის წონები ხშირად უზრუნველყოფენ მსგავს ხარისხს ინფერენსის დროს, როგორც მათი FP32 ანალოგი – ზუსტი მითითება.