Auteurs: 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 Abstract Large Language Models (LLMs) getraind op code zijn een revolutie in het softwareontwikkelingsproces. Steeds vaker worden code LLM's geïntegreerd in softwareontwikkelomgevingen om de productiviteit van menselijke programmeurs te verbeteren, en LLM-gebaseerde agenten beginnen veelbelovend te zijn voor het autonoom afhandelen van complexe taken. Het realiseren van het volledige potentieel van code LLM's vereist een breed scala aan mogelijkheden, waaronder codegeneratie, fouten oplossen, code uitleggen en documenteren, repositories onderhouden, en meer. In dit werk introduceren we de Granite-serie van decoder-only code-modellen voor code-generatietaken, getraind met code geschreven in 116 programmeertalen. De Granite Code-modellenfamilie bestaat uit modellen variërend in grootte van 3 tot 34 miljard parameters, geschikt voor toepassingen variërend van complexe applicatie-moderniseringstaken tot geheugenbeperkte on-device use cases. Evaluatie op een uitgebreide set taken toont aan dat Granite Code-modellen consequent state-of-the-art prestaties leveren onder beschikbare open-source code LLM's. De Granite Code-model familie is geoptimaliseerd voor enterprise softwareontwikkelworkflows en presteert goed in een reeks codeertaken (bijv. codegeneratie, -reparatie en -uitleg), waardoor het een veelzijdig "allround" code-model is. We publiceren al onze Granite Code-modellen onder een Apache 2.0-licentie voor zowel onderzoek als commercieel gebruik. https://github.com/ibm-granite/granite-code-models 1 Introductie In de afgelopen decennia is software verweven geraakt met elk aspect van onze samenleving. Nu de vraag naar softwareontwikkeling piekt, is het cruciaaler dan ooit om de productiviteit van softwareontwikkeling te verhogen, en LLM's bieden een veelbelovend pad voor het ondersteunen van menselijke programmeurs. Prominente enterprise use cases voor LLM's in softwareontwikkelingsproductiviteit omvatten codegeneratie, code-uitleg, code-reparatie, unit test- en documentatiegeneratie, applicatie-modernisering, kwetsbaarheidsdetectie, codetranslatie, en meer. Recente jaren hebben snelle vooruitgang gezien in het vermogen van LLM's om code te genereren en te manipuleren, en een reeks modellen met indrukwekkende codeervaardigheden is vandaag de dag beschikbaar. Modellen variëren in grootte van enkele miljarden parameters (bijv. Llama-7B (Touvron et al., 2023), Gemma-7B (Gemma-Team et al., 2024), etc.) tot honderden miljarden: DBRX (Databricks), Arctic (Snowflake), Grok, Mixtral 8x22B (MistralAI), Command R+ (Cohere) en verschillen in de algemeenheid van het beoogde gebruik, waarbij sommige modellen gericht zijn op een reeks toepassingen buiten code, terwijl andere zich primair richten op codegerelateerde taken (bijv. StarCoder (Li et al., 2023a; Lozhkov et al., 2024), CodeGen (Nijkamp et al., 2023), CodeLlama (Rozie`re et al., 2023), en CodeGemma (CodeGemma Team et al., 2024)). Er blijven echter belangrijke lacunes bestaan in het huidige veld van LLM's voor code, met name in de context van enterprise softwareontwikkeling. Ten eerste, hoewel zeer grote, generalistische LLM's uitstekende codeerprestaties kunnen behalen, maakt hun omvang ze duur om te implementeren. Kleinere codegerichte modellen ( , ; , ; , ; , ; , ) kunnen uitstekende codegeneratieprestaties leveren in een kleiner en flexibeler pakket, maar prestaties in coderingstaken naast generatie (bijv. reparatie en uitleg) kunnen achterblijven bij codegeneratieprestaties. Li et al. 2023a Lozhkov et al. 2024 Nijkamp et al. 2023 Rozie`re et al. 2023 CodeGemma Team et al. 2024 In veel enterprise-contexten wordt de adoptie van code LLM's verder bemoeilijkt door factoren die verder gaan dan de prestaties van de modellen. Zo kampen zelfs open modellen soms met een gebrek aan transparantie over de databronnen en dataprocessingmethoden die in het model zijn verwerkt, wat het vertrouwen in modellen in bedrijfskritische en gereguleerde contexten kan aantasten. Bovendien kunnen licentievoorwaarden in de huidige open LLM's de mogelijkheden van een onderneming om een model te gebruiken, belemmeren en compliceren. Hier presenteren we Granite Code-modellen, een reeks zeer capabele code LLM's, ontworpen om enterprise softwareontwikkeling te ondersteunen bij een breed scala aan codeertaken. Granite Code-modellen hebben twee hoofdvarianten die we in vier verschillende groottes (3B, 8B, 20B en 34B) uitbrengen: basis fundamentmodellen voor codegerelateerde taken; Granite Code Base: instructievolgende modellen die zijn verfijnd met een combinatie van Git commits gekoppeld aan menselijke instructies en open-source synthetisch gegenereerde code-instructiedatasets. Granite Code Instruct: De basismodellen in de reeks zijn vanaf nul getraind met een tweefasige trainingsstrategie. In fase 1 wordt ons model getraind op 3 tot 4 biljoen tokens afkomstig uit 116 programmeertalen, wat zorgt voor een uitgebreid begrip van programmeertalen en syntaxis. In fase 2 wordt ons model verder getraind op 500 miljard tokens met een zorgvuldig ontworpen mix van hoogwaardige gegevens uit code- en natuurlijke taal domeinen om het vermogen van het model om te redeneren te verbeteren. We gebruiken de unsupervised language modeling objective om de basismodellen in beide trainingsfasen te trainen. De instructmodellen zijn afgeleid door verdere finetuning van de bovengenoemde getrainde basismodellen op een combinatie van een gefilterde variant van CommitPack ( , ), natuurlijke taal instructievolgende datasets (OASST ( , ), HelpSteer ( , )) en open-source wiskundige datasets (MathInstruct ( , ) en MetaMathQA ( , )), inclusief synthetisch gegenereerde code datasets voor het verbeteren van instructievolgende en redeneervaardigheden. Muennighoff et al. 2023 Ko¨ pf et al. 2023 Wang et al. 2023 Yue et al. 2023 Yu et al. 2023 We voeren uitgebreide evaluaties uit van onze code LLM's op een uitgebreide set benchmarks, waaronder HumanEvalPack ( , ), MBPP(+) ( , ; , ), RepoBench ( , ), ReCode ( , ), en meer. Deze set benchmarks omvat vele verschillende soorten codeertaken naast alleen codesynthese in Python, bijv. code reparatie, code uitleg, code bewerking, codetranslatie, etc., in de meeste belangrijke programmeertalen (Python, JavaScript, Java, Go, C++, Rust, etc.). Muennighoff et al. 2023 Austin et al. 2021 Liu et al. 2023a Liu et al. 2023b Wang et al. 2022 Onze bevindingen laten zien dat, onder open-source modellen, de Granite Code-modellen over het algemeen zeer sterke prestaties laten zien over alle modelgroottes en benchmarks (vaak beter presterend dan andere open-source code-modellen die twee keer zo groot zijn als Granite). Als illustratie toont figuur (boven) een vergelijking van Granite-8B-Code-Base met andere open-source base code LLM's, inclusief recente hoog presterende general-purpose base LLM's zoals Mistral ( , ) en LLama-3 ( , ) op HumanEvalPack ( , ). Terwijl CodeGemma en StarCoder2 redelijk goed presteren bij het genereren van code, presteren ze significant slechter op de code reparatie- en uitlegvarianten van HumanEvalPack. Gemiddeld presteert Granite-8B-Code-Base bijna 12 punten beter dan het meest competitieve CodeGemma-8B-model op HumanEvalPack (33,2% vs. 21,3%), ondanks dat het is getraind op een significant kleiner aantal tokens (4,5T vs. 7,5T tokens). Naast basismodellen laten de instructie-gefinetunede varianten van onze Granite Code-modellen ook sterke prestaties zien op HumanEvalPack, beter presterend dan andere open-source (code) instructiemodellen, wat de voordelen aantoont voor een bredere set van codertaken met natuurlijke taalinstructies (zie figuur (onder)). 1 Jiang et al. 2023b AI@Meta 2024 Muennighoff et al. 2023 1 Bovendien, aangezien redeneren cruciaal is voor het oplossen van ingewikkelde vragen en taken, testen we ook ons Granite-8B-Code-Base model op zes wiskundige benchmarks, waaronder MATH ( , ), GSM8K ( , ) en probleemoplossing met toegang tot computationele tools, waarbij ons Granite 8B-model betere prestaties behaalt in vergelijking met de meeste state-of-the-art 7B of 8B LLM's. Bijvoorbeeld, Granite-8B-Code-Base presteert ongeveer 12 punten beter dan Llama-3-8B-Base op GSM8K en ongeveer 6 punten beter op MATH (zie tabel ). Cobbe et al. 2021 Cobbe et al. 2021 15 De belangrijkste voordelen van Granite Code-modellen zijn: : Granite Code-modellen leveren concurrerende of state-of-the-art prestaties op verschillende soorten codegerelateerde taken, waaronder codegeneratie, uitleg, reparatie, bewerking, vertaling, etc., wat hun vermogen aantoont om diverse codeertaken op te lossen; All-rounder Code LLM : Al onze modellen zijn getraind op licentie-toegestane gegevens die zijn verzameld volgens IBM's AI Ethics principes en geleid door IBM's Corporate Legal team voor betrouwbaar enterprise-gebruik. Alle Granite Code-modellen worden uitgebracht onder de Apache 2.0-licentie. Betrouwbaar Enterprise-Grade LLM 1 We beschrijven onze volledige data-verzameling, filtering en preprocessing pipeline in sectie . Sectie beschrijft de details van de modelarchitectuur, gevolgd door trainingsdetails in Sectie . Sectie biedt de details over instructie-tuning, en Sectie beschrijft de experimenten en resultaten ter vergelijking van Granite Code-modellen met andere open-source LLM's. 2 3 4 5 6 2 Gegevensverzameling In deze sectie beschrijven we het proces van crawling en filtering (Sec. ), deduplicatie (Sec. ), HAP/PII filtering (Sec. ) die zijn gebruikt om de codegegevens voor modeltraining voor te bereiden. We geven ook een overzicht van hoogwaardige natuurlijke taal gegevens die zijn gebruikt om het taalbegrip en de wiskundige redeneervaardigheden van het model te verbeteren. 2.1 2.2 2.3 2.1 Data Crawling en Filtering De pretraining code data is afkomstig uit een combinatie van publiek beschikbare datasets zoals Github Code Clean , StarCoderdata , en aanvullende openbare code repositories en issues van GitHub. We filteren ruwe gegevens om een lijst van 116 programmeertalen te behouden uit meer dan 300 talen, zoals vermeld in Bijlage . De toewijzing van gegevens aan programmeertalen gebeurt uitsluitend op basis van de bestandsextensie, vergelijkbaar met StarCoder ( , ). Na taalfiltering passen we vier belangrijke filterregels toe om code van lagere kwaliteit te verwijderen ( , ): (1) verwijder bestanden met minder dan 25% alfabetische tekens, (2) behalve voor de XSLT-taal, filter bestanden waar de string "<?xml version=” verschijnt binnen de eerste 100 tekens, (3) voor HTML-bestanden, behoud alleen bestanden waarbij de zichtbare tekst ten minste 20% van de HTML-code uitmaakt en een minimale lengte van 100 tekens heeft, (4) voor JSON- en YAML-bestanden, behoud alleen bestanden die een tekenaantal hebben tussen 50 en 5000 tekens. We filteren ook GitHub-issues met behulp van een set kwaliteitsstatistieken, waaronder het verwijderen van automatisch gegenereerde tekst, het filteren van niet-Engelse issues, het uitsluiten van reacties van bots, en het gebruiken van het aantal gebruikers dat deelneemt aan het gesprek als indicator van kwaliteit. We annoteren ook elk codebestand met licentie-informatie die bij de respectievelijke repository hoort, gevonden via GitHub API's en behouden alleen bestanden met permissieve licenties voor modeltraining. 2 3 A Li et al. 2023a Li et al. 2023a 2.2 Exacte en Fuzzy Deduplicatie We hanteren een agressieve deduplicatiestrategie, inclusief zowel exacte als fuzzy deduplicatie, om documenten met (bijna) identieke code-inhoud uit onze trainingsset te verwijderen. Voor exacte deduplicatie berekenen we eerst de SHA256-hash van de documentinhoud en verwijderen we records met identieke hashes. Na exacte deduplicatie passen we fuzzy deduplicatie toe met als doel codebestanden te verwijderen die lichte variaties kunnen hebben en daardoor de gegevens verder te ontlasten. We passen hiervoor een tweestapsmethode toe: (1) bereken MinHashes van alle documenten en gebruik vervolgens Locally Sensitive Hashing (LSH) om documenten te groeperen op basis van hun MinHash-vingerafdrukken, (2) meet de Jaccard-gelijkenis tussen elk paar documenten in dezelfde bucket en annoteer documenten behalve één als duplicaten op basis van een gelijkenisdrempel van 0,7. We passen dit bijna-deduplicatieproces toe op alle programmeertalen, inclusief GitHub-issues, om de rijkdom en diversiteit van de trainingsdataset te vergroten. 2.3 HAP, PII, Malware Filtering Om de kans op het genereren van haatdragende, beledigende of profane (HAP) taal uit de modellen te verminderen, doen we nauwgezet inspanningen om HAP-inhoud uit de trainingsset te filteren. We maken eerst een woordenlijst van HAP-zoekwoorden en annoteren vervolgens elk code document met het aantal voorkomens van dergelijke zoekwoorden in de inhoud, inclusief commentaar. We filteren documenten die de HAP-drempel overschrijden, berekend op basis van een distributionele analyse en handmatige inspectie van codebestanden. Bovendien volgen we, om privacy te beschermen, StarCoder ( , ) en doen we nauwgezet inspanningen om Persoonlijk Identificeerbare Informatie (PII) uit de trainingsset te anonimiseren. Specifiek maken we gebruik van het StarPII -model om IP-adressen, sleutels, e-mailadressen, namen, gebruikersnamen en wachtwoorden in de inhoud te detecteren. De PII-anonimisatiestap vervangt de PII-tekst door de corresponderende tokens NAME , EMAIL , KEY , PASSWORD en verandert het IP-adres met een synthetisch gegenereerd IP-adres, zoals in Li et al. (2023a). We scannen ook onze datasets met om gevallen van malware in de broncode te identificeren en te verwijderen. Li et al. 2023a 4 2.4 Natuurlijke Taal Datasets Naast het verzamelen van codegegevens voor modeltraining, stellen we verschillende publiek beschikbare hoogwaardige natuurlijke taal datasets samen om de vaardigheid van het model in taalbegrip en wiskundige redenering te verbeteren. Representatieve datasets onder deze categorie omvatten webdocumenten (Stackexchange, CommonCrawl), wiskundige webteksten (OpenWeb-Math; ( ), StackMathQA; ( )), academische teksten (Arxiv, Wikipedia), en instructie-tuning datasets (FLAN; ( ), HelpSteer ( , )). We dedupliceren deze reeds voorbewerkte natuurlijke taal datasets niet. Paster et al. 2023 Zhang 2024 Longpre et al. 2023 Wang et al. 2023 3 Model Architectuur We trainen een reeks code-modellen van verschillende groottes op basis van de transformer decoder architectuur ( , ). De model hyperparameters voor deze modellen worden gegeven in Tabel . Voor alle modelarchitecturen gebruiken we pre-normalisatie ( , ): normalisatie toegepast op de input van attentie- en MLP-blokken. Vaswani et al. 2017 1 Xiong et al. 2020 : Het kleinste model in de Granite-code model familie is getraind met RoPE embedding ( , ) en Multi-Head Attention ( , ). Dit model gebruikt de swish activatiefunctie ( , ) met GLU ( , ) voor de MLP, ook wel bekend als swiglu. Voor normalisatie gebruiken we RMSNorm ( , ) omdat het computationeel efficiënter is dan LayerNorm ( , ). Het 3B-model is getraind met een contextlengte van 2048 tokens. 3B Su et al. 2023 Vaswani et al. 2017 Ramachandran et al. 2017 Shazeer 2020 Zhang & Sennrich 2019 Ba et al. 2016 : Het 8B-model heeft een vergelijkbare architectuur als het 3B-model, met uitzondering van het gebruik van Grouped-Query Attention (GQA) ( , ). Het gebruik van GQA biedt een betere afweging tussen modelprestaties en inferentie-efficiëntie op deze schaal. We trainen het 8B-model met een contextlengte van 4096 tokens. 8B Ainslie et al. 2023 : Het 20B code-model is getraind met geleerde absolute positie-embeddings. We gebruiken Multi-Query Attention ( , ) tijdens training voor efficiënte downstream-inferentie. Voor het MLP-blok gebruiken we de GELU activatiefunctie ( , ). Voor het normaliseren van de activaties gebruiken we LayerNorm ( , ). Dit model is getraind met een contextlengte van 8192 tokens. 20B Shazeer 2019 Hendrycks & Gimpel 2023 Ba et al. 2016 : Om het 34B-model te trainen, volgen we de aanpak van voor diepte-opschaling van het 20B-model. Specifiek dupliceren we eerst het 20B code-model met 52 lagen en verwijderen we vervolgens de laatste 8 lagen van het originele model en de eerste 8 lagen van de duplicaten om twee modellen te vormen. 34B Kim et al. Tot slot voegen we beide modellen samen om het Granite-34B-Code model te vormen met 88 lagen (zie Figuur voor een illustratie). Na de diepte-opschaling observeren we dat de prestatiedaling vergeleken met het 20B-model erg klein is, in tegenstelling tot wat werd waargenomen door . Deze prestatie wordt vrij snel hersteld nadat we de pretraining van het opgeschaalde 34B-model voortzetten. Net als bij het 20B-model gebruiken we een context van 8192 tokens tijdens pretraining. 2 Kim et al. 4 Pretraining In deze sectie geven we details over de tweefasige training (Sec. ), trainingsdoelen (Sec. ), optimalisatie (Sec. ) en infrastructuur (Sec. ) die zijn gebruikt bij het pretrainen van de modellen. 4.1 4.2 4.3 4.4 4.1 Tweefasige Training Granite Code-modellen worden getraind op 3,5T tot 4,5T tokens aan codegegevens en natuurlijke taal datasets gerelateerd aan code. Gegevens worden getokeniseerd via byte pair encoding (BPE, ( , )), waarbij dezelfde tokenizer wordt gebruikt als StarCoder ( , ). Volgens ( , ; , ) gebruiken we hoogwaardige gegevens met twee trainingsfasen als volgt. Sennrich et al. 2015 Li et al. 2023a Shen et al. 2024 Hu et al. 2024 • : Tijdens fase 1 worden zowel de 3B- als 8B-modellen getraind op 4 biljoen tokens aan codegegevens die 116 talen omvatten. Het 20B parameter model wordt getraind op 3 biljoen tokens code. Het 34B-model wordt getraind op 1,4T tokens na de diepte-opschaling, die wordt uitgevoerd op de 1,6T checkpoint van het 20B-model. Fase 1 (alleen code training) • : In fase 2 nemen we aanvullende hoogwaardige publiek beschikbare gegevens uit verschillende domeinen op, waaronder technische, wiskundige en webdocumenten, om de prestaties van het model op het gebied van redeneren en probleemoplossende vaardigheden verder te verbeteren, die essentieel zijn voor codegeneratie. We trainen al onze modellen voor 500 miljard tokens (80% code en 20% taalgegevens) in fase 2 training. Fase 2 (code + taal training) 4.2 Trainingsdoel Voor de training van al onze modellen gebruiken we de causale taalmodellering objective en de Fill-In-the-Middle (FIM) ( , ) objective. De FIM-objective heeft als taak het voorspellen van ingevoegde tokens met de gegeven context en de daaropvolgende tekst. We trainen onze modellen om te werken met zowel PSM (Prefix-Suffix-Middle) als SPM (Suffix-Prefix-Middle) modi, met relevante opmaak controletokens, net als StarCoder ( , ). Bavarian et al. 2022 Li et al. 2023a De totale loss wordt berekend als een gewogen combinatie van de 2 doelen: We stellen = 0,5 empirisch in tijdens training en stellen vast dat dit in de praktijk goed werkt, wat leidt tot SOTA-prestaties op zowel code completion als code infilling taken. Het moet worden opgemerkt dat de FIM-objective alleen wordt gebruikt tijdens pretraining, maar we laten deze vallen tijdens instructie finetuning, d.w.z. we stellen = 1 in. α α 4.3 Optimalisatie We gebruiken de AdamW-optimizer ([Kingma & Ba](#_bookmark80),(#_bookmark80)) met β1 = 0,9, β2 = 0,95 en een gewichtsverval van 0,1 voor het trainen van al onze Granite code-modellen. Voor de fase 1 pretraining volgt de leersnelheid een cosinuschema beginnend bij 3 10−4, dat afneemt tot 3 10−5 met een initiële lineaire warmup stap van 2k iteraties. Voor de fase 2 pretraining starten we vanaf 3 10−4 (1,5 10−4 voor 20B en 34B modellen) en passen we een exponentieel vervalschema toe om deze te verminderen tot 10% van de initiële leersnelheid. We gebruiken een batchgrootte van 4M-5M tokens, afhankelijk van de modelgrootte, tijdens beide pretraining fasen. Om de training te versnellen, gebruiken we FlashAttention 2 ( , Dao et al.