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) obučeni na kodu revolucjoniziraju proces razvoja softvera. Sve se više LLM-ova za kod integrira u okruženja za razvoj softvera kako bi se povećala produktivnost ljudskih programera, a agenti temeljeni na LLM-ovima počinju pokazivati obećavajuće rezultate 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 spremišta i još mnogo toga. U ovom radu predstavljamo seriju decoder-only kodnih modela Granite za zadatke generiranja koda, treniranih 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 primjene 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 postižu performanse na najvišoj razini među dostupnim open-source LLM-ovima za kod. Obitelj modela Granite Code optimizirana je za radne tijekove razvoja softvera u poduzećima i dobro funkcionira u nizu zadataka kodiranja (npr. generiranje koda, ispravljanje i objašnjavanje), što je čini svestranim "all around" kodnim 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 Tijekom posljednjih nekoliko desetljeća, softver se isprepleo u tkivo svakog aspekta našeg društva. Kako potražnja za razvojem softvera raste, sve je kritičnije povećati produktivnost razvoja softvera, a LLM-ovi pružaju obećavajući put za augmentaciju ljudskih programera. Istaknute primjene LLM-ova u poduzećima za produktivnost 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 godina došlo je do brzog napretka u sposobnosti LLM-ova za generiranje i manipulaciju kodom, a danas su dostupni brojni modeli s impresivnim sposobnostima kodiranja. Modeli variraju 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 razlikuju se u općoj namjeni upotrebe, pri čemu neki modeli ciljaju na pokrivanje niza upotreba izvan koda, dok se drugi primarno fokusiraju na zadatke vezane uz 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 značajni nedostaci u trenutnom polju LLM-ova za kod, posebno u kontekstu razvoja softvera u poduzećima. Prvo, iako vrlo veliki, opći LLM-ovi mogu postići izvrsne rezultate kodiranja, njihova veličina čini ih skupima za implementaciju. Manji modeli fokusirani na kod ( , ; , ; , ; , ; , ) mogu postići izvrsne rezultate 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 faktorima izvan performansi modela. Na primjer, čak i otvoreni modeli ponekad pate od nedostatka transparentnosti o izvorima podataka i metodama obrade podataka koji su korišteni pri izradi modela, što može umanjiti povjerenje u modele u misijama 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 visoko sposobnih LLM-ova za kod, dizajniranih za podršku razvoja softvera u poduzećima 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 vezane uz kod; Granite Code Base: modeli za praćenje uputa finetunirani kombinacijom Git commitova uparenih s ljudskim uputama i open-source sintetički generiranim skupovima podataka za upute kodiranja. Granite Code Instruct: Osnovni modeli u seriji trenirani su od nule strategijom dvofaznog treniranja. U fazi 1, naš model se trenira na 3 do 4 trilijuna tokena dobivenih iz 116 programskih jezika, osiguravajući sveobuhvatno razumijevanje programskih jezika i sintakse. U fazi 2, naš model se dodatno trenira na 500 milijardi tokena s pažljivo dizajniranom mješavinom visokokvalitetnih podataka iz kodnih i prirodnih jezičnih domena kako bi se poboljšala sposobnost modela za zaključivanje. Koristimo ne nadzirani jezični modelarski cilj za treniranje osnovnih modela u obje faze treniranja. Instruct modeli su izvedeni daljnjim finetuniranjem gore treniranih osnovnih modela na kombinaciji filtrirane varijante CommitPack ( , ), skupova podataka za praćenje uputa na prirodnom jeziku (OASST ( , ), HelpSteer ( , )) i open-source matematičkih skupova podataka (MathInstruct ( , ) i MetaMathQA ( , )), uključujući sintetički generirane skupove podataka za kodiranje radi poboljšanja praćenja uputa i sposobnosti zaključ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 setu benchmarka, uključujući HumanEvalPack ( , ), MBPP(+) ( , ; , ), RepoBench ( , ), ReCode ( , ), i više. Ovaj set benchmarka obuhvaća mnoge različite vrste zadataka kodiranja izvan 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 open-source modelima, modeli Granite Code općenito pokazuju vrlo jake performanse u svim veličinama modela i benchmarkima (često nadmašujući druge open-source kodne modele koji su dvostruko veći u usporedbi s Graniteom). Kao ilustracija, slika (gore) prikazuje usporedbu Granite-8B-Code-Base s drugim open-source baznim kodnim LLM-ovima, uključujući nedavne visoko-performansne opće bazne LLM-ove poput Mistrala ( , ) i LLama-3 ( , ) na HumanEvalPack ( , ). Dok CodeGemma i StarCoder2 pokazuju razumne performanse u generiranju koda, značajno lošije performiraju na varijantama HumanEvalPack za ispravljanje i objašnjavanje koda. U prosjeku, Granite-8B-Code-Base nadmašuje najkonkurentniji CodeGemma-8B model za gotovo 12 bodova na HumanEvalPack (33,2% u usporedbi s 21,3%), unatoč tome što je treniran na značajno manjoj količini tokena (4,5T u usporedbi sa 7,5T tokena). Osim baznih modela, instruct varijante naših Granite Code modela također pokazuju jake performanse na HumanEvalPack, nadmašujući druge open-source (kodne) instruct modele, pokazujući prednosti za širi skup zadataka kodiranja s uputama na prirodnom jeziku (vidjeti sliku (dolje)). 1 Jiang et al. 2023b AI@Meta 2024 Muennighoff et al. 2023 1 Nadalje, budući da je zaključivanje ključno za rješavanje kompliciranih pitanja i zadataka, također testiramo naš Granite-8B-Code-Base model na šest matematičkih benchmarka, uključujući MATH ( , ), GSM8K ( , ) i rješavanje problema s pristupom računskim alatima, gdje naš Granite 8B model postiže bolje rezultate u usporedbi s većinom najsuvremenijih 7B ili 8B LLM-ova. Na primjer, Granite-8B-Code-Base nadmašuje Llama-3-8B-Base za ~12 bodova na GSM8K i ~6 bodova na MATH (vidjeti 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 najbolje performanse u klasi na različitim vrstama zadataka vezanih uz kod, uključujući generiranje koda, objašnjavanje, ispravljanje, uređivanje, prijevod, itd., pokazujući svoju sposobnost rješavanja raznolikih zadataka kodiranja; Svestrani kodni LLM : Svi naši modeli trenirani su na podacima dopuštenim licencom prikupljenim u skladu s IBM-ovim principima etike umjetne inteligencije i vođeni IBM-ovim timom 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 Opisujemo naš cjelokupni proces prikupljanja podataka, filtriranja i predobrade u odjeljku . Odjeljak opisuje detalje arhitekture modela, nakon čega slijede detalji treniranja u Odjeljku . Odjeljak pruža detalje o finetuniranju uputa, a Odjeljak opisuje eksperimente i rezultate koji uspoređuju Granite Code modele s drugim open-source LLM-ovima. 2 3 4 5 6 2 Prikupljanje podataka U ovom odjeljku opisujemo proces skeniranja i filtriranja (Sec. ), deduplikacije (Sec. ), filtriranja HAP/PII (Sec. ) korištenih za pripremu kodnih podataka za treniranje modela. Također pružamo pregled visokokvalitetnih podataka na prirodnom jeziku korištenih za poboljšanje modela u razumijevanju jezika i matematičkim sposobnostima zaključivanja. 2.1 2.2 2.3 2.1 Skeniranje i filtriranje podataka Podaci za pretreniranje koda prikupljeni su iz kombinacije javno dostupnih skupova podataka poput Github Code Clean , StarCoderdata , te dodatnih javnih spremišta koda i izdanja s GitHub-a. Filtriramo sirove podatke kako bismo zadržali popis od 116 programskih jezika od preko 300 jezika, kao što je navedeno u Prilogu . Dodjela podataka programskim jezicima vrši se isključivo na temelju proširenja datoteke, slično kao kod StarCoder ( , ). Nakon filtriranja jezika, primjenjujemo četiri ključna pravila filtriranja za uklanjanje koda 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 u rasponu od 50 do 5000 znakova. Također filtriramo GitHub izdanja koristeći set metrika kvalitete koji uključuje uklanjanje automatski generiranog teksta, filtriranje izdanja koja nisu na engleskom, isključivanje komentara od botova i korištenje broja korisnika uključenih u razgovor kao pokazatelja kvalitete. Također označavamo svaku kodnu datoteku s informacijama o licenci povezanom s odgovarajućim spremištem, pronađenim 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 nejasna deduplikacija Usvajamo agresivnu strategiju deduplikacije koja uključuje i točnu i nejasnu deduplikaciju radi uklanjanja dokumenata koji imaju (gotovo) identičan sadržaj koda u našem skupu za treniranje. Za točnu deduplikaciju, prvo izračunavamo SHA256 hash sadržaja dokumenta i uklanjamo zapise koji imaju identične hashove. Nakon točne deduplikacije, primjenjujemo nejasnu deduplikaciju s ciljem uklanjanja kodnih datoteka koje mogu imati male varijacije i time dodatno neutralizirati podatke. Primjenjujemo dvostupanjsku metodu za to: (1) izračunavamo MinHashove svih dokumenata, a 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. Primjenjujemo ovaj proces gotovo-deduplikacije na sve programske jezike, uključujući GitHub izdanja, kako bismo poboljšali bogatstvo i raznolikost skupa za treniranje. 2.3 Filtriranje HAP, PII, zlonamjernog softvera Kako bismo smanjili vjerojatnost generiranja uvredljivog, zlostavljačkog ili prostačkog (HAP) jezika iz modela, ulažemo marljive napore u filtriranje HAP sadržaja iz skupa za treniranje. Prvo stvaramo rječnik HAP ključnih riječi, a zatim svaki kodni dokument označavamo brojem pojavljivanja takvih ključnih riječi u sadržaju, uključujući komentare. Filtriramo dokumente koji prelaze prag HAP, izračunat na temelju distribucijske analize, kao i ručnog pregleda kodnih datoteka. Nadalje, kako bismo zaštitili privatnost, slijedimo StarCoder ( , ) i ulažemo marljive napore u redigiranje osobno identificirajućih informacija (PII) iz skupa za treniranje. Konkretno, koristimo StarPII model za otkrivanje IP adresa, ključeva, e-mail adresa, imena, korisničkih imena i lozinki pronađenih u sadržaju. Korak redigiranja PII zamjenjuje PII tekst odgovarajućim tokenima NAME , EMAIL , KEY i PASSWORD te 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 kodnih podataka za treniranje modela, pripremamo nekoliko javno dostupnih visokokvalitetnih skupova podataka na prirodnom jeziku za poboljšanje modela u razumijevanju jezika i matematičkim sposobnostima zaključivanja. 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 finetuniranje uputa (FLAN; ( ), HelpSteer ( , )). Ne dedupliciramo ove već predobradene skupove podataka na prirodnom jeziku. Paster et al. 2023 Zhang 2024 Longpre et al. 2023 Wang et al. 2023 3 Arhitektura modela Treniramo seriju kodnih modela različitih veličina na temelju decoder arhitekture transformera ( , ). Hiperparametri modela za ove modele dati su u Tablici . Za sve arhitekture modela koristimo pre-normalizaciju ( , ): normalizacija primijenjena na ulaz pozornosti i MLP blokova. Vaswani et al. 2017 1 Xiong et al. 2020 : Najmanji model u obitelji Granite-code modela treniran je s RoPE embeddingom ( , ) i Multi-Head Attentionom ( , ). Ovaj model koristi swish aktivacijsku funkciju ( , ) sa GLU ( , ) za MLP, također uobičajeno poznato kao swiglu. Za normalizaciju koristimo RMSNorm ( , ) jer je računski učinkovitiji od LayerNorma ( , ). 3B model treniran je s kontekstom duljine 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 : 8B model ima sličnu arhitekturu kao 3B model, s iznimkom korištenja Grouped-Query Attentiona (GQA) ( , ). Korištenje GQA nudi bolji kompromis između performansi modela i učinkovitosti inferencije u ovom obimu. Treniramo 8B model s kontekstom duljine od 4096 tokena. 8B Ainslie et al. 2023 : 20B kodni model treniran je s naučenim apsolutnim pozicijskim embeddingima. Koristimo Multi-Query Attention ( , ) tijekom treniranja za učinkovitu nizvodnu inferenciju. Za MLP blok koristimo GELU aktivacijsku funkciju ( , ). Za normalizaciju aktivacija koristimo LayerNorm ( , ). Ovaj model treniran je s kontekstom duljine od 8192 tokena. 20B Shazeer 2019 Hendrycks & Gimpel 2023 Ba et al. 2016 : Za treniranje 34B modela, slijedimo pristup za povećanje dubine 20B modela. Konkretno, prvo podupliramo 20B kodni model s 52 sloja, a zatim uklanjamo zadnjih 8 slojeva iz originalnog modela i prvih 8 slojeva iz njegove kopije kako bismo formirali dva modela. 34B Kim et al. Konačno, spajamo oba modela kako bismo formirali Granite-34B-Code model s 88 slojeva (vidi Slika za ilustraciju). Nakon povećanja dubine, primjećujemo da je pad performansi u usporedbi s 20B modelom prilično mali, za razliku od onoga što su promatrali . Ove performanse se prilično brzo oporavljaju nakon što nastavimo pretreniranje povećanog 34B modela. Slično kao kod 20B modela, koristimo kontekst od 8192 tokena tijekom pretreniranja. 2 Kim et al. 4 Pretreniranje U ovom odjeljku pružamo detalje o dvofaznom treniranju (Sec. ), ciljevima treniranja (Sec. ), optimizaciji (Sec. ) i infrastrukturi (Sec. ) korištenim u pretreniranju modela. 4.1 4.2 4.3 4.4 4.1 Dvofazno treniranje Granite Code modeli trenirani su na 3,5T do 4,5T tokena kodnih podataka i podataka na prirodnom jeziku vezanih uz kod. Podaci se tokeniziraju putem byte pair encodinga (BPE, ( , )), koristeći isti tokenizer kao i StarCoder ( , ). Slijedeći ( , ; , ), koristimo visokokvalitetne podatke s dvije faze treniranja na sljedeći način. Sennrich et al. 2015 Li et al. 2023a Shen et al. 2024 Hu et al. 2024 • : Tijekom faze 1, oba modela 3B i 8B trenirana su na 4 trilijuna tokena kodnih podataka koji obuhvaćaju 116 jezika. Model od 20B parametara treniran je na 3 trilijuna tokena koda. Model od 34B treniran je na 1,4T tokena nakon povećanja dubine koje je izvršeno na 1,6T provjeri modela od 20B. Faza 1 (treniranje 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 sposobnostima zaključivanja i rješavanja problema, koji su ključni za generiranje koda. Treniramo sve naše modele na 500B tokena (80% kodnih i 20% jezičnih podataka) u fazi 2 treniranja. Faza 2 (treniranje kod + jezik) 4.2 Cilj treniranja Za treniranje svih naših modela koristimo cilj modeliranja kauzalnog jezika i cilj Fill-In-the-Middle (FIM) ( , ). FIM cilj je predvidjeti umetnute tokene s obzirom na dati kontekst i naknadni tekst. Treniramo naše modele da rade s oba načina rada PSM (Prefix-Suffix-Middle) i SPM (Suffix-Prefix-Middle), s odgovarajućim kontrolnim tokenima za formatiranje, isto kao i StarCoder ( , ). Bavarian et al. 2022 Li et al. 2023a Ukupan gubitak izračunava se kao ponderirana kombinacija 2 cilja: Empirijski smo postavili = 0,5 tijekom treniranja i utvrdili da to dobro funkcionira u praksi, vodeći do SOTA performansi na zadacima dovršavanja koda i umetanja koda. Treba napomenuti da se FIM cilj koristi samo tijekom pretreniranja, međutim, odb α