```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 revolucionaliziraju 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 samostalnom rješavanju 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 repozitorija i još mnogo toga. U ovom radu predstavljamo seriju Granite modela dekodera samo 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 koje se kreću od složenih zadataka modernizacije aplikacija do slučajeva upotrebe s ograničenim memorijskim kapacitetom na uređaju. Evaluacija na sveobuhvatnom skupu zadataka pokazuje da modeli Granite Code dosljedno postižu najsuvremenije performanse među dostupnim open-source LLM-ovima za kod. Obitelj modela Granite Code optimizirana je za radne procese razvoja softvera za poduzeća i dobro se ponaša u nizu zadataka kodiranja (npr. generiranje, ispravljanje i objašnjavanje koda), što je čini svestranim "svestrannim" modelom koda. 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 je postao sastavni dio 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. Istaknuti slučajevi upotrebe LLM-ova u poduzećima za produktivnost razvoja softvera uključuju generiranje koda, objašnjavanje koda, ispravljanje koda, generiranje testova jedinica i dokumentacije, modernizaciju aplikacija, otkrivanje ranjivosti, prijevod koda i još mnogo toga. Posljednjih godina zabilježen je brzi napredak u sposobnosti LLM-ova da generiraju i manipuliraju kodom, a danas je dostupan niz modela s impresivnim mogućnostima 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, pri čemu neki modeli imaju za cilj pokriti niz upotreba izvan koda, dok su drugi prvenstveno fokusirani 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), CodeGemma (CodeGemma Team et al., 2024)). Međutim, postoje važni nedostaci u trenutnom polju LLM-ova za kod, posebno u kontekstu razvoja softvera za poduzeća. Prvo, dok 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 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 za model, što može narušiti povjerenje u modele u kritičnim i reguliranim kontekstima. Nadalje, uslovi licenciranja u današnjim otvorenim LLM-ovima mogu opteretiti i zakomplicirati sposobnost poduzeća da koristi model. Ovdje predstavljamo Granite Code modele, seriju visoko sposobnih LLM-ova za kod, dizajniranih za podršku razvoja softvera za poduzeća u širokom rasponu 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 s kodom; Granite Code Base: modeli za praćenje uputa finetunirani korištenjem kombinacije Git commitova uparenih s ljudskim uputama i open-source sintetički generiranih skupova podataka za upute u kodu. Granite Code Instruct: Osnovni modeli u seriji obučeni su od nule strategijom dvofaznog treninga. U fazi 1, naš model je obučen na 3 do 4 triliona tokena kodiranih na 116 programskih jezika, osiguravajući sveobuhvatno razumijevanje programskih jezika i sintakse. U fazi 2, naš model je dodatno obučen na 500 milijardi tokena sa pažljivo dizajniranom mješavinom visokokvalitetnih podataka iz domena koda i prirodnog jezika kako bi se poboljšala sposobnost modela za rasuđivanje. Koristimo nešpijunirani jezični modelni cilj za obuku osnovnih modela u obje faze treninga. Instruct modeli su izvedeni daljim finetuningom gore obučenih osnovnih modela na kombinaciji filtrirane varijante CommitPack ( , ), skupova podataka za praćenje jezičnih uputa (OASST ( , ), HelpSteer ( , )) i open-source matematičkih skupova podataka (MathInstruct ( , ) i MetaMathQA ( , )), uključujući sintetički generirane skupove podataka za kod kako bi se poboljšale sposobnosti praćenja uputa 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 skupu benchmarkova, uključujući HumanEvalPack ( , ), MBPP(+) ( , ; , ), RepoBench ( , ), ReCode ( , ), i još mnogo toga. Ovaj skup benchmarkova 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 open-source modelima, Granite Code modeli općenito pokazuju vrlo jake performanse u svim veličinama modela i na svim benchmarkovima (često nadmašujući druge open-source kod modele koji su dvostruko veći od Granite modela). Kao ilustracija, slika (gore) prikazuje poređenje Granite-8B-Code-Base s drugim open-source osnovnim kod LLM-ovima, uključujući nedavne visoko-performansne opće osnovne LLM-ove poput Mistral ( , ) i LLama-3 ( , ) na HumanEvalPack ( , ). Dok CodeGemma i StarCoder2 postižu prihvatljive rezultate u generiranju koda, značajno lošije postižu 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% naspram 21.3%), unatoč tome što je obučen na značajno manjem broju tokena (4.5T naspram 7.5T tokena). Osim osnovnih modela, i instruktivno podešeni varijanti naših Granite Code modela pokazuju jake performanse na HumanEvalPack, nadmašujući druge open-source (kod) instruktivne modele, demonstrirajuć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 rasuđivanje kritično za rješavanje složenih pitanja i zadataka, također testiramo naš model Granite-8B-Code-Base na šest matematičkih benchmarkova, uključujući MATH ( , ), GSM8K ( , ) i rješavanje problema s pristupom računarskim alatima, gdje naš Granite 8B model postiže bolje performanse 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 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 najsuvremenije performanse na različitim vrstama zadataka povezanih s kodom, uključujući generiranje koda, objašnjavanje, ispravljanje, uređivanje, prevođenje, itd., demonstrirajući svoju sposobnost rješavanja raznolikih zadataka kodiranja; Svestrani Code LLM : Svi naši modeli su obučeni na podacima dopuštenim licencama prikupljenim u skladu s IBM-ovim etičkim principima za AI i vođeni od strane IBM-ovog pravnog tima za pouzdanu upotrebu u poduzećima. Svi Granite Code modeli objavljeni su pod licencom Apache 2.0. Pouzdani LLM za poduzeća 1 Opisujemo naš cjelokupni postupak prikupljanja, filtriranja i predobrade podataka u sekciji . Sekcija opisuje detalje arhitekture modela, nakon čega slijede detalji treninga u Sekciji . Sekcija pruža detalje o instruktivnom finetuning-u, a Sekcija 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 dijelu opisujemo proces pretraživanja i filtriranja (Sec. ), deduplikacije (Sec. ), filtriranja HAP/PII (Sec. ) korištenih za pripremu podataka koda za trening modela. Također pružamo pregled visokokvalitetnih podataka prirodnog jezika korištenih za poboljšanje modelovog razumijevanja jezika i vještina matematičkog rasuđivanja. 2.1 2.2 2.3 2.1 Pretraživanje i filtriranje podataka Podaci za pretpripremu koda prikupljeni su iz kombinacije javno dostupnih skupova podataka poput Github Code Clean , StarCoderdata , te dodatnih javnih repozitorija koda i issues sa GitHub-a. Filtriramo sirove podatke kako bismo zadržali listu od 116 programskih jezika od preko 300 jezika, kao što je navedeno u Dodatku . Dodjela podataka programskim jezicima vrši se isključivo na osnovu ekstenzije datoteke, slično StarCoderu ( , ). Nakon filtriranja jezika, primjenjujemo četiri ključna pravila filtriranja kako bismo eliminirali kod nižeg kvaliteta ( , ): (1) uklanjanje datoteka s manje od 25% alfabetskih znakova, (2) osim za XSLT jezik, filtriranje datoteka gdje se niz " 2 3 A Li et al. 2023a Li et al. 2023a 2.2 Precizna i fuzzy deduplikacija Usvajamo agresivnu strategiju deduplikacije koja uključuje preciznu i fuzzy deduplikaciju kako bismo uklonili dokumente koji imaju (gotovo) identičan sadržaj koda u našem trening setu. Za preciznu deduplikaciju, prvo izračunavamo SHA256 hash na sadržaju dokumenta i uklanjamo zapise s identičnim hashovima. Nakon precizne deduplikacije, primjenjujemo fuzzy deduplikaciju s ciljem uklanjanja datoteka koda koje mogu imati manje varijacije i time dodatno uklanjamo pristranost u podacima. Primjenjujemo dvostepenu metodu za ovo: (1) izračunavamo MinHash-eve svih dokumenata i zatim koristimo Locally 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 anotiramo 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 trening seta podataka. 2.3 Filtriranje HAP, PII, Malware Kako bismo smanjili vjerovatnoću generiranja uvredljivog, zlostavljajućeg ili psovnog (HAP) jezika od strane modela, ulažemo marljive napore da filtriramo HAP sadržaj iz trening seta. Prvo kreiramo rječnik HAP ključnih riječi, a zatim svaki dokument koda 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. Nadalje, kako bismo zaštitili privatnost, pratimo StarCoder ( , ) i ulažemo marljive napore da cenzuriramo Lične Identifikacione Informacije (PII) iz trening seta. 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 cenzure 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 malware-a u izvornom kodu. Li et al. 2023a 4 2.4 Skupovi podataka na prirodnom jeziku Pored prikupljanja podataka koda za trening modela, kuriramo nekoliko javno dostupnih skupova podataka prirodnog jezika visokog kvaliteta za poboljšanje modelove sposobnosti razumijevanja jezika 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 instruktivni finetuning (FLAN; ( ), HelpSteer ( , )). Ne dedupliciramo ove već predprocesirane skupove podataka prirodnog jezika. 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 zasnovanih na arhitekturi dekodera transformera ( , ). Hiperparametri modela za ove modele dati su u Tabeli . Za sve arhitekture modela, koristimo pre-normalizaciju ( , ): normalizacija primijenjena na ulaz u blokove pažnje i MLP-a. Vaswani et al. 2017 1 Xiong et al. 2020 : Najmanji model u obitelji Granite-code modela treniran je s RoPE embeddingom ( , ) i Multi-Head Attention ( , ). Ovaj model koristi swish aktivacijsku funkciju ( , ) sa GLU ( , ) za MLP, također poznatu kao swiglu. Za normalizaciju, koristimo RMSNorm ( , ) jer je računski efikasniji od LayerNorm ( , ). 3B model je treniran s 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, s izuzetkom korištenja Grouped-Query Attention (GQA) ( , ). Korištenje GQA nudi bolji kompromis između performansi modela i efikasnosti inferencije u ovom obimu. Treniramo 8B model s kontekstualnom dužinom od 4096 tokena. 8B Ainslie et al. 2023 : 20B model za kod treniran je s naučenim apsolutnim pozicijskim embeddingima. Koristimo Multi-Query Attention ( , ) tijekom treninga za efikasnu nizvodnu inferenciju. Za MLP blok, koristimo GELU aktivacijsku funkciju ( , ). Za normalizaciju aktivacija, koristimo LayerNorm ( , ). Ovaj model je treniran s kontekstualnom dužinom 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. Specifično, prvo dupliciramo 20B kod model s 52 sloja, a zatim uklanjamo zadnjih 8 slojeva iz originalnog modela i prvih 8 slojeva iz njegove duplikacije kako bismo formirali dva modela. 34B Kim et al. Na kraju, spajamo oba modela kako bismo formirali Granite-34B-Code model sa 88 slojeva (pogledajte sliku 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 je primijetio . Ove performanse se prilično brzo oporavljaju nakon što nastavimo s pretpripremom uvećanog 34B modela. Slično kao kod 20B modela, koristimo kontekst od 8192 tokena tijekom pretpripreme. 2 Kim et al. 4 Pretpriprema U ovom dijelu pružamo detalje o dvofaznom treningu (Sec. ), ciljevima treninga (Sec. ), optimizaciji (Sec. ) i infrastrukturi (Sec. ) korištenim u pretpripremi 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 su tokenizirani pomoću byte pair encoding (BPE, ( , )), koristeći isti tokenizer kao StarCoder ( , ). Slijedeći ( , ; , ), koristimo visokokvalitetne podatke s dvije faze treninga kako slijedi. Sennrich et al. 2015 Li et al. 2023a Shen et al. 2024 Hu et al. 2024 • : Tijekom faze 1, oba 3B i 8B modela trenirana su na 4 triliona tokena kodiranih podataka koji obuhvataju 116 jezika. Model od 20B parametara treniran je na 3 triliona tokena koda. Model od 34B treniran je na 1.4T tokena nakon povećanja dubine koje je izvršeno na 1.6T checkpointu modela od 20B. 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 rasuđivanju i vještinama rješavanja problema, koji su neophodni za generiranje koda. Treniramo sve naše modele na 500B tokena (80% koda i 20% jezičnih podataka) u fazi 2 treninga. Faza 2 (trening koda + jezika) 4.2 Cilj treninga Za trening svih naših modela, koristimo cilj kauzalnog jezičnog modeliranja i cilj Fill-In-the-Middle (FIM) ( , ). FIM cilj je predvidjeti umetnute tokene s datim kontekstom i naknadnim tekstom. Treniramo naše modele da rade s oba načina rada, PSM (Prefix-Suffix-Middle) i SPM (Suffix-Prefix-Middle), s relevantnim kontrolnim tokenima za formatiranje, isto kao StarCoder ( , ). Bavarian et al. 2022 Li et al. 2023a Ukupan gubitak se izračunava kao ponderisana kombinacija 2 cilja: Empirijski smo postavili = 0.5 tijekom treninga i utvrdili smo da to dobro funkcionira u praksi, vodeći ka SOTA performansama na zadacima dovršavanja koda i umetanja koda. Treba napomenuti da se FIM cilj koristi samo tijekom pretpripreme, međutim mi ga odbacujemo tijekom finetuning-a uputa, tj. postavljamo = 1. α α