```html Tekijät: 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 Tiivistelmä Koodiin koulutetut suuret kielimallit (LLM) mullistavat ohjelmistokehitysprosessia. Yhä useammin koodi-LLM:iä integroidaan ohjelmistokehitysympäristöihin ihmisohjelmoijien tuottavuuden parantamiseksi, ja LLM-pohjaiset agentit alkavat osoittaa lupaavia tuloksia monimutkaisten tehtävien itsenäisessä suorittamisessa. Koodi-LLM:ien täyden potentiaalin hyödyntäminen vaatii laajan valikoiman ominaisuuksia, mukaan lukien koodin luonti, virheiden korjaus, koodin selittäminen ja dokumentointi, arkistojen ylläpito ja paljon muuta. Tässä työssä esittelemme Granite-sarjan dekooderi-only -koodimalleja koodinluontitehtäviin, jotka on koulutettu 116 ohjelmointikielellä kirjoitetulla koodilla. Granite Code -malliperhe koostuu 3–34 miljardin parametrin kokoisista malleista, jotka soveltuvat sovelluksiin monimutkaisista sovellusten modernisointitehtävistä laitteessa muistirajoitteisiin käyttötapauksiin. Kattavan tehtäväjoukon arviointi osoittaa, että Granite Code -mallit saavuttavat johdonmukaisesti huippuluokan suorituskyvyn saatavilla olevien avoimen lähdekoodin koodi-LLM:ien joukossa. Granite Code -malliperhe optimoitiin yritysohjelmistokehitystyönkulkuihin ja toimii hyvin erilaisissa koodaustehtävissä (esim. koodin luonti, korjaus ja selitys), mikä tekee siitä monipuolisen "kaikenkattavan" koodimallin. Julkaisemme kaikki Granite Code -mallimme Apache 2.0 -lisenssillä sekä tutkimus- että kaupalliseen käyttöön. https://github.com/ibm-granite/granite-code-models 1 Johdanto Viime vuosikymmeninä ohjelmistot ovat kudottuneet yhteiskuntamme jokaiseen osa-alueeseen. Ohjelmistokehityksen kysynnän kasvaessa on entistä kriittisempää lisätä ohjelmistokehityksen tuottavuutta, ja LLM:t tarjoavat lupaavan polun ihmisohjelmoijien täydentämiseen. Merkittäviä yrityskäyttötapauksia LLM:ille ohjelmistokehityksen tuottavuudessa ovat koodin luonti, koodin selittäminen, koodin korjaus, yksikkötestien ja dokumentaation luonti, sovellusten modernisointi, haavoittuvuuksien havaitseminen, koodin käännös ja paljon muuta. Viime vuosina LLM:ien kyky luoda ja käsitellä koodia on edennyt nopeasti, ja markkinoilla on nykyään laaja valikoima malleja, joilla on vaikuttava koodaustaito. Mallit vaihtelevat kooltaan yhden numeron miljardeista parametreista (esim. Llama-7B (Touvron et al., 2023), Gemma-7B (Gemma-Team et al., 2024) jne.) satoihin miljardeihin: DBRX (Databricks), Arctic (Snowflake), Grok, Mixtral 8x22B (MistralAI), Command R+ (Cohere), ja eroavat tarkoitetun käytön yleisyydessä, sillä jotkut mallit pyrkivät kattamaan laajan valikoiman koodin ulkopuolisia käyttötarkoituksia, kun taas toiset keskittyvät ensisijaisesti koodaukseen liittyviin tehtäviin (esim. StarCoder (Li et al., 2023a; Lozhkov et al., 2024), CodeGen (Nijkamp et al., 2023), CodeLlama (Rozie`re et al., 2023), ja CodeGemma (CodeGemma Team et al., 2024)). Kuitenkin koodin LLM:ien nykyisessä kentässä on edelleen tärkeitä aukkoja, erityisesti yritysohjelmistokehityksen kontekstissa. Ensinnäkin, vaikka erittäin suuret, yleiskäyttöiset LLM:t voivat saavuttaa erinomaisen koodaustehokkuuden, niiden koko tekee niiden käyttöönotosta kallista. Pienemmät koodiin keskittyneet mallit ( , ; , ; , ; , ; , ) voivat saavuttaa erinomaisen koodinluontitehokkuuden pienemmässä ja joustavammassa paketissa, mutta koodaustehtävien suorituskyky, joka ylittää luonnin (esim. korjaus ja selitys), voi jäädä jälkeen koodinluonnin suorituskyvystä. Li et al. 2023a Lozhkov et al. 2024 Nijkamp et al. 2023 Rozie`re et al. 2023 CodeGemma Team et al. 2024 Monissa yrityskonteksteissa koodi-LLM:ien käyttöönottoa voivat monimutkaistaa muut tekijät kuin mallien suorituskyky. Esimerkiksi jopa avoimet mallit kärsivät toisinaan läpinäkyvyyden puutteesta malliin menneistä tietolähteistä ja datan käsittelymenetelmistä, mikä voi heikentää luottamusta malleihin kriittisissä ja säännellyissä konteksteissa. Lisäksi nykyisten avoimien LLM:ien lisenssiehdot voivat rasittaa ja monimutkaistaa yrityksen kykyä käyttää mallia. Tässä esittelemme Granite Code -mallit, sarjan erittäin kyvykkäitä koodi-LLM:iä, jotka on suunniteltu tukemaan yritysohjelmistokehitystä laajassa valikoimassa koodaustehtäviä. Granite Code -malleilla on kaksi päävarianttia, jotka julkaisemme neljässä eri koossa (3B, 8B, 20B ja 34B): perustason mallit koodiin liittyviin tehtäviin; Granite Code Base: ohjeiden noudattamiseen optimoidut mallit, jotka on hienosäädetty käyttämällä yhdistelmää Git-kommitteja ja ihmisen antamia ohjeita sekä avoimen lähdekoodin synteettisesti luotuja koodiohjetietoja. Granite Code Instruct: Sarjan perustason mallit on koulutettu alusta alkaen kaksivaiheisella koulutusstrategialla. Vaiheessa 1 mallimme koulutetaan 3–4 biljoonalla tokenilla, jotka on hankittu 116 ohjelmointikielestä, varmistaen kattavan ymmärryksen ohjelmointikielistä ja syntaksista. Vaiheessa 2 mallimme koulutetaan edelleen 500 miljardilla tokenilla käyttäen huolellisesti suunniteltua sekoitusta korkealaatuista dataa koodista ja luonnollisesta kielestä parantamaan mallin päättelykykyä. Käytämme ohjaamatonta kielimallinnustavoitetta perusmallien koulutukseen molemmissa koulutusvaiheissa. Ohjemallit johdetaan edelleen hienosäätämällä yllä mainittuja koulutettuja perusmalleja yhdistelmällä suodatettua versiota CommitPackista ( , ), luonnollisen kielen ohjeiden noudattamista koskevia tietojoukkoja (OASST ( , ), HelpSteer ( , )) ja avoimen lähdekoodin matemaattisia tietojoukkoja (MathInstruct ( , ) ja MetaMathQA ( , )), mukaan lukien synteettisesti luodut kooditietojoukot ohjeiden noudattamisen ja päättelykyvyn parantamiseksi. Muennighoff et al. 2023 Ko¨ pf et al. 2023 Wang et al. 2023 Yue et al. 2023 Yu et al. 2023 Suoritamme laajoja arviointeja koodi-LLM:istämme kattavalla joukolla vertailukohtia, mukaan lukien HumanEvalPack ( , ), MBPP(+) ( , ; , ), RepoBench ( , ), ReCode ( , ) ja paljon muuta. Tämä vertailukohtien joukko sisältää monenlaisia koodaustehtäviä pelkän Python-koodin synteesin lisäksi, esim. koodin korjaus, koodin selitys, koodin muokkaus, koodin kääntäminen jne. useimmissa tärkeimmissä ohjelmointikielissä (Python, JavaScript, Java, Go, C++, Rust jne.). Muennighoff et al. 2023 Austin et al. 2021 Liu et al. 2023a Liu et al. 2023b Wang et al. 2022 Havaintojemme mukaan avoimen lähdekoodin mallien joukossa Granite Code -mallit osoittavat yleisesti erittäin vahvaa suorituskykyä kaikissa mallikooissa ja vertailukohdissa (usein ylittävät muiden avoimen lähdekoodin koodimallien suorituskyvyn, jotka ovat kaksi kertaa suurempia kuin Granite). Esimerkiksi kuva (ylhäällä) näyttää vertailun Granite-8B-Code-Basen ja muiden avoimen lähdekoodin peruskoodi-LLM:ien välillä, mukaan lukien äskettäin julkaistut korkean suorituskyvyn yleiskäyttöiset perus-LLM:t, kuten Mistral ( , ) ja LLama-3 ( , ) HumanEvalPackilla ( , ). Vaikka CodeGemma ja StarCoder2 suoriutuvat kohtuullisen hyvin koodinluonnissa, ne suoriutuvat merkittävästi huonommin HumanEvalPackin koodin korjaus- ja selitysversioissa. Keskimäärin Granite-8B-Code-Base ylittää kilpailukykyisimmän CodeGemma-8B-mallin lähes 12 pistettä HumanEvalPackilla (33.2 % vs. 21.3 %), vaikka se on koulutettu huomattavasti vähemmällä määrällä tokeneita (4.5T vs. 7.5T tokenia). Perusmallien lisäksi myös Granite Code -malliemme ohjeiden mukaisesti hienosäädetyt versiot osoittavat vahvaa suorituskykyä HumanEvalPackilla, ylittäen muut avoimen lähdekoodin (koodi) ohjemallit, mikä osoittaa hyötyä laajempaan joukkoon koodaustehtäviä luonnollisella kielellä annetuilla ohjeilla (katso kuva (alhaalla)). 1 Jiang et al. 2023b AI@Meta 2024 Muennighoff et al. 2023 1 Koska päättely on kriittistä monimutkaisten kysymysten ja tehtävien ratkaisemisessa, testaamme myös Granite-8B-Code-Base-malliamme kuudella matematiikan vertailukohdalla, mukaan lukien MATH ( , ), GSM8K ( , ) ja ongelmanratkaisu laskentatyökaluilla, joissa Granite 8B -mallimme saavuttaa paremman suorituskyvyn verrattuna useimpiin huippuluokan 7B tai 8B LLM:iin. Esimerkiksi Granite-8B-Code-Base ylittää Llama-3-8B-Basen noin 12 pistettä GSM8K:ssa ja noin 6 pistettä MATH:ssa (katso taulukko ). Cobbe et al. 2021 Cobbe et al. 2021 15 Granite Code -mallien tärkeimmät edut ovat: : Granite Code -mallit saavuttavat kilpailukykyisen tai huippuluokan suorituskyvyn erilaisissa koodiin liittyvissä tehtävissä, mukaan lukien koodin luonti, selitys, korjaus, muokkaus, kääntäminen jne., osoittaen kykynsä ratkaista monipuolisia koodaustehtäviä; Monipuolinen koodi-LLM : Kaikki mallimme on koulutettu lisenssinmukaisella datalla, joka on kerätty IBM:n tekoälyn etiikan periaatteiden mukaisesti ja jota IBM:n yritysjuridinen tiimi on ohjannut luotettavaa yrityskäyttöä varten. Kaikki Granite Code -mallit julkaistaan Apache 2.0 -lisenssillä. Luotettava yritystason LLM 1 Kuvaamme koko datankeruu-, suodatus- ja esikäsittelyputkemme osiossa . Osio kuvaa malliarkkitehtuurin yksityiskohdat, jota seuraavat koulutustiedot osiossa . Osio tarjoaa yksityiskohtia ohjeiden hienosäädöstä, ja osio kuvaa kokeet ja tulokset, joissa Granite Code -mallit verrataan muihin avoimen lähdekoodin LLM:iin. 2 3 4 5 6 2 Datan keruu Tässä osiossa kuvaamme indeksoinnin ja suodatuksen (osio ), deduplikaation (osio ), HAP/PII-suodatuksen (osio ) prosessin, joita käytettiin koodidatan valmisteluun mallikoulutusta varten. Tarjoamme myös yleiskatsauksen korkealaatuisista luonnollisen kielen tiedoista, joita käytetään mallin kielen ymmärryksen ja matemaattisen päättelyn taitojen parantamiseen. 2.1 2.2 2.3 2.1 Datan indeksointi ja suodatus Esikoulutuksen koodidata hankittiin yhdistelmällä julkisesti saatavilla olevia tietojoukkoja, kuten Github Code Clean , StarCoderdata , ja lisäksi julkisia koodivarastoja ja GitHubin ongelmia. Suodatamme raakadatan säilyttääksemme 116 ohjelmointikielen listan yli 300 kielestä, kuten liitteessä . Datan jakaminen ohjelmointikielittäin suoritetaan pelkästään tiedostopäätteen perusteella, samoin kuin StarCoderissa ( , ). Kielisuodatuksen jälkeen sovellamme neljää keskeistä suodatusääntöä alhaisemman laadun koodin suodattamiseksi ( , ): (1) poista tiedostot, joissa on alle 25 % aakkosnumeerisia merkkejä, (2) lukuun ottamatta XSLT-kieltä, suodata tiedostot, joissa merkkijono "<?xml version=” esiintyy ensimmäisen 100 merkin sisällä, (3) HTML-tiedostoille säilytä vain tiedostot, joissa näkyvä teksti muodostaa vähintään 20 % HTML-koodista ja on vähintään 100 merkkiä pitkä, (4) JSON- ja YAML-tiedostoille säilytä vain tiedostot, joiden merkkimäärä on välillä 50–5000 merkkiä. Suodatamme myös GitHubin ongelmat joukolla laatumittareita, jotka sisältävät automaattisesti luodun tekstin poistamisen, ei-englanninkielisten ongelmien suodattamisen, bottien kommenttien poissulkemisen ja keskusteluun osallistuneiden käyttäjien määrän käytön laadun indikaattorina. Lisäksi merkitsemme jokaisen kooditiedoston asianmukaisen arkiston lisenssitiedoilla, jotka löytyvät GitHub API:iden kautta, ja säilytämme vain sallituilla lisensseillä varustetut tiedostot mallikoulutusta varten. 2 3 A Li et al. 2023a Li et al. 2023a 2.2 Tarkka ja sumea deduplikaatio Otamme käyttöön aggressiivisen deduplikaatiostrategian, joka sisältää sekä tarkan että sumean deduplikaation, jotta voimme poistaa koulutusjoukostamme (lähes) identtistä koodisisältöä sisältävät dokumentit. Tarkkaa deduplikaatiota varten laskemme ensin dokumentin sisällön SHA256-tiivisteen ja poistamme samat tiivisteet sisältävät tietueet. Tarkan deduplikaation jälkeen sovellamme sumeaa deduplikaatiota, jonka tavoitteena on poistaa kooditiedostot, joissa voi olla pieniä vaihteluita, ja siten tasapainottaa dataa entisestään. Käytämme tähän kaksivaiheista menetelmää: (1) laskemme kaikkien dokumenttien MinHash-arvot ja käytämme sitten paikallisesti herkkyyttä hyödyntävää hajautusta (LSH) ryhmitelläksemme dokumentit niiden MinHash-sormenjälkien perusteella, (2) mittaamme Jaccard-samankaltaisuuden jokaisen dokumenttiparin välillä samassa luokassa ja merkitsemme dokumentit yhtä lukuun ottamatta kopioiksi samankaltaisuuskynnyksen 0.7 perusteella. Sovellamme tätä lähes deduplikaatioprosessia kaikkiin ohjelmointikieliin, mukaan lukien GitHubin ongelmat, koulutusaineiston rikkauden ja monipuolisuuden lisäämiseksi. 2.3 HAP-, PII-, haittaohjelmasuodatus Vähentääksemme mallien tuottaman vihamielisen, loukkaavan tai sivistymättömän (HAP) kielen todennäköisyyttä teemme huolellisia toimenpiteitä HAP-sisällön suodattamiseksi koulutusaineistosta. Luomme ensin sanaston HAP-avainsanoista ja merkitsemme sitten jokaisen koodidokumentin näiden avainsanojen esiintymien määrällä sisällössä, mukaan lukien kommentit. Suodatamme pois dokumentit, jotka ylittävät HAP-kynnyksen, joka lasketaan jakauma-analyysin ja kooditiedostojen manuaalisen tarkastelun perusteella. Lisäksi yksityisyyden suojaamiseksi noudatamme StarCoderin ( , ) tapaa ja teemme huolellisia toimenpiteitä henkilökohtaisesti tunnistettavien tietojen (PII) punakoodaamiseksi koulutusaineistosta. Erityisesti käytämme StarPII -mallia tunnistamaan IP-osoitteet, avaimet, sähköpostiosoitteet, nimet, käyttäjänimet ja salasanat sisällöstä. PII-punakoodausvaihe korvaa PII-tekstin vastaavilla tokeneilla NAME, EMAIL, KEY, PASSWORD ja muuttaa IP-osoitteen synteettisesti luoduksi IP-osoitteeksi, kuten Li et al. (2023a). Skannaamme myös tietojoukkojamme tunnistaaksemme ja poistaaksemme haittaohjelmat esiintymät lähdekoodista. Li et al. 2023a 4 2.4 Luonnollisen kielen tietojoukot Koodidatan keräämisen lisäksi mallikoulutusta varten kokoamme useita julkisesti saatavilla olevia korkealaatuisia luonnollisen kielen tietojoukkoja parantaaksemme mallin kielten ymmärrystä ja matemaattista päättelykykyä. Tyypillisiä tämän kategorian tietojoukkoja ovat verkkodokumentit (Stackexchange, CommonCrawl), matemaattinen verkkoteksti (OpenWeb-Math; ( ), StackMathQA; ( )), akateeminen teksti (Arxiv, Wikipedia) ja ohjeiden hienosäätöön tarkoitetut tietojoukot (FLAN; ( ), HelpSteer ( , )). Emme deduplikoi näitä jo esikäsiteltyjä luonnollisen kielen tietojoukkoja. Paster et al. 2023 Zhang 2024 Longpre et al. 2023 Wang et al. 2023 3 Mallin arkkitehtuuri Koulutamme sarjan erikokoisia koodimalleja, jotka perustuvat Transformer-dekooderiarkkitehtuuriin ( , ). Mallien hyperparametrit annetaan taulukossa . Kaikissa malliarkkitehtuureissa käytämme esiesikäsittelyä ( , ): normalisointi, joka kohdistuu huomio- ja MLP-lohkojen syötteisiin. Vaswani et al. 2017 1 Xiong et al. 2020 : Granite-code-malliperheen pienin malli on koulutettu käyttäen RoPE-upotusta ( , ) ja monipäähuomiota (Multi-Head Attention, , ). Tämä malli käyttää swish-aktivointitoimintoa ( , ) GLU:n ( , ) kanssa MLP:lle, jota kutsutaan myös yleisesti swiglu:ksi. Normalisointiin käytämme RMSNormia ( , ), koska se on laskennallisesti tehokkaampi kuin LayerNorm ( , ). 3B-malli koulutetaan 2048 tokenin kontekstin pituudella. 3B Su et al. 2023 Vaswani et al. 2017 Ramachandran et al. 2017 Shazeer 2020 Zhang & Sennrich 2019 Ba et al. 2016 : 8B-mallilla on samanlainen arkkitehtuuri kuin 3B-mallilla, lukuun ottamatta ryhmitellyn kyselyhuomion (Grouped-Query Attention, GQA) ( , ) käyttöä. GQA:n käyttö tarjoaa paremman tasapainon mallin suorituskyvyn ja päättelyn tehokkuuden välillä tässä mittakaavassa. Koulutamme 8B-mallia 4096 tokenin kontekstin pituudella. 8B Ainslie et al. 2023 : 20B-koodimalli on koulutettu opituilla absoluuttisilla positio-upotuksilla. Käytämme monipäähuomiota (Multi-Query Attention, , ) koulutuksen aikana tehokasta jatkoseurannan päättelyä varten. MLP-lohkolle käytämme GELU-aktivointitoimintoa ( , ). Aktivaatioiden normalisointiin käytämme LayerNormia ( , ). Tämä malli koulutetaan 8192 tokenin kontekstin pituudella. 20B Shazeer 2019 Hendrycks & Gimpel 2023 Ba et al. 2016 : 34B-mallin kouluttamiseksi noudatamme Kim et al.:n ( ) menetelmää 20B-mallin syvyysskaalauksessa. Erityisesti kopioimme ensin 20B-koodimallin, jossa on 52 kerrosta, ja poistamme sitten alkuperäisen mallin viimeiset 8 kerrosta ja sen kopion ensimmäiset 8 kerrosta muodostaaksemme kaksi mallia. 34B Kim et al. Lopuksi yhdistämme molemmat mallit muodostaaksemme Granite-34B-Code-mallin, jossa on 88 kerrosta (katso kuva havainnollistamiseksi). Syvyysskaalauksen jälkeen havaitsemme, että suorituskyvyn lasku verrattuna 20B-malliin on hyvin pieni, toisin kuin Kim et al.:n ( ) havainnot. Tämä suorituskyky palautuu melko nopeasti sen jälkeen, kun jatkamme skaalatun 34B-mallin esikoulutusta. Samoin kuin 20B-mallissa, käytämme 8192 tokenin kontekstia esikoulutuksen aikana. 2 Kim et al. 4 Esikoulutus Tässä osiossa esitämme yksityiskohdat kaksivaiheisesta koulutuksesta (osio ), koulutustavoitteista (osio ), optimoinnista (osio ) ja infrastruktuurista (osio ), joita käytettiin mallien esikoulutuksessa. 4.1 4.2 4.3 4.4 4.1 Kaksivaiheinen koulutus Granite Code -mallit koulutetaan 3,5–4,5 biljoonalla tokenilla koodidata