ანდრეი კარპატის nanoGPT-ით შთაგონებულებმა, ჩვენ შევქმენით მსგავსი პროექტი ვიზუალური სფეროსთვის. არსებითად, nanoVLM არის ხელსაწყოების ნაკრები, რომელიც გეხმარებათ ააწყოთ და გაავარჯიშოთ მოდელი, რომელსაც შეუძლია როგორც გამოსახულებების, ისე ტექსტის გაგება, შემდეგ კი ამის საფუძველზე ტექსტის გენერირება. nanoVLM-ის სილამაზე მის სიმარტივეშია. მთელი კოდის ბაზა განზრახ არის შენარჩუნებული მინიმალისტურად და იოლად წასაკითხად, რაც მას იდეალურს ხდის დამწყებთათვის ან მათთვის, ვისაც სურს გაეცნოს VLM-ების შიდა მუშაობას გადატვირთვის გარეშე. ამ ბლოგპოსტში ჩვენ განვიხილავთ პროექტის ძირითად იდეებს და გთავაზობთ რეპოზიტორთან ურთიერთქმედების მარტივ გზას. ჩვენ არა მხოლოდ დეტალურად განვიხილავთ პროექტს, არამედ ყველაფერს ისე ვაფუთებთ, რომ სწრაფად შეძლოთ მუშაობის დაწყება. შეგიძლიათ დაიწყოთ Vision Language Model-ის ავარჯიშება ჩვენი nanoVLM ხელსაწყოების ნაკრების გამოყენებით შემდეგი ნაბიჯებით: აქ არის Colab ნოუთბუქი, რომელიც დაგეხმარებათ ტრენინგის დაწყებაში ადგილობრივი დაყენების გარეშე! როგორც სახელი გვთავაზობს, Vision Language Model (VLM) არის მულტიმოდალური მოდელი, რომელიც ამუშავებს ორ მოდალობას: ხედვასა და ტექსტს. ეს მოდელები, როგორც წესი, იღებენ სურათებს და/ან ტექსტს შეყვანად და გენერირებენ ტექსტს გამოსავლად. ტექსტის (გამოსავლის) გენერირება სურათებისა და ტექსტების (შეყვანების) გაგებაზე დაყრდნობით არის მძლავრი პარადიგმა. ის იძლევა აპლიკაციების ფართო სპექტრის საშუალებას, დაწყებული სურათების წარწერებითა და ობიექტების ამოცნობით, დამთავრებული ვიზუალური კონტენტის შესახებ კითხვებზე პასუხის გაცემით (როგორც მოცემულია ქვემოთ მოცემულ ცხრილში). აღსანიშნავია, რომ nanoVLM ფოკუსირებულია მხოლოდ ვიზუალურ კითხვა-პასუხზე (Visual Question Answering), როგორც ტრენინგის მიზანზე. თუ დაინტერესებული ხართ VLM-ების შესახებ მეტის გაგებით, კატეგორიულად გირჩევთ წაიკითხოთ ჩვენი უახლესი ბლოგპოსტი ამ თემაზე: Vision Language Models (უკეთესი, სწრაფი, ძლიერი). „საუბარი იაფია, მაჩვენე კოდი“ - ლინუს ტორვალდსი. ამ სექციაში ჩვენ გაგიძღვებით კოდის ბაზაში. სასარგებლოა ცალკე ჩანართის ღიად დატოვება მითითებისთვის, როდესაც მიჰყვებით. ქვემოთ მოცემულია ჩვენი რეპოზიტორის ფაილების სტრუქტურა. ჩვენ ამოვიღეთ დამხმარე ფაილები მოკლედობისთვის. ჩვენ nanoVLM შევქმენით ორი ცნობილი და ფართოდ გამოყენებადი არქიტექტურის მიხედვით. ჩვენი ვიზუალური "ხერხემალი" (vision backbone) (models/vision_transformer.py) არის სტანდარტული vision transformer, უფრო კონკრეტულად კი Google-ის SigLIP vision encoder. ჩვენი ენობრივი "ხერხემალი" (language backbone) მიჰყვება Llama 3-ის არქიტექტურას. ვიზუალური და ტექსტური მოდალობები თანხვედრაშია მოყვანილი Modality Projection მოდულის გამოყენებით. ეს მოდული იღებს სურათის ჩანართებს (embeddings), რომლებიც წარმოიქმნება ვიზუალური ხერხემალიდან, როგორც შეყვანას და გარდაქმნის მათ ენობრივი მოდელის ჩანართების ფენიდან მიღებულ ტექსტურ ჩანართებთან თავსებად ჩანართებად. ეს ჩანართები შემდეგ ერთიანდება და გადაეცემა ენობრივ დეკოდერს. Modality Projection მოდული შედგება პიქსელების გადარევის (pixel shuffle) ოპერაციისგან, რასაც მოსდევს წრფივი ფენა (linear layer). პიქსელების გადარევა ამცირებს სურათის ტოკენების რაოდენობას, რაც ხელს უწყობს გამოთვლითი ხარჯების შემცირებას და აჩქარებს ტრენინგს, განსაკუთრებით ტრანსფორმატორზე დაფუძნებული ენობრივი დეკოდერებისთვის, რომლებიც მგრძნობიარეა შეყვანის სიგრძის მიმართ. ქვემოთ მოცემული სურათი ასახავს კონცეფციას. ყველა ფაილი ძალიან მსუბუქი და კარგად დოკუმენტირებულია. ჩვენ გირჩევთ, ინდივიდუალურად გადახედოთ მათ, რათა უკეთ გაიგოთ იმპლემენტაციის დეტალები (models/xxx.py). ტრენინგის დროს ჩვენ ვიყენებთ შემდეგ წინასწარ გაწვრთნილ "ხერხემალი" წონებს: ასევე შესაძლებელია "ხერხემლების" შეცვლა SigLIP/SigLIP 2-ის (ვიზუალური ხერხემლისთვის) და SmolLM2-ის (ენობრივი ხერხემლისთვის) სხვა ვარიანტებით. ახლა, როცა არქიტექტურას გავეცანით, მოდით გადავიდეთ იმაზე, თუ როგორ გავავარჯიშოთ თქვენი საკუთარი Vision Language Model train.py-ის გამოყენებით. ტრენინგის დაწყება შეგიძლიათ შემდეგნაირად: ეს სკრიპტი თქვენი ერთადერთი საშუალებაა მთელი ტრენინგის პროცესისთვის, მათ შორის: კონფიგურაცია. უპირველეს ყოვლისა, სკრიპტი იტვირთება ორ კონფიგურაციის კლასს models/config.py-დან. მონაცემთა ჩატვირთვა. მონაცემთა პროცესის გულში დგას get_dataloaders ფუნქცია. ის: სასარგებლო დროშა აქ არის data_cutoff_idx, რომელიც გამოსადეგია მცირე ქვეჯგუფებზე გამართვისთვის. მოდელის ინიციალიზაცია. მოდელი აგებულია VisionLanguageModel კლასის მეშვეობით. თუ აღადგენთ ჩეკპოინტიდან, ეს ისეთივე მარტივია, როგორც: წინააღმდეგ შემთხვევაში, თქვენ მიიღებთ ახლად ინიციალიზებულ მოდელს, სურვილისამებრ წინასწარ ჩატვირთული "ხერხემლებით" როგორც ხედვისთვის, ასევე ენისთვის. ოპტიმიზატორის დაყენება: ორი სწავლის სიჩქარე (LR). იმის გამო, რომ მოდალობის პროექტორი (MP) ახლად ინიციალიზებულია, ხოლო "ხერხემლები" წინასწარ გაწვრთნილია, ოპტიმიზატორი იყოფა ორ პარამეტრულ ჯგუფად, თითოეულს თავისი სწავლის სიჩქარე აქვს: ეს ბალანსი უზრუნველყოფს MP-ის სწრაფად სწავლას, ხოლო ცოდნის შენარჩუნებას ვიზუალურ და ენობრივ "ხერხემლებში". ტრენინგის ციკლი. ეს ნაწილი საკმაოდ სტანდარტულია, მაგრამ გააზრებულად არის სტრუქტურირებული: ყოველ 250 ნაბიჯში (კონფიგურირებადი), მოდელი ფასდება ვალიდაციის და MMStar ტესტის მონაცემთა ნაკრებებზე. თუ სიზუსტე უმჯობესდება, მოდელი აღინიშნება ჩეკპოინტით. ჟურნალირება და მონიტორინგი. თუ log_wandb ჩართულია, ტრენინგის სტატისტიკა, როგორიცაა batch_loss, val_loss, accuracy და tokens_per_second, აღირიცხება Weights & Biases-ში რეალურ დროში თვალთვალისთვის. გაშვებები ავტომატურად სახელდება მეტამონაცემების გამოყენებით, როგორიცაა ნიმუშის ზომა, ბატჩის ზომა, ეპოქების რაოდენობა, სწავლის სიჩქარეები და თარიღი, ყველა ამას ამუშავებს დამხმარე ფუნქცია get_run_name. მოდელის "ჰაბზე" ატვირთვა. გამოიყენეთ შემდეგი, რათა ატვირთოთ გაწვრთნილი მოდელი "ჰაბზე", რათა სხვებმა იპოვონ და გამოსცადონ: შეგიძლიათ მარტივად ატვირთოთ.