ღრმა სწავლების (Deep Learning) მოდელების მუშაობის გაუმჯობესება ხშირად ქაოსურ პროცესს ჰგავს. სპეციალისტები ხშირად იყენებენ შემთხვევით რჩევებს, როგორიცაა კონკრეტული ბიბლიოთეკების ვერსიების მონაცვლეობა ან კოდის მცირე ცვლილებები. თუმცა, რეალური შედეგის მისაღწევად საჭიროა სისტემური მიდგომა.

სისტემური შეზღუდვების სამი კომპონენტი

ნებისმიერი სათამაშო თუ სამუშაო სისტემა, რომელიც Deep Learning-ს იყენებს, სამ ძირითად კომპონენტზეა დამოკიდებული: გამოთვლითი სიმძლავრე (compute), მეხსიერების გამტარუნარიანობა (memory bandwidth) და სისტემური ზედნადები ხარჯები (overhead).

თუ თქვენი სისტემა მეხსიერების გამტარუნარიანობის ლიმიტშია, GPU-ს გამოთვლითი სიმძლავრის გაზრდა შედეგს არ მოიტანს. ანალოგიურად, თუ პრობლემა გამოთვლებს უკავშირდება, კოდის C++-ზე გადაწერა ზედმეტი გარჯა იქნება.

როგორ მუშაობს „ქარხნის“ მოდელი?

წარმოიდგინეთ პროცესი, როგორც ქარხანა. გამოთვლითი ბირთვები (Tensor Cores) არის დანადგარები, ხოლო მეხსიერება არის საწყობი. მონაცემების საწყობიდან დანადგარებთან გადატანა მოითხოვს დროსა და რესურსს. ეს არის მეხსიერების გამტარუნარიანობის ხარჯი.

თანამედროვე GPU-ები ოპტიმიზებულია მატრიცული გამრავლებისთვის (matmuls). სხვა ოპერაციები, როგორიცაა გააქტიურების ფუნქციები ან ნორმალიზაცია, ხშირად მატრიცულ გამრავლებებზე ასობითჯერ ნელა სრულდება. ისინი ქმნიან ე.წ. „bottleneck“-ს, რადგან დროის უმეტეს ნაწილს მონაცემების გადაზიდვაზე ხარჯავენ.

ოპერატორების ფუზია (Operator Fusion)

ყველაზე ეფექტური მეთოდი ამ პრობლემის გადასაჭრელად არის ოპერატორების ფუზია. ნაცვლად იმისა, რომ თითოეული ოპერაცია ცალ-ცალკე შევასრულოთ და მონაცემები მუდმივად გლობალურ მეხსიერებაში (DRAM) დავაბრუნოთ, ჩვენ ვაერთიანებთ მათ ერთ ჯაჭვად.

  • შემცირებული წვდომა: მონაცემები რჩება ჩიპზე, რაც ამცირებს DRAM-თან მიმართვების რაოდენობას.
  • სიჩქარე: ოპერაციების გაერთიანებით შესაძლებელია მუშაობის ორჯერ ან მეტჯერ დაჩქარება.

ეს მიდგომა მოითხოვს კომპილატორის დონეზე ჩარევას, რადგან მოდელმა წინასწარ უნდა იცოდეს, თუ რა ოპერაცია მოჰყვება მომდევნო ეტაპზე. ამიტომ, PyTorch-ის მსგავსი სისტემების „eager mode“-ში ამის განხორციელება რთულია.