```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 Apstrakt Veliki jezički modeli (LLM) obučeni na kodu revolucioniziraju proces razvoja softvera. Sve se više LLM-ova za kod integriše u okruženja za razvoj softvera radi poboljšanja produktivnosti ljudskih programera, a agenti zasnovani na LLM-ovima počinju da pokazuju obećanje u autonomnom upravljanju složenim zadacima. Ostvarivanje punog potencijala LLM-ova za kod zahteva širok spektar mogućnosti, uključujući generisanje koda, ispravljanje grešaka, objašnjavanje i dokumentovanje koda, održavanje spremišta i još mnogo toga. U ovom radu predstavljamo seriju Granite kodnih modela samo dekodera za zadatke generisanja koda, obučene kodom napisanim na 116 programskih jezika. Porodica 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 sa ograničenim memorijskim prostorom na uređaju. Evaluacija na sveobuhvatnom skupu zadataka pokazuje da kodni modeli Granite Code dosledno dostižu performanse najsavremenije među dostupnim modelima LLM otvorenog koda. Porodica kodnih modela Granite Code optimizovana je za tokove rada u preduzećima za razvoj softvera i dobro se pokazala u nizu zadataka kodiranja (npr. generisanje koda, ispravljanje i objašnjavanje), čineći je svestranim "sveobuhvatnim" kodnim modelom. Svi naši kodni modeli Granite objavljujemo pod licencom Apache 2.0 za istraživačku i komercijalnu upotrebu. https://github.com/ibm-granite/granite-code-models 1 Uvod Tokom poslednjih nekoliko decenija, softver je postao sastavni deo svakog aspekta našeg društva. Kako potražnja za razvojem softvera raste, kritičnije je nego ikada povećati produktivnost razvoja softvera, a LLM-ovi predstavljaju obećavajući put za poboljšanje ljudskih programera. Istaknute primene u preduzećima za LLM-ove u produktivnosti razvoja softvera uključuju generisanje koda, objašnjavanje koda, ispravljanje koda, generisanje testova jedinica i dokumentacije, modernizaciju aplikacija, detekciju ranjivosti, prevod koda i još mnogo toga. Poslednjih godina postignut je brz napredak u sposobnosti LLM-ova da generišu i manipulišu kodom, a danas su dostupni različiti modeli 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 razlikuju se u opštosti nameravanih upotreba, pri čemu neki modeli imaju za cilj da pokriju niz upotreba izvan koda, dok su drugi primarno fokusirani 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 jazovi u trenutnoj oblasti LLM-ova za kod, posebno u kontekstu razvoja softvera u preduzećima. Prvo, dok veoma 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 generisanja koda u manjem i fleksibilnijem paketu, ali performanse u zadacima kodiranja izvan generisanja (npr. ispravljanje i objašnjavanje) mogu zaostati 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 kontekstima preduzeća, usvajanje LLM-ova za kod može biti dodatno komplikovano faktorima izvan performansi modela. Na primer, čak i otvoreni modeli su ponekad opterećeni nedostatkom transparentnosti o izvorima podataka i metodama obrade podataka koje su korišćene u modelu, što može umanjiti 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 dve glavne varijante koje objavljujemo u četiri različite veličine (3B, 8B, 20B i 34B): osnovni temelji modela za zadatke vezane za kod; Granite Code Base: modeli za praćenje instrukcija fino-podešeni korišćenjem kombinacije Git komita uparenih sa ljudskim instrukcijama i otvorenim skupovima podataka sa sintetički generisanim instrukcijama za kod. Granite Code Instruct: Osnovni modeli u seriji su obučeni od nule strategijom obuke u dve faze. U fazi 1, naš model je obučen na 3 do 4 triliona tokena dobijenih iz 116 programskih jezika, obezbeđujuć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 domena koda i prirodnog jezika kako bi se poboljšala sposobnost modela za rezonovanje. Koristimo cilj modeliranja jezika bez nadzora za obuku osnovnih modela u obe faze obuke. Instrukcijski modeli su izvedeni daljim fino-podešavanjem gore navedenih obučenih osnovnih modela na kombinaciji filtrirane varijante CommitPack ( , ), skupova podataka za praćenje instrukcija na prirodnom jeziku (OASST ( , ), HelpSteer ( , )) i otvorenih matematičkih skupova podataka (MathInstruct ( , ) i MetaMathQA ( , )), uključujući sintetički generisane skupove podataka za kod radi poboljšanja praćenja instrukcija i sposobnosti rezonovanja. Muennighoff et al. 2023 Ko¨ pf et al. 2023 Wang et al. 2023 Yue et al. 2023 Yu et al. 2023 Sprovodimo opsežne evaluacije naših kodnih LLM-ova na sveobuhvatnom skupu merila, uključujući HumanEvalPack ( , ), MBPP(+) ( , ; , ), RepoBench ( , ), ReCode ( , ), i još. Ovaj skup merila obuhvata mnoge različite vrste zadataka kodiranja pored 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 modelima otvorenog koda, Granite Code modeli generalno pokazuju veoma jake performanse u svim veličinama modela i merilima (često nadmašujući druge modele otvorenog koda koji su dvostruko veći u poređenju sa Granite-om). Kao ilustracija, slika (gore) pokazuje poređenje Granite-8B-Code-Base sa drugim osnovnim LLM-ovima otvorenog koda, uključujući nedavne visoko-performantne generalističke osnovne LLM-ove poput Mistral ( , ) i LLama-3 ( , ) na HumanEvalPack ( , ). Dok CodeGemma i StarCoder2 pokazuju razumne performanse u generisanju koda, značajno lošije se 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% naspram 21.3%), uprkos tome što je obučen na značajno manjem broju tokena (4.5T naspram 7.5T tokena). Pored osnovnih modela, fino-podešeni instrukcijski varijante naših Granite Code modela takođe pokazuju jake performanse na HumanEvalPack, nadmašujući druge modele otvorenog koda (za kod) sa instrukcijama, pokazujući prednosti za širi set zadataka kodiranja sa instrukcijama na prirodnom jeziku (videti sliku (dole)). 1 Jiang et al. 2023b AI@Meta 2024 Muennighoff et al. 2023 1 Nadalje, pošto je rezonovanje kritično za rešavanje komplikovanih pitanja i zadataka, testiramo naš Granite-8B-Code-Base model i na šest matematičkih merila, uključujući MATH ( , ), GSM8K ( , ) i rešavanje problema uz pristup računarskim alatima, gde naš Granite 8B model postiže bolje performanse u poređenju sa većinom najsavremenijih LLM-ova od 7B ili 8B parametara. 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 najsavremenije performanse na različitim vrstama zadataka povezanih sa kodom, uključujući generisanje koda, objašnjavanje, ispravljanje, uređivanje, prevođenje, itd., pokazujući svoju sposobnost da rešavaju raznolike zadatke kodiranja; Sveobuhvatan LLM za kod : Svi naši modeli su obučeni na podacima dozvoljenim za licenciranje prikupljenim u skladu sa IBM-ovim principima AI etike i vođeni IBM-ovim pravnim timom za korporativnu upotrebu od poverenja. Svi Granite Code modeli su objavljeni pod licencom Apache 2.0. Pouzdan LLM za preduzeća 1 Opisujemo naš kompletan cevovod za prikupljanje, filtriranje i pred-obradu podataka u sekciji . Sekcija opisuje detalje arhitekture modela, praćene detaljima 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 odeljku opisujemo proces skeniranja i filtriranja (Sec. ), deduplikacije (Sec. ), filtriranja HAP/PII (Sec. ) korišćenih za pripremu podataka koda za obuku modela. Takođe pružamo pregled visokokvalitetnih podataka na prirodnom jeziku korišćenih za poboljšanje jezičkog razumevanja modela i veština matematičkog rezonovanja. 2.1 2.2 2.3 2.1 Skeniranje i filtriranje podataka Podaci o pred-obuci koda su dobijeni 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 kod StarCoder-a ( , ). Nakon filtriranja jezika, primenjujemo četiri ključna pravila filtriranja da bismo eliminisali kod nižeg kvaliteta ( , ): (1) uklanjamo datoteke sa manje od 25% alfabetskih karaktera, (2) osim za XSLT jezik, filtriramo datoteke gde se niz „<?xml version=” pojavljuje unutar prvih 100 karaktera, (3) za HTML datoteke, zadržavamo 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žavamo samo datoteke koje imaju broj karaktera između 50 i 5000. Takođe filtriramo GitHub probleme koristeći skup metrika kvaliteta koji uključuje uklanjanje automatski generisanog teksta, filtriranje problema koji nisu na engleskom, isključivanje komentara botova, i korišćenje broja korisnika uključenih u konverzaciju kao pokazatelja kvaliteta. Takođe anotiramo svaku datoteku koda sa informacijama o licenci povezanom 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 koja uključuje i tačnu i nepreciznu deduplikaciju kako bismo uklonili dokumente koji imaju (skoro) identičan sadržaj koda u našem skupu za obuku. Za tačnu deduplikaciju, prvo izračunavamo SHA256 heš na sadržaju dokumenta i uklanjamo zapise sa identičnim heševima. Nakon tačne deduplikacije, primenjujemo nepreciznu deduplikaciju sa ciljem uklanjanja datoteka koda koje mogu imati male varijacije i time dalje izjednačavamo podatke. Za ovo primenjujemo dvostepenu metodu: (1) izračunavamo MinHash-eve svih dokumenata, a zatim koristimo Locally Sensitive Hashing (LSH) za grupiranje dokumenata na osnovu njihovih MinHash otisaka, (2) merimo 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. Primenjujemo ovaj proces skoro-deduplikacije na sve programske jezike, uključujući GitHub probleme, kako bismo poboljšali bogatstvo i raznolikost skupa za obuku. 2.3 HAP, PII, filtriranje malvera Da bismo smanjili verovatnoću generisanja uvredljivog, zlostavljačkog ili psovanog (HAP) jezika od strane modela, ulažemo marljive napore da filtriramo HAP sadržaj iz skupa za obuku. Prvo kreiramo rečnik HAP ključnih reči, a zatim svaki dokument koda anotišamo brojem pojavljivanja takvih ključnih reči u sadržaju, uključujući komentare. Filtriramo dokumente koji prelaze prag HAP, izračunat na osnovu distribucijske analize kao i ručne inspekcije datoteka koda. Štaviše, radi zaštite privatnosti, pratimo StarCoder ( , ) i ulažemo marljive napore da uklonimo lično identifikujuće informacije (PII) iz skupa za obuku. Konkretno, koristimo StarPII model za detekciju IP adresa, ključeva, email adresa, imena, korisničkih imena i lozinki pronađenih u sadržaju. Korak uklanjanja PII zamenjuje PII tekst odgovarajućim tokenima NAME, EMAIL, KEY, PASSWORD i menja IP adresu sintetički generisanom IP adresom, kao kod Li et al. (2023a). Takođe skeniramo naše skupove podataka pomoću da bismo identifikovali i uklonili slučajeve malvera u izvornom kodu. Li et al. 2023a 4 2.4 Skupovi podataka na prirodnom jeziku Pored prikupljanja podataka o kodu za obuku modela, kuriramo nekoliko javno dostupnih visokokvalitetnih skupova podataka na prirodnom jeziku radi poboljšanja veštine modela u razumevanju jezika i matematičkom rezonovanju. Reprezentativni skupovi podataka u ovoj kategoriji uključuju veb dokumente (Stackexchange, CommonCrawl), matematički veb tekst (OpenWeb-Math; ( ), StackMathQA; ( )), akademski tekst (Arxiv, Wikipedia), i skupove podataka za fino-podešavanje instrukcija (FLAN; ( ), HelpSteer ( , )). Ne deduplikujemo 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 Obučavamo seriju kodnih modela različitih veličina zasnovanih na arhitekturi transformatora dekodera ( , ). Hiperparametri modela za ove modele dati su u Tabeli . Za sve arhitekture modela, koristimo pre-normalizaciju ( , ): normalizacija primenjena na ulaz blokova za pažnju i MLP. Vaswani et al. 2017 1 Xiong et al. 2020 : Najmanji model u porodici Granite-code modela obučen je sa RoPE ugrađivanjem ( , ) 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 ( , ). Model od 3B 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 : Model od 8B ima sličnu arhitekturu kao model od 3B, sa izuzetkom korišćenja Grouped-Query Attention (GQA) ( , ). Korišćenje GQA nudi bolji odnos između performansi modela i efikasnosti zaključivanja u ovom obimu. Obučavamo model od 8B sa kontekstualnom dužinom od 4096 tokena. 8B Ainslie et al. 2023 : Kodni model od 20B obučen je sa naučenim apsolutnim pozicionim ugrađivanjima. Koristimo Multi-Query Attention ( , ) tokom obuke za efikasno naknadno zaključivanje. 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 model od 34B, pratimo pristup Kim et al. ( ) za povećanje dubine modela od 20B. Konkretno, prvo dupliramo kodni model od 20B sa 52 sloja, a zatim uklanjamo poslednjih 8 slojeva iz originalnog modela i prvih 8 slojeva iz njegovog duplikata da bismo formirali dva modela. 34B Kim et al. Na kraju, spajamo oba modela da bismo formirali Granite-34B-Code model sa 88 slojeva (videti sliku za ilustraciju). Nakon povećanja dubine, primećujemo da je pad performansi u poređenju sa modelom od 20B prilično mali, za razliku od onoga što su primetili Kim et al. ( ). Ove performanse se prilično brzo oporavljaju nakon što nastavimo sa pred-obukom uvećanog 34B modela. Slično kao kod 20B, koristimo kontekst od 8192 tokena tokom pred-obuke. 2 Kim et al. 4 Pred-obuka U ovom odeljku pružamo detalje o obuci u dve faze (Sec. ), ciljevima obuke (Sec. ), optimizaciji (Sec. ) i infrastrukturi (Sec. ) korišćenim u pred-obuci modela. 4.1 4.2 4.3 4.4 4.1 Obuka u dve faze Granite Code modeli obučeni su na 3.5T do 4.5T tokena podataka koda i skupova podataka na prirodnom jeziku povezanih sa kodom. Podaci se tokenizuju pomoću byte pair encoding (BPE, ( , )), koristeći isti tokenizator kao StarCoder ( , ). Sledi ( , ; , ), koristimo visokokvalitetne podatke sa dve faze obuke kako sledi. Sennrich et al. 2015 Li et al. 2023a Shen et al. 2024 Hu et al. 2024 • : Tokom faze 1, oba modela od 3B i 8B obučena su 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 je urađeno na čekpointu od 1.6T modela od 20B. Faza 1 (obuka samo koda) • : U fazi 2, uključujemo dodatne visokokvalitetne javno dostupne podatke iz raznih domena, uključujući tehničke, matematičke i veb dokumente, radi daljeg poboljšanja performansi modela u rezonovanju i veštinama rešavanja problema, koji su neophodni za generisanje koda. Obučavamo sve naše modele za 500B tokena (80% kodnih 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 modeliranja jezika sa kauzalnošću 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 moda, PSM (Prefiks-Sufiks-Sredina) i SPM (Sufiks-Prefiks-Sredina), sa relevantnim kontrolnim tokenima formatiranja, isto kao i StarCoder ( , ). Bavarian et al. 2022 Li et al. 2023a Ukupan gubitak se izračunava kao ponderisana kombinacija 2 cilja: