როგორც ჩვენს წინა ბლოგპოსტში დეტალურად აღვწერეთ, Intel Xeon CPU-ები გვთავაზობს ფუნქციების კომპლექტს, რომელიც სპეციალურად შექმნილია ხელოვნური ინტელექტის (AI) ამოცანებისთვის, როგორიცაა AVX512 ან VNNI (Vector Neural Network Instructions), რათა უზრუნველყოფილი იყოს ეფექტური დასკვნის გამოტანა (inference) მთელი რიცხვით კვანტირებული ნერვული ქსელების გამოყენებით, დამატებითი სისტემური ინსტრუმენტებთან ერთად, რათა სამუშაო შესრულდეს ყველაზე ეფექტური გზით. ამ ბლოგპოსტში ჩვენ ყურადღებას გავამახვილებთ პროგრამულ ოპტიმიზაციებზე და მოგაწვდით ინფორმაციას Intel-ის Xeon CPU-ების ახალი Ice Lake თაობის მუშაობის შესახებ. ჩვენი მიზანია, სრულად წარმოგიდგინოთ, თუ რა არის ხელმისაწვდომი პროგრამული უზრუნველყოფის მხრივ, რათა მაქსიმალურად გამოიყენოთ თქვენი Intel-ის აპარატურა. წინა ბლოგპოსტის მსგავსად, ჩვენ ვაჩვენებთ მუშაობის შედეგებს ბენჩმარკებისა და სქემების სახით, ასევე გაგაცნობთ ახალ ინსტრუმენტებს, რომლებიც ამ ფუნქციების გამოყენებას ამარტივებს. აპრილში Intel-მა წარმოადგინა Intel Xeon პროცესორების უახლესი თაობა, კოდური სახელწოდებით Ice Lake, რომელიც მიზნად ისახავს ხელოვნური ინტელექტის ამოცანების უფრო ეფექტურ და პროდუქტიულ შესრულებას. უფრო კონკრეტულად, Ice Lake Xeon CPU-ებს შეუძლიათ 75%-მდე უფრო სწრაფი დასკვნის გამოტანა (inference) ბუნებრივი ენის დამუშავების (NLP) სხვადასხვა ამოცანებში, წინა თაობის Cascade Lake Xeon პროცესორებთან შედარებით. ეს მიღწეულია როგორც აპარატურული, ისე პროგრამული გაუმჯობესებების კომბინაციით, როგორიცაა ახალი ინსტრუქციები და PCIe 4.0, რომლებიც წარმოდგენილია Sunny Cove-ის ახალ არქიტექტურაში და მხარს უჭერს მანქანური სწავლების (Machine Learning) და ღრმა სწავლების (Deep Learning) ამოცანებს. და ბოლოს, რაც არანაკლებ მნიშვნელოვანია, Intel-მა იმუშავა სხვადასხვა ფრეიმვორკების სპეციფიკურ ოპტიმიზაციებზე, რომლებიც ახლა Intel-ის ვერსიებით არის წარმოდგენილი, მაგალითად: Intel’s Extension for Scikit Learn, Intel TensorFlow და Intel PyTorch Extension. ყველა ეს ფუნქცია ძალიან დაბალ დონეზეა იმ ინსტრუმენტების სტეკში, რომლებსაც ყოველდღიურად იყენებენ მონაცემთა მეცნიერები და მანქანური სწავლების ინჟინრები. უმრავლეს შემთხვევაში, უფრო გავრცელებულია მაღალი დონის ფრეიმვორკებსა და ბიბლიოთეკებზე დაყრდნობა მრავალგანზომილებიანი მასივების მანიპულირებისთვის, როგორიცაა PyTorch და TensorFlow, და მაღალოპტიმიზებული მათემატიკური ოპერატორების გამოყენება, როგორიცაა BLAS (Basic Linear Algebra Subroutines) გამოთვლითი ნაწილისთვის. ამ სფეროში Intel არსებით როლს ასრულებს პროგრამული კომპონენტების მიწოდებით oneAPI-ის ქოლგის ქვეშ, რაც ძალიან აადვილებს მაღალეფექტური წრფივი ალგებრის რუტინების გამოყენებას Intel oneMKL (Math Kernel Library) მეშვეობით, მაღალი დონის პარალელიზაციის ფრეიმვორკს Intel OpenMP-ით ან Threading Building Blocks (oneTBB)-ით. ასევე, oneAPI გთავაზობთ დომენ-სპეციფიკურ ბიბლიოთეკებს, როგორიცაა Intel oneDNN ღრმა ნერვული ქსელის პრიმიტივებისთვის (ReLU, fully-connected და ა.შ.) ან oneCCL კოლექტიური კომუნიკაციისთვის, რაც განსაკუთრებით გამოსადეგია დისტრიბუციული სისტემების გამოყენებისას მრავალ ჰოსტზე ეფექტური all-reduce ოპერაციების მისაწვდომად. ზოგიერთი ეს ბიბლიოთეკა, განსაკუთრებით MKL ან oneDNN, ნატურალურად არის ინტეგრირებული ისეთ ფრეიმვორკებში, როგორიცაა PyTorch და TensorFlow (ვერსია 2.5.0-დან), რათა საბოლოო მომხმარებლისთვის დაუყოვნებლივ იყოს ხელმისაწვდომი ყველა მუშაობის გაუმჯობესება. როდესაც კონკრეტული აპარატურული მახასიათებლების გამოყენებაა საჭირო, Intel გთავაზობთ ყველაზე გავრცელებული პროგრამული უზრუნველყოფის მორგებულ ვერსიებს, რომლებიც სპეციალურად Intel-ის პლატფორმისთვის არის ოპტიმიზებული. მაგალითად, TensorFlow-ს შემთხვევაში, Intel უზრუნველყოფს ფრეიმვორკის მორგებულ, მაღალოპტიმიზებულ ვერსიებს, ან Intel PyTorch Extension (IPEX) ფრეიმვორკს, რომელიც შეიძლება ჩაითვალოს ფუნქციების ლაბორატორიად PyTorch-ში ინტეგრაციამდე. როგორც ზემოთ აღინიშნა, ჩვენ განვიხილავთ რეგულირებადი ელემენტების ახალ კომპლექტს, რათა გავაუმჯობესოთ ჩვენი AI აპლიკაციის მუშაობა. მაღალი დონის თვალსაზრისით, ყველა მანქანური სწავლების და ღრმა სწავლების ფრეიმვორკი ერთი და იგივე ინგრედიენტებისგან შედგება: ზემოთ ჩამოთვლილი პუნქტების გარდა, ღრმა სწავლების ფრეიმვორკები უზრუნველყოფენ მონაცემთა ნაკადის და დამოკიდებულებების წარმოდგენის გზებს გრადიენტების გამოსათვლელად. ეს ამ ბლოგპოსტის ფარგლებს სცდება და იყენებს იმავე კომპონენტებს, რაც ზემოთ ჩამოთვლილია! ეს ბლოგპოსტი განზრახ გამოტოვებს მონაცემთა წარმოდგენის შესახებ პირველ პუნქტს, რადგან ის საკმაოდ ფრეიმვორკ-სპეციფიკურია. ცნობისთვის, PyTorch იყენებს საკუთარ იმპლემენტაციას, სახელწოდებით ATen, ხოლო TensorFlow ამ მიზნით ეყრდნობა ღია კოდის ბიბლიოთეკა Eigen-ს. მიუხედავად იმისა, რომ ძალიან რთულია ზოგადი ოპტიმიზაციების გამოყენება სხვადასხვა ობიექტის სტრუქტურებსა და განლაგებაზე, არსებობს ერთი სფერო, სადაც ჩვენ შეგვიძლია გავლენა მოვახდინოთ: მეხსიერების გამოყოფა (Memory Allocation). მოკლე შეხსენებისთვის, მეხსიერების გამოყოფა აქ გულისხმობს ოპერაციული სისტემისგან დინამიური (წინასწარ უცნობი) არეალის პროგრამულად მოთხოვნის პროცესს სისტემაზე, სადაც ჩვენ შევძლებთ ელემენტების შენახვას, როგორიცაა `malloc` და მისგან მიღებული ფუნქციები C-ში ან `new` ოპერატორი C++-ში. მეხსიერების ეფექტურობა, როგორც სიჩქარის, ასევე ფრაგმენტაციის თვალსაზრისით, ფართო სამეცნიერო და საინჟინრო საგანია მრავალი გადაწყვეტით, რაც დამოკიდებულია ამოცანასა და ძირითად აპარატურაზე. ბოლო წლების განმავლობაში ამ სფეროში სულ უფრო მეტი სამუშაო მიმდინარეობდა, განსაკუთრებით: თითოეული მათგანი გვთავაზობს სხვადასხვა მიდგომას მეხსიერების გამოყოფისა და მართვის ასპექტების გასაუმჯობესებლად სხვადასხვა პროგრამულ უზრუნველყოფაში. ახლა, როდესაც გვაქვს ჩვენი მონაცემების წარმოდგენის ეფექტური გზა, გვჭირდება გზა, რათა მაქსიმალურად გამოვიყენოთ ჩვენს ხელთ არსებული გამოთვლითი აპარატურა.