Autori: Mayank Mishra⋆, IBM Matt Stallone⋆, IBM Gaoyuan Zhang⋆, IBM Yikang Shen, IBM Aditya Prasad, IBM Adriana Meza Soria, IBM Michele Merler, IBM Parameswaran Selvam, IBM Saptha Surendran, IBM Shivdeep Singh, IBM Manish Sethi, IBM Xuan-Hong Dang, IBM Pengyuan Li, IBM Kun-Lung Wu, IBM Syed Zawad, IBM Andrew Coleman, IBM Matthew White, IBM Mark Lewis, IBM Raju Pavuluri, IBM Yan Koyfman, IBM Boris Lublinsky, IBM Maximilien de Bayser, IBM Ibrahim Abdelaziz, IBM Kinjal Basu, IBM Mayank Agarwal, IBM Yi Zhou, IBM Chris Johnson, IBM Aanchal Goyal, IBM Hima Patel, IBM Yousaf Shah, IBM Petros Zerfos, IBM Heiko Ludwig, IBM Asim Munawar, IBM Maxwell Crouse, IBM Pavan Kapanipathi, IBM Shweta Salaria, IBM Bob Calio, IBM Sophia Wen, IBM Seetharami Seelam, IBM Brian Belgodere, IBM Carlos Fonseca, IBM Amith Singhee, IBM Nirmit Desai, IBM David D. Cox, IBM Ruchir Puri†, IBM Rameswar Panda†, IBM Sažetak Veliki jezični modeli (LLM-ovi) obučeni na kodu revolucioniziraju proces razvoja softvera. Sve se više, LLM-ovi za kod integriraju u okruženja za razvoj softvera kako bi poboljšali produktivnost ljudskih programera, a agenti temeljeni na LLM-ovima počinju pokazivati obećanje za autonomno rješavanje složenih zadataka. Ostvarivanje punog potencijala LLM-ova za kod zahtijeva širok raspon mogućnosti, uključujući generiranje koda, ispravljanje grešaka, objašnjavanje i dokumentiranje koda, održavanje spremišta i još mnogo toga. U ovom radu predstavljamo seriju Graniteovih modela za kod samo-dekodera za generativne zadatke koda, obučene na kodu napisanom na 116 programskih jezika. Obitelj modela Granite Code sastoji se od modela veličine od 3 do 34 milijarde parametara, pogodnih za aplikacije u rasponu od složenih zadataka modernizacije aplikacija do slučajeva upotrebe s ograničenom memorijom na uređaju. Evaluacija na sveobuhvatnom setu zadataka pokazuje da modeli Granite Code dosljedno dostižu performanse najvišeg nivoa među dostupnim modelima LLM-a za kod otvorenog koda. Obitelj modela Granite Code optimizirana je za radne tokove razvoja softvera u preduzećima i dobro se pokazuje u nizu zadataka kodiranja (npr. generiranje, ispravljanje i objašnjavanje koda), što ga čini svestranim "all around" kod modelom. Svi naši Granite Code modeli objavljujemo pod licencom Apache 2.0 za istraživačku i komercijalnu upotrebu. https://github.com/ibm-granite/granite-code-models 1 Uvod Tokom posljednjih nekoliko decenija, softver se utkao u tkivo svakog aspekta našeg društva. Kako potražnja za razvojem softvera raste, kritičnije je nego ikad povećati produktivnost razvoja softvera, a LLM-ovi pružaju obećavajući put za dopunu ljudskih programera. Istaknuti slučajevi upotrebe u preduzećima za LLM-ove u produktivnosti razvoja softvera uključuju generiranje koda, objašnjavanje koda, ispravljanje koda, generiranje jedinica za testiranje i dokumentaciju, modernizaciju aplikacija, otkrivanje ranjivosti, prevođenje koda i još mnogo toga. Posljednjih godina došlo je do brzog napretka u sposobnosti LLM-ova da generišu i manipuliraju kodom, a danas je dostupan niz modela sa impresivnim sposobnostima kodiranja. Modeli se kreću u veličini od jednocifrenih milijardi parametara (npr. Llama-7B (Touvron et al., 2023), Gemma-7B (Gemma-Team et al., 2024), itd.) do stotina milijardi: DBRX (Databricks), Arctic (Snowflake), Grok, Mixtral 8x22B (MistralAI), Command R+ (Cohere), i variraju u općenitosti namjeravane upotrebe, s nekim modelima koji ciljaju na pokrivanje niza upotreba izvan koda, dok se drugi primarno fokusiraju na zadatke vezane za kodiranje (npr. StarCoder (Li et al., 2023a; Lozhkov et al., 2024), CodeGen (Nijkamp et al., 2023), CodeLlama (Rozie`re et al., 2023), i CodeGemma (CodeGemma Team et al., 2024)). Međutim, postoje važni jazovi u trenutnom polju LLM-ova za kod, posebno u kontekstu razvoja softvera u preduzećima. Prvo, dok vrlo veliki, generalistički LLM-ovi mogu postići odlične performanse kodiranja, njihova veličina ih čini skupim za implementaciju. Manji modeli fokusirani na kod ( , ; , ; , ; , ; , ) mogu postići odlične performanse generiranja koda u manjem i fleksibilnijem paketu, ali performanse u zadacima kodiranja izvan generiranja (npr. ispravljanje i objašnjavanje) mogu zaostati za performansama generiranja koda. Li et al. 2023a Lozhkov et al. 2024 Nijkamp et al. 2023 Rozie`re et al. 2023 CodeGemma Team et al. 2024 U mnogim kontekstima preduzeća, usvajanje LLM-ova za kod može biti dodatno komplikovano faktorima izvan performansi modela. Na primer, čak i otvoreni modeli ponekad pate od nedostatka transparentnosti o izvorima podataka i metodama obrade podataka koji su korišćeni u modelu, što može narušiti poverenje u modele u kritičnim i regulisanim kontekstima. Nadalje, uslovi licenciranja u današnjim otvorenim LLM-ovima mogu opteretiti i zakomplikovati sposobnost preduzeća da koristi model. Predstavljamo Granite Code modele, seriju visoko sposobnih LLM-ova za kod, dizajniranih da podrže razvoj softvera u preduzećima u širokom spektru zadataka kodiranja. Granite Code modeli imaju dva glavna varijanta koje objavljujemo u četiri različite veličine (3B, 8B, 20B i 34B): osnovni temeljni modeli za zadatke povezane sa kodom; Granite Code Base: modeli koji prate upute, fino podešeni korišćenjem kombinacije Git commitova uparenih sa ljudskim uputama i otvorenim sintetičkim skupovima podataka za upute za kod. Granite Code Instruct: Osnovni modeli u seriji su obučeni od nule sa dvofaznom strategijom obuke. U fazi 1, naš model je obučen na 3 do 4 triliona tokena dobijenih iz 116 programskih jezika, osiguravajući sveobuhvatno razumevanje programskih jezika i sintakse. U fazi 2, naš model je dodatno obučen na 500 milijardi tokena sa pažljivo dizajniranom mešavinom visokokvalitetnih podataka iz oblasti koda i prirodnog jezika kako bi se poboljšala sposobnost modela za rezonovanje. Koristimo neupravljani cilj jezičkog modelovanja za obuku osnovnih modela u obe faze obuke. Instrukcijski modeli su izvedeni daljim fino podešavanjem gore obučenih osnovnih modela na kombinaciji filtrirane varijante CommitPack ( , ), skupova podataka za praćenje uputa na prirodnom jeziku (OASST ( , ), HelpSteer ( , )) i otvorenih matematičkih skupova podataka (MathInstruct ( , ) i MetaMathQA ( , )), uključujući sintetičke skupove podataka za kod radi poboljšanja praćenja uputa i sposobnosti rezonovanja. Muennighoff et al. 2023 Ko¨ pf et al. 2023 Wang et al. 2023 Yue et al. 2023 Yu et al. 2023 Vrši-mo opsežne evaluacije naših LLM-ova za kod na sveobuhvatnom setu mjerila, uključujući HumanEvalPack ( , ), MBPP(+) ( , ; , ), RepoBench ( , ), ReCode ( , ), i više. Ovaj skup mjerila obuhvata mnoge različite vrste zadataka kodiranja osim samo sinteze koda u Pythonu, npr. ispravljanje koda, objašnjavanje koda, uređivanje koda, prevođenje koda, itd., u većini glavnih programskih jezika (Python, JavaScript, Java, Go, C++, Rust, itd.). Muennighoff et al. 2023 Austin et al. 2021 Liu et al. 2023a Liu et al. 2023b Wang et al. 2022 Naši nalazi otkrivaju da među modelima otvorenog koda, Granite Code modeli generalno pokazuju vrlo jake performanse u svim veličinama modela i mjerilima (često nadmašujući druge kodne modele otvorenog koda koji su dvostruko veći u poređenju sa Graniteom). Kao ilustracija, slika (vrh) prikazuje poređenje Granite-8B-Code-Base sa drugim otvorenim baznim kodnim LLM-ovima, uključujući nedavne visoko-performantne opšte bazne LLM-ove kao što su Mistral ( , ) i LLama-3 ( , ) na HumanEvalPack ( , ). Dok CodeGemma i StarCoder2 pokazuju razuman učinak u generiranju koda, značajno slabije se pokazuju na varijantama HumanEvalPack za ispravljanje i objašnjavanje koda. U prosjeku, Granite-8B-Code-Base nadmašuje najkonkurentniji CodeGemma-8B model za skoro 12 poena na HumanEvalPack (33.2% naspram 21.3%), uprkos tome što je obučen na značajno manjem broju tokena (4.5T naspram 7.5T tokena). Pored baznih modela, instrukcijski podešene varijante naših Granite Code modela takođe pokazuju snažne performanse na HumanEvalPack, nadmašujući druge modele otvorenog koda (za kod) sa instrukcijama, demonstrirajući prednosti za širi set zadataka kodiranja sa uputama na prirodnom jeziku (videti sliku (dno)). 1 Jiang et al. 2023b AI@Meta 2024 Muennighoff et al. 2023 1 Nadalje, budući da je rezonovanje ključno za rješavanje komplikovanih pitanja i zadataka, takođe testiramo naš Granite-8B-Code-Base model na šest matematičkih mjerila, uključujući MATH ( , ), GSM8K ( , ) i rješavanje problema uz pristup računarskim alatima, gdje naš Granite 8B model postiže bolje performanse u poređenju sa većinom najsavremenijih LLM-ova od 7B ili 8B parametara. Na primjer, Granite-8B-Code-Base nadmašuje Llama-3-8B-Base za ∼12 poena na GSM8K i ∼6 poena na MATH (videti tabelu ). Cobbe et al. 2021 Cobbe et al. 2021 15 Ključne prednosti Granite Code modela uključuju: : Granite Code modeli postižu konkurentne ili najsavremenije performanse u različitim vrstama zadataka vezanih za kod, uključujući generiranje koda, objašnjavanje, ispravljanje, uređivanje, prevođenje, itd., demonstrirajući svoju sposobnost rješavanja raznolikih zadataka kodiranja; Svestrani LLM za kod : Svi naši modeli su obučeni na podacima dozvoljenim licencom prikupljenim u skladu sa IBM-ovim principima etike AI i vođeni IBM-ovim korporativnim pravnim timom za pouzdanu upotrebu u preduzećima. Svi Granite Code modeli se objavljuju pod licencom Apache 2.0. Pouzdan LLM za preduzeća 1 Opisujemo naš cijeli proces prikupljanja podataka, filtriranja i predobrade u sekciji . Sekcija opisuje detalje arhitekture modela, nakon čega slijede detalji obuke u Sekciji . Sekcija pruža detalje o fino podešavanju instrukcija, a Sekcija opisuje eksperimente i rezultate koji upoređuju Granite Code modele sa drugim LLM-ovima otvorenog koda. 2 3 4 5 6 2 Prikupljanje podataka U ovom odjeljku opisujemo proces pretraživanja i filtriranja (Sec. ), deduplikacije (Sec. ), filtriranja HAP/PII (Sec. ) korištenog za pripremu podataka koda za obuku modela. Također pružamo pregled visokokvalitetnih podataka na prirodnom jeziku korištenih za poboljšanje razumijevanja jezika i vještina matematičkog rezonovanja modela. 2.1 2.2 2.3 2.1 Pretraživanje i filtriranje podataka Podaci koda za predobuku prikupljeni su iz kombinacije javno dostupnih skupova podataka kao što su Github Code Clean , StarCoderdata , i dodatna javna spremišta koda i problemi sa GitHub-a. Filtriramo sirove podatke kako bismo zadržali listu od 116 programskih jezika od preko 300 jezika, kako je navedeno u Prilogu . Dodjela podataka programskim jezicima vrši se isključivo na osnovu ekstenzije datoteke, slično kao kod StarCoder ( , ). Nakon filtriranja jezika, primjenjujemo četiri ključna pravila filtriranja kako bismo uklonili kod nižeg kvaliteta ( , ): (1) ukloniti datoteke s manje od 25% alfabetskih znakova, (2) osim za XSLT jezik, filtrirati datoteke gdje se niz "<?xml version=” pojavljuje unutar prvih 100 znakova, (3) za HTML datoteke, zadržati samo datoteke gdje vidljivi tekst čini najmanje 20% HTML koda i ima minimalnu dužinu od 100 znakova, (4) za JSON i YAML datoteke, zadržati samo datoteke koje imaju broj znakova u rasponu od 50 do 5000 znakova. Takođe filtriramo GitHub probleme koristeći skup metrika kvaliteta koji uključuju uklanjanje automatski generisanog teksta, filtriranje problema koji nisu na engleskom, isključivanje komentara od botova, i korištenje broja korisnika uključenih u razgovor kao pokazatelj kvaliteta. Također označavamo svaku datoteku koda sa informacijama o licenci povezanim sa odgovarajućim spremištem, pronađenim putem Github API-ja, i zadržavamo samo datoteke sa dozvoljenim licencama za obuku modela. 2 3 A Li et al. 2023a Li et al. 2023a 2.2 Tačna i neprecizna deduplikacija Usvajamo agresivnu strategiju deduplikacije uključujući i tačnu i nepreciznu deduplikaciju kako bismo uklonili dokumente koji imaju (skoro) identičan sadržaj koda u našem skupu podataka za obuku. Za tačnu deduplikaciju, prvo računamo SHA256 hash na sadržaju dokumenta i uklanjamo zapise sa identičnim hashovima. Nakon tačne deduplikacije, primjenjujemo nepreciznu deduplikaciju s ciljem uklanjanja datoteka koda koje mogu imati male varijacije i time dalje nepristrano obrađujemo podatke. Primjenjujemo dvostepenu metodu za ovo: (1) računamo MinHash svih dokumenata i zatim koristimo Lokalno Osjetljivo Haširanje (LSH) za grupiranje dokumenata na osnovu njihovih MinHash otisaka, (2) mjerimo Jaccard sličnost između svakog para dokumenata u istoj grupi i označavamo dokumente, osim jednog, kao duplikate na osnovu praga sličnosti od 0.7. Primjenjujemo ovaj proces bliske deduplikacije na sve programske jezike uključujući GitHub probleme kako bismo poboljšali bogatstvo i raznolikost skupa podataka za obuku. 2.3 Filtriranje HAP, PII, zlonamjernog softvera Da bismo smanjili vjerovatnoću generisanja mrziteljskog, uvredljivog ili prostog (HAP) jezika iz modela, ulažemo marljive napore da filtriramo HAP sadržaj iz skupa podataka za obuku. Prvo kreiramo rječnik HAP ključnih riječi i zatim svaki dokument koda označavamo brojem pojavljivanja takvih ključnih riječi u sadržaju, uključujući komentare. Filtriramo dokumente koji prelaze HAP prag, izračunat na osnovu distribucijske analize kao i ručne inspekcije datoteka koda. Nadalje, radi zaštite privatnosti, slijedimo StarCoder ( , ) i ulažemo marljive napore da redaktujemo Lične Identifikacione Informacije (PII) iz skupa podataka za obuku. Specifično, koristimo StarPII model za detekciju IP adresa, ključeva, email adresa, imena, korisničkih imena i lozinki pronađenih u sadržaju. Korak redakcije PII zamjenjuje PII tekst odgovarajućim tokenima NAME , EMAIL , KEY , PASSWORD i IP adrese mijenja sintetički generisanom IP adresom, kao kod Li et al. (2023a). Takođe skeniramo naše skupove podataka koristeći kako bismo identifikovali i uklonili instance zlonamjernog softvera u izvornom kodu. Li et al. 2023a 4 2.4 Skupovi podataka na prirodnom jeziku Pored prikupljanja podataka koda za obuku modela, kuriramo nekoliko javno dostupnih visokokvalitetnih skupova podataka na prirodnom jeziku za poboljšanje proficijencije modela u razumijevanju jezika i matematičkom rezonovanju. Reprezentativni skupovi podataka u ovoj kategoriji uključuju web dokumente (Stackexchange, CommonCrawl), matematičke web tekstove (OpenWeb-Math; ( ), StackMathQA; ( )), akademske tekstove (Arxiv, Wikipedia), i skupove podataka za fino podešavanje instrukcija (FLAN; ( ), HelpSteer ( , )). Ne deduplikujemo ove već predobrađene skupove podataka na prirodnom jeziku. Paster et al. 2023 Zhang 2024 Longpre et al. 2023 Wang et al. 2023 3 Arhitektura modela Obučavamo seriju modela za kod različitih veličina zasnovanih na arhitekturi dekodera transformera ( , ). Hiperparametri modela za ove modele dati su u Tabeli . Za sve arhitekture modela, koristimo pred-normalizaciju ( , ): normalizacija primenjena na ulaz u pažnju i MLP blokove. Vaswani et al. 2017 1 Xiong et al. 2020 : Najmanji model u obitelji Granite-code modela obučen je sa RoPE ugrađivanjem ( , ) i Multi-Head Attention ( , ). Ovaj model koristi swish aktivacionu funkciju ( , ) sa GLU ( , ) za MLP, također poznatu kao swiglu. Za normalizaciju koristimo RMSNorm ( , ) jer je računski efikasnija od LayerNorm ( , ). Model 3B obučen je sa kontekstom od 2048 tokena. 3B Su et al. 2023 Vaswani et al. 2017 Ramachandran et al. 2017 Shazeer 2020 Zhang & Sennrich 2019 Ba et al. 2016 : Model 8B ima sličnu arhitekturu kao model 3B, s izuzetkom korištenja Grouped-Query Attention (GQA) ( , ). Korištenje GQA nudi bolji kompromis između performansi modela i efikasnosti inferencije u ovom obimu. Obučavamo 8B model sa kontekstom od 4096 tokena. 8B Ainslie et al. 2023 : Model 20B za kod obučen je sa naučenim apsolutnim pozicionim ugrađivanjima. Koristimo Multi-Query Attention ( , ) tokom obuke za efikasnu inferenciju nakon obuke. Za MLP blok, koristimo GELU aktivacionu funkciju ( , ). Za normalizaciju aktivacija, koristimo LayerNorm ( , ). Ovaj model je obučen sa kontekstom od 8192 tokena. 20B Shazeer 2019 Hendrycks & Gimpel 2023 Ba et al. 2016 : Da bismo obučili 34B model, slijedimo pristup za povećanje dubine 20B modela. Specifično, prvo dupliramo 20B kodni model sa 52 sloja, a zatim uklanjamo zadnjih 8 slojeva iz originalnog modela i početnih 8 slojeva iz njegove duplikacije kako bismo formirali dva modela. 34B Kim et al. Konačno, konkateniramo oba modela da formiramo Granite-34B-Code model sa 88 slojeva (videti Slika za ilustraciju). Nakon povećanja dubine, primjećujemo da je pad performansi u poređenju sa 20B modelom prilično mali, za razliku od onoga što je primijetio . Ove performanse se prilično brzo oporavljaju nakon što nastavimo predobuku proširenog 34B modela. Slično kao kod 20B, koristimo kontekst od 8192 tokena tokom predobuke. 2 Kim et al. 4 Predobuka U ovom odjeljku pružamo detalje o dvofaznoj obuci (Sec. ), ciljevima obuke (Sec. ), optimizaciji (Sec. ) i infrastrukturi (Sec. ) korištenim u predobuci modela. 4.1 4.2 4.3 4.4 4.1 Dvofazna obuka Granite Code modeli su obučeni na 3.5T do 4.5T tokena podataka koda i skupova podataka na prirodnom jeziku vezanim za kod. Podaci se tokenizuju putem byte pair encoding (BPE, ( , )), koristeći isti tokenizator kao StarCoder ( , ). Slijedeći ( , ; , ), koristimo visokokvalitetne podatke sa dvije faze obuke na sljedeći način. Sennrich et al. 2015 Li et al. 2023a Shen et al. 2024 Hu et al. 2024 • : Tokom faze 1, oba modela 3B i 8B obučavaju se za 4 triliona tokena podataka koda koji obuhvataju 116 jezika. Model od 20B parametara obučen je na 3 triliona tokena koda. Model od 34B obučen je na 1.4T tokena nakon povećanja dubine koje se vrši na 1.6T kontrolnoj tački 20B modela. Faza 1 (samo obuka koda) • : U fazi 2, uključujemo dodatne visokokvalitetne javno dostupne podatke iz različitih domena, uključujući tehničke, matematičke i web dokumente, kako bismo dodatno poboljšali performanse modela u vještinama rezonovanja i rješavanja problema, koje su neophodne za generiranje koda. Obučavamo sve naše modele za 500B tokena (80% koda i 20% jezičkih podataka) u fazi 2 obuke. Faza 2 (obuka koda + jezika) 4.2 Cilj obuke Za obuku svih naših modela, koristimo cilj kauzalnog jezičkog modelovanja i cilj Fill-In-the-Middle (FIM) ( , ). FIM cilj je zadatak predviđanja umetnutih tokena sa datim kontekstom i naknadnim tekstom. Obučavamo naše modele da rade sa oba načina rada PSM (Prefiks-Sufiks-Sredina) i SPM (Sufiks-Prefiks-Sredina), sa odgovarajućim kontrolnim tokenima formata, isto kao i StarCoder ( , ). Bavarian et al. 2022 Li et al. 2023a Ukupan gubitak se računa kao ponderisana kombinacija 2 cilja: Empirijski smo postavili = 0.5 tokom obuke i otkrili da to dobro funkcionira u praksi, vodeći ka SOTA performans α