ენის მოდელები მუდმივად იზრდება ზომაში. ამჟამად, PaLM-ს აქვს 540 მილიარდი პარამეტრი, OPT-ს, GPT-3-ს და BLOOM-ს დაახლოებით 176 მილიარდი პარამეტრი აქვთ, და ჩვენ ვხედავთ ტენდენციას კიდევ უფრო დიდი მოდელებისკენ. ქვემოთ მოცემულია დიაგრამა, რომელიც ასახავს ზოგიერთი უახლესი ენის მოდელის ზომას. ამიტომ, ამ მოდელების გაშვება რთულია ადვილად ხელმისაწვდომ მოწყობილობებზე. მაგალითად, BLOOM-176B-ზე ინფერენციის შესასრულებლად დაგჭირდებათ 8 ერთეული 80 GB A100 GPU (თითო დაახლოებით $15k). BLOOM-176B-ის დასახვეწად (fine-tune) კი 72 ასეთი GPU-ა საჭირო! გაცილებით დიდი მოდელები, როგორიცაა PaLM, კიდევ უფრო მეტ რესურსს მოითხოვს. ვინაიდან ამ უზარმაზარ მოდელებს გასაშვებად ამდენი GPU სჭირდებათ, უნდა ვიპოვოთ გზები, რათა შევამციროთ ეს მოთხოვნები მოდელის მუშაობის შენარჩუნებით. შემუშავებულია სხვადასხვა ტექნოლოგია, რომლებიც ცდილობენ მოდელის ზომის შემცირებას; შესაძლოა გსმენიათ კვანტიზაციისა და დისტილაციის შესახებ, თუმცა ბევრი სხვაც არსებობს. BLOOM-176B-ის წვრთნის (training) დასრულების შემდეგ, HuggingFace-სა და BigScience-ში ვეძებდით გზებს, რათა ეს დიდი მოდელი უფრო ადვილად გაგვეშვა ნაკლები GPU-ის გამოყენებით. BigScience-ის საზოგადოების მეშვეობით გავეცანით Int8 ინფერენციის კვლევას, რომელიც არ აუარესებს დიდი მოდელების პროგნოზირების ხარისხს და ამცირებს მათ მეხსიერების მოხმარებას 2-ჯერ. მალე დავიწყეთ თანამშრომლობა ამ კვლევაზე, რამაც გამოიწვია მისი სრული ინტეგრაცია Hugging Face transformers-ში. ამ ბლოგ-პოსტით, ჩვენ გთავაზობთ LLM.int8() ინტეგრაციას Hugging Face-ის ყველა მოდელისთვის, რასაც ქვემოთ უფრო დეტალურად განვმარტავთ. თუ გსურთ მეტი გაიგოთ ჩვენი კვლევის შესახებ, შეგიძლიათ გაეცნოთ ჩვენს ნაშრომს, LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale. ეს სტატია ფოკუსირებულია ამ კვანტიზაციის ტექნოლოგიის ზოგადი მიმოხილვის მიწოდებაზე, ტრანსფორმერების ბიბლიოთეკაში მისი ინტეგრაციის სირთულეების აღწერაზე და ამ პარტნიორობის გრძელვადიანი მიზნების განსაზღვრაზე. აქ გაიგებთ, თუ კონკრეტულად რა განაპირობებს დიდი მოდელის მიერ ამდენი მეხსიერების გამოყენებას? რა ხდის BLOOM-ს 350GB-იანად? დავიწყოთ რამდენიმე ძირითადი წინაპირობის თანდათანობით განხილვით. ჩვენ ვიწყებთ სხვადასხვა მცოცავწერტილოვანი მონაცემთა ტიპების საბაზისო გაგებით, რომლებსაც მანქანური სწავლების კონტექსტში "სიზუსტესაც" (precision) უწოდებენ. მოდელის ზომა განისაზღვრება მისი პარამეტრების რაოდენობით და მათი სიზუსტით, როგორც წესი, ეს არის float32, float16 ან bfloat16 (ქვემოთ მოცემული სურათი: https://blogs.nvidia.com/blog/2020/05/14/tensorfloat-32-precision-format/). Float32 (FP32) წარმოადგენს სტანდარტიზებულ IEEE 32-ბიტიან მცოცავწერტილოვან წარმოდგენას. ამ მონაცემთა ტიპით შესაძლებელია მცოცავი რიცხვების ფართო დიაპაზონის წარმოდგენა. FP32-ში 8 ბიტი დაცულია "ექსპონენტისთვის", 23 ბიტი "მანტისასთვის" და 1 ბიტი რიცხვის ნიშნისთვის. გარდა ამისა, ტექნიკის უმეტესი ნაწილი მხარს უჭერს FP32 ოპერაციებსა და ინსტრუქციებს. float16 (FP16) მონაცემთა ტიპში 5 ბიტი დაცულია ექსპონენტისთვის და 10 ბიტი მანტისასთვის. ეს FP16 რიცხვების წარმოდგენის დიაპაზონს გაცილებით დაბალს ხდის, ვიდრე FP32-ისას. ეს FP16 რიცხვებს ოვერფლოუს (ძალიან დიდი რიცხვის წარმოდგენის მცდელობა) და ანდერფლოუს (ძალიან მცირე რიცხვის წარმოდგენა) რისკის ქვეშ აყენებს. მაგალითად, თუ გააკეთებთ 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-თან შედარებით. ამიტომ გამოიყენება შერეული სიზუსტის მიდგომა, სადაც წონები ინახება FP32-ში, როგორც ზუსტი „მთავარი წონების“ საცნობარო წერტილი, ხოლო გამოთვლები წინ და უკან გადაცემისას ხორციელდება FP16/BF16-ისთვის, რათა გაიზარდოს წვრთნის სიჩქარე. FP16/BF16 გრადიენტები შემდეგ გამოიყენება FP32 მთავარი წონების განახლებისთვის. წვრთნის დროს მთავარი წონები ყოველთვის ინახება FP32-ში, მაგრამ პრაქტიკაში, ნახევრად სიზუსტის წონები ხშირად იძლევა მსგავს ხარისხს ინფერენციის დროს, როგორც მათი FP32 ანალოგი – ზუსტი საცნობარო წერტილი...