```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 Abstract Modelele lingvistice mari (LLM) antrenate pe cod revoluționează procesul de dezvoltare software. Din ce în ce mai mult, LLM-urile de cod sunt integrate în mediile de dezvoltare software pentru a îmbunătăți productivitatea programatorilor umani, iar agenții bazați pe LLM încep să arate promisiuni în gestionarea sarcinilor complexe în mod autonom. Realizarea potențialului deplin al LLM-urilor de cod necesită o gamă largă de capabilități, inclusiv generare de cod, repararea erorilor, explicarea și documentarea codului, întreținerea depozitelor și multe altele. În această lucrare, introducem seria Granite de modele de cod doar-decoder pentru sarcini generative de cod, antrenate cu cod scris în 116 limbi de programare. Familia de modele Granite Code constă din modele cu dimensiuni variind de la 3 la 34 de miliarde de parametri, potrivite pentru aplicații de la sarcini complexe de modernizare a aplicațiilor la cazuri de utilizare cu constrângeri de memorie pe dispozitiv. Evaluarea pe un set cuprinzător de sarcini demonstrează că modelele Granite Code ating în mod constant performanțe de ultimă generație printre LLM-urile de cod open-source disponibile. Familia de modele Granite Code a fost optimizată pentru fluxurile de lucru de dezvoltare software enterprise și funcționează bine într-o serie de sarcini de codificare (de ex. generare, reparare și explicare de cod), făcându-l un model de cod „all around” versatil. Lansăm toate modelele noastre Granite Code sub o licență Apache 2.0 atât pentru uz cercetare, cât și comercial. https://github.com/ibm-granite/granite-code-models 1 Introducere În ultimele decenii, software-ul a fost țesut în structura fiecărui aspect al societății noastre. Pe măsură ce cererea pentru dezvoltare software crește, este mai critic ca niciodată să creștem productivitatea dezvoltării software, iar LLM-urile oferă o cale promițătoare pentru augmentarea programatorilor umani. Cazurile de utilizare enterprise proeminente pentru LLM-uri în productivitatea dezvoltării software includ generarea de cod, explicarea codului, repararea codului, generarea de teste unitare și documentație, modernizarea aplicațiilor, detectarea vulnerabilităților, traducerea codului și multe altele. Anii recenți au văzut un progres rapid în capacitatea LLM-urilor de a genera și manipula cod, iar o gamă de modele cu abilități impresionante de codificare sunt disponibile astăzi. Modelele variază în dimensiune de la miliarde de parametri cu o singură cifră (de ex. Llama-7B (Touvron et al., 2023), Gemma-7B (Gemma-Team et al., 2024), etc.) la sute de miliarde: DBRX (Databricks), Arctic (Snowflake), Grok, Mixtral 8x22B (MistralAI), Command R+ (Cohere), și variază în generalitatea utilizării intenționate, unele modele vizând să acopere o gamă de utilizări în afara codului, în timp ce altele se concentrează în principal pe sarcini legate de codificare (de 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)). Cu toate acestea, există încă lacune importante în domeniul actual al LLM-urilor pentru cod, în special în contextul dezvoltării software enterprise. În primul rând, în timp ce LLM-urile generaliste foarte mari pot obține performanțe excelente de codificare, dimensiunea lor le face costisitoare de implementat. Modelele mai mici focalizate pe cod ( , ; , ; , ; , ; , ) pot obține performanțe excelente de generare de cod într-un pachet mai mic și mai flexibil, dar performanța în sarcini de codificare dincolo de generare (de ex. reparare și explicare) poate fi inferioară performanței de generare de cod. Li et al. 2023a Lozhkov et al. 2024 Nijkamp et al. 2023 Rozie`re et al. 2023 CodeGemma Team et al. 2024 În multe contexte enterprise, adopția LLM-urilor de cod poate fi complicată în continuare de factori dincolo de performanța modelelor. De exemplu, chiar și modelele deschise sunt uneori afectate de lipsa de transparență cu privire la sursele de date și metodele de procesare a datelor care au stat la baza modelului, ceea ce poate eroda încrederea în modele în contexte critice și reglementate. Mai mult, termenii de licență ai LLM-urilor deschise actuale pot împovăra și complica capacitatea unei companii de a utiliza un model. Aici, prezentăm modelele Granite Code, o serie de LLM-uri de cod extrem de capabile, concepute pentru a sprijini dezvoltarea software enterprise într-o gamă largă de sarcini de codificare. Modelele Granite Code au două variante principale pe care le lansăm în patru dimensiuni diferite (3B, 8B, 20B și 34B): modele de bază fundamentale pentru sarcini legate de cod; Granite Code Base: modele de instruire fin-tunizate utilizând o combinație de commit-uri Git asociate cu instrucțiuni umane și seturi de date de instrucțiuni de cod sintetizate open-source. Granite Code Instruct: Modelele de bază din serie au fost antrenate de la zero cu o strategie de antrenament în două faze. În faza 1, modelul nostru este antrenat pe 3 până la 4 trilioane de tokeni proveniți din 116 limbi de programare, asigurând o înțelegere cuprinzătoare a limbajelor de programare și a sintaxei. În faza 2, modelul nostru este antrenat suplimentar pe 500 de miliarde de tokeni cu un amestec atent conceput de date de înaltă calitate din domenii de cod și limbaj natural pentru a îmbunătăți capacitatea de raționament a modelului. Utilizăm obiectivul de modelare lingvistică nesupervizată pentru a antrena modelele de bază în ambele faze de antrenament. Modelele de instruire sunt derivate prin finetuning suplimentar al modelelor de bază antrenate mai sus pe o combinație a unei variante filtrate de CommitPack ( , ), seturi de date de instruire în limbaj natural (OASST ( , ), HelpSteer ( , )) și seturi de date matematice open-source (MathInstruct ( , ) și MetaMathQA ( , )), inclusiv seturi de date de cod sintetizate pentru îmbunătățirea capacității de instruire și raționament. Muennighoff et al. 2023 Ko¨ pf et al. 2023 Wang et al. 2023 Yue et al. 2023 Yu et al. 2023 Realizăm evaluări extinse ale LLM-urilor noastre de cod pe un set cuprinzător de benchmark-uri, inclusiv HumanEvalPack ( , ), MBPP(+) ( , ; , ), RepoBench ( , ), ReCode ( , ) și altele. Acest set de benchmark-uri cuprinde multe tipuri diferite de sarcini de codificare dincolo de simpla sinteză de cod în Python, de ex., repararea codului, explicarea codului, editarea codului, traducerea codului, etc., în majoritatea limbajelor de programare majore (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 Constatările noastre relevă că, printre modelele open-source, modelele Granite Code prezintă în general performanțe foarte solide pe toate dimensiunile modelelor și benchmark-urile (depășind adesea alte modele de cod open-source care sunt de două ori mai mari comparativ cu Granite). Ca o ilustrare, figura (sus) arată o comparație a Granite-8B-Code-Base cu alte LLM-uri de bază de cod open-source, inclusiv LLM-uri de bază generaliste performante recente precum Mistral ( , ) și LLama-3 ( , ) pe HumanEvalPack ( , ). În timp ce CodeGemma și StarCoder2 performează rezonabil în generarea de cod, ele performează semnificativ mai prost pe variantele de reparare și explicare a codului din HumanEvalPack. În medie, Granite-8B-Code-Base depășește modelul CodeGemma-8B cel mai competitiv cu aproape 12 puncte pe HumanEvalPack (33,2% vs 21,3%), deși este antrenat pe un număr semnificativ mai mic de tokeni (4,5T vs 7,5T tokeni). Pe lângă modelele de bază, variantele de instruire ale modelelor noastre Granite Code prezintă, de asemenea, performanțe solide pe HumanEvalPack, depășind alte modele de instruire (de cod) open-source, demonstrând beneficii pentru un set mai larg de sarcini de codificare cu instrucțiuni în limbaj natural (vezi figura (jos)). 1 Jiang et al. 2023b AI@Meta 2024 Muennighoff et al. 2023 1 Mai mult, deoarece raționamentul este critic pentru rezolvarea întrebărilor și sarcinilor complicate, testăm, de asemenea, modelul nostru Granite-8B-Code-Base pe șase benchmark-uri matematice, inclusiv MATH ( , ), GSM8K ( , ) și rezolvarea problemelor cu acces la instrumente computaționale, unde modelul nostru Granite 8B obține performanțe mai bune comparativ cu majoritatea LLM-urilor de ultimă generație de 7B sau 8B. De exemplu, Granite-8B-Code-Base depășește Llama-3-8B-Base cu ~12 puncte pe GSM8K și ~6 puncte pe MATH (vezi tabelul ). Cobbe et al. 2021 Cobbe et al. 2021 15 Avantajele cheie ale modelelor Granite Code includ: : Modelele Granite Code ating performanțe competitive sau de ultimă generație pe diferite tipuri de sarcini legate de cod, inclusiv generare, explicare, reparare, editare, traducere de cod, etc., demonstrând capacitatea lor de a rezolva sarcini diverse de codificare; LLM de cod „All-rounder” : Toate modelele noastre sunt antrenate pe date permise de licență colectate conform principiilor de etică AI ale IBM și ghidate de echipa juridică corporativă a IBM pentru utilizare enterprise de încredere. Toate modelele Granite Code sunt lansate sub licența Apache 2.0. LLM de nivel Enterprise de încredere 1 Descriem întregul nostru pipeline de colectare, filtrare și preprocesare a datelor în secțiunea . Secțiunea descrie detaliile arhitecturii modelului, urmate de detaliile de antrenament în Secțiunea . Secțiunea oferă detalii despre instruirea cu instrucțiuni, iar Secțiunea descrie experimentele și rezultatele comparând modelele Granite Code cu alte LLM-uri open-source. 2 3 4 5 6 2 Colectarea Datelor În această secțiune, descriem procesul de crawling și filtrare (Sec. ), deduplicare (Sec. ), filtrare HAP/PII (Sec. ) utilizate pentru a pregăti datele de cod pentru antrenarea modelului. De asemenea, oferim o prezentare generală a datelor de limbaj natural de înaltă calitate utilizate pentru a îmbunătăți înțelegerea limbajului și abilitățile de raționament matematic ale modelului. 2.1 2.2 2.3 2.1 Crawling și Filtrare Date Datele de preantrenare a codului au fost obținute dintr-o combinație de seturi de date disponibile public, cum ar fi Github Code Clean , StarCoderdata , și depozite de cod publice suplimentare și probleme de pe GitHub. Filtram datele brute pentru a păstra o listă de 116 limbaje de programare din peste 300 de limbi, așa cum este listat în Apendicele . Atribuirea datelor limbilor de programare se face exclusiv pe baza extensiei fișierului, similar cu StarCoder ( , ). După filtrarea limbajului, aplicăm patru reguli cheie de filtrare pentru a elimina codul de calitate inferioară ( , ): (1) eliminarea fișierelor cu mai puțin de 25% caractere alfabetice, (2) cu excepția limbajului XSLT, eliminarea fișierelor unde șirul „<?xml version=” apare în primele 100 de caractere, (3) pentru fișierele HTML, păstrarea doar a fișierelor unde textul vizibil reprezintă cel puțin 20% din codul HTML și are o lungime minimă de 100 de caractere, (4) pentru fișierele JSON și YAML, păstrarea doar a fișierelor care au un număr de caractere cuprins între 50 și 5000. Filtram, de asemenea, problemele GitHub folosind un set de metrici de calitate care includ eliminarea textului generat automat, filtrarea problemelor non-engleze, excluderea comentariilor de la boți și utilizarea numărului de utilizatori implicați în conversație ca indicator al calității. De asemenea, adnotăm fiecare fișier de cod cu informații despre licență asociate cu depozitul respectiv, găsite prin API-urile Github și păstrăm doar fișierele cu licențe permisive pentru antrenarea modelului. 2 3 A Li et al. 2023a Li et al. 2023a 2.2 Deduplicare Exactă și Fuzzy Adoptăm o strategie agresivă de deduplicare, inclusiv deduplicarea exactă și fuzzy, pentru a elimina documentele care au conținut de cod (aproape) identic în setul nostru de antrenament. Pentru deduplicarea exactă, calculăm mai întâi hash-ul SHA256 pe conținutul documentului și eliminăm înregistrările cu hash-uri identice. După deduplicarea exactă, aplicăm deduplicarea fuzzy cu scopul de a elimina fișierele de cod care pot avea variații ușoare și, astfel, de a de-bia mai mult datele. Aplicăm o metodă în doi pași pentru aceasta: (1) calculăm MinHashes ale tuturor documentelor și apoi utilizăm Locally Sensitive Hashing (LSH) pentru a grupa documentele pe baza amprentelor lor MinHash, (2) măsurăm similaritatea Jaccard între fiecare pereche de documente din același bucket și adnotăm documentele, cu excepția unuia, ca duplicate pe baza unui prag de similaritate de 0.7. Aplicăm acest proces de dedubicare apropiată tuturor limbilor de programare, inclusiv problemelor GitHub, pentru a spori bogăția și diversitatea setului de date de antrenament. 2.3 Filtrare HAP, PII, Malware Pentru a reduce probabilitatea de a genera limbajuri de ură, abuzive sau profanatorii (HAP) din partea modelelor, depunem eforturi diligente pentru a filtra conținutul HAP din setul de antrenament. Creăm mai întâi un dicționar de cuvinte cheie HAP și apoi adnotăm fiecare document de cod cu numărul de apariții ale unor astfel de cuvinte cheie în conținut, inclusiv comentariile. Filtram documentele care depășesc pragul HAP, calculat pe baza unei analize distribuționale, precum și a inspecției manuale a fișierelor de cod. Mai mult, pentru a proteja confidențialitatea, urmăm StarCoder ( , ) și depunem eforturi diligente pentru a redacta informații de identificare personală (PII) din setul de antrenament. Mai exact, utilizăm modelul StarPII pentru a detecta adrese IP, chei, adrese de e-mail, nume, nume de utilizator și parole găsite în conținut. Pasul de redactare PII înlocuiește textul PII cu tokenii corespunzători NAME , EMAIL , KEY , PASSWORD și modifică adresa IP cu o adresă IP generată sintetic, conform Li et al. (2023a). De asemenea, scanăm seturile noastre de date folosind pentru a identifica și elimina instanțele de malware din codul sursă. Li et al. 2023a 4 2.4 Seturi de Date în Limbaj Natural Pe lângă colectarea datelor de cod pentru antrenarea modelului, curatoriem mai multe seturi de date de limbaj natural de înaltă calitate, disponibile public, pentru a îmbunătăți competența modelului în înțelegerea limbajului și raționamentul matematic. Seturile de date reprezentative din această categorie includ documente web (Stackexchange, CommonCrawl), text web matematic (OpenWeb-Math; ( ), StackMathQA; ( )), text academic (Arxiv, Wikipedia) și seturi de date de instruire cu instrucțiuni (FLAN; ( ), HelpSteer ( , )). Nu deduplicăm aceste seturi de date de limbaj natural deja preprocesate. Paster et al. 2023 Zhang 2024 Longpre et al. 2023 Wang et al. 2023 3 Arhitectura Modelului Antrenăm o serie de modele de cod de diferite dimensiuni bazate pe arhitectura transformer decoder ( , ). Hiperparametrii modelului pentru aceste modele sunt prezentați în Tabelul . Pentru toate arhitecturile de modele, utilizăm pre-normalizare ( , ): normalizare aplicată intrării blocurilor de atenție și MLP. Vaswani et al. 2017 1 Xiong et al. 2020 : Cel mai mic model din familia Granite-code este antrenat cu embedding RoPE ( , ) și Multi-Head Attention ( , ). Acest model utilizează funcția de activare swish ( , ) cu GLU ( , ) pentru MLP, cunoscută, de asemenea, sub denumirea de swiglu. Pentru normalizare, utilizăm RMSNorm ( , ), deoarece este mai eficient din punct de vedere computațional decât LayerNorm ( , ). Modelul 3B este antrenat cu o lungime de context de 2048 tokeni. 3B Su et al. 2023 Vaswani et al. 2017 Ramachandran et al. 2017 Shazeer 2020 Zhang & Sennrich 2019 Ba et al. 2016 : Modelul 8B are o arhitectură similară cu modelul 3B, cu excepția utilizării Grouped-Query Attention (GQA) ( , ). Utilizarea GQA oferă un compromis mai bun între performanța modelului și eficiența inferenței la această scară. Antrenăm modelul 8B cu o lungime de context de 4096 tokeni. 8B Ainslie et al. 2023 : Modelul de cod 20B este antrenat cu embedding-uri de poziție absolute învățate. Utilizăm Multi-Query Attention ( , ) în timpul antrenamentului pentru inferență eficientă ulterioară. Pentru blocul MLP, utilizăm funcția de activare GELU ( , ). Pentru normalizarea activărilor, utilizăm LayerNorm ( , ). Acest model este antrenat cu o lungime de context de 8192 tokeni. 20B Shazeer 2019 Hendrycks & Gimpel 2023 Ba et al. 2016 : Pentru a antrena modelul 34B, urmăm abordarea lui pentru scalarea în profunzime a modelului 20B. Mai exact, mai întâi duplicăm modelul de cod 20B cu 52 de straturi și apoi eliminăm ultimele 8 straturi din modelul original și primele 8 straturi din duplicatul său pentru a forma două modele. 34B Kim et al. În final, concatenăm ambele modele pentru a forma modelul Granite-34B-Code cu 88 de straturi (vezi Figura pentru o ilustrare). După scalarea în profunzime, observăm că scăderea performanței comparativ cu modelul 20B este destul de mică, contrar celor observate de . Această performanță este recuperată destul de rapid după ce continuăm preantrenamentul modelului scalat 34B. Similar cu 20B, utilizăm un context de 8192 tokeni în timpul preantrenamentului. 2 Kim et al. 4 Prentrenament În această secțiune, oferim detalii despre antrenamentul în două faze (Sec. ), obiectivele de antrenament (Sec. ), optimizarea (Sec. ) și infrastructura (Sec. ) utilizate în preantrenamentul modelelor. 4.1 4.2 4.3 4.4 4.1 Antrenament în Două Faze Modelele Granite Code sunt antrenate pe 3,5T până la 4,5T de tokeni de date de cod și seturi de date de limbaj natural legate de cod. Datele sunt tokenizate prin byte pair encoding (BPE, ( , )), utilizând același tokenizer ca StarCoder ( , ). Urmând ( , ; , ), utilizăm date de înaltă calitate cu două faze de antrenament, după cum urmează. Sennrich et al. 2015 Li et al. 2023a Shen et al. 2024 Hu et al. 2024 • : În timpul fazei 1, ambele modele 3B și 8B sunt antrenate pentru 4 trilioane de tokeni de date de cod, cuprinzând 116 limbi. Modelul de 20B parametri este antrenat pe 3 trilioane de tokeni de cod. Modelul 34B este antrenat pe 1,4T tokeni după scalarea în profunzime, care se face pe checkpoint-ul de 1,6T al modelului 20B. Faza 1 (antrenament doar pe cod) • : În faza 2, includem date suplimentare de înaltă calitate, disponibile public, din diverse domenii, inclusiv documente tehnice, matematice și web, pentru a îmbunătăți performanța modelului în abilitățile de raționament și rezolvare a problemelor, care sunt esențiale pentru generarea de cod. Antrenăm toate modelele noastre pentru 500B tokeni (80% cod și 20% date lingvistice) în antrenamentul de faza 2. Faza 2 (antrenament cod + limbaj) 4.2 Obiectivul de Antrenament Pentru antrenarea tuturor modelelor noastre, utilizăm obiectivul de modelare lingvistică cauzală și obiectivul Fill-In-the-Middle (FIM) ( , ). Obiectivul FIM are sarcina de a prezice tokenii inserați cu contextul dat și textul ulterior. Antrenăm modelele noastre să funcționeze cu ambele moduri PSM (Prefix-Suffix-Middle) și SPM (Suffix-Prefix-Middle), cu tokeni de control de formatare relevanți, la fel ca StarCoder ( , ). Bavarian et al. 2022 Li et al. 2023a Pierderea generală este calculată ca o combinație ponderată a celor 2 obiective: Am setat empiric = 0.5 în timpul antrenamentului și constatăm că acest lucru funcționează bine în practică, ducând la performanțe SOTA atât α