```html Autoriai: 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 Santrauka Dideli kalbos modeliai (LLM), apmokyti koduoti, pertvarkys programinės įrangos kūrimo procesą. Vis dažniau kodiniai LLM integruojami į programinės įrangos kūrimo aplinkas, siekiant padidinti žmonių programuotojų produktyvumą, o LLM pagrįsti agentai pradeda rodyti pažadą autonomiškai tvarkyti sudėtingas užduotis. Norint išnaudoti visą kodinių LLM potencialą, reikia įvairių gebėjimų, įskaitant kodo generavimą, klaidų taisymą, kodo paaiškinimą ir dokumentavimą, saugyklų priežiūrą ir kt. Šiame darbe pristatome dekoderio tipo kodinių modelių seriją „Granite“, skirtą kodui generuoti, apmokytą naudojant kodą, parašytą 116 programavimo kalbų. „Granite Code“ modelių šeima apima nuo 3 iki 34 milijardų parametrų dydžio modelius, tinkamus įvairioms programoms, nuo sudėtingų programų modernizavimo užduočių iki įrenginiuose naudojamų, atminties apribojimų turinčių atvejų. Išsamių užduočių rinkinys parodė, kad „Granite Code“ modeliai nuolat pasiekia pažangiausią našumą tarp prieinamų atvirojo kodo kodinių LLM. „Granite Code“ modelių šeima buvo optimizuota įmonių programinės įrangos kūrimo darbo eigoms ir gerai veikia įvairiose kodavimo užduotyse (pvz., kodo generavimas, taisymas ir paaiškinimas), todėl tai yra universaliausias „visapusiškas“ kodinis modelis. Visus mūsų „Granite Code“ modelius išleidžiame pagal „Apache 2.0“ licenciją tiek moksliniams, tiek komerciniams naudojimams. https://github.com/ibm-granite/granite-code-models 1 Įvadas Per pastaruosius kelis dešimtmečius programinė įranga įsiskverbė į visus mūsų visuomenės aspektus. Kiekvienais metais didėjant programinės įrangos kūrimo paklausai, tampa vis svarbiau didinti programinės įrangos kūrimo produktyvumą, o LLM suteikia perspektyvų kelią, kaip sustiprinti programuotojus. Ryškūs verslo atvejai, kai LLM naudojami programinės įrangos kūrimo produktyvumui didinti, apima kodo generavimą, kodo paaiškinimą, kodo taisymą, vienetinių testų ir dokumentų generavimą, programų modernizavimą, pažeidžiamumo aptikimą, kodo vertimą ir kt. Pastaraisiais metais LLM gebėjimai generuoti ir manipuliuoti kodą sparčiai progresavo, o šiandien yra prieinami įvairūs modeliai, turintys įspūdingų kodavimo gebėjimų. Modeliai svyruoja nuo vieno skaitmens milijardų parametrų (pvz., Llama-7B (Touvron et al., 2023), Gemma-7B (Gemma-Team et al., 2024) ir kt.) iki šimtų milijardų: DBRX (Databricks), Arctic (Snowflake), Grok, Mixtral 8x22B (MistralAI), Command R+ (Cohere) ir skiriasi pagal numatytą naudojimo bendrumą, kai kuriems modeliams siekiama aprėpti įvairias programas, neapsiribojant kodu, o kiti daugiausia dėmesio skiria kodavimui susijusioms užduotims (pvz., StarCoder (Li et al., 2023a; Lozhkov et al., 2024), CodeGen (Nijkamp et al., 2023), CodeLlama (Rozie`re et al., 2023), CodeGemma (CodeGemma Team et al., 2024)). Tačiau dabartinėje kodinių LLM srityje vis dar yra svarbių spragų, ypač verslo programinės įrangos kūrimo kontekste. Pirma, nors labai dideli, bendrojo pobūdžio LLM gali pasiekti puikių kodavimo rezultatų, jų dydis apsunkina diegimą. Mažesni, kodui skirti modeliai ( , ; , ; , ; , ; , ) gali pasiekti puikių kodo generavimo rezultatų mažesnėje ir lankstesnėje pakuotėje, tačiau našumas kodavimo užduotyse, neapsiribojant generavimu (pvz., taisymu ir paaiškinimu), gali atsilikti nuo kodo generavimo našumo. Li et al. 2023a Lozhkov et al. 2024 Nijkamp et al. 2023 Rozie`re et al. 2023 CodeGemma Team et al. 2024 Daugelyje įmonių situacijų kodinių LLM įsisavinimą gali apsunkinti veiksniai, neapsiribojantys modelių našumu. Pavyzdžiui, net ir atviri modeliai kartais kenčia nuo duomenų šaltinių ir duomenų apdorojimo metodų, naudotų kuriant modelį, skaidrumo trūkumo, o tai gali sumažinti pasitikėjimą modeliais kritinės svarbos ir reguliuojamose kontekstuose. Be to, dabartinių atvirų LLM licencijų sąlygos gali apsunkinti ir komplikuoti įmonių galimybes naudoti modelį. Čia pristatome „Granite Code“ modelius – itin pajėgių kodinių LLM seriją, skirtą įmonių programinės įrangos kūrimui palaikyti įvairiose kodavimo užduotyse. „Granite Code“ modeliai turi du pagrindinius variantus, kuriuos išleidžiame keturių skirtingų dydžių (3B, 8B, 20B ir 34B): pagrindiniai fondų modeliai kodavimui skirtoms užduotims; „Granite Code Base“: instrukcijas sekantys modeliai, papildomai apmokyti naudojant Git komitų poras su žmonių instrukcijomis ir atvirojo kodo sintetiškai generuojamais kodinių instrukcijų duomenimis. „Granite Code Instruct“: Pagrindiniai serijos modeliai nuo pat pradžių buvo apmokyti naudojant dviejų etapų apmokymo strategiją. Pirmojo etapo metu mūsų modelis apmokomas 3–4 trilijonais žetonų, gautų iš 116 programavimo kalbų, užtikrinant išsamų programavimo kalbų ir sintaksės supratimą. Antrojo etapo metu mūsų modelis toliau apmokomas 500 milijardų žetonų, naudojant kruopščiai suprojektuotą aukštos kokybės duomenų mišinį iš kodo ir natūralios kalbos sričių, siekiant pagerinti modelio gebėjimą samprotauti. Abiejuose apmokymo etapuose naudojame nekontroliuojamo kalbos modeliavimo tikslą apmokyti pagrindinius modelius. Instrukciniai modeliai gaunami toliau papildomai apmokant pirmiau minėtus pagrindinius modelius, naudojant filtruotą „CommitPack“ ( , ) variantą, natūralios kalbos instrukcijų sekimo duomenis (OASST ( , ), HelpSteer ( , )) ir atvirojo kodo matematikos duomenis (MathInstruct ( , ) ir MetaMathQA ( , )), įskaitant sintetiškai generuojamus kodinius duomenis, siekiant pagerinti instrukcijų sekimo ir samprotavimo gebėjimus. Muennighoff et al. 2023 Ko¨ pf et al. 2023 Wang et al. 2023 Yue et al. 2023 Yu et al. 2023 Atliekame išsamų mūsų kodinių LLM įvertinimą visame rinkinyje etalonų, įskaitant HumanEvalPack ( , ), MBPP(+) ( , ; , ), RepoBench ( , ), ReCode ( , ) ir kt. Šis etalonų rinkinys apima daugybę skirtingų kodavimo užduočių, neapsiribojant tik kodo sinteze Python, pvz., kodo taisymą, kodo paaiškinimą, kodo redagavimą, kodo vertimą ir kt., įtraukiant daugumą pagrindinių programavimo kalbų (Python, JavaScript, Java, Go, C++, Rust ir kt.). Muennighoff et al. 2023 Austin et al. 2021 Liu et al. 2023a Liu et al. 2023b Wang et al. 2022 Mūsų atradimai atskleidžia, kad tarp atvirojo kodo modelių „Granite Code“ modeliai apskritai rodo labai stiprų našumą visuose modelių dydžiuose ir etalonuose (dažnai viršydami kitų atvirojo kodo kodinių modelių našumą, kurie yra dvigubai didesni nei „Granite“). Kaip iliustracija, 1 pav. (viršuje) parodytas „Granite-8B-Code-Base“ palyginimas su kitais atvirojo kodo pagrindiniais kodiniais LLM, įskaitant naujausius aukštos kokybės bendrojo naudojimo pagrindinius LLM, tokius kaip „Mistral“ ( , ) ir „LLama-3“ ( , ), „HumanEvalPack“ ( , ) etalone. Nors „CodeGemma“ ir „StarCoder2“ gerai generuoja kodą, jie žymiai blogiau veikia „HumanEvalPack“ kodo taisymo ir paaiškinimo variantuose. Vidutiniškai „Granite-8B-Code-Base“ viršija konkurencingiausią „CodeGemma-8B“ modelį beveik 12 taškų „HumanEvalPack“ etalone (33,2 % prieš 21,3 %), nors apmokytas žymiai mažesniu kiekiu žetonų (4,5T prieš 7,5T žetonų). Be pagrindinių modelių, instrukcijomis apmokyti „Granite Code“ modelių variantai taip pat rodo stiprų našumą „HumanEvalPack“ etalone, viršydami kitus atvirojo kodo (kodo) instrukcinius modelius, demonstruodami naudą platesniam kodavimo užduočių spektrui su natūralios kalbos instrukcijomis (žr. 1 pav. (apačioje)). Jiang et al. 2023b AI@Meta 2024 Muennighoff et al. 2023 Be to, kadangi samprotavimas yra kritinis sprendžiant sudėtingus klausimus ir užduotis, mes taip pat išbandome savo „Granite-8B-Code-Base“ modelį šešiuose matematikos etalonuose, įskaitant MATH ( , ), GSM8K ( , ) ir problemų sprendimą su prieiga prie skaičiavimo įrankių, kur mūsų „Granite 8B“ modelis pasiekia geresnį našumą, palyginti su dauguma naujausių 7B arba 8B LLM. Pavyzdžiui, „Granite-8B-Code-Base“ viršija „Llama-3-8B-Base“ ~12 taškų GSM8K etalone ir ~6 taškus MATH etalone (žr. 15 lentelę). Cobbe et al. 2021 Cobbe et al. 2021 Pagrindiniai „Granite Code“ modelių privalumai apima: : „Granite Code“ modeliai pasiekia konkurencingą ar pažangiausią našumą įvairiose su kodu susijusiose užduotyse, įskaitant kodo generavimą, paaiškinimą, taisymą, redagavimą, vertimą ir kt., demonstruodami gebėjimą spręsti įvairias kodavimo užduotis; Visapusis kodinis LLM : Visi mūsų modeliai apmokyti licencijuojamais duomenimis, surinktais laikantis IBM etikos principų dirbtinio intelekto srityje ir vadovaujant IBM korporatyviniam teisiniam skyriui, siekiant patikimo verslo naudojimo. Visi „Granite Code“ modeliai išleidžiami pagal „Apache 2.0“ licenciją. Patikimas verslo lygio LLM 1 Visą mūsų duomenų rinkimo, filtravimo ir išankstinio apdorojimo procesą aprašome 2 skyriuje. 2 skyriuje aprašome duomenų rinkimo, filtravimo (2.1 sk.) procesą, dubliavimo šalinimą (2.2 sk.), HAP/PII filtravimą (2.3 sk.), naudojamą kodinių duomenų paruošimui modelio apmokymui. Taip pat pateikiame aukštos kokybės natūralios kalbos duomenų apžvalgą, naudotą modelio kalbos supratimo ir matematinių samprotavimų įgūdžiams tobulinti. 2 Duomenų rinkimas Šiame skyriuje aprašome duomenų rinkimo ir filtravimo (2.1 sk.), dubliavimo šalinimo (2.2 sk.), HAP/PII filtravimo (2.3 sk.) procesus, naudojamus kodiniams duomenims paruošti modelio apmokymui. Taip pat pateikiame apžvalgą apie aukštos kokybės natūralios kalbos duomenis, naudotus modelio kalbos supratimui ir matematiniams samprotavimams tobulinti. 2.1 Duomenų rinkimas ir filtravimas Išankstiniam apmokymui skirti kodiniai duomenys buvo gauti iš viešai prieinamų duomenų rinkinių, tokių kaip Github Code Clean , StarCoderdata , ir papildomų viešų GitHub kodinių saugyklų ir išleistų problemų. Iš žalių duomenų atrenkame 116 programavimo kalbų sąrašą iš daugiau nei 300 kalbų, kaip nurodyta A priede . Duomenys priskiriami programavimo kalboms remiantis tik failo plėtiniu, panašiai kaip „StarCoder“ ( , ). Po kalbų filtravimo taikome keturias pagrindines filtravimo taisykles, siekdami atmesti mažesnės kokybės kodą ( , ): (1) pašaliname failus, kuriuose yra mažiau nei 25 % raidžių; (2) išskyrus XSLT kalbą, atmetame failus, kuriuose eilutė „<?xml version=” pasirodo pirmųjų 100 simbolių; (3) HTML failams išsaugome tik tuos failus, kuriuose matomas tekstas sudaro ne mažiau kaip 20 % HTML kodo ir jo ilgis yra ne mažesnis kaip 100 simbolių; (4) JSON ir YAML failams išsaugome tik tuos failus, kurių simbolių skaičius svyruoja nuo 50 iki 5000 simbolių. Taip pat filtruojame GitHub problemas, naudodami kokybės metrikų rinkinį, įskaitant automatiškai generuojamo teksto atmetimą, neanglų kalbos problemų atmetimą, robotų komentarų atmetimą ir naudotojų, dalyvaujančių pokalbyje, skaičių kaip kokybės rodiklį. Taip pat kiekvieną kodinį failą anotojame licencijavimo informacija, susijusia su atitinkama saugykla, rastą per GitHub API, ir modelio apmokymui išsaugome tik failus su leidžiamomis licencijomis. 2 3 A Li et al. 2023a Li et al. 2023a 2.2 Tikslus ir neryškus dubliavimo šalinimas Naudojame griežtą dubliavimo šalinimo strategiją, apimančią tiek tikslų, tiek neryškų dubliavimo šalinimą, kad pašalintume dokumentus, turinčius (beveik) identišką kodinį turinį mūsų mokymo rinkinyje. Tiksliniam dubliavimo šalinimui pirmiausia apskaičiuojame dokumentų turinio SHA256 maišą ir pašaliname įrašus, turinčius identiškus maišus. Po tikslinio dubliavimo šalinimo taikome neryškų dubliavimo šalinimą, siekdami pašalinti kodinius failus, kurie gali turėti nedidelių skirtumų, taip dar labiau suvienodindami duomenis. Tam naudojame dviejų etapų metodą: (1) apskaičiuojame visų dokumentų „MinHashes“ ir tada naudojame „Locally Sensitive Hashing“ (LSH), kad grupuotume dokumentus pagal jų „MinHash“ pirštų atspaudus; (2) matuojame „Jaccard“ panašumą tarp kiekvienos dokumentų poros toje pačioje grupėje ir anotuojame dokumentus, išskyrus vieną, kaip dublikatus, remdamiesi 0,7 panašumo riba. Šį beveik dubliavimo šalinimo procesą taikome visoms programavimo kalboms, įskaitant „GitHub“ problemas, siekdami padidinti mokymo duomenų rinkinio turtingumą ir įvairovę. 2.3 HAP, PII, kenkėjiškų programų filtravimas Siekiant sumažinti tikimybę, kad modeliai generuos neapykantą kurstančią, įžeidžiančią ar nešvankią (HAP) kalbą, dedame pastangas filtruoti HAP turinį iš mokymo rinkinio. Pirmiausia sukuriame HAP raktinių žodžių žodyną ir tada kiekvieną kodinį dokumentą anotuojame pagal tokių raktinių žodžių pasikartojimų skaičių turinyje, įskaitant komentarus. Pašaliname dokumentus, viršijančius HAP ribą, apskaičiuotą remiantis paskirstymo analize ir rankiniu kodinių failų tikrinimu. Be to, siekdami apsaugoti privatumą, laikomės „StarCoder“ ( , ) ir dedame pastangas pašalinti asmens tapatybės informaciją (PII) iš mokymo rinkinio. Konkrečiai, naudojame „StarPII“ modelį, kad aptiktume IP adresus, raktus, el. pašto adresus, vardus, vartotojų vardus ir slaptažodžius, rastus turinyje. PII pašalinimo žingsnis pakeičia PII tekstą atitinkamais žetonais NAME , EMAIL , KEY , PASSWORD ir pakeičia IP adresą sintetiškai generuojamu IP adresu, kaip aprašyta Li et al. (2023a). Taip pat skenuojame savo duomenų rinkinius, kad nustatytume ir pašalintume kenkėjiškų programų atvejus šaltinio kode. Li et al. 2023a 4 2.4 Natūralios kalbos duomenų rinkiniai Be kodinių duomenų rinkimo modelio apmokymui, mes kuruojame keletą viešai prieinamų aukštos kokybės natūralios kalbos duomenų rinkinių, siekdami pagerinti modelio mokėjimą suprasti kalbą ir matematinius samprotavimus. Tipiški šiai kategorijai priskiriami duomenų rinkiniai apima žiniatinklio dokumentus (Stackexchange, CommonCrawl), matematinius žiniatinklio tekstus (OpenWeb-Math; ( ), StackMathQA; ( )), akademinius tekstus (Arxiv, Wikipedia) ir instrukcijų derinimo duomenų rinkinius (FLAN; ( ), HelpSteer ( , )). Šių jau apdorotų natūralios kalbos duomenų rinkinių dubliavimo nešaliname. Paster et al. 2023 Zhang 2024 Longpre et al. 2023 Wang et al. 2023 3 Modelio architektūra Treniruojame įvairių dydžių kodinių modelių seriją, pagrįstą transformatoriaus dekoderio architektūra ( , ). Modelio hiperparametrai šiems modeliams pateikiami 1 lentelėje . Visoms modelio architektūroms naudojame išankstinį normalizavimą ( , ): normalizavimą, taikomą dėmesio ir MLP blokų įėjimui. Vaswani et al. 2017 1 Xiong et al. 2020 : Mažiausias „Granite-code“ modelių šeimos modelis treniruojamas naudojant RoPE įterpimą ( , ) ir daugiagalvį dėmesį (Multi-Head Attention) ( , ). Šis modelis naudoja „swish“ aktyvacijos funkciją ( , ) su GLU ( , ) MLP, taip pat dažnai vadinama „swiglu“. Normalizavimui naudojame „RMSNorm“ ( , ), nes jis yra skaičiuojamojo požiūriu efektyvesnis nei „LayerNorm“ ( , ). 3B modelis treniruojamas su 2048 žetonų konteksto ilgiu. 3B Su et al. 2023 Vaswani et al. 2017 Ramachandran et al. 2017 Shazeer 2020 Zhang & Sennrich 2019 Ba et al. 2016 : 8B modelis turi panašią architektūrą kaip 3B modelis, išskyrus tai, kad naudojamas grupuotas užklausų dėmesys (Grouped-Query Attention, GQA) ( , ). Naudojant GQA, pasiekiama geresnė modelio našumo ir efektyvumo išvedimo pusiausvyra šiuo mastu. 8B modelį treniruojame su 4096 žetonų konteksto ilgiu. 8B Ainslie et al. 2023 : 20B kodinis modelis treniruojamas naudojant mokamus absoliučius pozicijos įterpimus. Treniravimo metu naudojame daugiakrypį dėmesį (Multi-Query Attention) ( , ) efektyviam tolesniam išvedimui. MLP blokui naudojame GELU aktyvacijos funkciją ( , ). Normalizuojant aktyvacijas, naudojame LayerNorm ( , ). Šis modelis treniruojamas su 8192 žetonų konteksto ilgiu. 20B Shazeer 2019 Hendrycks & Gimpel 2023 Ba et al. 2016 : Norėdami treniruoti 34B modelį, laikomės metodo, skirtą 20B modelio giluminiam didinimui. Konkrečiai, pirmiausia dubliuojame 20B kodinį modelį su 52 sluoksniais, tada pašaliname paskutinius 8 sluoksnius iš originalaus modelio ir pirmuosius 8 sluoksnius iš jo dublikato, kad gautume du modelius. 34B Kim et al. Galiausiai, abu modelius sujungiame, kad sudarytume „Granite-34B-Code“ modelį su 88 sluoksniais (žr. 2 pav. iliustraciją). Po giluminio didinimo pastebime, kad našumo sumažėjimas, palyginti su 20B modeliu, yra gana nedidelis, kitaip nei pastebėta . Šis našumas gana greitai atsigauna, kai tęsiame apmokytą didintą 34B modelį. Panašiai kaip ir 20B modelyje, apmokymo metu naudojame 8192 žetonų kontekstą. 2 Kim et al. 4 Išankstinis apmokymas Šiame skyriuje pateikiame detales apie dviejų etapų apmokymą (4.1 sk.), apmokymo tikslus (4.2 sk.), optimizavimą (4.3 sk.) ir infrastruktūrą (4.4 sk.), naudotus modelių išankstiniam apmokymui. 4.1 Dviejų etapų apmokymas „Granite Code“ modeliai apmokomi 3,5T–4,5T žetonų kodinių duomenų ir su kodu susijusių natūralios kalbos duomenų rinkinių. Duomenys yra tokenizuojami naudojant „byte pair encoding“ (BPE, , ), naudojant tą patį tokenizerį kaip ir „StarCoder“ ( , ). Laikantis ( , ; , Sennrich et al. 2015 Li et al. 2023a Shen et al. 2024 Hu et al.