კოდის გენერაციის მოდელის წვრთნის დეტალები: Python-ის მაგალითზე
სტატია დეტალურად აღწერს პითონის კოდის გენერაციის მოდელის შექმნისა და წვრთნის კომპლექსურ პროცესს. ის მოიცავს მონაცემთა მოპოვებას GitHub-იდან, 180 GB-იანი მონაცემთა ნაკრების გაწმენდას დუბლიკატებისაგან Codex-ის ევრისტიკის გამოყენებით (რაც 50 GB-იან გაწმენდილ ნაკრებს იძლევა). შემდეგ აღწერილია სპეციალიზებული ტოკენაიზერის წვრთნა, GPT-2 Large-ზე დაფუძნებული მოდელის ინიციალიზაცია სპეციალური კორექტირებით, და ეფექტიანი სავარჯიშო ციკლის დაყენება 🤗 Accelerate ბიბლიოთეკის გამოყენებით განაწილებული (multi-GPU)
პირველ რიგში, გვჭირდება დიდი სავარჯიშო მონაცემთა ნაკრები. პითონის კოდის გენერაციის მოდელის გაწვრთნის მიზნით, ჩვენ მივიღეთ წვდომა GitHub-ის დანამატზე, რომელიც ხელმისაწვდომია Google-ის BigQuery-ზე და გავფილტრეთ ყველა პითონის ფაილი. შედეგად მივიღეთ 180 GB მოცულობის მონაცემთა ნაკრები, რომელიც მოიცავს 20 მილიონ ფაილს (ხელმისაწვდომია აქ).
საწყისი ექსპერიმენტების შემდეგ აღმოვაჩინეთ, რომ მონაცემთა ნაკრებში არსებული დუბლიკატები მნიშვნელოვნად აუარესებდა მოდელის მუშაობას. მონაცემთა ნაკრების შემდგომი შესწავლისას აღმოვაჩინეთ, რომ: ჩვენი აღმოჩენების შესახებ მეტის გაგება შეგიძლიათ ამ Twitter-ის თრედში. ჩვენ მოვაცილეთ დუბლიკატები და გამოვიყენეთ იგივე გაწმენდის ევრისტიკა, რომელიც Codex-ის ნაშრომშია აღწერილი. Codex არის CoPilot-ის უკან მდგარი მოდელი და წარმოადგენს GPT-3 მოდელს, რომელიც გაწვრთნილია GitHub-ის კოდზე. გაწმენდილი მონაცემთა ნაკრები კვლავ 50GB მოცულობისაა და ხელმისაწვდომია Hugging Face Hub-ზე: codeparrot-clean.
ამ მონაცემებით შეგვიძლია ახალი ტოკენაიზერის დაყენება და მოდელის გაწვრთნა. პირველ რიგში, გვჭირდება ტოკენაიზერი. მოდით, გავწვრთნათ ის კონკრეტულად კოდზე, რათა კარგად დაყოს კოდის ტოკენები. შეგვიძლია ავიღოთ არსებული ტოკენაიზერი (მაგ., GPT-2) და პირდაპირ გავწვრთნათ ის ჩვენს საკუთარ მონაცემთა ნაკრებზე `train_new_from_iterator()` მეთოდის გამოყენებით. შემდეგ ვტვირთავთ მას Hub-ზე. გაითვალისწინეთ, რომ კოდის მაგალითებიდან გამოვტოვეთ იმპორტები, არგუმენტების პარსინგი და ლოგირება, რათა კოდის ბლოკები კომპაქტური ყოფილიყო. სრულ კოდს, წინასწარი დამუშავებისა და შემდგომი ამოცანების შეფასების ჩათვლით, იპოვით აქ. მეტი შეიტყვეთ ტოკენაიზერებისა და მათი შექმნის შესახებ Hugging Face-ის კურსზე.
ხედავთ იმ შეუმჩნეველ არგუმენტს `streaming=True`? ამ პატარა ცვლილებას დიდი გავლენა აქვს: მთელი (50GB) მონაცემთა ნაკრების ჩამოტვირთვის ნაცვლად, ის საჭიროებისამებრ მოახდენს ცალკეული ნიმუშების ნაკადურ გადაცემას (streaming), რაც ბევრ დისკის ადგილს დაზოგავს! ნაკადური გადაცემის შესახებ მეტი ინფორმაციისთვის ეწვიეთ Hugging Face-ის კურსს.
ახლა ვაინიციალიზებთ ახალ მოდელს. გამოვიყენებთ GPT-2 large-ის (1.5 მილიარდი პარამეტრი) იგივე ჰიპერპარამეტრებს და დავაკორექტირებთ embedding ფენას ჩვენს ახალ ტოკენაიზერზე მოსარგებად, ასევე დავამატებთ სტაბილურობის გასაუმჯობესებელ რამდენიმე ცვლილებას. `scale_attn_by_layer_idx` დროშა უზრუნველყოფს ყურადღების (attention) მასშტაბირებას ფენის ID-ის მიხედვით, ხოლო `reorder_and_upcast_attn` ძირითადად უზრუნველყოფს ყურადღების გამოთვლას სრული სიზუსტით, რათა თავიდან ავიცილოთ რიცხვითი პრობლემები. ახლად ინიციალიზებულ მოდელს ვტვირთავთ იმავე რეპოზიტორიუმში, სადაც ტოკენაიზერია.
მას შემდეგ, რაც გვექნება ეფექტიანი ტოკენაიზერი და ახლად ინიციალიზებული მოდელი, შეგვიძლია დავიწყოთ რეალური წვრთნის ციკლი. ჩვენ ვწვრთნით 🤗 Accelerate ბიბლიოთეკის გამოყენებით, რომელიც საშუალებას გვაძლევს წვრთნა ჩვენი ლეპტოპიდან მრავალ-GPU მანქანაზე გადავიტანოთ ერთი ხაზის შეუცვლელად. ჩვენ უბრალოდ ვქმნით აქსელერატორს და ვასრულებთ არგუმენტების მოწესრიგებას: ახლა მზად ვართ წვრთნისთვის! მოდით, გამოვიყენოთ `huggingface_hub` კლიენტის ბიბლიოთეკა ახალი ტოკენაიზერისა და მოდელის შემცველი რეპოზიტორიუმის დასაკლონირებლად. ამ ექსპერიმენტისთვის ახალ ბრანჩზე გადავალთ. ამ დაყენებით, შეგვიძლია მრავალი ექსპერიმენტის პარალელურად გაშვება და ბოლოს საუკეთესოს მთავარ ბრანჩში გაერთიანება. ტოკენაიზერისა და მოდელის უშუალოდ ლოკალური რეპოზიტორიუმიდან ჩატვირთვა შეგვიძლია. რადგან დიდ მოდელებთან გვაქვს საქმე, შესაძლოა, მოგვინდეს გრადიენტის შემოწმების (gradient checkpointing) ჩართვა, რათა შემცირდეს GPU-ის მეხსიერების გამოყენება წვრთნის დროს.
შემდეგი არის მონაცემთა ნაკრები. წვრთნას ვამარტივებთ მონაცემთა ნაკრებით, რომელიც გვაწვდის მაგალითებს ფიქსირებული კონტექსტის ზომით. ზედმეტი მონაცემების დასაზოგად (ზოგიერთი ნიმუში ძალიან მოკლე ან გრძელია), შეგვიძლია ბევრი მაგალითი EOS ტოკენთან გავაერთიანოთ და შემდეგ დავყოთ ნაწილებად. რაც უფრო მეტ თანმიმდევრობას ვამზადებთ ერთად, მით უფრო მცირეა ტოკენების წილი, რომლებსაც უარვყოფთ (წინა სურათზე ნაცრისფერი). რადგან გვინდა მონაცემთა ნაკრების ნაკადური გადაცემა, იმის ნაცვლად, რომ ყველაფერი წინასწარ მოვამზადოთ, ვიყენებთ `IterableDataset`-ს. მონაცემთა ნაკრების სრული კლასი ასე გამოიყურება: ბუფერში არსებული ტექსტები პარალელურად ტოკენიზდება და შემდეგ ერთიანდება. დანაწევრებული ნიმუშები მიეწოდება მანამ, სანამ ბუფერი არ დაიცლება და პროცესი კვლავ არ დაიწყება. თუ `infinite=True` დავაყენებთ, მონაცემთა ნაკრების იტერატორი თავიდან დაიწყებს ბოლოდან.
წვრთნის დაწყებამდე უნდა დავაყენოთ ოპტიმიზატორი და სწავლის ტემპის განრიგი. არ გვინდა წონის დაშლის (weight decay) გამოყენება biases-სა და LayerNorm წონებზე, ამიტომ ვიყენებთ დამხმარე ფუნქციას მათ გამოსარიცხად. დიდი კითხვა, რომელიც რჩება, არის ის, თუ როგორ განაწილდება ყველა მონაცემი და მოდელი რამდენიმე GPU-ზე. ეს რთულ ამოცანად ჟღერს, მაგრამ სინამდვილეში მხოლოდ ერთი ხაზი კოდი სჭირდება 🤗 Accelerate-ის გამოყენებით. შიდა მხარეზე ის გამოიყენებს `DistributedDataParallel`-ს, რაც ნიშნავს, რომ ერთი batch იგზავნება თითოეულ GPU-მუშაკთან, რომელსაც აქვს მოდელის საკუთარი ასლი. იქ გამოითვლება გრადიენტები და შემდეგ ხდება მათი აგრეგირება მოდელის გასაახლებლად თითოეულ მუშაკზე.
ასევე, გვინდა მოდელის პერიოდული შეფასება ვალიდაციის ნაკრებზე, ასე რომ, დავწეროთ ფუნქცია სწორედ ამისთვის. ეს ავტომატურად ხდება განაწილებული ფორმით და ჩვენ უბრალოდ უნდა შევაგროვოთ ყველა დანაკარგი (losses) მუშაკებიდან. ასევე გვინდა მოვახსენოთ perplexity-ის შესახებ. ახლა მზად ვართ დავწეროთ მთავარი სავარჯიშო ციკლი. ის ძალიან ჰგავს ჩვეულებრივ PyTorch სავარჯიშო ციკლს. აქა-იქ ნახავთ, რომ ვიყენებთ ამაჩქარებლის (accelerator) ფუნქციებს მშობლიური PyTorch-ის ნაცვლად. ასევე, ყოველი შეფასების შემდეგ მოდელს ვტვირთავთ ბრანჩზე. როდესაც ვიძახებთ `wait_for_everyone()` და `unwrap_model()` ფუნქციებს, ვრწმუნდებით, რომ ყველა მუშაკი მზად არის და მოდელის ნებისმიერი ფენა, რომელიც იყო...
წყარო: huggingface.co
AI-ით გადამუშავებული
მსგავსი სტატიები
ხელოვნური ინტელექტი
Anthropic-ის Claude-ის აღზევება Apple App Store-ის რეიტინგებში პენტაგონთან მოლაპარაკებების ფონზე
ხელოვნური ინტელექტი
ტრამპის ადმინისტრაცია Anthropic-ს სანქციებს უწესებს ხელოვნური ინტელექტის გამოყენებაზე უარის გამო: ექსპერტი ინდუსტრიის უსაფრთხოების ხარვეზებზე საუბრობს
ხელოვნური ინტელექტი