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 Kopsavilkums Lielie valodu modeļi (LLM), kas apmācīti uz kodu, revolucionē programmatūras izstrādes procesu. Pieaugošā mērā kodu LLM tiek integrēti programmatūras izstrādes vidēs, lai uzlabotu cilvēka programmētāju produktivitāti, un LLM balstīti aģenti sāk radīt cerības sarežģītu uzdevumu autonomā veikšanā. Lai pilnībā izmantotu kodu LLM potenciālu, nepieciešamas plašas iespējas, tostarp kodu ģenerēšana, kļūdu labošana, kodu skaidrošana un dokumentēšana, repozitoriju uzturēšana un daudz kas cits. Šajā darbā mēs iepazīstinām ar Granite sērijas dekoderu-tikai kodu modeļiem kodu ģenerēšanas uzdevumiem, kas apmācīti ar kodu, kas rakstīts 116 programmēšanas valodās. Granite Code modeļu saime sastāv no modeļiem, kuru izmēri ir no 3 līdz 34 miljardiem parametru, piemērotiem lietojumiem, sākot no sarežģītiem lietojumprogrammu modernizācijas uzdevumiem līdz ierīcē esošiem lietojumiem ar ierobežotu atmiņu. Visaptverošu uzdevumu komplektu novērtējums parāda, ka Granite Code modeļi konsekventi sasniedz vismodernāko veiktspēju starp pieejamajiem atvērtā pirmkoda kodu LLM. Granite Code modeļu saime tika optimizēta uzņēmumu programmatūras izstrādes darbplūsmām un labi darbojas dažādos kodēšanas uzdevumos (piemēram, kodu ģenerēšana, labošana un skaidrošana), padarot to par daudzpusīgu "visaptverošu" kodu modeli. Mēs atbrīvojam visus mūsu Granite Code modeļus ar Apache 2.0 licenci gan pētniecības, gan komerciālai lietošanai. https://github.com/ibm-granite/granite-code-models 1 Ievads Pēdējās desmitgadēs programmatūra ir ieausta mūsu sabiedrības audumā. Tā kā pieprasījums pēc programmatūras izstrādes pieaug, ir ļoti svarīgi palielināt programmatūras izstrādes produktivitāti, un LLM nodrošina daudzsološu ceļu cilvēka programmētāju papildināšanai. Ievērojami uzņēmumu lietojuma gadījumi LLM programmatūras izstrādes produktivitātē ietver kodu ģenerēšanu, kodu skaidrošanu, kodu labošanu, vienības testu un dokumentācijas ģenerēšanu, lietojumprogrammu modernizāciju, ievainojamības noteikšanu, koda tulkošanu un daudz ko citu. Pēdējos gados ir panākts straujš progress LLM spējās ģenerēt un manipulēt kodu, un šodien ir pieejami vairāki modeļi ar iespaidīgām kodēšanas spējām. Modeļu izmēri svārstās no viena cipara miljardiem parametru (piemēram, Llama-7B (Touvron et al., 2023), Gemma-7B (Gemma-Team et al., 2024) utt.) līdz simtiem miljardu: DBRX (Databricks), Arctic (Snowflake), Grok, Mixtral 8x22B (MistralAI), Command R+ (Cohere), un tie atšķiras ar paredzētās lietošanas vispārīgumu, dažiem modeļiem mērķējot uz plašu lietojumu klāstu ārpus kodēšanas, savukārt citi galvenokārt koncentrējas uz ar kodēšanu saistītiem uzdevumiem (piemēram, StarCoder (Li et al., 2023a; Lozhkov et al., 2024), CodeGen (Nijkamp et al., 2023), CodeLlama (Rozie`re et al., 2023), un CodeGemma (CodeGemma Team et al., 2024)). Tomēr LLM kodēšanas jomā joprojām pastāv svarīgas nepilnības, īpaši uzņēmumu programmatūras izstrādes kontekstā. Pirmkārt, lai gan ļoti lieli, ģenerālistu LLM var sasniegt lielisku kodēšanas veiktspēju, to izmērs padara tos dārgus izvietošanai. Mazāki kodu-fokusēti modeļi ( , ; , ; , ; , ; , ) var sasniegt lielisku kodu ģenerēšanas veiktspēju mazākā un elastīgākā paketē, taču veiktspēja kodēšanas uzdevumos, kas pārsniedz ģenerēšanu (piemēram, labošana un skaidrošana), var atpalikt no kodu ģenerēšanas veiktspējas. Li et al. 2023a Lozhkov et al. 2024 Nijkamp et al. 2023 Rozie`re et al. 2023 CodeGemma Team et al. 2024 Daudzos uzņēmumu kontekstos LLM pieņemšanu kodēšanā var vēl vairāk sarežģīt faktori, kas pārsniedz modeļu veiktspēju. Piemēram, pat atvērtie modeļi dažreiz cieš no pārredzamības trūkuma attiecībā uz datu avotiem un datu apstrādes metodēm, kas tika izmantotas modeļa izveidē, kas var mazināt uzticību modeļiem misijas kritiskos un regulētos kontekstos. Turklāt mūsdienu atvērto LLM licences noteikumi var apgrūtināt un sarežģīt uzņēmuma spēju izmantot modeli. Šeit mēs iepazīstinām ar Granite Code modeļiem, kas ir ļoti spējīgu kodu LLM sērija, kas paredzēta uzņēmumu programmatūras izstrādes atbalstam plašā kodēšanas uzdevumu klāstā. Granite Code modeļiem ir divi galvenie varianti, ko mēs atbrīvojam četrās dažādās izmēros (3B, 8B, 20B un 34B): pamata fonda modeļi ar kodēšanu saistītiem uzdevumiem; Granite Code Base: instruktu sekšanas modeļi, kas pārfinēti, izmantojot Git komandu pārus kopā ar cilvēka instrukcijām un atvērtā pirmkoda sintētiski ģenerētiem kodu instrukciju datu kopumiem. Granite Code Instruct: Sērijas pamata modeļi ir apmācīti no nulles ar divu posmu apmācības stratēģiju. 1. posmā mūsu modelis tiek apmācīts uz 3 līdz 4 triljoniem marķieru, kas iegūti no 116 programmēšanas valodām, nodrošinot visaptverošu izpratni par programmēšanas valodām un sintaksi. 2. posmā mūsu modelis tiek tālāk apmācīts uz 500 miljardiem marķieru ar rūpīgi izstrādātu augstas kvalitātes datu maisījumu no kodu un dabiskās valodas domēnām, lai uzlabotu modeļa spēju spriest. Mēs izmantojam neuzraudzītu valodu modelēšanas mērķi, lai apmācītu pamata modeļus abos apmācības posmos. Instrukciju modeļi ir atvasināti, tālāk pārfinējot iepriekš apmācītos pamata modeļus uz filtrētas CommitPack variants ( , ), dabiskās valodas instrukciju sekošanas datu kopumiem (OASST ( , ), HelpSteer ( , )) un atvērtā pirmkoda matemātikas datu kopumiem (MathInstruct ( , ) un MetaMathQA ( , )), tostarp sintētiski ģenerētiem kodu datu kopumiem, lai uzlabotu instrukciju sekošanas un spriešanas spējas. Muennighoff et al. 2023 Ko¨ pf et al. 2023 Wang et al. 2023 Yue et al. 2023 Yu et al. 2023 Mēs veicam mūsu kodu LLM plašu novērtējumu visaptverošā etalonu komplektā, tostarp HumanEvalPack ( , ), MBPP(+) ( , ; , ), RepoBench ( , ), ReCode ( , ), un citus. Šis etalonu komplekts aptver daudzus dažādus kodēšanas uzdevumu veidus, kas pārsniedz tikai Python koda sintēzi, piemēram, koda labošanu, koda skaidrošanu, koda rediģēšanu, koda tulkošanu utt., vairumā galveno programmēšanas valodu (Python, JavaScript, Java, Go, C++, Rust utt.). Muennighoff et al. 2023 Austin et al. 2021 Liu et al. 2023a Liu et al. 2023b Wang et al. 2022 Mūsu atklājumi liecina, ka starp atvērtā pirmkoda modeļiem Granite Code modeļi kopumā parāda ļoti spēcīgu veiktspēju visos modeļu izmēros un etalonos (bieži vien pārspējot citus atvērtā pirmkoda kodu modeļus, kas ir divreiz lielāki nekā Granite). Kā ilustrāciju, 1. attēlā (augšā) parādīts Granite-8B-Code-Base salīdzinājums ar citiem atvērtā pirmkoda pamata kodu LLM, tostarp nesenajiem augstas veiktspējas vispārējās lietošanas pamata LLM, piemēram, Mistral ( , ) un LLama-3 ( , ) uz HumanEvalPack ( , ). Lai gan CodeGemma un StarCoder2 darbojas saprātīgi labi kodu ģenerēšanā, tie ievērojami sliktāk darbojas kodu labošanas un skaidrošanas variantos HumanEvalPack. Vidēji Granite-8B-Code-Base pārspēj viskonkurētspējīgāko CodeGemma-8B modeli par gandrīz 12 punktiem HumanEvalPack (33,2% pret 21,3%), neskatoties uz to, ka tas ir apmācīts uz ievērojami mazāku marķieru skaitu (4,5T pret 7,5T marķieriem). Papildus pamata modeļiem mūsu Granite Code modeļu instrukciju pārveidotie varianti arī parāda spēcīgu veiktspēju HumanEvalPack, pārspējot citus atvērtā pirmkoda (kodu) instrukciju modeļus, demonstrējot ieguvumus plašākam kodēšanas uzdevumu kopumam ar dabiskās valodas instrukcijām (skatīt 1. attēlu (apakšā)). Jiang et al. 2023b AI@Meta 2024 Muennighoff et al. 2023 Turklāt, tā kā spriešana ir būtiska sarežģītu jautājumu un uzdevumu risināšanai, mēs arī testējam mūsu Granite-8B-Code-Base modeli uz sešiem matemātikas etaloniem, tostarp MATH ( , ), GSM8K ( , ) un problēmu risināšanai ar piekļuvi aprēķinu rīkiem, kur mūsu Granite 8B modelis sasniedz labāku veiktspēju salīdzinājumā ar vairumu pašreizējo 7B vai 8B LLM. Piemēram, Granite-8B-Code-Base pārspēj Llama-3-8B-Base par ~12 punktiem GSM8K un ~6 punktiem MATH (skatīt 1. tabulu 15). Cobbe et al. 2021 Cobbe et al. 2021 Granite Code modeļu galvenās priekšrocības ietver: : Granite Code modeļi sasniedz konkurētspējīgu vai pašreizējo veiktspēju dažādos ar kodu saistītos uzdevumos, tostarp koda ģenerēšanā, skaidrošanā, labošanā, rediģēšanā, tulkošanā utt., demonstrējot savas spējas risināt dažādus kodēšanas uzdevumus; Visaptverošs kodu LLM : Visi mūsu modeļi ir apmācīti uz atļautu datu bāzes, kas savākta, ievērojot IBM AI ētikas principus , un vadīta ar IBM Korporatīvo juridisko komandu uzticamai uzņēmumu lietošanai. Visi Granite Code modeļi tiek atbrīvoti saskaņā ar Apache 2.0 licenci. Uzticams uzņēmuma līmeņa LLM 1 Mēs aprakstām visu mūsu datu vākšanas, filtrēšanas un pirmapstrādes cauruļvadu 2. sadaļā . 3. sadaļā aprakstīta modeļa arhitektūras detalizācija, kam seko apmācības detalizācija 4. sadaļā. 5. sadaļā sniegti modeļa arhitektūras detalizējumi, un 6. sadaļā aprakstīti eksperimenti un rezultāti, salīdzinot Granite Code modeļus ar citiem atvērtā pirmkoda LLM. 2 2 Datu vākšana Šajā sadaļā mēs aprakstām datu indeksēšanas un filtrēšanas procesu (2.1. punkts), deduplikāciju (2.2. punkts), HAP/PII filtrēšanu (2.3. punkts), ko izmanto, lai sagatavotu koda datus modeļa apmācībai. Mēs arī sniedzam pārskatu par augstas kvalitātes dabiskās valodas datiem, ko izmanto, lai uzlabotu modeļa valodu izpratni un matemātiskās spriešanas prasmes. 2.1 Datu indekssēšana un filtrēšana Priekšapmācības koda dati tika iegūti no publiski pieejamiem datu kopumiem, piemēram, Github Code Clean , StarCoderdata , un papildu publiskiem koda repozitorijiem un GitHub problēmām. Mēs filtrējam izejas datus, lai saglabātu 116 programmēšanas valodu sarakstu no vairāk nekā 300 valodām, kā norādīts A. pielikumā . Datu piešķiršana programmēšanas valodām tiek veikta, pamatojoties tikai uz faila paplašinājumu, līdzīgi kā StarCoder ( , ). Pēc valodu filtrēšanas mēs piemērojam četrus galvenos filtrēšanas noteikumus, lai izfiltrētu zemākas kvalitātes kodu ( , ): (1) izdzēst failus ar mazāk nekā 25% alfabētisko rakstu zīmju, (2) izņemot XSLT valodu, izfiltrēt failus, kur virkne “<?xml version=” parādās pirmo 100 rakstzīmju robežās, (3) HTML failiem saglabāt tikai tos failus, kur redzamais teksts veido vismaz 20% no HTML koda un kura minimālais garums ir 100 rakstzīmes, (4) JSON un YAML failiem saglabāt tikai tos failus, kuru rakstzīmju skaits ir no 50 līdz 5000 rakstzīmēm. Mēs arī filtrējam GitHub problēmas, izmantojot kvalitātes metrikas kopumu, kas ietver automātiski ģenerēta teksta dzēšanu, neangļu valodas problēmu izfiltrēšanu, botu komentāru izslēgšanu un lietotāju iesaistīšanās skaita izmantošanu kā kvalitātes rādītāju. Mēs arī anotējam katru koda failu ar licences informāciju, kas saistīta ar attiecīgo repozitoriju, izmantojot Github API, un modeļa apmācībai saglabājam tikai failus ar atļautām licencēm. 2 3 A Li et al. 2023a Li et al. 2023a 2.2 Precīza un neprecīza deduplikācija Mēs izmantojam agresīvu deduplikācijas stratēģiju, kas ietver gan precīzu, gan neprecīzu deduplikāciju, lai mūsu apmācību kopumā dzēstu dokumentus ar (gandrīz) identisku saturu. Precīzai deduplikācijai mēs vispirms aprēķinām dokumenta satura SHA256 jaucējkodu un dzēšam ierakstus ar identiskiem jaucējkodiem. Pēc precīzas deduplikācijas mēs piemērojam neprecīzu deduplikāciju ar mērķi dzēst koda failus, kuriem var būt nelielas atšķirības, tādējādi vēl vairāk padarot datus neobjektīvus. Mēs izmantojam divpakāpju metodi: (1) aprēķinām visu dokumentu MinHash un pēc tam izmantojam Lokāli Jutīgu Hašēšanu (LSH), lai grupētu dokumentus pēc viņu MinHash pirkstu nospiedumiem, (2) izmēram Jaccard līdzību starp katru dokumentu pāri vienā un tajā pašā kaudzē un anotējam dokumentus, izņemot vienu, kā dublikātus, pamatojoties uz līdzības slieksni 0,7. Mēs piemērojam šo gandrīz-deduplikācijas procesu visām programmēšanas valodām, tostarp GitHub problēmām, lai uzlabotu apmācību datu kopuma bagātību un daudzveidību. 2.3 HAP, PII, ļaunprātīgas programmatūras filtrēšana Lai samazinātu iespēju, ka modeļi ģenerē naidīgu, aizvainojošu vai nepiedienīgu (HAP) valodu, mēs cenšamies filtrēt HAP saturu no apmācību kopuma. Vispirms mēs izveidojam HAP atslēgvārdu vārdnīcu un pēc tam anotējam katru koda dokumentu ar šādu atslēgvārdu sastopamības skaitu saturā, tostarp komentāros. Mēs filtrējam dokumentus, kas pārsniedz HAP slieksni, kas aprēķināta, pamatojoties uz sadalījuma analīzi, kā arī manuālu koda failu pārbaudi. Turklāt, lai aizsargātu privātumu, mēs sekojam StarCoder ( , ) un cenšamies rediģēt personīgi identificējamu informāciju (PII) no apmācību kopuma. Konkrēti, mēs izmantojam StarPII modeli, lai noteiktu IP adreses, atslēgas, e-pasta adreses, vārdus, lietotājvārdus un paroles, kas atrodas saturā. PII rediģēšanas solis aizstāj PII tekstu ar attiecīgiem marķieriem NAME , EMAIL , KEY , PASSWORD un maina IP adresi uz sintētiski ģenerētu IP adresi, kā Li et al. (2023a). Mēs arī skenējam mūsu datu kopumus, lai identificētu un dzēstu ļaunprātīgas programmatūras gadījumus avota kodā. Li et al. 2023a 4 2.4 Dabiskās valodas datu kopumi Papildus koda datu vākšanai modeļa apmācībai, mēs kurējam vairākus publiski pieejamus augstas kvalitātes dabiskās valodas datu kopumus, lai uzlabotu modeļa prasmes valodu izpratnē un matemātiskajā spriešanā. Reprezentatīvi datu kopumi šajā kategorijā ietver tīmekļa dokumentus (Stackexchange, CommonCrawl), matemātikas tīmekļa tekstus (OpenWeb-Math; ( ), StackMathQA; ( )), akadēmiskos tekstus (Arxiv, Wikipedia) un instrukciju apmācības datu kopumus (FLAN; ( ), HelpSteer ( , )). Mēs nededuplicējam šos jau iepriekš apstrādātos dabiskās valodas datu kopumus. Paster et al. 2023 Zhang 2024 Longpre et al. 2023 Wang et al. 2023 3 Modeļa arhitektūra Mēs apmācām transformatoru dekoderu arhitektūras ( , ) balstītu dažādu izmēru kodu modeļu sēriju. Modeļa parametri šiem modeļiem ir sniegti 1. tabulā . Visām modeļu arhitektūrām mēs izmantojam iepriekšēju normalizāciju ( , ): normalizācija, ko piemēro uzmanības un MLP bloku ievadei. Vaswani et al. 2017 1 Xiong et al. 2020 : Mazākais Granite-code modeļu saimes modelis tiek apmācīts ar RoPE embeddings ( , ) un Multi-Head Attention ( , ). Šis modelis izmanto swish aktivācijas funkciju ( , ) ar GLU ( , ) MLP, kas parasti pazīstams arī kā swiglu. Normalizācijai mēs izmantojam RMSNorm ( , ), jo tas ir aprēķināts efektīvāk nekā LayerNorm ( , ). 3B modelis tiek apmācīts ar konteksta garumu 2048 marķierus. 3B Su et al. 2023 Vaswani et al. 2017 Ramachandran et al. 2017 Shazeer 2020 Zhang & Sennrich 2019 Ba et al. 2016 : 8B modelim ir līdzīga arhitektūra kā 3B modelim, izņemot Grupētās Vaicājumu Uzmanības (GQA) ( , ) izmantošanu. GQA izmantošana nodrošina labāku veiktspējas un izvietošanas efektivitātes kompromisu šajā mērogā. Mēs apmācām 8B modeli ar konteksta garumu 4096 marķierus. 8B Ainslie et al. 2023 : 20B kodu modelis tiek apmācīts ar apgūtiem absolūtajiem pozīcijas embeddings. Apmācības laikā mēs izmantojam Multi-Query Attention ( , ) efektīvai turpmākai izvietošanai. MLP blokam mēs izmantojam GELU aktivācijas funkciju ( , ). Lai normalizētu aktivācijas, mēs izmantojam LayerNorm ( , ). Šis modelis tiek apmācīts ar konteksta garumu 8192 marķierus. 20B Shazeer 2019 Hendrycks & Gimpel 2023 Ba et al. 2016 : Lai apmācītu 34B modeli, mēs sekojam pieejai dziļuma palielināšanai 20B modelim. Konkrēti, mēs vispirms dublējam 20B kodu modeli ar 52 slāņiem un pēc tam dzēšam pēdējos 8 slāņus no sākotnējā modeļa un sākotnējos 8 slāņus no tā dublikāta, lai izveidotu divus modeļus. 34B Kim et al. Visbeidzot, mēs apvienojam abus modeļus, lai izveidotu Granite-34B-Code modeli ar 88 slāņiem (skatīt 2. attēlu ilustrācijai). Pēc dziļuma palielināšanas mēs novērojam, ka veiktspējas kritums salīdzinājumā ar 20B modeli ir ļoti neliels, pretēji tam, ko novēroja . Šī veiktspēja tiek diezgan ātri atjaunota pēc tam, kad mēs turpinām palielinātā 34B modeļa priekšapmācību. Līdzīgi kā 20B modelim, mēs izmantojam 8192 marķieru kontekstu priekšapmācības laikā. 2 Kim et al. 4 Priekšapmācība Šajā sadaļā mēs sniedzam detalizētu informāciju par divu posmu apmācību (4.1. punkts), apmācības mērķiem (4.2. punkts), optimizāciju (4.3. punkts) un infrastruktūru (4.4. punkts), ko izmantojām modeļu priekšapmācībā. 4.1 &