```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, pakeičia programinės įrangos kūrimo procesą. Vis dažniau kodavimo LLM integruojami į programinės įrangos kūrimo aplinkas, siekiant pagerinti žmonių programuotojų produktyvumą, o LLM pagrįsti agentai pradeda rodyti pažadą autonomiškai tvarkyti sudėtingas užduotis. Norint realizuoti visą kodavimo LLM potencialą, reikia plačių galimybių, įskaitant kodų generavimą, klaidų taisymą, kodų paaiškinimą ir dokumentavimą, saugyklų priežiūrą ir dar daugiau. Šiame darbe pristatome „Granite“ serijos dekoderio kodų modelius kodų generavimo užduotims, apmokytus koduojant 116 programavimo kalbų. „Granite Code“ modelių šeima apima modelius, kurių dydis svyruoja nuo 3 iki 34 milijardų parametrų, tinkamus programoms, pradedant sudėtingomis programų modernizavimo užduotimis ir baigiant įrenginyje naudojamais atminties apribojimais. Visapusiškas užduočių rinkinys rodo, kad „Granite Code“ modeliai nuolat pasiekia geriausią našumą tarp turimų atvirojo kodo kodavimo LLM. „Granite Code“ modelių šeima buvo optimizuota įmonių programinės įrangos kūrimo darbo eigai ir gerai veikia įvairiose kodavimo užduotyse (pvz., kodų generavimas, taisymas ir paaiškinimas), todėl tai yra universaliausias kodavimo 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ė į kiekvieną mūsų visuomenės aspektą. Didėjant programinės įrangos kūrimo paklausai, vis svarbiau didinti programinės įrangos kūrimo produktyvumą, o LLM suteikia perspektyvų kelią, kaip sustiprinti programuotojus. Ryškūs įmonių naudojimo atvejai, kai LLM naudojami programinės įrangos kūrimo produktyvumui didinti, apima kodų generavimą, kodų paaiškinimą, kodų taisymą, vienetinių testų ir dokumentų generavimą, programų modernizavimą, pažeidžiamumo aptikimą, kodų vertimą ir kt. Pastaraisiais metais sparčiai pažengė LLM gebėjimas generuoti ir manipuliuoti kodais, o šiandien yra prieinami įspūdingi kodavimo gebėjimai turintys modeliai. 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 numatomo naudojimo bendrumu, kai kurie modeliai skirti įvairiems naudojimo atvejams, ne tik kodavimui, o kiti daugiausia sutelkia dėmesį į kodavimui skirtas užduotis (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 LLM kodavimo srityje vis dar yra svarbių spragų, ypač įmonių programinės įrangos kūrimo kontekste. Pirma, nors labai dideli, bendro pobūdžio LLM gali pasiekti puikų kodavimo našumą, jų dydis daro juos brangius diegti. Mažesni, koduoti skirti modeliai ( , ; , ; , ; , ; , ) gali pasiekti puikų kodų generavimo našumą mažesniu ir lankstesniu paketu, tačiau našumas kodavimo užduotyse, neviršijančiose generavimo (pvz., taisymo ir paaiškinimo), gali atsilikti nuo kodų 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 Daugeliu įmonių kontekstų kodavimo LLM pritaikymą gali dar labiau apsunkinti veiksniai, neviršijantys modelių našumo. Pavyzdžiui, net ir atviri modeliai kartais kenčia nuo duomenų šaltinių ir duomenų apdorojimo metodų, kurie buvo naudojami modelio kūrimui, skaidrumo trūkumo, o tai gali sumažinti pasitikėjimą modeliais kritinės svarbos ir reguliuojamose situacijose. Be to, dabartinių atvirųjų LLM licencijos sąlygos gali apriboti ir apsunkinti įmonės galimybę naudoti modelį. Štai „Granite Code“ modeliai, labai pajėgūs kodavimo LLM, skirti palaikyti įmonių programinės įrangos kūrimą įvairiose kodavimo užduotyse. „Granite Code“ modeliai turi du pagrindinius variantus, kuriuos išleidžiame keturiais skirtingais dydžiais (3B, 8B, 20B ir 34B): pagrindiniai fondų modeliai kodavimo užduotims; Granite Code Base: instrukcijų laikymosi modeliai, toliau patobulinti naudojant Git commitų derinį su žmogaus instrukcijomis ir atvirojo kodo sintetiniu kodu instrukcijų duomenimis. Granite Code Instruct: Pagrindiniai serijos modeliai buvo apmokyti nuo nulio naudojant dviejų fazių mokymo strategiją. Pirmoje fazėje mūsų modelis apmokytas 3–4 trilijonų žetonų iš 116 programavimo kalbų, užtikrinant išsamų programavimo kalbų ir sintaksės supratimą. Antroje fazėje mūsų modelis toliau apmokytas 500 milijardų žetonų su kruopščiai suprojektuota aukštos kokybės duomenų iš kodų ir natūralios kalbos sričių mišinio, kad pagerintų modelio gebėjimą mąstyti. Abiejose mokymo fazėse naudojame nekontroliuojamo kalbos modeliavimo tikslą apmokyti pagrindinius modelius. Instrukcijų modeliai išvedami toliau patobulinus aukščiau apmokytus pagrindinius modelius, naudojant filtruotą CommitPack variantą ( , ), natūralios kalbos instrukcijų laikymosi duomenų rinkinius (OASST ( , ), HelpSteer ( , )) ir atvirojo kodo matematikos duomenų rinkinius (MathInstruct ( , ) ir MetaMathQA ( , )), įskaitant sintetinius kodų duomenų rinkinius, siekiant pagerinti instrukcijų laikymosi ir mąstymo gebėjimus. Muennighoff et al. 2023 Ko¨ pf et al. 2023 Wang et al. 2023 Yue et al. 2023 Yu et al. 2023 Mes atliekame išsamų savo kodavimo LLM vertinimą visapusiškame etalonų rinkinyje, įskaitant HumanEvalPack ( , ), MBPP(+) ( , ; , ), RepoBench ( , ), ReCode ( , ) ir kt. Šis etalonų rinkinys apima daugybę skirtingų kodavimo užduočių, ne tik kodų sintezę Python, pvz., kodų taisymą, kodų paaiškinimą, kodų redagavimą, kodų vertimą ir kt., įvairiose pagrindinėse programavimo kalbose (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ų išvados rodo, kad tarp atvirojo kodo modelių „Granite Code“ modeliai apskritai rodo labai stiprų našumą visuose modelių dydžiuose ir etalonuose (dažnai viršydami kitus atvirojo kodo kodavimo modelius, kurie yra dvigubai didesni nei „Granite“). Kaip iliustracija, 1 pav. (viršuje) parodytas „Granite-8B-Code-Base“ palyginimas su kitais atvirojo kodo pagrindiniais kodavimo LLM, įskaitant neseniai pasižymėjusius bendrojo pobūdžio pagrindinius LLM, tokius kaip Mistral ( , ) ir LLama-3 ( , ) „HumanEvalPack“ ( , ) etalonoje. Nors „CodeGemma“ ir „StarCoder2“ gana gerai generuoja kodą, jie žymiai prasčiau veikia kodų taisymo ir paaiškinimo „HumanEvalPack“ variantuose. Vidutiniškai „Granite-8B-Code-Base“ viršija konkurencingiausią „CodeGemma-8B“ modelį beveik 12 balų „HumanEvalPack“ etalonėje (33,2 % vs 21,3 %), nepaisant to, kad buvo apmokytas žymiai mažesniu žetonų kiekiu (4,5 T vs 7,5 T žetonų). Be pagrindinių modelių, instrukcijų patobulinti mūsų „Granite Code“ modelių variantai taip pat rodo stiprų našumą „HumanEvalPack“, viršydami kitus atvirojo kodo (kodavimo) instrukcijų 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 mąstymas yra kritinis sprendžiant sudėtingus klausimus ir užduotis, mes taip pat išbandome savo „Granite-8B-Code-Base“ modelį šešiose matematikos etalonėse, į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“ maždaug 12 balų GSM8K etalonėje ir maždaug 6 balus MATH etalonėje (žr. 15 lentelę). Cobbe et al. 2021 Cobbe et al. 2021 Pagrindiniai „Granite Code“ modelių privalumai yra šie: : „Granite Code“ modeliai pasiekia konkurencingą ar naujausią našumą įvairiose kodavimo užduotyse, įskaitant kodų generavimą, paaiškinimą, taisymą, redagavimą, vertimą ir kt., demonstruodami savo gebėjimą spręsti įvairias kodavimo užduotis; Visapusiškas kodavimo LLM : visi mūsų modeliai apmokyti naudojant licencijuotus duomenis, surinktus pagal IBM AI etikos principus ir vadovaujant IBM korporacijos teisiniam skyriui, siekiant užtikrinti patikimą įmonių naudojimą. Visi „Granite Code“ modeliai išleidžiami pagal „Apache 2.0“ licenciją. Patikimas įmonės lygio LLM 1 Visą mūsų duomenų rinkimo, filtravimo ir išankstinio apdorojimo eigą aprašome 2 skyriuje. 2 skyriuje aprašome duomenų rinkimo, filtravimo (2.1 skyrius), dubliavimo šalinimo (2.2 skyrius), HAP/PII filtravimo (2.3 skyrius) procesus, naudojamus kodavimo duomenims paruošti modelio mokymui. Taip pat pateikiame apžvalgą apie aukštos kokybės natūralios kalbos duomenis, naudojamus modelio kalbos supratimui ir matematiniam mąstymui pagerinti. skyrius aprašo modelio architektūros detales, mokymo detales – 3 skyriuje, instrukcijų patobulinimo detales – 5 skyriuje, o eksperimentus ir rezultatus, lyginant „Granite Code“ modelius su kitais LLM – 6 skyriuje. 2 2 Duomenų rinkimas Šiame skyriuje aprašome duomenų rinkimo ir filtravimo (2.1 skyrius), dubliavimo šalinimo (2.2 skyrius), HAP/PII filtravimo (2.3 skyrius) procesus, naudojamus kodavimo duomenims paruošti modelio mokymui. Taip pat pateikiame apžvalgą apie aukštos kokybės natūralios kalbos duomenis, naudojamus modelio kalbos supratimui ir matematiniam mąstymui pagerinti. 2.1 Duomenų rinkimas ir filtravimas Išankstinio mokymo kodavimo duomenys buvo gauti iš viešai prieinamų duomenų rinkinių, tokių kaip „Github Code Clean“ , „StarCoderdata“ , ir papildomų viešųjų GitHub kodų saugyklų ir problemų. Fil-truojame žaliuosius duomenis, kad išlaikytume 116 programavimo kalbų sąrašą iš 300+ kalbų, kaip nurodyta A priede . Duomenų priskyrimas programavimo kalboms atliekamas tik pagal failo plėtinį, panašiai kaip „StarCoder“ ( , ). Po kalbos filtravimo taikome keturias pagrindines filtravimo taisykles, kad pašalintume žemesnės kokybės kodą ( , ): (1) pašalinti failus, kuriuose yra mažiau nei 25% abėcėlės simbolių, (2) išskyrus XSLT kalbą, filtruoti failus, kuriuose eilutė „<?xml version=” pasirodo pirmųjų 100 simbolių, (3) HTML failams, išlaikyti tik tuos failus, kuriuose matomas tekstas sudaro mažiausiai 20% HTML kodo ir yra ne mažiau kaip 100 simbolių ilgio, (4) JSON ir YAML failams, išlaikyti tik 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 pašalinimą, neanglų kalba parašytų problemų filtravimą, robotų komentarų pašalinimą ir diskusijoje dalyvaujančių vartotojų skaičiaus naudojimą kaip kokybės rodiklį. Taip pat kiekvieną kodų failą anotavo-jame licencijos informacija, susijusia su atitinkama saugykla, rastą per GitHub API, ir tik leidžiančias licencijas turinčius failus sau-come modelio mokymui. 2 3 A Li et al. 2023a Li et al. 2023a 2.2 Tikslus ir neaiškus dubliavimas Naudojame agresyvią dubliavimo šalinimo strategiją, įskaitant tikslų ir neaiškų dubliavimą, kad pašalintume dokumentus, turinčius (beveik) identišką kodų 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 pašalinimo taikome neaiškų dubliavimą, siekdami pašalinti kodų failus, kurie gali turėti nedidelius skirtumus ir taip dar labiau subalansuoti duomenis. Tam naudojame dviejų etapų metodą: (1) apskaičiuojame visų dokumentų MinHash ir tada naudojame Vietiškai Jautrų Maišavimą (LSH), kad sugrupuotume dokumentus pagal jų MinHash pirštų atspaudus, (2) matuojame Jaccard panašumą tarp kiekvienos dokumentų poros tame pačiame kaušelyje ir anotuo-jame dokumentus, išskyrus vieną, kaip dublikatus, remdamiesi panašumo slenksčiu 0,7. Šį beveik dubliavimo šalinimo procesą taikome visoms programavimo kalboms, įskaitant GitHub problemas, kad padidintume mokymo duomenų rinkinio turtingumą ir įvairovę. 2.3 HAP, PII, kenkėjiškų programų filtravimas Norėdami sumažinti tikimybę, kad modeliai generuos neapykantos, įžeidžiančią ar necenzūrinę (HAP) kalbą, dedame pastangas, kad HAP turinys būtų pašalintas iš mokymo rinkinio. Pirmiausia sukuriame HAP raktinių žodžių žodyną ir tada anotuo-jame kiekvieną kodų dokumentą pagal tokių raktinių žodžių pasikartojimų skaičių turinyje, įskaitant komentarus. Pašaliname dokumentus, kurie viršija HAP slenkstį, apskaičiuotą remiantis paskirstymo analize, taip pat rankiniu kodų failų tikrinimu. Be to, siekdami apsaugoti privatumą, sekame „StarCoder“ ( , ) ir dedame pastangas, kad asmens duomenys (PII) būtų pašalinti iš mokymo rinkinio. Konkrečiai, naudojame „StarPII“ modelį, kad aptiktume IP adresus, raktus, el. pašto adresus, vardus, vartotojo vardus ir slaptažodžius, rastus turinyje. PII pašalinimo žingsnyje PII tekstas pakeičiamas atitinkamais žetonais NAME , EMAIL , KEY , PASSWORD ir IP adresas pakeičiamas sintetiniu IP adresu, kaip ir Li et al. (2023a). Taip pat skanuojame 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 kodavimo duomenų rinkimo modelio mokymui, mes kuruojame keletą viešai prieinamų aukštos kokybės natūralios kalbos duomenų rinkinių, siekdami pagerinti modelio kalbos supratimą ir matematinius mąstymo įgūdžius. Pavyzdiniai šios kategorijos duomenų rinkiniai apima žiniatinklio dokumentus (Stackexchange, CommonCrawl), matematinius žiniatinklio tekstus (OpenWeb-Math; ( ), StackMathQA; ( )), akademinius tekstus (Arxiv, Wikipedia) ir instrukcijų mokymo duomenų rinkinius (FLAN; ( ), HelpSteer ( , )). Šių jau paruoštų natūralios kalbos duomenų rinkinių nedubliuojame. Paster et al. 2023 Zhang 2024 Longpre et al. 2023 Wang et al. 2023 3 Modelio architektūra Mes apmokome seriją kodavimo modelių skirtingų dydžių, pagrįstų transformatoriaus dekoderio architektūra ( , ). Modelio hiperparametrai šiems modeliams pateikti 1 lentelėje . Visoms modelio architektūroms naudojame išankstinį normalizavimą ( , ): normalizavimas taikomas dėmesio ir MLP blokų įėjimui. Vaswani et al. 2017 1 Xiong et al. 2020 : Mažiausias „Granite-code“ modelių šeimos modelis apmokytas naudojant RoPE įterpimą ( , ) ir daugiagalvį dėmesį ( , ). Šis modelis naudoja „swish“ aktyvacijos funkciją ( , ) su GLU ( , ) MLP, taip pat dažnai vadinama „swiglu“. Normalizavimui naudojame RMSNorm ( , ), nes tai yra skaičiuojamai efektyviau nei „LayerNorm“ ( , ). 3B modelis apmokytas 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 Grupės Klausymo Dėmesys (GQA) ( , ). Naudojant GQA, pasiekiama geresnė modelio našumo ir efektyvumo išvedimo santykio. 8B modelį apmokome su 4096 žetonų konteksto ilgiu. 8B Ainslie et al. 2023 : 20B kodų modelis apmokytas naudojant išmoktus absoliučius pozicijų įterpimus. Mokymo metu naudojame Daugiaklausių Dėmesį (MQM) ( , ) efektyviam vėlesniam išvedimui. MLP blokui naudojame GELU aktyvacijos funkciją ( , ). Aktyvacijoms normalizuoti naudojame LayerNorm ( , ). Šis modelis apmokytas su 8192 žetonų konteksto ilgiu. 20B Shazeer 2019 Hendrycks & Gimpel 2023 Ba et al. 2016 : Norėdami apmokyti 34B modelį, sekame metodą dėl 20B modelio gylio didinimo. Konkrečiai, pirmiausia dubliuojame 20B kodų modelį su 52 sluoksniais, tada pašaliname 8 paskutinius originalaus modelio sluoksnius ir 8 pirmuosius jo dublikato sluoksnius, kad sudarytume du modelius. 34B Kim et al. Galiausiai, sukoncatenavome abu modelius, kad sudarytume „Granite-34B-Code“ modelį su 88 sluoksniais (žr. 2 pav. iliustraciją). Po gylio padidinimo pastebėjome, kad našumo kritimas, palyginti su 20B modeliu, yra gana mažas, skirtingai nei pastebėta . Šis našumas gana greitai atstatomas po to, kai tęsiame padidinto 34B modelio išankstinį apmokymą. Panašiai kaip ir 20B, prieš mokymą naudojame 8192 žetonų kontekstą. Kim et al. 4 Išankstinis apmokymas Šiame skyriuje pateikiame detales apie dviejų fazių mokymą (4.1 skyrius), mokymo tikslus (4.2 skyrius), optimizavimą (4.3 skyrius) ir infrastruktūrą (4.4 skyrius), naudotus modelių išankstiniam apmokymui. 4.1 Dviejų fazių mokymas „Granite Code“ modeliai apmokomi naudojant 3,5T–4,5T žetonų kodavimo duomenų ir su kodu susijusių natūralios kalbos duomenų. Duomenys tokenizuojami „byte pair encoding“ (BPE, ( , )) metodu, naudojant tą patį tokenizerį kaip ir „StarCoder“ ( , ). Sekdami ( , ; , ), naudojame aukštos kokybės duomenis su dviem mokymo fazėmis: Sennrich et al. 2015 Li et al. 2023a Shen et al. 2024 Hu et al. 2024 • : per 1 fazę, tiek 3B, tiek 8B modeliai apmokomi 4 trilijonais kodų duomenų žetonų, apimančių 116 kalbų. 20B parametrų modelis apmokytas 3 tril 1 fazė (tik kodavimo mokymas)