მკვლევარებში დიდი ტრანსფორმერული მოდელების წინა-წვრთნის კიდევ ერთი პოპულარული ინსტრუმენტია Megatron-LM, მძლავრი ფრეიმვორკი, რომელიც NVIDIA-ს Applied Deep Learning Research გუნდის მიერ არის შემუშავებული. accelerate-ისგან და Trainer-ისგან განსხვავებით, Megatron-LM-ის გამოყენება არც თუ ისე მარტივია და დამწყებთათვის შეიძლება ცოტა დამაბნეველიც კი იყოს. თუმცა, ის უაღრესად ოპტიმიზებულია GPU-ებზე წვრთნისთვის და შეუძლია მნიშვნელოვანი აჩქარება უზრუნველყოს. ამ ბლოგპოსტში შეიტყობთ, თუ როგორ უნდა ავარჯიშოთ ენობრივი მოდელი NVIDIA GPU-ებზე Megatron-LM-ში და გამოიყენოთ ის ტრანსფორმერებთან ერთად. ჩვენ ვეცდებით დეტალურად განვიხილოთ GPT2 მოდელის წვრთნის სხვადასხვა ნაბიჯები ამ ფრეიმვორკში, რაც მოიცავს: წვრთნის დეტალებში ჩაღრმავებამდე, მოდით, ჯერ გავიგოთ, რა ხდის ამ ფრეიმვორკს უფრო ეფექტურს, ვიდრე სხვები. ეს სექცია შთაგონებულია ამ შესანიშნავი ბლოგით BLOOM-ის წვრთნის შესახებ Megatron-DeepSpeed-ის გამოყენებით; გთხოვთ, მიმართოთ მას დამატებითი დეტალებისთვის, რადგან ეს ბლოგი Megatron-LM-ის ნაზ შესავალს ისახავს მიზნად. Megatron-LM აღჭურვილია ეფექტური DataLoader-ით (მონაცემთა ჩამტვირთავი), სადაც მონაცემები ტოკენიზდება და ირევა წვრთნამდე. ის ასევე ყოფს მონაცემებს დანომრილ მიმდევრობებად ინდექსებით, რომლებიც ისე ინახება, რომ მათი გამოთვლა მხოლოდ ერთხელ არის საჭირო. ინდექსის შესაქმნელად, ეპოქების რაოდენობა გამოითვლება წვრთნის პარამეტრების საფუძველზე და იქმნება და შემდეგ ირევა თანმიმდევრობა. ეს განსხვავდება შემთხვევების უმეტესობისგან, სადაც ჩვენ ვიმეორებთ მთელ მონაცემთა ნაკრებს, სანამ ის არ ამოიწურება და შემდეგ ვიმეორებთ მეორე ეპოქისთვის. ეს არბილებს სწავლის მრუდს და ზოგავს დროს წვრთნის განმავლობაში. როდესაც გამოთვლა ხორციელდება GPU-ზე, საჭირო მონაცემები იღება მეხსიერებიდან, შემდეგ ხდება გამოთვლა და შედეგი ისევ მეხსიერებაში ინახება. მარტივად რომ ვთქვათ, „შერწყმული ბირთვების“ (fused kernels) იდეა მდგომარეობს იმაში, რომ მსგავსი ოპერაციები, რომლებიც ჩვეულებრივ Pytorch-ის მიერ ცალ-ცალკე სრულდება, გაერთიანებულია ერთ აპარატურულ ოპერაციაში. ამრიგად, ისინი ამცირებენ მეხსიერების გადაადგილების რაოდენობას, რომელიც მრავალ ცალკეულ გამოთვლაში ხორციელდება, მათ ერთში შერწყმით. ქვემოთ მოცემული ფიგურა ასახავს Kernel Fusion-ის იდეას. ის შთაგონებულია ამ ნაშრომიდან, სადაც კონცეფცია დეტალურად არის განხილული. როდესაც f, g და h შერწყმულია ერთ ბირთვში, f-ისა და g-ის შუალედური შედეგები x’ და y’ ინახება GPU რეგისტრებში და დაუყოვნებლივ გამოიყენება h-ის მიერ. შერწყმის გარეშე კი, x’ და y’ უნდა გადაკოპირდეს მეხსიერებაში და შემდეგ ჩაიტვირთოს h-ის მიერ. ამიტომ, Kernel Fusion მნიშვნელოვნად აჩქარებს გამოთვლებს. Megatron-LM ასევე იყენებს AdamW-ის შერწყმულ (Fused) იმპლემენტაციას Apex-დან, რომელიც უფრო სწრაფია, ვიდრე Pytorch-ის იმპლემენტაცია. მიუხედავად იმისა, რომ შესაძლებელია DataLoader-ის მორგება Megatron-LM-ის მსგავსად და Apex-ის Fused ოპტიმიზატორის გამოყენება ტრანსფორმერებთან ერთად, საბაჟო Fused CUDA Kernels-ის აგება დამწყებთათვის მარტივი საქმე არ არის. ახლა, როცა გაეცანით ფრეიმვორკს და მის უპირატესობებს, მოდით, გადავიდეთ წვრთნის დეტალებზე! გარემოს დაყენების უმარტივესი გზაა NVIDIA PyTorch Container-ის გადმოწერა NGC-დან, რომელიც მოყვება ყველა საჭირო ინსტალაციას. დამატებითი დეტალებისთვის იხილეთ დოკუმენტაცია. თუ არ გსურთ ამ კონტეინერის გამოყენება, დაგჭირდებათ უახლესი pytorch, cuda, nccl და NVIDIA APEX გამოშვებების, ასევე nltk ბიბლიოთეკის დაყენება. ასე რომ, Docker-ის დაყენების შემდეგ, შეგიძლიათ გაუშვათ კონტეინერი შემდეგი ბრძანებით (xx.xx აღნიშნავს თქვენს Docker-ის ვერსიას), და შემდეგ მასში Megatron-LM რეპოზიტორიის კლონირება: ასევე უნდა დაამატოთ თქვენი ტოკენაიზერის ლექსიკონის ფაილი vocab.json და შერწყმის ცხრილი merges.txt კონტეინერის Megatron-LM საქაღალდეში. ეს ფაილები შეგიძლიათ იპოვოთ მოდელის რეპოზიტორიაში წონებთან ერთად; იხილეთ ეს რეპოზიტორია GPT2-ისთვის. ასევე შეგიძლიათ ავარჯიშოთ თქვენი საკუთარი ტოკენაიზერი ტრანსფორმერების გამოყენებით. პრაქტიკული მაგალითისთვის შეგიძლიათ იხილოთ CodeParrot პროექტი. ახლა, თუ გსურთ ამ მონაცემების კონტეინერის გარედან კოპირება, შეგიძლიათ გამოიყენოთ შემდეგი ბრძანებები: ამ სახელმძღვანელოს დანარჩენ ნაწილში ჩვენ გამოვიყენებთ CodeParrot მოდელს და მონაცემებს მაგალითად. წვრთნის მონაცემები მოითხოვს წინასწარ დამუშავებას. პირველ რიგში, ის უნდა გადაიყვანოთ თავისუფალი JSON ფორმატში, სადაც ერთი JSON სტრიქონი შეიცავს ერთ ტექსტურ ნიმუშს. თუ იყენებთ 🤗 Datasets-ს, აი მაგალითი, თუ როგორ უნდა გააკეთოთ ეს (ყოველთვის Megatron-LM საქაღალდეში): მონაცემები შემდეგ ტოკენიზდება, ირევა და მუშავდება ბინარულ ფორმატში წვრთნისთვის შემდეგი ბრძანების გამოყენებით: workers და chunk_size ოფციები ეხება წინასწარი დამუშავებისას გამოყენებული მუშაკების რაოდენობას და თითოეულზე მინიჭებული მონაცემების ბლოკის ზომას. dataset-impl ეხება ინდექსირებული მონაცემთა ნაკრების იმპლემენტაციის რეჟიმს ['lazy', 'cached', 'mmap'] სიიდან. ეს გამოაქვს ორ ფაილს: codeparrot_content_document.idx და codeparrot_content_document.bin, რომლებიც გამოიყენება წვრთნაში. შეგიძლიათ დააკონფიგურიროთ მოდელის არქიტექტურა და წვრთნის პარამეტრები, როგორც ნაჩვენებია ქვემოთ, ან განათავსოთ იგი bash სკრიპტში, რომელსაც გაუშვებთ. ეს ბრძანება ახორციელებს წინა-წვრთნას 8 GPU-ზე 110 მილიონი პარამეტრის მქონე CodeParrot მოდელისთვის. გაითვალისწინეთ, რომ მონაცემები ნაგულისხმევად დაყოფილია 969:30:1 თანაფარდობით წვრთნის/ვალიდაციის/ტესტირების ნაკრებებისთვის. ამ პარამეტრით, წვრთნა დაახლოებით 12 საათს გრძელდება. ეს კონფიგურაცია იყენებს მონაცემთა პარალელიზმს (Data Parallelism), მაგრამ ასევე შესაძლებელია მოდელის პარალელიზმის (Model Parallelism) გამოყენებაც.