```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) obučeni na kodu revolucioniraju 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ćavajuće rezultate u autonomnom rješavanju složenih zadataka. Ostvarivanje punog potencijala LLM-ova za kod zahtijeva širok spektar 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 Granite dekoderskih kodnih modela za zadatke generiranja koda, obučenih na kodu napisanom na 116 programskih jezika. Obitelj kodnih 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 kodni modeli Granite Code dosljedno postižu vrhunske performanse među dostupnim open-source LLM-ovima za kod. Obitelj kodnih modela Granite Code optimizirana je za radne tokove razvoja softvera u preduzećima i dobro se pokazuje u nizu kodnih zadataka (npr. generiranje koda, ispravljanje i objašnjavanje), što ga čini svestranim "sveobuhvatnim" kodnim modelom. Svi naši Granite kodni 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 tkanje 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 nude obećavajući put za jačanje ljudskih programera. Istaknute korporativne primene za LLM-ove u produktivnosti razvoja softvera uključuju generiranje koda, objašnjavanje koda, ispravljanje koda, generiranje testova jedinica i dokumentacije, modernizaciju aplikacija, detekciju ranjivosti, prevod koda i još mnogo toga. Posljednjih godina došlo je do brzog napretka u sposobnosti LLM-ova da generiraju i manipulišu kodom, a danas je dostupan niz modela sa impresivnim mogućnostima 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šnosti namenske upotrebe, pri čemu neki modeli teže pokrivanju niza upotreba izvan koda, dok se drugi primarno fokusiraju na zadatke povezane sa kodiranjem (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 nedostaci u trenutnom polju LLM-ova za kod, posebno u kontekstu razvoja softvera u preduzećima. Prvo, iako vrlo veliki, generalistički LLM-ovi mogu postići izvrsne performanse kodiranja, njihova veličina čini ih skupim za implementaciju. Manji modeli fokusirani na kod ( , ; , ; , ; , ; , ) mogu postići izvrsne performanse generisanja koda u manjem i fleksibilnijem paketu, ali performanse u kodnim zadacima izvan generisanja (npr. ispravljanje i objašnjavanje) mogu zaostajati za performansama generisanja 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 korporativnim kontekstima, usvajanje LLM-ova za kod može biti dodatno komplikovano faktorima izvan performansi modela. Na primer, čak i otvoreni modeli su ponekad narušeni nedostatkom transparentnosti o izvorima podataka i metodama obrade podataka koji su korišćeni u modelu, što može potkopati 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. Ovde predstavljamo Granite Code modele, seriju visoko sposobnih LLM-ova za kod, dizajniranih da podrže razvoj softvera u preduzećima u širokom spektru kodnih zadataka. Granite Code modeli imaju dva glavna varijanta koja objavljujemo u četiri različite veličine (3B, 8B, 20B i 34B): osnovni temelji modeli za zadatke vezane za kod; Granite Code Base: modeli za praćenje instrukcija finetunovani korišćenjem kombinacije Git commita uparenih sa ljudskim instrukcijama i open-source sintetički generisanim skupovima podataka za instrukcije koda. Granite Code Instruct: Osnovni modeli u seriji obučeni su od nule sa strategijom dvofaznog treninga. U fazi 1, naš model je obučen na 3 do 4 biliona tokena dobavljenih iz 116 programskih jezika, osiguravajući sveobuhvatno razumevanje programskih jezika i sintakse. U fazi 2, naš model je dalje obučen na 500 milijardi tokena sa pažljivo dizajniranom mešavinom visokokvalitetnih podataka iz domenâ koda i prirodnog jezika kako bi se poboljšala sposobnost modela za rasuđivanje. Koristimo neometeni jezički modelni cilj za obuku osnovnih modela u obe faze treninga. Instruct modeli su izvedeni daljim finetuningom gore pomenutih osnovnih modela na kombinaciji filtrirane varijante CommitPack ( , ), skupova podataka za instrukcije prirodnog jezika (OASST ( , ), HelpSteer ( , )) i open-source matematičkih skupova podataka (MathInstruct ( , ) i MetaMathQA ( , )), uključujući sintetički generisane skupove podataka za kod radi poboljšanja sposobnosti praćenja instrukcija i rasuđivanja. Muennighoff et al. 2023 Ko¨ pf et al. 2023 Wang et al. 2023 Yue et al. 2023 Yu et al. 2023 Provodimo 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 obuhvata mnoge različite vrste kodnih zadataka izvan samo sinteze koda u Pythonu, npr. ispravljanje koda, objašnjavanje koda, uređivanje koda, prevod 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, Granite Code modeli generalno pokazuju veoma snažne performanse na svim veličinama modela i benchmarkovima (često nadmašujući druge open-source kodne modele koji su dvostruko veći od Granite-a). Kao ilustracija, slika (gore) pokazuje poređenje Granite-8B-Code-Base sa drugim open-source osnovnim kodnim LLM-ovima, uključujući nedavne visoko-performantne general purpose osnovne LLM-ove poput Mistral ( , ) i LLama-3 ( , ) na HumanEvalPack ( , ). Dok CodeGemma i StarCoder2 pokazuju razumno dobre performanse u generiranju koda, značajno lošije performanse pokazuju na varijantama HumanEvalPack za ispravljanje i objašnjavanje koda. U proseku, Granite-8B-Code-Base nadmašuje najkonkurentniji CodeGemma-8B model za skoro 12 poena na HumanEvalPack (33.2% vs 21.3%), uprkos tome što je obučen na značajno manjem broju tokena (4.5T vs 7.5T tokena). Pored osnovnih modela, instrukcijski finetunovani varijanti naših Granite Code modela takođe pokazuju snažne performanse na HumanEvalPack, nadmašujući druge open-source (kod) instruktne modele, demonstrirajući prednosti za širi skup kodnih zadataka sa uputstvima na prirodnom jeziku (videti sliku (dole)). 1 Jiang et al. 2023b AI@Meta 2024 Muennighoff et al. 2023 1 Nadalje, budući da je rasuđivanje ključno za rešavanje komplikovanih pitanja i zadataka, testiramo i naš model Granite-8B-Code-Base na šest matematičkih benchmarkova, uključujući MATH ( , ), GSM8K ( , ) i rešavanje problema sa pristupom računarskim alatima, gde naš Granite 8B model postiže bolje performanse u poređenju sa većinom state-of-the-art 7B ili 8B LLM-ova. Na primer, 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 state-of-the-art performanse na različitim vrstama zadataka vezanih za kod, uključujući generisanje koda, objašnjavanje, ispravljanje, uređivanje, prevod, itd., demonstrirajući njihovu sposobnost da rešavaju raznolike kodne zadatke; Sveobuhvatni kodni LLM : Svi naši modeli su obučeni na podacima koji dozvoljavaju licenciranje, prikupljeni u skladu sa IBM-ovim principima etike AI i vođeni IBM-ovim korporativnim pravnim timom za upotrebu u preduzećima. Svi Granite Code modeli objavljeni su pod licencom Apache 2.0. Pouzdani LLM za preduzeća 1 Opisujemo ceo naš proces prikupljanja podataka, filtriranja i predprocesiranja u odeljku . Odeljak opisuje detalje arhitekture modela, nakon čega slede detalji treninga u Odeljku . Odeljak pruža detalje o instrukcijskom finetuningu, a Odeljak opisuje eksperimente i rezultate upoređujući Granite Code modele sa drugim open-source LLM-ovima. 2 3 4 5 6 2 Prikupljanje podataka U ovom odeljku opisujemo proces indeksiranja i filtriranja (Sec. ), deduplikacije (Sec. ), filtriranja HAP/PII (Sec. ) korišćenih za pripremu kodnih podataka za trening modela. Takođe pružamo pregled visokokvalitetnih podataka prirodnog jezika korišćenih za poboljšanje razumevanja jezika i matematičkog rasuđivanja modela. 2.1 2.2 2.3 2.1 Indeksiranje i filtriranje podataka Podaci za predobuku koda dobijeni su iz kombinacije javno dostupnih skupova podataka kao što su Github Code Clean , StarCoderdata , i dodatnih javnih spremišta koda i problema sa GitHub-a. Filtriramo sirove podatke kako bismo zadržali listu od 116 programskih jezika od preko 300 jezika, kao što je navedeno u Prilogu . Dodela podataka programskim jezicima vrši se isključivo na osnovu ekstenzije datoteke, slično kao StarCoder ( , ). Nakon filtriranja jezika, primenjujemo četiri ključna pravila filtriranja za uklanjanje koda nižeg kvaliteta ( , ): (1) ukloniti datoteke sa manje od 25% alfabetskih karaktera, (2) osim za XSLT jezik, filtrirati datoteke gde se string „<?xml version=” pojavljuje unutar prvih 100 karaktera, (3) za HTML datoteke, zadržati samo datoteke gde vidljivi tekst čini najmanje 20% HTML koda i ima minimalnu dužinu od 100 karaktera, (4) za JSON i YAML datoteke, zadržati samo datoteke koje imaju broj karaktera u rasponu od 50 do 5000 karaktera. Takođe filtriramo GitHub issues koristeći skup metrika kvaliteta koji uključuje uklanjanje automatski generisanog teksta, filtriranje ne-engleskih issues, isključivanje komentara od botova, i korišćenje broja korisnika uključenih u konverzaciju kao indikatora kvaliteta. Takođe, svaku kodnu datoteku anotiramo informacijama o licenci povezanoj sa odgovarajućim spremištem, pronađenim putem Github API-ja i zadržavamo samo datoteke sa dozvoljenim licencama za trening modela. 2 3 A Li et al. 2023a Li et al. 2023a 2.2 Precizna i neprecizna deduplikacija Usvajamo agresivnu strategiju deduplikacije koja uključuje preciznu i nepreciznu deduplikaciju radi uklanjanja dokumenata koji imaju (skoro) identičan kodni sadržaj u našem skupu za trening. Za preciznu deduplikaciju, prvo izračunavamo SHA256 heš na sadržaju dokumenta i uklanjamo zapise sa identičnim heševima. Nakon precizne deduplikacije, primenjujemo nepreciznu deduplikaciju sa ciljem uklanjanja kodnih datoteka koje mogu imati blage varijacije i time dodatno obezbjeđujemo podatke. Primjenjujemo dvostepenu metodu za ovo: (1) izračunavamo MinHash-eve svih dokumenata, a zatim koristimo Local Sensitive Hashing (LSH) za grupiranje dokumenata na osnovu njihovih MinHash otisaka, (2) mjerimo Jaccard sličnost između svakog para dokumenata u istoj grupi i bilježimo dokumente, osim jednog, kao duplikate na osnovu praga sličnosti od 0.7. Primjenjujemo ovaj proces skoro-deduplikacije na sve programske jezike, uključujući GitHub issues, kako bismo poboljšali bogatstvo i raznolikost skupa za trening. 2.3 Filtriranje HAP, PII, Malware-a Da bismo smanjili vjerovatnoću generisanja uvredljivog, zlostavljačkog ili prostog (HAP) jezika od strane modela, ulažemo marljive napore da filtriramo HAP sadržaj iz skupa za trening. Prvo kreiramo rječnik HAP ključnih riječi, a zatim svaki kodni dokument anotiramo brojem pojavljivanja takvih ključnih riječi u sadržaju, uključujući komentare. Filtriramo dokumente koji prelaze prag HAP-a, izračunat na osnovu distribucijske analize, kao i ručne inspekcije kodnih datoteka. Štaviše, radi zaštite privatnosti, slijedimo StarCoder ( , ) i ulažemo marljive napore da redaktujemo lične podatke koji se mogu identifikovati (PII) iz skupa za trening. Konkretno, 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 mijenja IP adresu sintetički generisanom IP adresom, kao u Li et al. (2023a). Takođe skeniramo naše skupove podataka pomoću kako bismo identifikovali i uklonili instance malware-a u izvornom kodu. Li et al. 2023a 4 2.4 Skupovi podataka prirodnog jezika Pored prikupljanja kodnih podataka za trening modela, kuriramo nekoliko javno dostupnih visokokvalitetnih skupova podataka prirodnog jezika za poboljšanje jezičke pismenosti modela i matematičkog rasuđivanja. Reprezentativni skupovi podataka pod ovom kategorijom uključuju web dokumente (Stackexchange, CommonCrawl), matematičke web tekstove (OpenWeb-Math; ( ), StackMathQA; ( )), akademske tekstove (Arxiv, Wikipedia), i skupove podataka za instrukcijski trening (FLAN; ( ), HelpSteer ( , )). Ne deduplikujemo ove već predprocesirane skupove podataka prirodnog jezika. Paster et al. 2023 Zhang 2024 Longpre et al. 2023 Wang et al. 2023 3 Arhitektura modela Obučavamo seriju kodnih modela različitih veličina zasnovanih na arhitekturi transformera sa dekoderom ( , ). Hiperparametri modela za ove modele dati su u Tabeli . Za sve arhitekture modela, koristimo pre-normalizaciju ( , ): normalizacija primenjena na ulaz u blokove pažnje i MLP. Vaswani et al. 2017 1 Xiong et al. 2020 : Najmanji model u porodici Granite-code modela obučen je sa RoPE embeddingom ( , ) i Multi-Head Attention ( , ). Ovaj model koristi swish funkciju aktivacije ( , ) sa GLU ( , ) za MLP, takođe poznatu kao swiglu. Za normalizaciju, koristimo RMSNorm ( , ) jer je računski efikasniji od LayerNorm ( , ). 3B model je obučen sa kontekstualnom dužinom 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, sa izuzetkom korišćenja Grouped-Query Attention (GQA) ( , ). Korišćenje GQA nudi bolji odnos između performansi modela i efikasnosti inferencije u ovom obimu. Obučavamo 8B model sa kontekstualnom dužinom od 4096 tokena. 8B Ainslie et al. 2023 : 20B kodni model obučen je sa naučenim apsolutnim pozicionim embeddingima. Koristimo Multi-Query Attention ( , ) tokom treninga za efikasnu nizvodnu inferenciju. Za MLP blok, koristimo GELU funkciju aktivacije ( , ). Za normalizaciju aktivacija, koristimo LayerNorm ( , ). Ovaj model je obučen sa kontekstualnom dužinom od 8192 tokena. 20B Shazeer 2019 Hendrycks & Gimpel 2023 Ba et al. 2016 : Da bismo obučili 34B model, slijedimo pristup Kim et al. ( ) za povećanje dubine 20B modela. Specifično, prvo dupliramo 20B kodni model sa 52 sloja, a zatim uklanjamo posljednjih 8 slojeva iz originalnog modela i prvih 8 slojeva iz njegovog duplikata kako bismo formirali dva modela. 34B Kim et al. Konačno, spajamo oba modela kako bismo formirali Granite-34B-Code model sa 88 slojeva (videti sliku 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 Kim et al. ( ). Ova performansa se prilično brzo oporavlja nakon što nastavimo predobuku proširenog 34B modela. Slično kao 20B, koristimo kontekst od 8192 tokena tokom predobuke. 2 Kim et al. 4 Predobuka U ovom odeljku pružamo detalje o dvofaznom treningu (Sec. ), ciljevima treninga (Sec. ), optimizaciji (Sec. ) i infrastrukturi (Sec. ) korišćenim u predobuci modela. 4.1 4.2 4.3 4.4 4.1 Dvofazni trening Granite Code modeli obučeni su na 3.5T do 4.5T tokena kodnih podataka i podataka prirodnog jezika vezanih za kod. Podaci su tokenizovani putem byte pair encoding (BPE, ( , )), koristeći isti tokenizer kao StarCoder ( , ). Slijedeći ( , ; , ), koristimo visokokvalitetne podatke sa dva faze treninga kako slijedi. 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čeni su za 4 triliona tokena kodnih podataka koji obuhvataju 116 jezika. Model od 20B parametara obučen je na 3 triliona tokena koda. Model 34B obučen je na 1.4T tokena nakon povećanja dubine koje je izvršeno na 1.6T čekpointu 20B modela. Faza 1 (samo trening 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 rasuđivanja i rešavanja problema, koje su neophodne za generisanje koda. Obučavamo sve naše modele za 500B tokena (80% koda i 20% podataka na jeziku) u fazi 2 treninga. Faza 2 (trening koda + jezika) 4.2 Cilj treninga Za trening svih naših modela koristimo cilj kauzalnog jezičkog modeliranja i Fill-In-the-Middle (FIM) ( , ) cilj. FIM cilj je predvideti umetnute tokene 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 relevantnim kontrolnim tokenima formatiranja, isto kao 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 treninga i otkrili da to dobro funkcioniše u praksi, vodeći ka SOTA performansama na zadacima dopunjavanja koda i umetanja koda. Treba napomenuti da se FIM cilj koristi α