RAG-ის მიმოხილვა RAG (Retrieval Augmented Generation) არის მოდელი, რომელიც თავისი მუშაობის პროცესში იღებს კონტექსტურ დოკუმენტებს გარე მონაცემთა ნაკრებიდან. ეს კონტექსტური დოკუმენტები გამოიყენება საწყის შეტანილ ინფორმაციასთან ერთად გამოსავლის გენერირებისთვის. (GIF აღებულია Facebook-ის ორიგინალური ბლოგ-პოსტიდან). ცოტა ხნის წინ, Huggingface-მა Facebook AI-სთან თანამშრომლობით RAG მოდელი თავისი Transformers ბიბლიოთეკის ნაწილად წარმოადგინა. RAG ისევე მუშაობს, როგორც ნებისმიერი სხვა seq2seq მოდელი. თუმცა, RAG-ს აქვს შუალედური კომპონენტი, რომელიც იღებს კონტექსტურ დოკუმენტებს გარე ცოდნის ბაზიდან (მაგალითად, ვიკიპედიის ტექსტური კორპუსი). ეს დოკუმენტები შემდეგ გამოიყენება შეტანილ თანმიმდევრობასთან ერთად და გადაეცემა ძირითად seq2seq გენერატორს. ინფორმაციის მოძიების ეს ნაბიჯი RAG-ს საშუალებას აძლევს გამოიყენოს ცოდნის მრავალი წყარო — როგორც ის, რაც მოდელის პარამეტრებშია ჩაშენებული, ასევე ის ინფორმაცია, რომელიც კონტექსტურ პასაჟებშია მოცემული, რაც მას საშუალებას აძლევს, უკეთესი შედეგები აჩვენოს ხელოვნური ინტელექტის თანამედროვე მოდელებთან შედარებით ისეთ ამოცანებში, როგორიცაა კითხვა-პასუხი. მომხმარებლებს შეუძლიათ მისი გამოცდა Huggingface-ის მიერ შემოთავაზებული დემოს მეშვეობით! კონტექსტური დოკუმენტების ეს მოძიება გადამწყვეტია RAG-ის უახლესი შედეგებისთვის, თუმცა დამატებით სირთულეებსაც ქმნის. მონაცემთა პარალელური სწავლების რუტინით სწავლების პროცესის მასშტაბირებისას, დოკუმენტის ძიების მარტივმა იმპლემენტაციამ შესაძლოა სწავლების პროცესი შეაფერხოს (გახდეს „ბოთლნექი“). გარდა ამისა, მოძიების კომპონენტში გამოყენებული დოკუმენტის ინდექსი ხშირად საკმაოდ დიდია, რაც შეუძლებელს ხდის თითოეული სწავლების მუშაკისთვის ინდექსის საკუთარი რეპლიცირებული ასლის ჩატვირთვას. RAG-ის წინა დაზუსტებული კონფიგურაციის (fine-tuning) იმპლემენტაცია იყენებდა torch.distributed საკომუნიკაციო პაკეტს დოკუმენტების მოძიების ნაწილისთვის. თუმცა, ეს იმპლემენტაცია ზოგჯერ მოუქნელი და მასშტაბირებადობის თვალსაზრისით შეზღუდული აღმოჩნდა. ამის ნაცვლად, საჭიროა ჩარჩოებისგან დამოუკიდებელი და უფრო მოქნილი იმპლემენტაცია ad-hoc კონკურენტული პროგრამირებისთვის. Ray იდეალურად ჯდება ამ მოთხოვნებში. Ray არის მარტივი, მაგრამ მძლავრი Python ბიბლიოთეკა ზოგადი დანიშნულების განაწილებული და პარალელური პროგრამირებისთვის. Ray-ის გამოყენებით განაწილებული დოკუმენტების მოძიებისთვის, ჩვენ მივაღწიეთ 2-ჯერ გაუმჯობესებულ სიჩქარეს თითოეულ მოძიების გამოძახებაზე torch.distributed-თან შედარებით და მთლიანობაში უკეთეს დაზუსტებული კონფიგურაციის მასშტაბირებადობას. დოკუმენტების მოძიება torch.distributed-ის იმპლემენტაციით torch.distributed-ის იმპლემენტაციის მთავარი ნაკლი დოკუმენტების მოძიებისთვის იყო ის, რომ ის უკავშირდებოდა სწავლებისთვის გამოყენებულ იმავე პროცესთა ჯგუფს და მხოლოდ რანგის 0-ის მქონე სწავლების მუშაკს შეეძლო ინდექსის მეხსიერებაში ჩატვირთვა. შედეგად, ამ იმპლემენტაციას ჰქონდა გარკვეული შეზღუდვები. დოკუმენტების მოძიება Ray-ის იმპლემენტაციით ამ შეზღუდვების დასაძლევად, ჩვენ წარმოგიდგინეთ განაწილებული მოძიების ახალი იმპლემენტაცია, რომელიც Ray-ზეა დაფუძნებული. Ray-ის მდგომარეობრივი აქტორის აბსტრაქციების წყალობით, სწავლების პროცესებისგან განცალკევებული მრავალი პროცესი გამოიყენება ინდექსის ჩასატვირთად და მოძიების მოთხოვნების დასამუშავებლად. მრავალი Ray აქტორის გამოყენებით, მოძიება აღარ არის შემაფერხებელი ფაქტორი და PyTorch აღარ არის RAG-ისთვის სავალდებულო მოთხოვნა. როგორც ქვემოთ ხედავთ, Ray-ზე დაფუძნებული იმპლემენტაციის გამოყენება იწვევს მოძიების უკეთეს შესრულებას მრავალი GPU-ს მქონე დაზუსტებული კონფიგურაციისთვის. შემდეგი შედეგები აჩვენებს წამებს თითო მოძიების გამოძახებაზე და ვხედავთ, რომ რაც უფრო მეტ GPU-ს ვიყენებთ სწავლებისთვის, Ray-ს აქვს შედარებით უკეთესი შესრულება torch.distributed-თან შედარებით. ასევე, თუ გავზრდით Ray პროცესების რაოდენობას, რომლებიც მოძიებას ასრულებენ, უკეთეს შესრულებას მივიღებთ უფრო მეტი სწავლების მუშაკით, რადგან ერთი მოძიების პროცესი აღარ არის შემაფერხებელი ფაქტორი. მოძიების სხვადასხვა იმპლემენტაციის შესრულების შედარება დოკუმენტის მოძიების თითოეული იმპლემენტაციისთვის, ჩვენ ვატარებთ 500 სწავლების ნაბიჯს 8-ის ტოლი GPU-ზე თითოეული პაკეტის ზომით და ვზომავთ დროს, რაც სჭირდება კონტექსტური დოკუმენტების მოძიებას თითოეული პაკეტისთვის რანგის 0-ის მქონე სწავლების მუშაკზე. როგორც შედეგები აჩვენებს, მრავალი მოძიების პროცესის გამოყენება აუმჯობესებს შესრულებას, განსაკუთრებით მაშინ, როდესაც სწავლებას მრავალ GPU-ზე ვახორციელებთ. Huggingface გთავაზობთ PyTorch Lightning-ზე დაფუძნებულ დაზუსტებული კონფიგურაციის სკრიპტს და ჩვენ გავაფართოვეთ იგი, რათა დაგვემატებინა Ray მოძიების იმპლემენტაცია, როგორც ერთ-ერთი ვარიანტი. მის გამოსაცდელად, ჯერ დააინსტალირეთ საჭირო მოთხოვნები. შემდეგ, შეგიძლიათ მიუთითოთ თქვენი მონაცემთა გზები და სხვა კონფიგურაციები და გაუშვათ finetune-rag-ray.sh! RAG-ის გამოყენებით Huggingface transformers-თან და Ray-ის მოძიების იმპლემენტაციასთან ერთად უფრო სწრაფი განაწილებული დაზუსტებული კონფიგურაციისთვის, შეგიძლიათ RAG გამოიყენოთ მოძიებაზე დაფუძნებული გენერაციისთვის თქვენს საკუთარ ცოდნის ინტენსიურ ამოცანებში. ასევე, ჰიპერპარამეტრების დარეგულირება (hyperparameter tuning) ტრანსფორმატორების დაზუსტებული კონფიგურაციის კიდევ ერთი ასპექტია და მას სიზუსტეზე დიდი გავლენის მოხდენა შეუძლია. მასშტაბირებადი და მარტივი ჰიპერპარამეტრების დარეგულირებისთვის, გაეცანით Ray Tune ბიბლიოთეკას. Ray Tune-ის PyTorch Lightning-თან ინტეგრაციის, ან Huggingface transformers-თან ჩაშენებული ინტეგრაციის გამოყენებით, შეგიძლიათ ჩაატაროთ ექსპერიმენტები თქვენი RAG მოდელისთვის სრულყოფილი ჰიპერპარამეტრების მოსაძებნად. და ბოლოს, თვალი ადევნეთ RAG-ის პოტენციურ Tensorflow იმპლემენტაციას Huggingface-ზე! თუ გეგმავთ RAG+Ray ინტეგრაციის გამოცდას, თავისუფლად გააზიარეთ თქვენი გამოცდილება Ray Discourse-ზე ან შეუერთდით Ray საზოგადოების Slack-ს შემდგომი განხილვისთვის — ჩვენ სიამოვნებით მოვისმენთ თქვენგან!