```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, keičia programinės įrangos kūrimo procesą. Vis dažniau kodą generuojantys LLM yra 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 realizuoti visą kodą generuojančių 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 „Granite“ serijos vien tik dekoderio kodinius modelius kodą generuojančioms užduotims, apmokytus naudojant 116 programavimo kalbų kodą. „Granite Code“ modelių šeima apima modelius, kurių dydis svyruoja nuo 3 iki 34 milijardų parametrų, tinkamus programoms nuo sudėtingų programų modernizavimo užduočių iki įrenginyje veikiančių, ribotos atminties naudojančių atvejų. Išsamių užduočių rinkinys parodė, kad „Granite Code“ modeliai nuolat pasiekia aukščiausios klasės našumą tarp turimų atvirojo kodo kodą generuojančių 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 universalus „visapusiškas“ kodavimo modelis. Mes išleidžiame visus savo „Granite Code“ modelius pagal Apache 2.0 licenciją tiek moksliniams, tiek komerciniams tikslams. https://github.com/ibm-granite/granite-code-models 1 Įvadas Per pastaruosius kelis dešimtmečius programinė įranga persmelkė kiekvieną mūsų visuomenės aspektą. Didėjant programinės įrangos kūrimo paklausai, vis svarbiau didinti programinės įrangos kūrimo našumą, o LLM suteikia perspektyvią galimybę sustiprinti žmogaus programuotojus. Žinomos įmonių LLM programinės įrangos kūrimo našumo didinimo reikmės 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 kodu sparčiai tobulėjo, ir šiandien yra prieinami įvairūs modeliai, pasižymintys įspūdingais kodavimo gebėjimais. Modeliai svyruoja nuo vieno skaitmens milijardų parametrų (pvz., Llama-7B (Touvron et al., 2023), Gemma-7B (Gemma-Team et al., 2024), kt.) iki šimtų milijardų: DBRX (Databricks), Arctic (Snowflake), Grok, Mixtral 8x22B (MistralAI), Command R+ (Cohere) ir skiriasi numatomo naudojimo bendrumu, kai kurie modeliai siekia aprėpti įvairius kodavimo užduotis neesančius panaudojimus, o kiti daugiausia dėmesio skiria kodavimo užduotims (pvz., StarCoder (Li et al., 2023a; Lozhkov et al., 2024), CodeGen (Nijkamp et al., 2023), CodeLlama (Rozie`re et al., 2023), ir CodeGemma (CodeGemma Team et al., 2024)). Tačiau dabartinėje kodavimo LLM srityje vis dar yra svarbių spragų, ypač įmonių programinės įrangos kūrimo kontekste. Pirma, nors labai dideli, bendriniai LLM gali pasiekti puikų kodavimo našumą, jų dydis apsunkina diegimą. Mažesni, kodui skirti modeliai ( , ; , ; , ; , ; , ) gali pasiekti puikų kodo generavimo našumą mažesnėje ir lankstesnėje pakuotėje, tačiau našumas kodavimo užduotims, viršijančioms generavimą (pvz., taisymas ir paaiškinimas), 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ų kontekstų kodavimo LLM diegimą gali apsunkinti veiksniai, viršijantys pačių modelių našumą. Pavyzdžiui, net ir atviri modeliai kartais pasižymi skaidrumo stoka apie duomenų šaltinius ir duomenų apdorojimo metodus, kurie buvo naudojami kuriant modelį, o tai gali sumažinti pasitikėjimą modeliais kritinės svarbos ir reguliuojamose aplinkose. Be to, šiandieninių atvirųjų LLM licencijavimo sąlygos gali apriboti ir apsunkinti įmonių galimybes naudoti modelį. Čia pristatome „Granite Code“ modelius, seriją didelio pajėgumo kodavimo LLM, sukurtų palaikyti įmonių programinės įrangos kūrimą į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 fondiniai modeliai kodavimo užduotims; Granite Code Base: instrukcijas sekantys modeliai, patobulinti naudojant „Git“ komitų ir žmogaus instrukcijų derinį bei atvirojo kodo sintetiniu būdu generuojamus kodinius instrukcijų duomenų rinkinius. Granite Code Instruct: Šios serijos pagrindiniai modeliai buvo apmokyti nuo nulio, naudojant dviejų fazių mokymo strategiją. Pirmoje fazėje mūsų modelis apmokomas naudojant 3–4 trilijonus žetonų, gautų iš 116 programavimo kalbų, užtikrinant visapusišką programavimo kalbų ir sintaksės supratimą. Antroje fazėje mūsų modelis toliau apmokomas naudojant 500 milijardų žetonų, naudojant kruopščiai suprojektuotą aukštos kokybės duomenų iš kodo ir natūralios kalbos sričių mišinį, siekiant pagerinti modelio gebėjimą samprotauti. Nesuderintą kalbos modeliavimą naudojame pagrindinių modelių mokymui abiejose fazėse. Instrukcijų modeliai išvedami toliau patobulinant aukščiau apmokytus pagrindinius modelius, naudojant filtruotą „CommitPack“ variantą ( , ), natūralios kalbos instrukcijų sekimo duomenų rinkinius (OASST ( , ), HelpSteer ( , )) ir atvirojo kodo matematinius duomenų rinkinius (MathInstruct ( , ) ir MetaMathQA ( , )), įskaitant sintetiniu būdu generuojamus kodinius duomenų rinkinius, 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ų savo kodavimo LLM įvertinimą, naudojant visapusišką standartinių testo rinkinių rinkinį, įskaitant HumanEvalPack ( , ), MBPP+ ( , ; , ), RepoBench ( , ), ReCode ( , ) ir kt. Šis standartinių testo rinkinių rinkinys apima daugybę skirtingų kodavimo užduočių, neapsiribojant tik Python kodo sinteze, pvz., kodo taisymą, kodo paaiškinimą, kodo redagavimą, kodo 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ų tyrimai atskleidžia, kad tarp atvirojo kodo modelių „Granite Code“ modeliai apskritai rodo labai stiprų našumą visuose modelių dydžiuose ir standartiniuose testo rinkiniuose (dažnai viršijantys kitų atvirojo kodo kodavimo modelių, kurie yra du kartus didesni nei „Granite“, našumą). Iliustracijai, 1 pav. (viršuje) parodytas „Granite-8B-Code-Base“ palyginimas su kitais atvirojo kodo baziniais kodavimo LLM, įskaitant naujausius aukštos klasės bendrosios paskirties bazinius LLM, tokius kaip „Mistral“ ( , ) ir „LLama-3“ ( , ) „HumanEvalPack“ ( , ) bandymų metu. Nors „CodeGemma“ ir „StarCoder2“ gana gerai generuoja kodą, jie žymiai blogiau pasirodo kodo taisymo ir paaiškinimo variantuose „HumanEvalPack“. Vidutiniškai „Granite-8B-Code-Base“ viršija konkurencingiausią „CodeGemma-8B“ modelį beveik 12 balų „HumanEvalPack“ bandymų metu (33,2% prieš 21,3%), nors ir apmokytas žymiai mažesniu žetonų skaičiumi (4,5T prieš 7,5T žetonų). Be bazinių modelių, mūsų „Granite Code“ modelių instrukcijomis patobulinti variantai taip pat rodo stiprų našumą „HumanEvalPack“, viršijant kitus atvirojo kodo (kodavimo) instrukcijų modelius, demonstruodami naudą platesniam kodavimo užduočių, su natūralios kalbos instrukcijomis, spektrui (žr. 1 pav. (apačioje)). Jiang et al. 2023b AI@Meta 2024 Muennighoff et al. 2023 Be to, kadangi samprotavimas yra svarbus sudėtingoms problemoms spręsti, mes taip pat išbandome savo „Granite-8B-Code-Base“ modelį šešiuose matematikos standartiniuose testo rinkiniuose, įskaitant MATH ( , ), GSM8K ( , ) ir problemų sprendimą naudojant skaičiavimo įrankius, kur mūsų „Granite 8B“ modelis pasiekia geresnį našumą, palyginti su dauguma naujausių 7B ar 8B LLM. Pavyzdžiui, „Granite-8B-Code-Base“ viršija „Llama-3-8B-Base“ ∼12 balų GSM8K ir ∼6 balais MATH (žr. 15 lentelę). Cobbe et al. 2021 Cobbe et al. 2021 Pagrindiniai „Granite Code“ modelių privalumai yra šie: : „Granite Code“ modeliai pasiekia konkurencingą ar aukščiausios klasės našumą įvairiose su kodu susijusiose užduotyse, įskaitant kodo 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 yra apmokyti naudojant leidžiamų licencijų duomenis, surinktus pagal IBM AI etikos principus ir vadovaujant IBM įmonių teisiniam skyriui, siekiant užtikrinti patikimą įmonių naudojimą. Visi „Granite Code“ modeliai yra išleidžiami pagal Apache 2.0 licenciją. Patikimas įmonių klasės 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.), deduplikavimo (2.2 sk.), HAP/PII filtravimo (2.3 sk.) procesą, naudojamą 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 matematiniams samprotavimams pagerinti. 2 Duomenų rinkimas Šiame skyriuje aprašome duomenų rinkimo ir filtravimo (2.1 sk.), deduplikavimo (2.2 sk.), HAP/PII filtravimo (2.3 sk.) procesą, naudojamą 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 matematiniams samprotavimams 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šų „GitHub“ kodų saugyklų ir problemų. Filtruojame žaliuosius duomenis, kad išlaikytume 116 programavimo kalbų sąrašą iš daugiau nei 300 kalbų, kaip nurodyta A priede . Duomenų priskyrimas programavimo kalboms atliekamas remiantis tik failo plėtiniu, panašiai kaip „StarCoder“ ( , ). Po kalbų filtravimo taikome keturias pagrindines filtravimo taisykles, kad pašalintume žemesnės kokybės kodą ( , ): (1) pašalinti failus, kuriuose yra mažiau nei 25% raidinių 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 bent 20% HTML kodo ir kurio minimalus ilgis yra 100 simbolių, (4) JSON ir YAML failams, išlaikyti tik failus, kurių simbolių skaičius yra nuo 50 iki 5000. Taip pat filtruojame „GitHub“ problemas, naudodami kokybės rodiklių rinkinį, įskaitant automatiškai sugeneruoto teksto pašalinimą, neanglų kalba parašytų problemų filtravimą, robotų komentarų išskyrimą ir naudotojų, dalyvaujančių pokalbyje, skaičiaus naudojimą kaip kokybės rodiklį. Taip pat kiekvieną kodavimo failą anotuojame licencijos informacija, susijusia su atitinkama saugykla, rasta per „Github“ API, ir modelio mokymui išlaikome tik failus su leidžiamomis licencijomis. 2 3 A Li et al. 2023a Li et al. 2023a 2.2 Tiksli ir neaiški deduplikacija Mes taikome agresyvią deduplikavimo strategiją, įskaitant tikslią ir neaiškią deduplikaciją, kad pašalintume dokumentus, turinčius (beveik) identišką kodavimo turinį mūsų mokymo rinkinyje. Tiksliai deduplikuodami, pirmiausia apskaičiuojame dokumentų turinio SHA256 maišą ir pašaliname įrašus, turinčius identiškus maišus. Po tikslios deduplikacijos taikome neaiškią deduplikaciją, siekdami pašalinti kodinius failus, kurie gali turėti nedidelius skirtumus ir taip dar labiau subalansuoti 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 tame pačiame kauše ir anotuojame dokumentus, išskyrus vieną, kaip dublikatus, remdamiesi panašumo riba 0,7. Šį beveik deduplikavimo 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 Siekdami sumažinti tikimybę, kad modeliai generuos neapykantos, įžeidinėjimo ar necenzūrinės (HAP) kalbos, mes dedame pastangas, kad filtruotume HAP turinį iš mokymo rinkinio. Pirma, sukuriame HAP raktinių žodžių žodyną ir tada anotuojame kiekvieną kodavimo dokumentą pagal tokių raktinių žodžių pasikartojimo skaičių turinyje, įskaitant komentarus. Filtruojame dokumentus, viršijančius HAP ribą, apskaičiuotą remiantis paskirstymo analize ir rankine kodinių failų inspekcija. Be to, siekdami apsaugoti privatumą, sekame „StarCoder“ ( , ) ir dedame pastangas, kad iš mokymo rinkinio pašalintume asmens tapatybės informaciją (PII). Konkrečiai, naudojame „StarPII“ modelį, kad aptiktume IP adresus, raktus, el. pašto adresus, vardus, naudotojo vardus ir slaptažodžius, rastus turinyje. PII pašalinimo žingsnyje PII tekstas pakeičiamas atitinkamais žetonais NAME, EMAIL, KEY, PASSWORD, o IP adresas pakeičiamas sintetiniu būdu sugeneruotu IP adresu, kaip ir 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 kodavimo duomenų rinkimo modelio mokymui, mes kuruojame keletą viešai prieinamų aukštos kokybės natūralios kalbos duomenų rinkinių, siekdami pagerinti modelio kalbos supratimo ir matematinių samprotavimų įgūdžius. Pavyzdžiai duomenų rinkinių šioje kategorijoje apima žiniatinklio dokumentus (Stackexchange, CommonCrawl), matematinius žiniatinklio tekstus (OpenWeb-Math; ( ), StackMathQA; ( )), akademinius tekstus (Arxiv, Wikipedia) ir instrukcijų mokymo duomenų rinkinius (FLAN; ( ), HelpSteer ( , )). Šių jau iš anksto apdorotų natūralios kalbos duomenų rinkinių nededuplikuojame. Paster et al. 2023 Zhang 2024 Longpre et al. 2023 Wang et al. 2023 3 Modelio architektūra Mokome įvairaus dydžio kodavimo modelių seriją, pagrįstą transformatorių dekoderio architektūra ( , ). Modelio hiperparametrai šiems modeliams pateikiami 1 lentelėje . Visiems modelių architektūrams 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 apmokomas naudojant RoPE įterpimą ( , ) ir „Multi-Head Attention“ ( , ). Šis modelis naudoja „swish“ aktyvacijos funkciją ( , ) su GLU ( , ) MLP, taip pat dažnai vadinamą „swiglu“. Normalizavimui naudojame RMSNorm ( , ), nes jis yra skaičiuojamai efektyvesnis nei „LayerNorm“ ( , ). 3B modelis apmokomas 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 naudoja „Grouped-Query Attention“ (GQA) ( , ). GQA naudojimas suteikia geresnį našumo ir efektyvumo priimtinumo santykį šiuo mastu. 8B modelį apmokome su 4096 žetonų konteksto ilgiu. 8B Ainslie et al. 2023 : 20B kodavimo modelis apmokomas naudojant išmoktus absoliučius padėties įterpimus. Mokymo metu naudojame „Multi-Query Attention“ ( , ) efektyviam vėlesniam naudojimui. MLP blokui naudojame GELU aktyvacijos funkciją ( , ). Aktyvacijoms normalizuoti naudojame „LayerNorm“ ( , ). Šis modelis apmokomas su 8192 žetonų konteksto ilgiu. 20B Shazeer 2019 Hendrycks & Gimpel 2023 Ba et al. 2016 : 34B modelio mokymui sekame požiūrį, siekdami padidinti 20B modelio gylį. Konkrečiai, pirmiausia dubliuojame 20B kodavimo modelį su 52 sluoksniais, tada pašaliname 8 paskutinius sluoksnius iš originalaus modelio ir 8 pirmuosius sluoksnius iš jo dublikato, kad sudarytume du modelius. 34B Kim et al. Galiausiai, sujungę abu modelius, sudarome „Granite-34B-Code“ modelį su 88 sluoksniais (žr. 2 pav. iliustraciją ). Po gylio padidinimo pastebime, kad našumo nuosmukis, palyginti su 20B modeliu, yra labai mažas, priešingai nei pastebėta. Šis našumas gana greitai atstatomas po to, kai tęsiame padidinto 34B modelio išankstinį mokymą. Panašiai kaip 20B, išankstinio mokymo metu naudojame 8192 žetonų kontekstą. 2 Kim et al. 4 Išankstinis mokymas Šiame skyriuje pateikiame informaciją apie dviejų fazių mokymą (4.1 sk.), mokymo tikslus (4.2 sk.), optimizavimą (4.3 sk.) ir infrastruktūrą (4.4 sk.), naudotą modelių išankstiniam mokymui. 4.1 Dviejų fazių mokymas „Granite Code“ modeliai apmokomi naudojant 3,5–4,5 trilijonų žetonų kodavimo duomenų ir su kodu susijusių natūralios kalbos duomenų. Duomenys tokenizuojami „byte pair encoding“ (BPE, ( , )) metodu, naudojant tą patį tokenizatorių kaip ir „StarCoder“ ( , ). Sekdami ( , ; , ), naudojame aukštos kokybės duomenis su dviem mokymo fazėmis, kaip nurodyta toliau. Sennrich et al. 2015 Li et al. 2023a Shen et al. 2024 Hu et al. 2024 • : Pirmoje fazėje tiek 3B, tiek 8B modeliai apmokomi naudojant 4 trilijonus kodavimo duomenų žetonų, ap 1 fazė (tik kodavimo mokymas)