Hugging Face-ისა და AMD-ის გარღვევა AI მოდელების ოპტიმიზაციაში MI300X-ზე
Hugging Face-მა და AMD-მ ითანამშრომლეს, რათა მნიშვნელოვნად გაეუმჯობესებინათ ხელოვნური ინტელექტის მოდელების, კერძოდ Llama 3.1 405B-ის ინფერენსის შესრულება AMD MI300X GPU-ებზე. პროექტი ფოკუსირებულია დაბალი დონის კერნელების ოპტიმიზაციაზე, რაც გადამწყვეტია მილიარდობით პარამეტრის მქონე მოდელებისთვის. ამ თანამშრომლობის შედეგად შეიქმნა ღია კოდის მორგებული კერნელები, რომლებმაც მნიშვნელოვანი სიჩქარის ზრდა აჩვენეს, განსაკუთრებით AMD-ის აპარატურისთვის, რომელიც ხშირად იგნორირებულია კერნელის დეველოპერების მი
დღეში მილიარდზე მეტი: ეს არის ChatGPT-ის მიერ ყოველდღიურად დამუშავებული მოთხოვნების დაბალი შეფასება, მაჩვენებელი, რომელიც ნაკლებად სავარაუდოა, რომ მალე შემცირდება. თითოეული მოთხოვნისა და თითოეული გენერირებული ტოკენისთვის, ჩვენ ვასრულებთ მრავალმილიარდიანი პარამეტრების მოდელის ინფერენსს. სწორედ ამიტომ არის მოდელის ოპტიმიზაცია უმნიშვნელოვანესი ყველა დონეზე: როდესაც საქმე ამ მასშტაბებს ეხება, თუნდაც 1%-იანი შეყოვნების (ლატენცია) შემცირება ან ენერგიის მოხმარების ეფექტურობის გაზრდა უზარმაზარ დანაზოგს იძლევა.
მაგრამ საიდან შეიძლება მოდიოდეს ეს სარგებელი? მოდელის არქიტექტურები უკვე კარგად არის დამკვიდრებული და პოპულარულ მოდელებს დიდი ხანია აქვთ კვანტიზებული წონები. თუმცა, რჩება გადამწყვეტი დონე, რომელზეც შეგვიძლია მოდელის ინფერენსის ოპტიმიზაცია: კერნელის დონე. კერნელები არის ალგორითმები, რომლებიც სრულდება თქვენს ქსელში ნებისმიერი ოპერაციის დროს: არსებობს მატრიცული გამრავლების კერნელები, კონვოლუციური კერნელები, პაკეტური ნორმალიზაციის კერნელები და ა.შ. კერნელები არის დაბალი დონის, მაღალოპტიმიზებული ალგორითმები, რომლებიც ხშირად მორგებულია კონკრეტულ მოწყობილობაზე, რომელზეც იმუშავებენ. ცნობილია, რომ მათი დაწერა ხანგრძლივი და რთულია და მოითხოვს GPU-ს შიდა მუშაობის პრინციპების კარგად გაგებას.
კერნელები აუცილებელია ნერვულ ქსელებში ოპერაციების შესასრულებლად — კერნელის გარეშე, ოპერაციის ეფექტურად გამოყენება შეუძლებელია. ამ მიზეზით, ახალი ინოვაციები ხშირად იწყება "ნულოვანი დღის" კერნელით, რომელიც, როგორც წესი, ოპტიმიზებულია მხოლოდ უახლესი Nvidia-ს აპარატურისთვის. ეს მიდგომა გამორიცხავს ბევრ სხვა მოწყობილობას, განსაკუთრებით AMD GPU-ებს, რომლებიც, მიუხედავად იმისა, რომ გვთავაზობენ შედარებად ან აღმატებულ მახასიათებლებს, ხშირად შეუმჩნეველი რჩებიან კერნელის დეველოპერებისთვის.
Hugging Face-მა AMD-სთან ითანამშრომლა, რათა უზრუნველეყო უმაღლესი დონის შესრულება AMD-ის პლატფორმებზე და მისგან სარგებელი მიეღო ღია კოდის საზოგადოებას. ამ პარტნიორობის ფარგლებში, ჩვენ AMD-სთან ერთად გადავწყვიტეთ, ფოკუსირება მოვახდინოთ ღია კოდის ოპტიმიზებული კერნელების მიწოდებაზე, რათა გაუმჯობესდეს Llama 3.1 405B-ის FP8-ში სერვირების შესრულება 8 MI300X კვანძზე VLLM-ის გამოყენებით.
ამ ბლოგ-პოსტში ჩვენ განვიხილავთ, თუ როგორ მოვახდინეთ MI300X-ის შესრულების ოპტიმიზაცია და როგორ იქნა თითოეული კერნელი ინდივიდუალურად დაზუსტებული. მაგრამ ჯერ ვნახოთ ის მიღწეული შესრულების გაუმჯობესება, რომელიც ჩვენი მორგებული კერნელების გამოყენებით იქნა მიღწეული. შემდეგი სამი ოპტიმიზებული კერნელის კომბინაციით, ჩვენ მივაღწიეთ მნიშვნელოვან დაჩქარებას VLLM-ის გაშვებისას MI300X GPU-ებით აღჭურვილ კვანძზე.
გაზომვები ჩატარდა შეყვანის ზომით 1 და გამომავალი ზომით 128, რათა მიმეტიკა მოეხდინათ დეკოდირების რეჟიმისთვის. დეკოდირების შეყოვნებას ვზომავთ 30 იტერაციაზე მიღებული მედიანის გამოყენებით.
ეს შესრულების გაუმჯობესება გაიზომა VLLM-ში, მაგრამ ასევე შეგიძლიათ გამოიყენოთ კერნელები ცალკე, როგორც აღწერილია შემდეგ "როგორ" განყოფილებაში. ყველა ადრე აღწერილი კერნელი ხელმისაწვდომია hf-rocm-kernels საცავში, რომელიც აქ მდებარეობს. მასში ნახავთ ინსტრუქციებს, თუ როგორ დააინსტალიროთ პაკეტი, თითოეული კერნელის საწყისი კოდი, მათი შესაბამისი Python-ის ბაინდინგები, სხვადასხვა ბენჩმარკინგის სკრიპტები და ტესტების ნაკრები. ბენჩმარკინგის სკრიპტებისა და MI300X-ის გამოყენებით, შესაძლოა ამ ბლოგ-პოსტში აღწერილი შედეგები თავადაც აღადგინოთ. Torch-ისთვის ან VLLM-ისთვის იგივე შედეგების უზრუნველსაყოფად, შეგიძლიათ გამოიყენოთ იგივე კონტეინერი, რაც ჩვენ გამოვიყენეთ.
ასევე შეგიძლიათ გამოიყენოთ საცავი, როგორც საფუძველი საკუთარი კერნელების შესაქმნელად: მასში მოცემულია ინსტრუქციები, თუ როგორ დააკავშიროთ CUDA-ს სტილის კერნელი Python-თან და მარტივი ნიმუში კერნელი. შეგიძლიათ გადახედოთ განვითარების პროცესში მყოფ განშტოებებს ახალი კერნელებისთვის, მაგალითად, გამოთვლისა და კომუნიკაციის კერნელს, როგორც ეს აქ არის აღწერილი.
აღწერილი კერნელები მალე ინტეგრირებული იქნება VLLM პროექტის AMD-ის ფორკში, მაგრამ თუ გსურთ ნახოთ, როგორ შეგიძლიათ მსგავსი რამის გაკეთება თავად, შეგიძლიათ შეამოწმოთ ეს განშტოება და ეს დოკუმენტი.
ჯერ სწრაფად განვაახლებთ ჩვენს ცოდნას იმ მოწყობილობის არქიტექტურის შესახებ, რომელზეც ვმუშაობთ: MI300X. შემდეგ, განვიხილავთ ჩვენი მოდელის ინფერენსის მდგომარეობას მის ოპტიმიზაციამდე. ეს მოგვცემს საშუალებას, გამოვავლინოთ პრობლემური უბნები და გავიგოთ, რომელი მორგებული კერნელები უნდა დავწეროთ. შემდეგ, განვიხილავთ თითოეულ დაწერილ კერნელს, რაც მოგვცემს შესაძლებლობას, სხვადასხვა კუთხით შევისწავლოთ, თუ როგორ ხდება კერნელის ოპტიმიზაცია.
სანამ GPU კოდის ოპტიმიზაციას შევუდგებით, უნდა ვიცოდეთ, როგორ მუშაობს GPU. არსებობს უამრავი რესურსი, რომელიც შესანიშნავად ხსნის GPU-ს შიდა მუშაობის დეტალებს, რომლებსაც აქ, აქ და აქ დავდებ ბმულებს. ჩვენ მაინც სწრაფად გადავხედავთ GPU-ს სხვადასხვა დონეს, ცოდნის გასახალისებლად.
თუ გსურთ გამოტოვოთ განახლება და პირდაპირ ჩვენი მორგებული კერნელების დეტალებზე გადახვიდეთ, დააჭირეთ აქ!
GPU-ში მუშაობის უმცირესი ერთეული არის თრედი (ნაკადი). ყოველთვის, როდესაც GPU-ზე რაიმე სამუშაო სრულდება, ეს იმიტომ ხდება, რომ თრედმა შეასრულა ინსტრუქცია. ინსტრუქციები არის ძირითადი ოპერაციები, როგორიცაა მიმატება, გამრავლება, მონაცემთა ერთი ტიპიდან მეორეში კონვერტაცია, ან ჩატვირთვა და შენახვა. თითოეულ თრედს აქვს საკუთარი მეხსიერება, რომელსაც რეგისტრები (ან VGPR-ები) ეწოდება და რომელზეც წვდომა მხოლოდ მას აქვს. თრედს შეუძლია ჰქონდეს მაქსიმუმ 256 რეგისტრი, თითოეული 32-ბიტიანი სიგანის. ქვემოთ მოცემულია თრედი, რომელსაც აქვს წვდომა თავის 256 VGPR-ზე. თრედებს, გარდა ჩატვირთვის ან შენახვის ინსტრუქციების გამოყენების შემთხვევისა, შეუძლიათ ინსტრუქციების შესრულება მხოლოდ საკუთარ რეგისტრებზე. მაგალითად, ორი ვექტორის A და B შესაკრებად, თითოეული თრედი 1) ჩატვირთავს თავის რეგისტრებში ელემენტს A-დან და 2) მეორეს B-დან, შემდეგ 3) შეასრულებს...
თეგები:
#ai
#მანქანური სწავლება
#ოპტიმიზაცია
#gpu
#ნერვული ქსელები
#hugging face
#ღია კოდი
#amd
#llama
#mi300x
#კერნელები
#vllm
#fp8
წყარო: huggingface.co
AI-ით გადამუშავებული