```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 Abstrakt Veľké jazykové modely (LLM) trénované na kóde prinášajú revolúciu do procesu vývoja softvéru. Stále častejšie sa LLM pre kód integrujú do prostredí na vývoj softvéru s cieľom zlepšiť produktivitu ľudských programátorov a agenti založení na LLM začínajú ukazovať prísľub pri autonómnom zvládaní zložitých úloh. Realizácia plného potenciálu LLM pre kód vyžaduje širokú škálu schopností vrátane generovania kódu, opravy chýb, vysvetľovania a dokumentovania kódu, údržby repozitárov a ďalších. V tejto práci predstavujeme sériu dekóderovo-len kódových modelov Granite pre generatívne kódové úlohy, trénovaných s kódom napísaným v 116 programovacích jazykoch. Rodina kódových modelov Granite Code pozostáva z modelov s veľkosťou od 3 do 34 miliárd parametrov, vhodných pre aplikácie od komplexných úloh modernizácie aplikácií až po prípady použitia s obmedzenou pamäťou na zariadeniach. Hodnotenie na komplexnej sade úloh demonštruje, že kódové modely Granite Code konzistentne dosahujú špičkový výkon medzi dostupnými open-source LLM pre kód. Rodina kódových modelov Granite Code bola optimalizovaná pre pracovné postupy vývoja podnikových softvérov a dobre funguje v širokej škále kódovacích úloh (napr. generovanie kódu, opravy a vysvetlenie), čo z nej robí všestranný „všestranný“ kódový model. Všetky naše kódové modely Granite uvoľňujeme pod licenciou Apache 2.0 na výskumné aj komerčné použitie. https://github.com/ibm-granite/granite-code-models 1 Úvod Počas posledných niekoľkých desaťročí sa softvér preplietol do štruktúry každej oblasti našej spoločnosti. Keďže dopyt po vývoji softvéru prudko rastie, je čoraz dôležitejšie zvyšovať produktivitu vývoja softvéru a LLM poskytujú sľubnú cestu na rozšírenie ľudských programátorov. Medzi prominentné podnikové prípady použitia LLM v oblasti produktivity vývoja softvéru patria generovanie kódu, vysvetľovanie kódu, opravy kódu, generovanie jednotkových testov a dokumentácie, modernizácia aplikácií, detekcia zraniteľností, preklad kódu a ďalšie. Posledné roky zaznamenali rýchly pokrok v schopnosti LLM generovať a manipulovať s kódom a dnes sú k dispozícii rôzne modely s pôsobivými kódovacími schopnosťami. Modely sa pohybujú vo veľkosti od jednociferných miliárd parametrov (napr. Llama-7B (Touvron et al., 2023), Gemma-7B (Gemma-Team et al., 2024) atď.) až po stovky miliárd: DBRX (Databricks), Arctic (Snowflake), Grok, Mixtral 8x22B (MistralAI), Command R+ (Cohere) a líšia sa v všeobecnosti zamýšľaného použitia, pričom niektoré modely sa zameriavajú na pokrytie širokej škály použití mimo kódu, zatiaľ čo iné sa primárne zameriavajú na úlohy súvisiace s kódovaním (napr. StarCoder (Li et al., 2023a; Lozhkov et al., 2024), CodeGen (Nijkamp et al., 2023), CodeLlama (Rozie`re et al., 2023), a CodeGemma (CodeGemma Team et al., 2024)). Napriek tomu v súčasnom poli LLM pre kód existujú dôležité medzery, najmä v kontexte vývoja podnikových softvérov. Po prvé, zatiaľ čo veľmi veľké, generalistické LLM môžu dosiahnuť vynikajúci kódovací výkon, ich veľkosť ich robí drahými na nasadenie. Menšie modely zamerané na kód ( , ; , ; , ; , ; , ) môžu dosiahnuť vynikajúci výkon pri generovaní kódu v menšom a flexibilnejšom balení, ale výkon pri kódovacích úlohách nad rámec generovania (napr. opravy a vysvetlenie) môže zaostávať za výkonom generovania kódu. Li et al. 2023a Lozhkov et al. 2024 Nijkamp et al. 2023 Rozie`re et al. 2023 CodeGemma Team et al. 2024 V mnohých podnikových kontextoch môže byť prijatie LLM pre kód ďalej komplikované faktormi nad rámec výkonu modelov. Napríklad aj otvorené modely sú niekedy postihnuté nedostatkom transparentnosti o zdrojoch dát a metódach spracovania dát, ktoré boli použité pri tvorbe modelu, čo môže narušiť dôveru v modely v kritických a regulovaných kontextoch. Navyše, licenčné podmienky v dnešných otvorených LLM môžu obmedziť a skomplikovať schopnosť podniku používať model. Tu predstavujeme kódové modely Granite, sériu vysoko schopných LLM pre kód, navrhnutých na podporu vývoja podnikových softvérov v širokej škále kódovacích úloh. Kódové modely Granite majú dva hlavné varianty, ktoré vydávame v štyroch rôznych veľkostiach (3B, 8B, 20B a 34B): základné základné modely pre úlohy súvisiace s kódom; Granite Code Base: modely na sledovanie inštrukcií jemne doladené pomocou kombinácie párov Git commitov s ľudskými inštrukciami a open-source synteticky generovaných dátových sád inštrukcií pre kód. Granite Code Instruct: Základné modely v sérii boli trénované od začiatku pomocou dvojfázovej tréningovej stratégie. Vo fáze 1 je náš model trénovaný na 3 až 4 biliónoch tokenov pochádzajúcich zo 116 programovacích jazykov, čo zaisťuje komplexné porozumenie programovacích jazykov a syntaxe. Vo fáze 2 je náš model ďalej trénovaný na 500 miliardách tokenov so starostlivo navrhnutou zmesou vysokokvalitných dát z kódovej a prirodzenej jazykovej domény na zlepšenie schopnosti modelu uvažovať. Na trénovanie základných modelov v oboch fázach tréningu používame bezdozorný jazykový modelovací cieľ. Inštrukčné modely sú odvodené ďalším jemným doladením vyššie uvedených trénovaných základných modelov na kombináciu filtrovaného variantu CommitPack ( , ), dátových sád inštrukcií na sledovanie prirodzeného jazyka (OASST ( , ), HelpSteer ( , )) a open-source matematických dátových sád (MathInstruct ( , ) a MetaMathQA ( , )), vrátane synteticky generovaných kódových dátových sád na zlepšenie schopnosti sledovať inštrukcie a uvažovať. Muennighoff et al. 2023 Ko¨ pf et al. 2023 Wang et al. 2023 Yue et al. 2023 Yu et al. 2023 Vykonávame rozsiahle hodnotenia našich LLM pre kód na komplexnej sade benchmarkov vrátane HumanEvalPack ( , ), MBPP(+) ( , ; , ), RepoBench ( , ), ReCode ( , ) a ďalších. Táto sada benchmarkov zahŕňa mnoho rôznych druhov kódovacích úloh nad rámec syntézy kódu v Pythone, napr. opravy kódu, vysvetlenie kódu, úpravy kódu, preklad kódu atď., vo väčšine hlavných programovacích jazykov (Python, JavaScript, Java, Go, C++, Rust atď.). Muennighoff et al. 2023 Austin et al. 2021 Liu et al. 2023a Liu et al. 2023b Wang et al. 2022 Naše zistenia odhaľujú, že medzi open-source modelmi, modely Granite Code celkovo vykazujú veľmi silný výkon naprieč všetkými veľkosťami modelov a benchmarkmi (často prekonávajúce iné open-source kódové modely, ktoré sú dvakrát väčšie ako Granite). Ako ilustrácia, obrázok (hore) ukazuje porovnanie Granite-8B-Code-Base s inými open-source základnými LLM pre kód, vrátane nedávnych výkonných generalistických základných LLM ako Mistral ( , ) a LLama-3 ( , ) na HumanEvalPack ( , ). Kým CodeGemma a StarCoder2 dosahujú primerane dobrý výkon pri generovaní kódu, výrazne horšie si počínajú na variantoch HumanEvalPack pre opravy a vysvetlenie kódu. V priemere Granite-8B-Code-Base prekonáva najkonkurencie schopnejší model CodeGemma-8B takmer o 12 bodov na HumanEvalPack (33,2 % vs. 21,3 %), napriek tomu, že bol trénovaný na výrazne menšom počte tokenov (4,5 T vs. 7,5 T tokenov). Okrem základných modelov, varianty našich modelov Granite Code jemne doladené pomocou inštrukcií tiež vykazujú silný výkon na HumanEvalPack, prekonávajúce iné open-source (kódové) inštrukčné modely, čo demonštruje výhody pre širšiu sadu kódovacích úloh s pokynmi v prirodzenom jazyku (pozri obrázok (dole)). 1 Jiang et al. 2023b AI@Meta 2024 Muennighoff et al. 2023 1 Okrem toho, keďže uvažovanie je kritické pre riešenie zložitých otázok a úloh, testujeme aj náš model Granite-8B-Code-Base na šiestich matematických benchmarkoch vrátane MATH ( , ), GSM8K ( , ) a riešenie problémov s prístupom k výpočtovým nástrojom, kde náš model Granite 8B dosahuje lepší výkon v porovnaní s väčšinou najmodernejších LLM s veľkosťou 7B alebo 8B. Napríklad Granite-8B-Code-Base prekonáva Llama-3-8B-Base o ∼12 bodov na GSM8K a ∼6 bodov na MATH (pozri tabuľku ). Cobbe et al. 2021 Cobbe et al. 2021 15 Kľúčové výhody kódových modelov Granite zahŕňajú: : Kódové modely Granite dosahujú konkurencieschopný alebo špičkový výkon pri rôznych druhoch úloh súvisiacich s kódom, vrátane generovania kódu, vysvetľovania, opravy, úprav, prekladu atď., čo demonštruje ich schopnosť riešiť rozmanité kódovacie úlohy; Všestranný LLM pre kód : Všetky naše modely sú trénované na dátach, ktoré umožňujú licencovanie, zhromaždené v súlade s princípmi etiky AI spoločnosti IBM a riadené právnym tímom spoločnosti IBM pre dôveryhodné podnikové použitie. Všetky kódové modely Granite sú vydané pod licenciou Apache 2.0. Dôveryhodný LLM pre podnikový stupeň 1 Celý náš pipeline zberu, filtrovania a predzpracovania dát opisujeme v sekcii . Sekcia opisuje detaily architektúry modelu, po ktorej nasledujú detaily tréningu v sekcii . Sekcia poskytuje detaily o jemnom ladení inštrukcií a sekcia opisuje experimenty a výsledky porovnávajúce kódové modely Granite s inými open-source LLM. 2 3 4 5 6 2 Zber dát V tejto sekcii opisujeme proces prehľadávania a filtrovania (sekcia ), deduplikácie (sekcia ), filtrovania HAP/PII (sekcia ) použitého na prípravu kódových dát pre tréning modelu. Poskytujeme tiež prehľad vysokokvalitných dát v prirodzenom jazyku použitých na zlepšenie jazykového porozumenia modelu a matematických schopností uvažovania. 2.1 2.2 2.3 2.1 Prehľadávanie a filtrovanie dát Predtréningové kódové dáta pochádzali z kombinácie verejne dostupných dátových sád ako Github Code Clean , StarCoderdata , a ďalších verejných kódových repozitárov a problémov z GitHubu. Surové dáta filtrujeme, aby sme zachovali zoznam 116 programovacích jazykov z viac ako 300 jazykov, ako je uvedené v prílohe . Priradenie dát k programovacím jazykom sa vykonáva výlučne na základe prípony súboru, podobne ako v StarCoder ( , ). Po filtrovaní jazykov aplikujeme štyri kľúčové filtračné pravidlá na filtrovanie menej kvalitného kódu ( , ): (1) odstrániť súbory s menej ako 25 % abecedných znakov, (2) okrem jazyka XSLT odfiltrovať súbory, kde sa reťazec „<?xml version=” objaví do 100 znakov, (3) pre HTML súbory ponechať iba súbory, kde viditeľný text predstavuje najmenej 20 % HTML kódu a má minimálnu dĺžku 100 znakov, (4) pre súbory JSON a YAML ponechať iba súbory, ktoré majú počet znakov v rozsahu od 50 do 5000 znakov. Taktiež anotujeme problémy GitHubu pomocou sady metrík kvality, ktoré zahŕňajú odstránenie automaticky generovaného textu, filtrovanie neanglických problémov, vylúčenie komentárov od botov a použitie počtu používateľov zapojených do konverzácie ako ukazovateľa kvality. Každý kódový súbor tiež anotujeme informáciami o licencii pridruženej k príslušnému repozitáru, nájdenými prostredníctvom API GitHubu, a na tréning modelu ponechávame iba súbory s permisívnymi licenciami. 2 3 A Li et al. 2023a Li et al. 2023a 2.2 Presná a fuzzy deduplikácia Prijímame agresívnu stratégiu deduplikácie vrátane presnej aj fuzzy deduplikácie na odstránenie dokumentov s (takmer) identickým obsahom kódu v našej tréningovej sade. Pre presnú deduplikáciu najprv vypočítame hash SHA256 na obsahu dokumentu a odstránime záznamy s identickými hashmi. Po presnej deduplikácii aplikujeme fuzzy deduplikáciu s cieľom odstrániť kódové súbory, ktoré môžu mať mierne variácie, a tým ďalej odľahčiť dáta. Na tento účel aplikujeme dvojkrokovú metódu: (1) vypočítame MinHash všetky dokumenty a potom použijeme Local Sensitive Hashing (LSH) na zoskupenie dokumentov na základe ich MinHash odtlačkov prstov, (2) zmeriame Jaccardovu podobnosť medzi každým párom dokumentov v rovnakom segmente a označíme dokumenty okrem jedného ako duplikáty na základe prahovej hodnoty podobnosti 0,7. Tento proces takmer deduplikácie aplikujeme na všetky programovacie jazyky vrátane problémov GitHubu, aby sme zvýšili bohatosť a rozmanitosť tréningovej datovej sady. 2.3 Filtrovanie HAP, PII, malvéru Aby sme znížili pravdepodobnosť generovania nenávistného, urážlivého alebo profánneho (HAP) jazyka z modelov, vynakladáme usilovné úsilie na filtrovanie HAP obsahu z tréningovej sady. Najprv vytvoríme slovník kľúčových slov HAP a potom každý kódový dokument anotujeme počtom výskytov takýchto kľúčových slov v obsahu vrátane komentárov. Filtrujeme dokumenty, ktoré prekračujú prahovú hodnotu HAP, vypočítanú na základe distribučnej analýzy, ako aj manuálnej kontroly kódových súborov. Okrem toho, na ochranu súkromia, postupujeme podľa StarCoder ( , ) a vynakladáme usilovné úsilie na redigovanie osobne identifikovateľných informácií (PII) z tréningovej sady. Konkrétne, využívame model StarPII na detekciu IP adries, kľúčov, e-mailových adries, mien, používateľských mien a hesiel nájdených v obsahu. Krok redigovania PII nahrádza text PII zodpovedajúcimi tokenmi NAME , EMAIL , KEY a PASSWORD a mení IP adresu na synteticky generovanú IP adresu, ako v Li et al. (2023a). Taktiež skenujeme naše datové sady pomocou na identifikáciu a odstránenie malvérových inštancií v zdrojovom kóde. Li et al. 2023a 4 2.4 Datové sady v prirodzenom jazyku Okrem zberu kódových dát na tréning modelu, kurátujeme niekoľko verejne dostupných vysokokvalitných datových sád v prirodzenom jazyku na zlepšenie presnosti modelu v porozumení jazyka a matematických úvahách. Reprezentatívne dátové sady v tejto kategórii zahŕňajú webové dokumenty (Stackexchange, CommonCrawl), matematické webové texty (OpenWeb-Math; ( ), StackMathQA; ( )), akademické texty (Arxiv, Wikipedia) a datové sady na jemné ladenie inštrukcií (FLAN; ( ), HelpSteer ( , )). Tieto už predzpracované datové sady v prirodzenom jazyku nededuplikujeme. Paster et al. 2023 Zhang 2024 Longpre et al. 2023 Wang et al. 2023 3 Architektúra modelu Trénujeme sériu kódových modelov rôznych veľkostí na základe architektúry dekodéra transformátora ( , ). Hyperparametre modelu pre tieto modely sú uvedené v tabuľke . Pre všetky architektúry modelov používame prednormalizáciu ( , ): normalizácia aplikovaná na vstup pozornosti a MLP blokov. Vaswani et al. 2017 1 Xiong et al. 2020 : Najmenší model v rodine modelov Granite-code je trénovaný s RoPE embeddingom ( , ) a Multi-Head Attention ( , ). Tento model používa aktivačnú funkciu swish ( , ) s GLU ( , ) pre MLP, tiež bežne označovanú ako swiglu. Pre normalizáciu používame RMSNorm ( , ), pretože je výpočtovo efektívnejšia ako LayerNorm ( , ). Model 3B je trénovaný s kontextovou dĺžkou 2048 tokenov. 3B Su et al. 2023 Vaswani et al. 2017 Ramachandran et al. 2017 Shazeer 2020 Zhang & Sennrich 2019 Ba et al. 2016 : Model 8B má podobnú architektúru ako model 3B s výnimkou použitia Grouped-Query Attention (GQA) ( , ). Použitie GQA ponúka lepší kompromis medzi výkonom modelu a efektivitou inferencie v tejto škále. Model 8B trénujeme s kontextovou dĺžkou 4096 tokenov. 8B Ainslie et al. 2023 : Kódový model 20B je trénovaný s naučenými absolútnymi pozičnými vkladaniami. Počas tréningu používame Multi-Query Attention ( , ) pre efektívnu následnú inferenciu. Pre MLP blok používame funkciu aktivácie GELU ( , ). Na normalizáciu aktivácií používame LayerNorm ( , ). Tento model je trénovaný s kontextovou dĺžkou 8192 tokenov. 20B Shazeer 2019 Hendrycks & Gimpel 2023 Ba et al. 2016 : Na trénovanie modelu 34B sledujeme prístup pre upscaling hĺbky modelu 20B. Konkrétne najprv duplikujeme 20B kódový model s 52 vrstvami a potom odstránime posledných 8 vrstiev z pôvodného modelu a prvých 8 vrstiev z jeho duplikátu, aby sme vytvorili dva modely. 34B Kim et al. Nakoniec obidva modely spojíme, aby sme vytvorili model Granite-34B-Code s 88 vrstvami (pozri obrázok pre ilustráciu). Po zväčšení hĺbky pozorujeme, že pokles výkonu v porovnaní s modelom 20B je veľmi malý, na rozdiel od toho, čo pozorovali . Tento výkon sa pomerne rýchlo obnoví po pokračovaní predtréningu zväčšeného 34B modelu. Podobne ako pri 20B, aj pri predtréningu používame kontext s dĺžkou 8192 tokenov. 2 Kim et al. 4 Predtréning V tejto sekcii poskytujeme podrobnosti o dvojfázovom tréningu (sekcia ), tréningových cieľoch (sekcia ), optimalizácii (sekcia ) a infraštruktúre (sekcia ) použitej pri predtréningu modelov. 4.1 4.2 4.3 4.4 4.1 Dvojfázový tréning Kódové modely Granite sú trénované na 3,5 T až 4,5 T tokenoch kódových dát a dátových sád v prirodzenom jazyku súvisiacich s kódom. Dáta sú tokenizované pomocou byte pair encoding (BPE, ( , )), pričom sa používa rovnaký tokenizer ako v StarCoder ( , ). V súlade s ( , ; , ) používame vysokokvalitné dáta s dvoma fázami tréningu nasledovne. Sennrich et al. 2015 Li et al. 2023a Shen et al. 2024 Hu et al. 2024 • : Počas fázy 1 sú oba modely 3B a 8B trénované na 4 biliónoch tokenov kódových dát pokrývajúcich 116 jazykov. Model s 20 miliardami parametrov je trénovaný na 3 biliónoch tokenov kódu. Model 34B je trénovaný na 1,4 T tokenov po zväčšení hĺbky, ktoré sa vykonáva na kontrolnom bode 1,6 T modelu 20B. Fáza 1 (tréning iba na kód) • : Vo fáze 2 pridávame dodatočné vysokokvalitné verejne dostupné dáta z rôznych domén, vrátane technických, matematických a webových dokumentov, na ďalšie zlepšenie výkonu modelu v úlohách uvažovania a riešenia problémov, ktoré sú nevyhnutné pre generovanie kódu. Všetky naše modely trénujeme na 500 B tokenoch (80 % kódových a 20 % jazykových dát) vo fáze 2 tréningu. Fáza 2 (tréning kódu + jazyka) 4.2