```html 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-ova za kod integrira u okruženja za razvoj softvera kako bi se poboljšala produktivnost ljudskih programera, a agenti temeljeni na LLM-ovima počinju pokazivati obećanje u autonomnom rješavanju složenih zadataka. Ostvarivanje punog potencijala LLM-ova za kod zahtijeva širok raspon mogućnosti, uključujući generiranje koda, ispravljanje programskih pogrešaka, objašnjavanje i dokumentiranje koda, održavanje repozitorija i još mnogo toga. U ovom radu predstavljamo seriju dekodersko-fokusiranih modela koda Granite za generativne zadatke koda, treniranih s kodom napisanim na 116 programskih jezika. Obitelj modela Granite Code sastoji se od modela veličine od 3 do 34 milijarde parametara, prikladnih za primjene od složenih zadataka modernizacije aplikacija do slučajeva upotrebe s ograničenim memorijskim prostorom na uređaju. Procjena na sveobuhvatnom skupu zadataka pokazuje da modeli Granite Code dosljedno postižu najsuvremenije performanse među dostupnim modelima LLM-ova za kod otvorenog koda. Obitelj modela Granite Code optimizirana je za radne procese razvoja softvera za poduzeća i dobro funkcionira u nizu zadataka kodiranja (npr. generiranje koda, ispravljanje i objašnjavanje), što ga čini svestranim "all-around" modelom koda. Svi naši modeli Granite Code objavljujemo pod licencom Apache 2.0 za istraživačku i komercijalnu upotrebu. https://github.com/ibm-granite/granite-code-models 1 Uvod Tijekom posljednjih nekoliko desetljeća, softver je utkan u tkivo svih aspekata 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 proširenje ljudskih programera. Istaknuti slučajevi upotrebe u poduzećima za LLM-ove u produktivnosti razvoja softvera uključuju generiranje koda, objašnjavanje koda, ispravljanje koda, generiranje jedinčnih testova i dokumentacije, modernizaciju aplikacija, otkrivanje ranjivosti, prijevod koda i još mnogo toga. Posljednjih su godina postignut brzi napredak u sposobnosti LLM-ova da generiraju i manipuliraju kodom, a danas je dostupan niz modela s impresivnim sposobnostima kodiranja. Modeli variraju u veličini od nekoliko 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 razlikuju se u općenitosti namjeravane upotrebe, pri čemu neki modeli ciljaju pokriti niz upotreba izvan koda, dok se drugi primarno fokusiraju na zadatke povezane s kodiranjem (npr. StarCoder (Li et al., 2023a; Lozhkov et al., 2024), CodeGen (Nijkamp et al., 2023), CodeLlama (Rozie`re et al., 2023), and CodeGemma (CodeGemma Team et al., 2024)). Međutim, u području LLM-ova za kod postoje važni nedostaci, osobito u kontekstu razvoja softvera za poduzeća. Prvo, iako vrlo veliki, opći LLM-ovi mogu postići izvrsne performanse kodiranja, njihova veličina čini ih skupima za implementaciju. Manji modeli usmjereni na kod ( , ; , ; , ; , ; , ) mogu postići izvrsne performanse generiranja koda u manjem i fleksibilnijem paketu, ali performanse u zadacima kodiranja izvan generiranja (npr. ispravljanje i objašnjavanje) mogu zaostajati 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 poduzeća, usvajanje LLM-ova za kod može biti dodatno komplicirano čimbenicima izvan performansi modela. Na primjer, čak i otvoreni modeli ponekad pate od nedostatka transparentnosti u vezi s izvorima podataka i metodama obrade podataka koji su korišteni u modelu, što može narušiti povjerenje u modele u kritičnim i reguliranim kontekstima. Nadalje, uvjeti licenciranja u današnjim otvorenim LLM-ovima mogu opteretiti i zakomplicirati sposobnost poduzeća da koristi model. Ovdje predstavljamo modele Granite Code, seriju vrlo sposobnih LLM-ova za kod, dizajniranih za podršku razvoja softvera za poduzeća u širokom rasponu zadataka kodiranja. Modeli Granite Code imaju dva glavna varijanta koje objavljujemo u četiri različite veličine (3B, 8B, 20B i 34B): osnovni temeljni modeli za zadatke povezane s kodom; Granite Code Base: modeli koji slijede upute, fino podešeni korištenjem kombinacije Git commita uparenih s ljudskim uputama i sintetički generiranim skupovima podataka za instrukcije koda otvorenog koda. Granite Code Instruct: Osnovni modeli u seriji trenirani su od nule pomoću strategije dvofaznog treninga. U fazi 1, naš model je treniran na 3 do 4 trilijuna tokena dobivenih iz 116 programskih jezika, osiguravajući sveobuhvatno razumijevanje programskih jezika i sintakse. U fazi 2, naš model je dodatno treniran na 500 milijardi tokena s pažljivo dizajniranom mješavinom visokokvalitetnih podataka iz domena koda i prirodnog jezika kako bi se poboljšala sposobnost modela za rasuđivanje. Koristimo cilj modeliranja jezika bez nadzora za treniranje osnovnih modela u obje faze treninga. Instrukcijski modeli izvedeni su daljnjim finim podešavanjem gore treniranih osnovnih modela na kombinaciji filtrirane varijante CommitPack ( , ), skupova podataka za praćenje instrukcija na prirodnom jeziku (OASST ( , ), HelpSteer ( , )) i matematičkih skupova podataka otvorenog koda (MathInstruct ( , ) i MetaMathQA ( , )), uključujući sintetički generirane skupove podataka koda za poboljšanje praćenja instrukcija i sposobnosti rasuđivanja. Muennighoff et al. 2023 Ko¨ pf et al. 2023 Wang et al. 2023 Yue et al. 2023 Yu et al. 2023 Proveli smo opsežne evaluacije naših LLM-ova za kod na sveobuhvatnom skupu mjerila, uključujući HumanEvalPack ( , ), MBPP(+) ( , ; , ), RepoBench ( , ), ReCode ( , ), i još mnogo toga. Ovaj skup mjerila obuhvaća mnoge različite vrste zadataka kodiranja osim samo sinteze koda u Pythonu, npr. ispravljanje koda, objašnjavanje koda, uređivanje koda, prijevod 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, modeli Granite Code općenito pokazuju vrlo snažne performanse u svim veličinama modela i mjerilima (često nadmašujući druge modele koda otvorenog koda koji su dvostruko veći u usporedbi s Graniteom). Kao ilustracija, slika (gore) prikazuje usporedbu Granite-8B-Code-Base s drugim osnovnim LLM-ovima koda otvorenog koda, uključujući nedavne LLM-ove opće namjene s visokim performansama kao što su Mistral ( , ) i LLama-3 ( , ) na HumanEvalPack ( , ). Dok CodeGemma i StarCoder2 postižu razuman uspjeh u generiranju koda, znatno lošije prolaze na varijantama HumanEvalPack za ispravljanje i objašnjavanje koda. U prosjeku, Granite-8B-Code-Base nadmašuje najkonkurentniji model CodeGemma-8B za gotovo 12 bodova na HumanEvalPack (33,2% vs 21,3%), unatoč tome što je treniran na znatno manjem broju tokena (4,5T vs 7,5T tokena). Osim osnovnih modela, instrukcijski podešene varijante naših modela Granite Code također pokazuju snažne performanse na HumanEvalPack, nadmašujući druge modele otvorenog koda (za kod) s uputama, pokazujući prednosti za širi skup zadataka kodiranja s uputama na prirodnom jeziku (vidi sliku (dolje)). 1 Jiang et al. 2023b AI@Meta 2024 Muennighoff et al. 2023 1 Nadalje, budući da je rasuđivanje ključno za rješavanje složenih pitanja i zadataka, također testiramo naš model Granite-8B-Code-Base na šest matematičkih mjerila, uključujući MATH ( , ), GSM8K ( , ) i rješavanje problema uz pristup računalnim alatima, gdje naš model Granite 8B postiže bolje performanse u usporedbi s većinom najsuvremenijih LLM-ova od 7B ili 8B. Na primjer, Granite-8B-Code-Base nadmašuje Llama-3-8B-Base za ~12 bodova na GSM8K i ~6 bodova na MATH (vidi tablicu ). Cobbe et al. 2021 Cobbe et al. 2021 15 Ključne prednosti modela Granite Code uključuju: : Modeli Granite Code postižu konkurentne ili najsuvremenije performanse u različitim vrstama zadataka povezanih s kodom, uključujući generiranje koda, objašnjavanje, ispravljanje, uređivanje, prevođenje, itd., pokazujući svoju sposobnost rješavanja raznolikih zadataka kodiranja; Svestrani LLM za kod : Svi naši modeli trenirani su na podacima dopuštenim licencom prikupljenim u skladu s IBM-ovim etičkim principima AI i vođeni IBM-ovim Odjelom za korporativno pravo za pouzdanu upotrebu u poduzećima. Svi modeli Granite Code objavljeni su pod licencom Apache 2.0. Pouzdani LLM za poduzeća 1 Detaljno opisujemo naš cijeli postupak prikupljanja, filtriranja i predobrade podataka u odjeljku . Odjeljak opisuje detalje arhitekture modela, nakon čega slijede detalji treninga u Odjeljku . Odjeljak pruža detalje o finom podešavanju instrukcija, a Odjeljak opisuje eksperimente i rezultate uspoređujući modele Granite Code s 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štenih za pripremu podataka koda za treniranje modela. Također pružamo pregled visokokvalitetnih podataka prirodnog jezika korištenih za poboljšanje jezičnog razumijevanja modela i vještina matematičkog rasuđivanja. 2.1 2.2 2.3 2.1 Pretraživanje i filtriranje podataka Podaci koda za pred-trening potječu iz kombinacije javno dostupnih skupova podataka kao što su Github Code Clean , StarCoderdata , te dodatnih javnih repozitorija koda i issues s GitHub-a. Filtriramo sirove podatke kako bismo zadržali popis od 116 programskih jezika od preko 300 jezika, kako je navedeno u Prilogu . Dodjela podataka programskim jezicima vrši se isključivo na temelju ekstenzije datoteke, slično StarCoderu ( , ). Nakon filtriranja jezika, primjenjujemo četiri ključna pravila filtriranja kako bismo uklonili kod niže kvalitete ( , ): (1) ukloniti datoteke s manje od 25% abecednih 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 duljinu od 100 znakova, (4) za JSON i YAML datoteke, zadržati samo datoteke koje imaju broj znakova između 50 i 5000 znakova. Također filtriramo GitHub issues pomoću skupa metrika kvalitete koji uključuju uklanjanje automatski generiranog teksta, filtriranje issues-a koji nisu na engleskom, isključivanje komentara od strane botova i korištenje broja korisnika uključenih u razgovor kao pokazatelja kvalitete. Svakoj datoteci koda također dodjeljujemo informacije o licenci povezane s odgovarajućim repozitorijem, pronađene putem GitHub API-ja i zadržavamo samo datoteke s dopuštenim licencama za treniranje modela. 2 3 A Li et al. 2023a Li et al. 2023a 2.2 Točna i fuzzy deduplikacija Usvajamo agresivnu strategiju deduplikacije koja uključuje i točnu i fuzzy deduplikaciju kako bismo uklonili dokumente koji imaju (gotovo) identičan sadržaj koda u našem skupu podataka za treniranje. Za točnu deduplikaciju, prvo izračunavamo SHA256 hash na sadržaju dokumenta i uklanjamo zapise koji imaju identične hash-eve. Nakon točne deduplikacije, primjenjujemo fuzzy deduplikaciju s ciljem uklanjanja datoteka koda koje mogu imati male varijacije i time dodatno uravnotežiti podatke. Primjenjujemo dvostupanjsku metodu za to: (1) izračunavamo MinHash-eve svih dokumenata i zatim koristimo Locally Sensitive Hashing (LSH) za grupiranje dokumenata na temelju 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 temelju praga sličnosti od 0.7. Ovaj proces gotovo-deduplikacije primjenjujemo na sve programske jezike, uključujući GitHub issues, kako bismo poboljšali bogatstvo i raznolikost skupa podataka za treniranje. 2.3 Filtriranje HAP-a, PII-a, zlonamjernog softvera Kako bismo smanjili vjerojatnost generiranja uvredljivog, zlostavljačkog ili prostog (HAP) jezika iz modela, ulažemo marljive napore da filtriramo HAP sadržaj iz skupa podataka za treniranje. Prvo stvaramo rječnik HAP ključnih riječi, a 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 temelju distribucijske analize, kao i ručne inspekcije datoteka koda. Nadalje, kako bismo zaštitili privatnost, slijedimo StarCoder ( , ) i ulažemo marljive napore da uklonimo osobne identifikacijske podatke (PII) iz skupa podataka za treniranje. Konkretno, koristimo StarPII model za otkrivanje IP adresa, ključeva, adresa e-pošte, imena, korisničkih imena i lozinki pronađenih u sadržaju. Korak uklanjanja PII zamjenjuje PII tekst odgovarajućim tokenima NAME , EMAIL , KEY , PASSWORD i mijenja IP adresu sintetički generiranom IP adresom, kao u Li et al. (2023a). Također skeniramo naše skupove podataka pomoću kako bismo identificirali i uklonili instance zlonamjernog softvera u izvornom kodu. Li et al. 2023a 4 2.4 Skupovi podataka na prirodnom jeziku Osim prikupljanja podataka koda za treniranje modela, prikupljamo nekoliko javno dostupnih visokokvalitetnih skupova podataka na prirodnom jeziku za poboljšanje modelove vještine u razumijevanju jezika i matematičkom rasuđivanju. 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 dedupliciramo ove već pred-obrađene skupove podataka na prirodnom jeziku. Paster et al. 2023 Zhang 2024 Longpre et al. 2023 Wang et al. 2023 3 Arhitektura modela Treniramo seriju modela koda različitih veličina na temelju transformatorske dekoderske arhitekture ( , ). Hiperparametri modela za ove modele dati su u Tablici . Za sve arhitekture modela, koristimo pre-normalizaciju ( , ): normalizacija primijenjena na ulaz pažnje i MLP blokova. Vaswani et al. 2017 1 Xiong et al. 2020 : Najmanji model u obitelji Granite-code treniran je s RoPE ugrađivanjem ( , ) i Multi-Head Attention ( , ). Ovaj model koristi swish aktivacijsku funkciju ( , ) s GLU ( , ) za MLP, također uobičajeno poznat kao swiglu. Za normalizaciju, koristimo RMSNorm ( , ) jer je izračunski učinkovitiji od LayerNorm ( , ). Model 3B treniran je s kontekstnom duljinom 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, osim korištenja Grouped-Query Attention (GQA) ( , ). Korištenje GQA nudi bolji kompromis između performansi modela i učinkovitosti zaključivanja u ovom opsegu. Treniramo model 8B s kontekstnom duljinom od 4096 tokena. 8B Ainslie et al. 2023 : Model koda 20B treniran je s naučenim apsolutnim pozicijskim ugrađivanjima. Koristimo Multi-Query Attention ( , ) tijekom treninga za učinkovito naknadno zaključivanje. Za MLP blok, koristimo GELU aktivacijsku funkciju ( , ). Za normalizaciju aktivacija, koristimo LayerNorm ( , ). Ovaj model treniran je s kontekstnom duljinom od 8192 tokena. 20B Shazeer 2019 Hendrycks & Gimpel 2023 Ba et al. 2016 : Za treniranje modela 34B, slijedimo pristup za povećanje dubine modela 20B. Konkretno, prvo dupliciramo model koda 20B s 52 sloja, a zatim uklanjamo zadnjih 8 slojeva iz originalnog modela i početnih 8 slojeva iz njegove kopije kako bismo formirali dva modela. 34B Kim et al. Na kraju, spajamo oba modela kako bismo formirali model Granite-34B-Code s 88 slojeva (vidi sliku za ilustraciju). Nakon povećanja dubine, primjećujemo da je pad performansi u usporedbi s modelom 20B prilično mali, suprotno onome što su promatrali . Ove performanse se prilično brzo oporavljaju nakon što nastavimo s pred-treningom povećanog 34B modela. Slično kao i kod 20B, koristimo kontekst od 8192 tokena tijekom pred-treninga. 2 Kim et al. 4 Pred-trening U ovom odjeljku pružamo detalje o dvofaznom treningu (Sec. ), ciljevima treninga (Sec. ), optimizaciji (Sec. ) i infrastrukturi (Sec. ) korištenim u pred-treningu modela. 4.1 4.2 4.3 4.4 4.1 Dvofazni trening Granite Code modeli trenirani su na 3.5T do 4.5T tokena podataka koda i skupova podataka prirodnog jezika povezanih s kodom. Podaci se tokeniziraju pomoću byte pair encoding (BPE, ( , )), koristeći isti tokenizator kao StarCoder ( , ). Slijedeći ( , ; , ), koristimo visokokvalitetne podatke s dva faza treninga kako slijedi. Sennrich et al. 2015 Li et al. 2023a Shen et al. 2024 Hu et al. 2024 • : Tijekom faze 1, oba modela 3B i 8B treniraju se na 4 trilijuna tokena podataka koda koji obuhvaćaju 116 jezika. Model od 20B parametara treniran je na 3 trilijuna tokena koda. Model 34B treniran je na 1.4T tokena nakon povećanja dubine koje se vrši na 1.6T checkpointu modela 20B. Faza 1 (trening samo koda) • : U fazi 2, uključujemo dodatne visokokvalitetne javno dostupne podatke iz raznih domena, uključujući tehničke, matematičke i web dokumente, kako bismo dodatno poboljšali performanse modela u rasuđivanju i vještinama rješavanja problema, koji su ključni za generiranje koda. Sve naše modele treniramo na 500B tokena (80% koda i 20% podataka jezika) u fazi 2 treninga. Faza 2 (trening koda + jezika) 4.2 Cilj treninga Za treniranje svih naših modela koristimo cilj modeliranja uzročnog jezika i cilj Fill-In-the-Middle (FIM) ( , ). FIM cilj je predvidjeti umetnute tokene s danim kontekstom i naknadnim tekstom. Treniramo naše modele da rade s oba načina PSM (Prefix-Suffix-Middle) i SPM (Suffix-Prefix-Middle), s relevantnim kontrolnim tokenima formatiranja, isto kao StarCoder ( , ). Bavarian et al. 2022 Li et al. 2023a Ukupni gubitak izračunava se kao ponderirana kombinacija 2 cilja: Empirijski smo