დღეს ჩვენ განვიხილავთ Hugging Face-ის ამაღელვებელ სიახლეს: Kernel Hub-ს! როგორც მანქანური სწავლების სპეციალისტებმა ვიცით, მუშაობის მაქსიმალური გაზრდა ხშირად გულისხმობს ოპტიმიზებულ კოდში, მორგებულ CUDA ბირთვებში ან რთულ build სისტემებში ღრმა ჩაძიებას. Kernel Hub მნიშვნელოვნად ამარტივებს ამ პროცესს! ქვემოთ მოცემულია მოკლე მაგალითი, თუ როგორ გამოვიყენოთ ბირთვი თქვენს კოდში. მომდევნო სექციებში განვიხილავთ შემდეგ თემებს: ამ კონცეფციებს სწრაფად წარმოგიდგენთ – ძირითადი იდეის გაგება დაახლოებით 5 წუთშია შესაძლებელი (თუმცა ექსპერიმენტებსა და ბენჩმარკინგს შეიძლება ცოტა მეტი დრო დასჭირდეს!). Kernel Hub (👈 ნახეთ!) საშუალებას აძლევს Python-ის ბიბლიოთეკებსა და აპლიკაციებს, ჩატვირთონ ოპტიმიზებული გამოთვლითი ბირთვები უშუალოდ Hugging Face Hub-იდან. წარმოიდგინეთ, რომ ეს Model Hub-ის მსგავსია, მაგრამ დაბალდონიანი, მაღალეფექტური კოდის ფრაგმენტებისთვის (ბირთვები), რომლებიც აჩქარებენ სპეციფიკურ ოპერაციებს, ხშირად GPU-ებზე. მაგალითები მოიცავს: გაუმჯობესებულ ყურადღების მექანიზმებს (როგორიცაა FlashAttention, დრამატული აჩქარებისა და მეხსიერების დაზოგვისთვის); მორგებულ კვანტიზაციის ბირთვებს (რომლებიც უზრუნველყოფენ ეფექტურ გამოთვლებს დაბალი სიზუსტის მონაცემთა ტიპებით, როგორიცაა INT8 ან INT4); სპეციალიზებულ ბირთვებს, რომლებიც საჭიროა რთული არქიტექტურებისთვის, როგორიცაა Mixture of Experts (MoE) ფენები, რომლებიც მოიცავს რთულ მარშრუტიზაციასა და გამოთვლით შაბლონებს; ასევე, აქტივაციის ფუნქციებსა და ნორმალიზაციის ფენებს (როგორიცაა LayerNorm ან RMSNorm). ნაცვლად იმისა, რომ ხელით მართოთ რთული დამოკიდებულებები, იბრძოლოთ კომპილაციის ფლაგებთან ან თავიდან ააგოთ ბიბლიოთეკები, როგორიცაა Triton ან CUTLASS, შეგიძლიათ გამოიყენოთ `kernels` ბიბლიოთეკა წინასწარ კომპილირებული, ოპტიმიზებული ბირთვების მყისიერად მისაღებად და გასაშვებად. მაგალითად, FlashAttention-ის გასააქტიურებლად საჭიროა მხოლოდ ერთი ხაზი — ყოველგვარი build-ისა და flag-ის გარეშე: `kernels` ამოიცნობს თქვენს ზუსტ Python, PyTorch და CUDA ვერსიებს, შემდეგ ჩამოტვირთავს შესაბამის წინასწარ კომპილირებულ ბინარულ ფაილს — როგორც წესი, წამებში (ან ერთი-ორი წუთი ნელი კავშირის შემთხვევაში). ამის საპირისპიროდ, FlashAttention-ის ხელით კომპილაცია მოითხოვს: Kernel Hub აქრობს ყველა ამ სირთულეს: ერთი ფუნქციის გამოძახება, მყისიერი აჩქარება. როგორც ბევრმა მანქანური სწავლების დეველოპერმა იცის, დამოკიდებულებების მართვა და დაბალდონიანი კოდის წყაროდან აგება შეიძლება იყოს დროის მომხმარებელი და შეცდომების გამომწვევი პროცესი. Kernel Hub მიზნად ისახავს ამის გამარტივებას ოპტიმიზებული გამოთვლითი ბირთვების ცენტრალიზებული საცავის შეთავაზებით, რომელთა მარტივად ჩატვირთვა და გაშვებაა შესაძლებელი. დაუთმეთ მეტი დრო შესანიშნავი მოდელების შექმნას და ნაკლები დრო build სისტემებთან ბრძოლას! Kernel Hub-ის გამოყენება მარტივია. `kernels` ბიბლიოთეკა უზრუნველყოფს მთავარ ინტერფეისს. აქ მოცემულია მოკლე მაგალითი, რომელიც ტვირთავს ოპტიმიზებულ GELU აქტივაციის ფუნქციის ბირთვს. (მოგვიანებით, ჩვენ ვნახავთ კიდევ ერთ მაგალითს იმის შესახებ, თუ როგორ უნდა მოვახდინოთ ბირთვის ინტეგრირება ჩვენს მოდელში). ფაილი: `activation_validation_example.py` (შენიშვნა: თუ uv გაქვთ დაინსტალირებული, შეგიძლიათ შეინახოთ ეს სკრიპტი, როგორც `script.py` და გაუშვათ `uv run script.py`, რათა ავტომატურად გაუმკლავდეთ დამოკიდებულებებს.) ეს მარტივი მაგალითი გვიჩვენებს, თუ რამდენად ადვილად შეგიძლიათ მოიძიოთ და შეასრულოთ მაღალოპტიმიზებული კოდი. ახლა განვიხილოთ უფრო პრაქტიკული ინტეგრაცია RMS ნორმალიზაციის გამოყენებით. მოდით, ოპტიმიზებული RMS ნორმალიზაციის ბირთვი ინტეგრირება მოვახდინოთ საბაზისო მოდელში. ჩვენ გამოვიყენებთ LlamaRMSNorm-ის იმპლემენტაციას, რომელიც მოწოდებულია `kernels-community/triton-layer-norm` საცავში (შენიშვნა: ეს რეპოზიტორია შეიცავს სხვადასხვა ნორმალიზაციის ბირთვებს) და შევადარებთ მას RMSNorm-ის PyTorch-ის საბაზისო იმპლემენტაციას. პირველ რიგში, განვსაზღვროთ მარტივი RMSNorm მოდული PyTorch-ში და საბაზისო მოდელი მისი გამოყენებით: ფაილი: `rmsnorm_baseline.py` ახლა კი შევქმნათ ვერსია LlamaRMSNorm ბირთვის გამოყენებით, რომელიც ჩატვირთულია `kernels`-ის საშუალებით. ფაილი: `rmsnorm_kernel.py` მნიშვნელოვანი შენიშვნები KernelModel-ზე: რამდენად სწრაფია ოპტიმიზებული Triton RMSNorm ბირთვი სტანდარტულ PyTorch ვერსიასთან შედარებით? მოდით, შევაფასოთ forward pass, რათა გავარკვიოთ. ფაილი: `rmsnorm_benchmark.py` მოსალოდნელი შედეგი: LayerNorm-ის მსგავსად, Triton-ის გამოყენებით კარგად მორგებულ RMSNorm-ის იმპლემენტაციას შეუძლია მნიშვნელოვანი აჩქარება მოგვცეს PyTorch-ის ნაგულისხმევი ვერსიის წინააღმდეგ — განსაკუთრებით მეხსიერებით შეზღუდული დატვირთვებისთვის თავსებად აპარატურაზე (მაგ. NVIDIA Ampere ან Hopper GPU-ები) და დაბალი სიზუსტის ტიპებით, როგორიცაა float16 ან bfloat16. გაითვალისწინეთ: რეალური შედეგები დამოკიდებული იქნება თქვენს აპარატურაზე და კონკრეტული ბირთვის იმპლემენტაციაზე. აქ მოცემულია მაგალითი იმისა, რასაც შეიძლება ნახოთ (L4 GPU-ზე). `kernels` ბიბლიოთეკა ჯერ კიდევ იზრდება, მაგრამ უკვე გამოიყენება სხვადასხვა რეალურ პროექტში, მათ შორის: თქვენ ნახეთ, რამდენად ადვილია ოპტიმიზებული ბირთვების მოძიება და გამოყენება Hugging Face Kernel Hub-ის საშუალებით. მზად ხართ თავად სცადოთ? დააინსტალირეთ ბიბლიოთეკა: დარწმუნდით, რომ გაქვთ თავსებადი PyTorch ვერსია და GPU დრაივერი დაინსტალირებული. დაათვალიერეთ Hub: გამოიკვლიეთ ხელმისაწვდომი ბირთვები Hugging Face Hub-ზე „kernels“ ტეგის ქვეშ ან ისეთ ორგანიზაციებში, როგორიცაა `kernels-community`. მოძებნეთ ბირთვები, რომლებიც თქვენს ოპერაციებს შეესაბამება (აქტივაციები, ყურადღება, ნორმალიზაცია, როგორიცაა LayerNorm/RMSNorm და ა.შ.). ექსპერიმენტი: სცადეთ კომპონენტების შეცვლა თქვენს საკუთარ მოდელებში. გამოიყენეთ `get_kernel("user-or-org/kernel-name")`. რაც მთავარია, შეამოწმეთ ჩატვირთული ბირთვის ობიექტი (მაგ. `print(dir(loaded_kernel)))` ან შეამოწმეთ მისი Hub-ის საცავის დოკუმენტაცია, რათა გაიგოთ, როგორ სწორად გამოიძახოთ მისი ფუნქციები/მეთოდები და რა პარამეტრებს (წონა, გადახრა, შეყვანა, ეფსილონი) მოელის იგი. ბენჩმარკი...