Modele językowe o dużej skali (LLM) zrewolucjonizowały wiele dziedzin, w tym rozwój oprogramowania, zwłaszcza w obszarze zadań związanych z kodowaniem. Narzędzia takie jak ChatGPT, Copilot czy Cursor zmieniły sposób pracy programistów, ukazując niezwykły potencjał specjalizowanych modeli językowych do obsługi kodu. Mimo to, stworzenie otwartoźródłowych modeli LLM do kodowania pozostaje wyzwaniem, gdyż ich wydajność wciąż pozostaje w tyle za czołowymi, zamkniętymi rozwiązaniami. Główną przyczyną tej różnicy jest brak dostępu do wysokiej jakości danych szkoleniowych, które są ściśle kontrolowane przez liderów branży. Brak tych zasobów stanowi istotną barierę dla społeczności badawczej, która nie może tworzyć solidnych punktów odniesienia ani lepiej zgłębić mechanizmów działania najlepszych modeli LLM do kodowania.
W przeszłości podejmowane były różne inicjatywy badawcze mające na celu rozwijanie modeli językowych związanych z kodowaniem. Chociaż zamknięte modele osiągały imponujące wyniki w wielu testach, ich ograniczony dostęp hamował innowacje. W odpowiedzi na to, społeczność badawcza stworzyła otwartoźródłowe alternatywy, takie jak CodeGen, StarCoder czy CodeLlama, przyczyniające się do dalszego rozwoju tej dziedziny. Te modele oceniano na różnych testach, w tym w zadaniach związanych z wyszukiwaniem kodu, tłumaczeniami, oceną efektywności i uzupełnianiem kodu w całych repozytoriach. Ostatnio duży nacisk położono na rozwój otwartoźródłowych LLM, a projekty takie jak LLaMA, Mistral czy ChatGLM udostępniają zarówno modele, jak i obszerne zestawy danych szkoleniowych. Warto szczególnie podkreślić inicjatywy takie jak OLMo i StarCoderV2, które oferują pełną dokumentację swoich procesów szkolenia, przepływów danych i punktów kontrolnych, promując tym samym przejrzystość i możliwość odtworzenia wyników.
OpenCoder – Innowacyjne podejście do modeli językowych do kodowania
Naukowcy z INF i M-A-P zaprezentowali projekt OpenCoder, który ma na celu wypełnienie luki w przejrzystości modeli językowych specyficznych dla kodu, poprzez realizację trzech głównych celów. Projekt dąży do zapewnienia badaczom w pełni przejrzystego modelu bazowego, umożliwiającego badania nad interpretowalnością i wzorcami dystrybucji danych, przeprowadzenia kompleksowych analiz metod tworzenia zbiorów danych szkoleniowych oraz umożliwienia dostosowywania rozwiązań dzięki szczegółowym wglądom w proces rozwoju modeli.
Badania wykazują kluczowe decyzje projektowe w zakresie selekcji danych na różnych etapach treningu, podkreślając znaczenie dokładnego czyszczenia danych, skutecznych strategii deduplikacji na poziomie plików oraz uważnego uwzględniania metryk popularności repozytoriów na GitHubie. Ważnym odkryciem było to, że dane o wysokiej jakości stają się coraz bardziej kluczowe w późniejszych fazach szkolenia, a dwustopniowe podejście do strojenia instrukcji okazuje się szczególnie skuteczne w rozwijaniu wszechstronnych umiejętności, a następnie w dopracowywaniu specyficznych dla kodu zdolności.
Dane przedtreningowe
Projekt OpenCoder korzysta z zaawansowanego procesu przetwarzania danych, opartego na zestawie RefineCode, który składa się z 960 miliardów tokenów z 607 języków programowania. Proces przygotowania danych obejmuje pięć kroków, mających na celu zagwarantowanie najwyższej jakości i różnorodności danych. Początkowa faza przetwarzania wyklucza pliki większe niż 8MB i ogranicza wybór do specyficznych rozszerzeń plików języków programowania. Proces deduplikacji wykorzystuje zarówno dokładne, jak i przybliżone metody, aby usunąć duplikaty, jednocześnie zachowując pliki o wyższej liczbie gwiazdek na GitHubie i bardziej aktualnych czasach commitów.
W następnej fazie następuje usunięcie notatek prawnych i redukcja informacji umożliwiających identyfikację osób (PII). Proces filtrowania obejmuje trzy kategorie: filtrowanie treści w języku naturalnym, ogólne filtrowanie kodu oraz filtrowanie specyficzne dla ośmiu głównych języków programowania. Ostatecznie, faza próbkowania danych utrzymuje równowagę w dystrybucji, poprzez redukcję nadmiernie reprezentowanych języków, takich jak Java i HTML, co prowadzi do zestawu danych składającego się z około 730 miliardów tokenów do szkolenia.
Architektura modelu i trening
Architektura OpenCoder obejmuje dwa warianty modelu: model z 1,5 miliarda parametrów oraz model z 8 miliardami parametrów. Wersja 1.5B posiada 24 warstwy, 2240 wymiarów ukrytych i 14 głowic uwagi, natomiast wersja 8B opiera się na architekturze Llama-3.1-8B z 32 warstwami, 4096 wymiarami ukrytymi i 8 głowicami uwagi. Oba modele wykorzystują funkcję aktywacji SwiGLU oraz słownik o wielkości 96 640 elementów.
Model 1.5B przetwarza 2 biliony tokenów w czterech epokach, po czym następuje faza treningu z 100 miliardami dodatkowych tokenów. Model 8B przetwarza 2,5 biliona tokenów w 3,5 epoki, po czym przechodzi do fazy wygaszania, również z 100 miliardami tokenów. Proces treningowy odbywa się na dużych klastrach GPU, przy czym model 1.5B wymaga 28 034 godzin GPU na H800s, a model 8B zużywa 96 000 godzin GPU na H100s.
Post-trening i strojenie
Po zakończeniu podstawowego treningu, OpenCoder przechodzi do fazy strojenia instrukcji, w której wykorzystuje różnorodne źródła danych i metody syntezy. Proces ten zaczyna się od zbierania otwartoźródłowych korpusów instrukcji, takich jak Evol-Instruct czy McEval. Zrealizowano również trzy specjalistyczne podejścia do syntezy instrukcji. Na przykład, synteza instrukcji edukacyjnych polega na generowaniu przypadków testowych, które służą weryfikacji poprawności danych wejściowych.
Model OpenCoder wykorzystuje dwustopniowe podejście do strojenia instrukcji. Pierwszy etap koncentruje się na wiedzy teoretycznej z dziedziny informatyki, natomiast drugi etap kładzie nacisk na praktyczne umiejętności kodowania, wykorzystując zestawy danych z prawdziwymi przykładami kodu z GitHub.
Ocena wydajności
OpenCoder był oceniany na wielu testach, zarówno w wersji bazowej, jak i dostrojonej instrukcyjnie. Modele bazowe przeszły testy związane z uzupełnianiem kodu, takie jak HumanEval, MBPP i BigCodeBench. Wyniki tych testów pokazały, że model radzi sobie doskonale z rozwiązywaniem problemów algorytmicznych i zarządzaniem złożonymi bibliotekami.
Wersje dostrojone instrukcyjnie przeszły bardziej szczegółowe testy, takie jak LiveCodeBench czy McEval, gdzie OpenCoder-8B-Instruct wykazał się wyjątkowymi umiejętnościami wielojęzycznymi, przewyższając inne modele otwartoźródłowe w zadaniach generowania i debugowania kodu w różnych językach programowania.
Wnioski
OpenCoder stanowi znaczący krok naprzód w dziedzinie otwartoźródłowych modeli językowych do kodowania, osiągając wydajność porównywalną z zamkniętymi rozwiązaniami, jednocześnie zachowując pełną transparentność. Dzięki udostępnieniu szczegółowych materiałów szkoleniowych, w tym przepływów danych i protokołów, OpenCoder ustanawia nowy standard rozwoju badań nad sztuczną inteligencją w dziedzinie kodowania.