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 revolucionišu proces razvoja softvera. Sve se više, LLM-ovi za kod integrišu u okruženja za razvoj softvera kako bi poboljšali produktivnost ljudskih programera, a agenti zasnovani na LLM-ovima počinju da pokazuju obećavajuće rezultate u autonomnom rešavanju složenih zadataka. 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 repozitorijuma i još mnogo toga. U ovom radu predstavljamo seriju Granite modela sa dekoderom za generativne zadatke koda, obučenih na kodu napisanom na 116 programskih jezika. Porodica modela Granite Code sastoji se od modela veličine od 3 do 34 milijarde parametara, pogodnih za aplikacije od složenih zadataka modernizacije aplikacija do slučajeva upotrebe sa ograničenom memorijom na uređaju. Evaluacija na sveobuhvatnom setu zadataka pokazuje da modeli Granite Code dosledno dostižu performanse na najvišem nivou među dostupnim open-source LLM-ovima za kod. Porodica modela Granite Code optimizovana je za radne tokove razvoja softvera u preduzećima i dobro funkcioniše u širokom spektru zadataka kodiranja (npr. generisanje koda, ispravljanje i objašnjavanje), što ga čini svestranim "sveobuhvatnim" 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 Tokom poslednjih nekoliko decenija, softver se utkao u tkivo svakog aspekta našeg društva. Kako potražnja za razvojem softvera raste, od ključnog je značaja povećati produktivnost razvoja softvera, a LLM-ovi pružaju obećavajući put za proširenje mogućnosti ljudskih programera. Istaknuti slučajevi upotrebe 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 razni modeli sa impresivnim mogućnostima kodiranja. Modeli se kreću 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 variraju u opštoj nameni, pri čemu neki modeli ciljaju na širok spektar upotreba izvan koda, dok se drugi fokusiraju prvenstveno 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), CodeGemma (CodeGemma Team et al., 2024)). Međutim, postoje važni nedostaci 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 pakovanju, ali performanse u zadacima kodiranja 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 optereć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 visokokapacitetnih 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 temeljni modeli za zadatke vezane za kod; Granite Code Base: modeli za praćenje instrukcija fino-podešeni korišćenjem kombinacije Git commit-a uparenih sa ljudskim instrukcijama i open-source sintetički generisanih skupova podataka za instrukcije koda. Granite Code Instruct: Osnovni modeli u seriji obučeni su 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, 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 domena koda i prirodnog jezika kako bi se poboljšala sposobnost modela da rasuđuje. Koristimo cilj neumsko jezičkog modelovanja 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 open-source matematičkih skupova podataka (MathInstruct ( , ) i MetaMathQA ( , )), uključujući sintetički generisane skupove podataka koda za poboljšanje 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 Obavljamo opsežne evaluacije naših LLM-ova za kod na sveobuhvatnom setu benchmark-a, uključujući HumanEvalPack ( , ), MBPP(+) ( , ; , ), RepoBench ( , ), ReCode ( , ), i još mnogo toga. Ovaj set benchmark-a 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 open-source modelima, Granite Code modeli generalno pokazuju veoma jake performanse na svim veličinama modela i benchmark-ima (često nadmašujući druge open-source kod modele koji su dvostruko veći u poređenju sa Granite-om). Kao ilustracija, slika (gore) pokazuje poređenje Granite-8B-Code-Base sa drugim open-source osnovnim LLM-ovima za kod, uključujući nedavne visoko-performantne generalne osnovne LLM-ove kao što su Mistral ( , ) i LLama-3 ( , ) na HumanEvalPack ( , ). Dok CodeGemma i StarCoder2 postižu solidne rezultate u generisanju koda, značajno lošije rezultate postižu 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%), iako je obučen na znatno manjem broju tokena (4.5T naspram 7.5T tokena). Pored osnovnih modela, fino-podešeni varijanti naših Granite Code modela takođe pokazuju jake performanse na HumanEvalPack, nadmašujući druge open-source (kod) instrukcijske modele, demonstrirajući prednosti za širi set zadataka kodiranja sa instrukcijama na prirodnom jeziku (vidi sliku (dole)). 1 Jiang et al. 2023b AI@Meta 2024 Muennighoff et al. 2023 1 Nadalje, pošto je rasuđivanje ključno za rešavanje komplikovanih pitanja i zadataka, takođe testiramo naš Granite-8B-Code-Base model na šest matematičkih benchmark-a, 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 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 najsavremenije performanse na različitim vrstama zadataka vezanih za kod, uključujući generisanje koda, objašnjavanje, ispravljanje, uređivanje, prevod, itd., demonstrirajući svoju sposobnost da rešavaju raznolike zadatke kodiranja; Sveobuhvatni LLM za kod : Svi naši modeli su obučeni na podacima dozvoljenim licencom prikupljenim u skladu sa IBM-ovim principima etike veštačke inteligencije i vođeni IBM-ovim timom za korporativnu pravnu službu za pouzdanu upotrebu u preduzećima. Svi Granite Code modeli objavljeni su pod licencom Apache 2.0. Pouzdan LLM za preduzeća 1 Celokupan naš pipeline za prikupljanje, filtriranje i predprocesiranje podataka opisan je 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 open-source LLM-ovima. 2 3 4 5 6 2 Prikupljanje podataka U ovom delu opisujemo proces prikupljanja 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 veština modela za razumevanje jezika i matematičko rasuđivanje. 2.1 2.2 2.3 2.1 Prikupljanje i filtriranje podataka Podaci koda za pred-obuku potiču iz kombinacije javno dostupnih skupova podataka kao što su Github Code Clean , StarCoderdata , i dodatni javni repozitorijumi koda i problemi sa GitHub-a. Filtriramo sirove podatke kako bismo zadržali listu od 116 programskih jezika od preko 300+ jezika, kako je navedeno u Dodatku . 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 kako bismo uklonili kod 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 probleme koristeći set 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 povezanim sa odgovarajućim repozitorijumom, pronađenim preko GitHub API-ja i zadržavamo samo datoteke sa permisivnim 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 koji imaju identične heševe. Nakon tačne deduplikacije, primenjujemo nepreciznu deduplikaciju sa ciljem uklanjanja datoteka koda koje mogu imati blage varijacije i time dodatno nepristrasno obrađujemo podatke. Za ovo primenjujemo dvostepenu metodu: (1) izračunavamo MinHasheve svih dokumenata i zatim koristimo Locally Sensitive Hashing (LSH) za grupisanje 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. Primjenjujemo 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 Filtriranje HAP, PII, malvera Da bismo smanjili verovatnoću generisanja hejtovanog, uvredljivog ili prostog (HAP) jezika iz 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 anotiramo svaki dokument koda brojem pojavljivanja takvih ključnih reči u sadržaju, uključujući komentare. Filtriramo dokumente koji prelaze prag HAP, izračunat na osnovu distribuirane analize, kao i ručne inspekcije datoteka koda. Nadalje, radi zaštite privatnosti, pratimo StarCoder ( , ) i ulažemo marljive napore da redigujemo lične identifikacione podatke (PII) iz skupa za obuku. Konkretno, koristimo StarPII model za detekciju IP adresa, ključeva, imejl adresa, imena, korisničkih imena i lozinki pronađenih u sadržaju. Korak redigovanja PII zamenjuje PII tekst odgovarajućim tokenima NAME , EMAIL , KEY i 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 kako bismo identifikovali i uklonili instance malvera u izvornom kodu. Li et al. 2023a 4 2.4 Skupovi podataka na prirodnom jeziku Pored prikupljanja podataka koda za obuku modela, kuriramo nekoliko javno dostupnih visokokvalitetnih skupova podataka na prirodnom jeziku za poboljšanje modelove veštine u razumevanju jezika i matematičkom rasuđivanju. 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 modela koda različitih veličina zasnovanih na transformer dekoderskoj arhitekturi ( , ). Hiperparametri modela za ove modele dati su u Tabeli . Za sve arhitekture modela koristimo pre-normalizaciju ( , ): normalizacija primenjena na ulaz pažnje i MLP blokova. Vaswani et al. 2017 1 Xiong et al. 2020 : Najmanji model u porodici Granite-code obučen je sa RoPE embeddingom ( , ) i Multi-Head Attention ( , ). Ovaj model koristi swish aktivacionu funkciju ( , ) sa GLU ( , ) za MLP, što je takođe uobičajeno poznato 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 balans 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 kod model je obučen sa naučenim apsolutnim pozicionim embedding-ima. Koristimo Multi-Query Attention ( , ) tokom obuke za efikasnu nizvodnu inferenciju. Za MLP blok, koristimo GELU aktivacionu funkciju ( , ). 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 : Za obuku 34B modela, sledimo pristup za povećanje dubine 20B modela. Specifično, prvo dupliramo 20B kod model sa 52 sloja, a zatim uklanjamo zadnja 8 sloja iz originalnog modela i prva 8 sloja iz njegovog duplikata da bismo formirali dva modela. 34B Kim et al. Konačno, konkateneramo oba modela da bismo formirali Granite-34B-Code model sa 88 sloja (videti sliku za ilustraciju). Nakon povećanja dubine, primećujemo da je pad performansi u poređenju sa 20B modelom prilično mali, za razliku od onoga što su primećivali . Ove performanse se prilično brzo oporavljaju nakon što nastavimo sa pred-obukom uvećanog 34B modela. Slično kao kod 20B, koristimo 8192 tokena konteksta tokom pred-obuke. 2 Kim et al. 4 Pred-obuka U ovom delu 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 se obučavaju na 3.5T do 4.5T tokena podataka koda i skupova podataka na prirodnom jeziku vezanih za kod. Podaci se tokenizuju pomoću byte pair encoding (BPE, ( , )), koristeći isti tokenizer kao StarCoder ( , ). Prateći ( , ; , ), koristimo visokokvalitetne podatke sa dve faze obuke na sledeći način. Sennrich et al. 2015 Li et al. 2023a Shen et al. 2024 Hu et al. 2024 • : Tokom faze 1, oba 3B i 8B modela se obučavaju za 4 triliona tokena podataka koda koji obuhvataju 116 jezika. Model od 20B parametara se obučava na 3 triliona tokena koda. Model od 34B se obučava na 1.4T tokena nakon povećanja dubine koje se vrši na čekpointu od 1.6T modela od 20B. Faza 1 (obuka samo koda) • : U fazi 2, uključujemo dodatne visokokvalitetne javno dostupne podatke iz različitih domena, uključujući tehničke, matematičke i veb dokumente, kako bismo dalje poboljšali performanse modela u veš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 obuke. Faza 2 (obuka koda + jezika) 4.2 Cilj obuke Za obuku svih naših modela koristimo cilj kauzalnog jezičkog modelovanja i cilj Fill-In-the-Middle (FIM) ( , ). FIM cilj je da predvidi umetnute tokene sa datim kontekstom i naknadnim tekstom. Obučavamo naše modele da rade sa oba režima, PSM (Prefiks-Sufiks-Sredina) i SPM (Sufiks-Prefiks-Sredina), sa relevantnim kontrolnim tokenima formatiranja, isto kao kod StarCoder-a ( , ). Bavarian et al. 2022 Li et al. 2023a Ukupan gubitak se računa kao ponderisana kombinacija 2 cilja: