Autors: 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 Resum Els grans models lingüístics (LLMs) entrenats amb codi estan revolucionant el procés de desenvolupament de programari. Cada cop més, els LLMs de codi s'estan integrant en entorns de desenvolupament de programari per millorar la productivitat dels programadors humans, i els agents basats en LLM comencen a mostrar promeses per gestionar tasques complexes de manera autònoma. La realització del ple potencial dels LLMs de codi requereix una àmplia gamma de capacitats, com ara la generació de codi, la correcció d'errors, l'explicació i la documentació del codi, el manteniment de repositoris i molt més. En aquest treball, presentem la sèrie Granite de models de codi només de descodificador per a tasques de generació de codi, entrenats amb codi escrit en 116 llenguatges de programació. La família de models Granite Code consta de models que varien en mida des de 3 fins a 34 mil milions de paràmetres, adequats per a aplicacions que van des de tasques complexes de modernització d'aplicacions fins a casos d'ús amb memòria limitada al dispositiu. L'avaluació en un conjunt complet de tasques demostra que els models Granite Code assoleixen constantment un rendiment d'última generació entre els LLMs de codi de codi obert disponibles. La família de models Granite Code es va optimitzar per als fluxos de treball de desenvolupament de programari empresarial i funciona bé en una sèrie de tasques de codificació (p. ex., generació, correcció i explicació de codi), cosa que el converteix en un model de codi versàtil "tot terreny". Publiquem tots els nostres models Granite Code sota una llicència Apache 2.0 per a ús tant de recerca com comercial. https://github.com/ibm-granite/granite-code-models 1 Introducció Durant les últimes dècades, el programari s'ha teixit en el teixit de tots els aspectes de la nostra societat. A mesura que augmenta la demanda de desenvolupament de programari, és més important que mai augmentar la productivitat del desenvolupament de programari, i els LLMs proporcionen una via prometedora per augmentar els programadors humans. Els casos d'ús empresarials destacats per als LLMs en la productivitat del desenvolupament de programari inclouen la generació de codi, l'explicació de codi, la correcció de codi, la generació de proves unitàries i documentació, la modernització d'aplicacions, la detecció de vulnerabilitats, la traducció de codi, i molt més. Els últims anys han vist un ràpid progrés en la capacitat dels LLMs per generar i manipular codi, i avui dia hi ha disponibles una gamma de models amb capacitats de codificació impressionants. Els models varien en mida des de pocs mil milions de paràmetres (p. ex., Llama-7B (Touvron et al., 2023), Gemma-7B (Gemma-Team et al., 2024), etc.) fins a centenars de mil milions: DBRX (Databricks), Arctic (Snowflake), Grok, Mixtral 8x22B (MistralAI), Command R+ (Cohere), i varien en la generalitat de l'ús previst, amb alguns models que pretenen cobrir una gamma d'usos fora del codi, mentre que altres se centren principalment en tasques relacionades amb la codificació (p. ex., 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)). No obstant això, encara queden buits importants en el camp actual dels LLMs per a codi, especialment en el context del desenvolupament de programari empresarial. En primer lloc, tot i que els LLMs generalistes molt grans poden aconseguir un rendiment de codificació excel·lent, la seva mida els fa cars de desplegar. Els models més petits centrats en el codi ( , ; , ; , ; , ; , ) poden aconseguir un rendiment de generació de codi excel·lent en un paquet més petit i flexible, però el rendiment en tasques de codificació més enllà de la generació (p. ex., correcció i explicació) pot quedar per darrere del rendiment de generació de codi. Li et al. 2023a Lozhkov et al. 2024 Nijkamp et al. 2023 Rozie`re et al. 2023 CodeGemma Team et al. 2024 En molts contextos empresarials, l'adopció de LLMs de codi pot complicar-se encara més per factors més enllà del rendiment dels models. Per exemple, fins i tot els models oberts de vegades es veuen afectats per la manca de transparència sobre les fonts de dades i els mètodes de processament de dades que van entrar en el model, cosa que pot erosionar la confiança en els models en contextos de missió crítica i regulats. A més, els termes de llicència dels LLMs oberts actuals poden gravar i complicar la capacitat d'una empresa per utilitzar un model. Aquí, presentem els models Granite Code, una sèrie de LLMs de codi altament capaços, dissenyats per donar suport al desenvolupament de programari empresarial en una àmplia gamma de tasques de codificació. Els models Granite Code tenen dues variants principals que publiquem en quatre mides diferents (3B, 8B, 20B i 34B): models base fonamentals per a tasques relacionades amb el codi; Granite Code Base: models que segueixen instruccions afinats utilitzant una combinació de commits de Git emparellats amb instruccions humanes i conjunts de dades d'instruccions de codi sintèticament generades de codi obert. Granite Code Instruct: Els models base de la sèrie s'han entrenat des de zero amb una estratègia d'entrenament en dues fases. A la fase 1, el nostre model s'entrena en 3 a 4 bilions de tokens provinents de 116 llenguatges de programació, assegurant una comprensió completa dels llenguatges i la sintaxi de programació. A la fase 2, el nostre model s'entrena addicionalment en 500 mil milions de tokens amb una barreja dissenyada amb cura de dades d'alta qualitat dels dominis de codi i llenguatge natural per millorar la capacitat de raonament del model. Utilitzem l'objectiu de modelatge de llenguatge no supervisat per entrenar els models base en ambdues fases d'entrenament. Els models d'instrucció es deriven afinant addicionalment els models base entrenats anteriors en una combinació d'una variant filtrada de CommitPack ( , ), conjunts de dades d'instruccions de llenguatge natural (OASST ( , ), HelpSteer ( , )) i conjunts de dades de matemàtiques de codi obert (MathInstruct ( , ) i MetaMathQA ( , )), inclosos conjunts de dades de codi generats sintèticament per millorar les capacitats de seguiment d'instruccions i raonament. Muennighoff et al. 2023 Ko¨ pf et al. 2023 Wang et al. 2023 Yue et al. 2023 Yu et al. 2023 Realitzem avaluacions exhaustives dels nostres LLMs de codi en un conjunt complet de punts de referència, incloent HumanEvalPack ( , ), MBPP+ ( , ; , ), RepoBench ( , ), ReCode ( , ), i més. Aquest conjunt de punts de referència inclou molts tipus diferents de tasques de codificació més enllà de la simple síntesi de codi en Python, p. ex., correcció de codi, explicació de codi, edició de codi, traducció de codi, etc., a través de la majoria dels principals llenguatges de programació (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 Les nostres troballes revelen que entre els models de codi obert, els models Granite Code mostren en general un rendiment molt sòlid en totes les mides de models i punts de referència (sovint superant altres models de codi de codi obert que són el doble de grans que Granite). Com a il·lustració, la figura (a dalt) mostra una comparació de Granite-8B-Code-Base amb altres LLMs base de codi obert, inclosos LLMs base d'ús general d'alt rendiment recents com Mistral ( , ) i LLama-3 ( , ) a HumanEvalPack ( , ). Mentre que CodeGemma i StarCoder2 funcionen raonablement bé en la generació de codi, funcionen significativament pitjor en les variants de correcció i explicació de codi de HumanEvalPack. De mitjana, Granite-8B-Code-Base supera el model CodeGemma-8B més competitiu per gairebé 12 punts a HumanEvalPack (33,2% vs 21,3%), tot i haver estat entrenat amb un nombre significativament menor de tokens (4,5T vs 7,5T tokens). A més dels models base, les variants d'instrucció afinades dels nostres models Granite Code també mostren un rendiment sòlid a HumanEvalPack, superant altres models d'instrucció (de codi obert), demostrant beneficis a un conjunt més ampli de tasques de codificació amb instruccions de llenguatge natural (vegeu la figura (a baix)). 1 Jiang et al. 2023b AI@Meta 2024 Muennighoff et al. 2023 1 A més, ja que el raonament és crític per resoldre preguntes i tasques complicades, també provem el nostre model Granite-8B-Code-Base en sis punts de referència matemàtics, inclosos MATH ( , ), GSM8K ( , ) i la resolució de problemes amb accés a eines computacionals, on el nostre model Granite 8B aconsegueix un millor rendiment en comparació amb la majoria dels LLMs d'última generació de 7B o 8B. Per exemple, Granite-8B-Code-Base supera a Llama-3-8B-Base en ~12 punts a GSM8K i ~6 punts a MATH (vegeu la taula ). Cobbe et al. 2021 Cobbe et al. 2021 15 Els avantatges clau dels models Granite Code inclouen: : els models Granite Code aconsegueixen un rendiment competitiu o d'última generació en diferents tipus de tasques relacionades amb el codi, com ara la generació de codi, l'explicació, la correcció, l'edició, la traducció, etc., demostrant la seva capacitat per resoldre diverses tasques de codificació; LLM de codi tot terreny : tots els nostres models estan entrenats amb dades de llicència permissible recopilades seguint els principis d'ètica de la IA d'IBM i guiats per l'equip legal corporatiu d'IBM per a un ús empresarial fiable. Tots els models Granite Code es publiquen sota la llicència Apache 2.0. LLM de qualitat empresarial fiable 1 Descrivim tot el nostre pipeline de recopilació, filtratge i pre-processament de dades a la secció . La secció descriu els detalls de l'arquitectura del model, seguida dels detalls d'entrenament a la Secció . La secció proporciona els detalls sobre l'afinació d'instruccions, i la secció descriu els experiments i els resultats que comparen els models Granite Code amb altres LLMs de codi obert. 2 3 4 5 6 2 Recopilació de dades En aquesta secció, descrivim el procés de rastreig i filtratge (Secc. ), deduplicació (Secc. ), filtratge HAP/PII (Secc. ) utilitzats per preparar les dades de codi per a l'entrenament del model. També proporcionem una visió general de les dades de llenguatge natural d'alta qualitat utilitzades per millorar la comprensió del llenguatge i les habilitats de raonament matemàtic del model. 2.1 2.2 2.3 2.1 Rastrament i filtratge de dades Les dades de codi de preentrenament es van obtenir d'una combinació de conjunts de dades públicament disponibles com Github Code Clean , StarCoderdata , i repositoris i problemes de codi públics addicionals de GitHub. Filtrem les dades crues per retenir una llista de 116 llenguatges de programació de més de 300 llenguatges, tal com s'indica a l'Apèndix . L'assignació de dades a llenguatges de programació es realitza basant-se únicament en l'extensió del fitxer, similar a StarCoder ( , ). Després del filtratge de llenguatges, apliquem quatre regles de filtratge clau per eliminar codi de baixa qualitat ( , ): (1) eliminar fitxers amb menys del 25% de caràcters alfabètics, (2) excepte per al llenguatge XSLT, filtrar fitxers on la cadena "<?xml version=” apareix dins dels primers 100 caràcters, (3) per a fitxers HTML, conservar només fitxers on el text visible constitueix almenys el 20% del codi HTML i té una longitud mínima de 100 caràcters, (4) per a fitxers JSON i YAML, conservar només fitxers que tinguin un recompte de caràcters entre 50 i 5000 caràcters. També filtrem els problemes de GitHub utilitzant un conjunt de mètriques de qualitat que inclouen l'eliminació de text generat automàticament, el filtratge de problemes no anglesos, l'exclusió de comentaris de bots i l'ús del nombre d'usuaris implicats en la conversa com a indicador de qualitat. També anotem cada fitxer de codi amb informació de llicència associada al repositori respectiu, trobada mitjançant API de Github i només conservem fitxers amb llicències permissives per a l'entrenament del model. 2 3 A Li et al. 2023a Li et al. 2023a 2.2 Deduplicació exacta i fuzzy Adoptem una estratègia de deduplicació agressiva que inclou tant la deduplicació exacta com la fuzzy per eliminar documents que tenen contingut de codi (gairebé) idèntic al nostre conjunt d'entrenament. Per a la deduplicació exacta, primer calculem l'hash SHA256 sobre el contingut del document i eliminem els registres amb hashes idèntics. Després de la deduplicació exacta, apliquem la deduplicació fuzzy amb l'objectiu d'eliminar fitxers de codi que puguin tenir lleugeres variacions i, per tant, desequilibrar encara més les dades. Apliquem un mètode en dos passos per a això: (1) calculem MinHashes de tots els documents i després utilitzem Locally Sensitive Hashing (LSH) per agrupar documents basant-nos en les seves empremtes MinHash, (2) mesurem la similitud de Jaccard entre cada parell de documents del mateix bucket i anotem els documents excepte un com a duplicats basant-nos en un llindar de similitud de 0,7. Apliquem aquest procés de quasi-deduplicació a tots els llenguatges de programació, inclosos els problemes de GitHub, per millorar la riquesa i la diversitat del conjunt de dades d'entrenament. 2.3 Filtratge HAP, PII, Malware Per reduir la probabilitat de generar llenguatge odiós, abusiu o profà (HAP) dels models, fem esforços diligents per filtrar el contingut HAP del conjunt d'entrenament. Primer creem un diccionari de paraules clau HAP i després anotem cada document de codi amb el nombre d'ocurrències d'aquestes paraules clau en el contingut, inclosos els comentaris. Filtrem els documents que superen el llindar HAP, calculat basant-nos en un anàlisi distributiva així com en una inspecció manual dels fitxers de codi. A més, per protegir la privadesa, seguim StarCoder ( , ) i fem esforços diligents per redactar informació d'identificació personal (PII) del conjunt d'entrenament. Específicament, utilitzem el model StarPII per detectar adreces IP, claus, adreces de correu electrònic, noms, noms d'usuari i contrasenyes trobades en el contingut. El pas de redacció de PII substitueix el text de PII amb els tokens corresponents NAME , EMAIL , KEY , PASSWORD i canvia l'adreça IP per una adreça IP generada sintèticament, com a Li et al. (2023a). També escanejarem els nostres conjunts de dades mitjançant per identificar i eliminar instàncies de malware al codi font. Li et al. 2023a 4 2.4 Conjunts de dades de llenguatge natural A més de recopilar dades de codi per a l'entrenament del model, organitzem diversos conjunts de dades de llenguatge natural d'alta qualitat disponibles públicament per millorar la competència del model en comprensió del llenguatge i raonament matemàtic. Els conjunts de dades representatius d'aquesta categoria inclouen documents web (Stackexchange, CommonCrawl), text web matemàtic (OpenWeb-Math; ( ), StackMathQA; ( )), text acadèmic (Arxiv, Wikipedia), i conjunts de dades d'afinació d'instruccions (FLAN; ( ), HelpSteer ( , )). No dedupliquem aquests conjunts de dades de llenguatge natural ja pre-processats. Paster et al. 2023 Zhang 2024 Longpre et al. 2023 Wang et al. 2023 3 Arquitectura del model Entrenem una sèrie de models de codi de diferents mides basats en l'arquitectura transformer decoder ( , ). Els hiperparàmetres del model per a aquests models es troben a la Taula . Per a totes les arquitectures de models, utilitzem pre-normalització ( , ): normalització aplicada a l'entrada dels blocs d'atenció i MLP. Vaswani et al. 2017 1 Xiong et al. 2020 : El model més petit de la família de models Granite-code s'entrena amb embedding RoPE ( , ) i Multi-Head Attention ( , ). Aquest model utilitza la funció d'activació swish ( , ) amb GLU ( , ) per al MLP, també conegut comunament com swiglu. Per a la normalització, utilitzem RMSNorm ( , ) ja que és computacionalment més eficient que LayerNorm ( , ). El model 3B s'entrena amb una longitud de context de 2048 tokens. 3B Su et al. 2023 Vaswani et al. 2017 Ramachandran et al. 2017 Shazeer 2020 Zhang & Sennrich 2019 Ba et al. 2016 : El model 8B té una arquitectura similar al model 3B, amb l'excepció d'utilitzar Grouped-Query Attention (GQA) ( , ). L'ús de GQA ofereix un millor compromís entre el rendiment del model i l'eficiència d'inferència a aquesta escala. Entrenem el model 8B amb una longitud de context de 4096 tokens. 8B Ainslie et al. 2023 : El model de codi 20B s'entrena amb embeddings de posició absoluts apresos. Utilitzem Multi-Query Attention ( , ) durant l'entrenament per a una inferència downstream eficient. Per al bloc MLP, utilitzem la funció d'activació GELU ( , ). Per normalitzar les activacions, utilitzem LayerNorm ( , ). Aquest model s'entrena amb una longitud de context de 8192 tokens. 20B Shazeer 2019 Hendrycks & Gimpel 2023 Ba et al. 2016 : Per entrenar el model 34B, seguim l'enfocament de per a l'escalat de profunditat del model 20B. Específicament, primer dupliquem el model de codi 20B amb 52 capes i després eliminem les 8 capes finals del model original i les 8 capes inicials de la seva duplicació per formar dos models. 34B Kim et al. Finalment, concatenem ambdós models per formar el model Granite-34B-Code amb 88 capes (vegeu la Figura per a una il·lustració). Després de l'escalat de profunditat, observem que la caiguda de rendiment en comparació amb el model 20B és força petita, contràriament al que s'observa a . Aquest rendiment es recupera força ràpidament després de continuar el preentrenament del model 34B escalat. Similar al 20B, utilitzem un context de 8192 tokens durant el preentrenament. 2 Kim et al. 4 Preentrenament En aquesta secció, proporcionem detalls sobre l'entrenament en dues fases (Secc. ), objectius d'entrenament (Secc. ), optimització (Secc. ) i infraestructura (Secc. ) utilitzades en el preentrenament dels models. 4.1 4.2 4.3 4.4 4.1 Entrenament en dues fases Els models Granite Code s'entrenen amb 3,5T a 4,5T de tokens de dades de codi i conjunts de dades de llenguatge natural relacionats amb el codi. Les dades es tokenitzen mitjançant byte pair encoding (BPE, ( , )), utilitzant el mateix tokenitzador que StarCoder ( , ). Seguint ( , ; , ), utilitzem dades d'alta qualitat amb dues fases d'entrenament, com ara: Sennrich et al. 2015 Li et al. 2023a Shen et al. 2024 Hu et al. 2024 • : Durant la fase 1, els models 3B i 8B s'entrenen per 4 bilions de tokens de dades de codi que comprenen 116 llenguatges. El model de 20B paràmetres s'entrena amb 3 bilions de tokens de codi. El model 34B s'entrena amb 1,4T tokens després de l'escalat de profunditat, que es realitza al punt de control de 1,6T del model 20B. Fase 1 (entrenament només de codi) • : A la fase 2, incloem dades addicionals d'alta qualitat disponibles públicament de diversos dominis, inclosos documents tècnics, matemàtics i web, per millorar encara més el rendiment del model en habilitats de raonament i resolució de problemes, que són essencials per a la generació de codi. Entrenem tots els nostres models durant 500 mil milions de tokens (8 Fase 2 (entrenament de codi + llenguatge)