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 ar kodu, maina programmatūras izstrādes procesu. Arvien biežāk kodu LLM tiek integrēti programmatūras izstrādes vidēs, lai uzlabotu cilvēku programmētāju produktivitāti, un LLM balstīti aģenti sāk demonstrēt daudzsološu sniegumu sarežģītu uzdevumu autonomā veikšanā. Lai realizētu pilnu kodu LLM potenciālu, ir nepieciešamas plašas iespējas, tostarp koda ģenerēšana, kļūdu labošana, koda skaidrošana un dokumentēšana, repozitoriju uzturēšana un daudz kas cits. Šajā darbā mēs iepazīstinām ar Granite sērijas dekoderu tipa kodu modeļiem koda ģ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ērs svārstās no 3 līdz 34 miljardiem parametru, kas ir piemēroti lietojumprogrammām, sākot no sarežģītiem lietojumprogrammu modernizācijas uzdevumiem līdz ierīcē izmantojamām atmiņas ierobežojošām lietošanas situācijām. Visaptverošu uzdevumu kopumu novērtējums parāda, ka Granite Code modeļi konsekventi sasniedz visaugstāko veiktspējas līmeni 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, koda ģ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ējo desmitgažu laikā programmatūra ir ieaugtā mūsu sabiedrības audumā. Tā kā pieprasījums pēc programmatūras izstrādes pieaug, ir vissvarīgāk palielināt programmatūras izstrādes produktivitāti, un LLM piedāvā daudzsološu ceļu cilvēku programmētāju papildināšanai. Ievērojami uzņēmumu lietošanas gadījumi LLM programmatūras izstrādes produktivitātē ietver koda ģenerēšanu, koda skaidrošanu, koda labošanu, vienības testu un dokumentācijas ģenerēšanu, lietojumprogrammu modernizāciju, ievainojamību noteikšanu, koda tulkošanu un daudz ko citu. Pēdējos gados ir notikusi strauja LLM spēju ģenerēt un manipulēt kodu attīstība, un mūsdienās ir pieejami dažādi modeļi ar iespaidīgām kodēšanas spējām. Modeļi svārstās no viena cipara miljardiem parametru (piemēram, Llama-7B (Touvron et al., 2023), Gemma-7B (Gemma-Team et al., 2024) uc) līdz simtiem miljardu: DBRX (Databricks), Arctic (Snowflake), Grok, Mixtral 8x22B (MistralAI), Command R+ (Cohere) un atšķiras pēc paredzētās lietošanas vispārības, dažiem modeļiem mērķis ir aptvert dažādus lietojumus ārpus koda, 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), and 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, vispārīgie LLM var sasniegt izcilu kodēšanas veiktspēju, to izmērs padara tos dārgus izvietošanai. Mazāki uz kodu orientēti modeļi ( , ; , ; , ; , ; , ) var sasniegt izcilu koda ģenerēšanas veiktspēju mazākā un elastīgākā iepakojumā, taču veiktspēja kodēšanas uzdevumos, kas pārsniedz ģenerēšanu (piemēram, labošana un skaidrošana), var atpalikt no koda ģ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ērti modeļi dažreiz cieš no caurredzamības trūkuma attiecībā uz datu avotiem un datu apstrādes metodēm, kas tika izmantotas modelī, kas var mazināt uzticību modeļiem misijas kritisko un regulētu kontekstu gadījumā. Turklāt mūsdienu atvērtajiem LLM licenču nosacījumi var apgrūtināt un sarežģīt uzņēmuma spēju izmantot modeli. Šeit mēs piedāvājam Granite Code modeļus, virkni ļoti spējīgu kodu LLM, kas izstrādāti, lai atbalstītu uzņēmumu programmatūras izstrādi plašā koda uzdevumu klāstā. Granite Code modeļiem ir divi galvenie varianti, kurus mēs izlaižam četrās dažādās izmēros (3B, 8B, 20B un 34B): pamata fundamentālie modeļi ar kodu saistītiem uzdevumiem; Granite Code Base: instrukciju sekošanas modeļi, kas pārkvalificēti, izmantojot Git komitejās apvienotus ar cilvēka instrukcijām un atklātā pirmkoda sintētiski ģenerētiem koda 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 ar 3–4 triljoniem atzīmju, kas iegūtas no 116 programmēšanas valodām, nodrošinot visaptverošu programmēšanas valodu un sintakses izpratni. 2. posmā mūsu modelis tiek tālāk apmācīts ar 500 miljardiem atzīmju, izmantojot rūpīgi izstrādātu augstas kvalitātes datu sajaukumu no koda 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 tiek iegūti, turpmāk pārkvalificējot iepriekš apmācītos pamata modeļus, izmantojot filtrētu CommitPack variantu ( , ), dabiskās valodas instrukciju sekošanas datu kopumus (OASST ( , ), HelpSteer ( , )) un atklātā pirmkoda matemātikas datu kopumus (MathInstruct ( , ) and MetaMathQA ( , )), ieskaitot sintētiski ģenerētus koda datu kopumus, 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 plašus mūsu kodu LLM novērtējumus visaptverošā etalonu kopumā, tostarp HumanEvalPack ( , ), MBPP(+) ( , ; , ), RepoBench ( , ), ReCode ( , ) un citus. Šī etalonu kopums ietver 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 atklātā pirmkoda modeļiem Granite Code modeļi kopumā uzrāda ļoti spēcīgu veiktspēju visos modeļu izmēros un etalonos (bieži vien pārspējot citus atklātā pirmkoda kodu modeļus, kas ir divreiz lielāki par Granite). Kā ilustrācija, 1. attēls (augšpusē) parāda Granite-8B-Code-Base salīdzinājumu ar citiem atklātā pirmkoda pamata kodu LLM, ieskaitot nesenus augstas veiktspējas vispārīgas lietošanas pamata LLM, piemēram, Mistral ( , ) un LLama-3 ( , ) uz HumanEvalPack ( , ). Lai gan CodeGemma un StarCoder2 darbojas saprātīgi labi koda ģenerēšanā, tie ievērojami sliktāk darbojas HumanEvalPack koda labošanas un skaidrošanas variantos. Vidēji Granite-8B-Code-Base pārspēj viskonkurētspējīgāko CodeGemma-8B modeli gandrīz par 12 punktiem uz HumanEvalPack (33,2% pret 21,3%), neskatoties uz to, ka tas tika apmācīts uz ievērojami mazāku atzīmju skaitu (4,5T pret 7,5T atzīmēm). Papildus pamata modeļiem, mūsu Granite Code modeļu instrukciju pielāgotie varianti arī uzrāda spēcīgu veiktspēju uz HumanEvalPack, pārspējot citus atklātā pirmkoda (kodu) instrukciju modeļus, demonstrējot priekšrocības plašākam kodēšanas uzdevumu klāstam ar dabisko valodu instrukcijām (skat. 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āšanā, mēs arī testējam mūsu Granite-8B-Code-Base modeli uz sešiem matemātikas etalonu kopumiem, tostarp MATH ( , ), GSM8K ( , ) un problēmu risināšanu ar piekļuvi aprēķinu rīkiem, kur mūsu Granite 8B modelis sasniedz labāku veiktspēju, salīdzinot ar lielāko daļu pašreizējo 7B vai 8B LLM. Piemēram, Granite-8B-Code-Base pārspēj Llama-3-8B-Base par ~12 punktiem uz GSM8K un ~6 punktiem uz MATH (skat. 15. tabulu). 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 visaugstāko veiktspējas līmeni dažādos ar kodu saistītos uzdevumos, tostarp koda ģenerēšanā, skaidrošanā, labošanā, rediģēšanā, tulkošanā utt., demonstrējot spēju risināt dažādus kodēšanas uzdevumus; Visaptverošs Kodu LLM : Visi mūsu modeļi tiek apmācīti uz licenču ziņā pieļaujamiem datiem, kas savākti saskaņā ar IBM AI ētikas principiem un ko vada IBM Korporatīvā juridiskā komanda uzticamai uzņēmumu lietošanai. Visi Granite Code modeļi tiek izlaisti 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ļā. 2. sadaļa apraksta datu vākšanas procesu, 2.1. sadaļa apraksta datu pārmeklēšanu un filtrēšanu, 2.2. sadaļa apraksta de-dublikāciju, 2.3. sadaļa apraksta HAP/PII filtrēšanu, ko izmanto, lai sagatavotu koda datus modeļu 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 Datu vākšana Šajā sadaļā mēs aprakstām pārmeklēšanas un filtrēšanas (2.1. sadaļa), de-dublikācijas (2.2. sadaļa), HAP/PII filtrēšanas (2.3. sadaļa) procesu, ko izmanto, lai sagatavotu koda datus modeļu 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 pārmeklēšana un filtrēšana Priekšapmācības koda dati tika iegūti no publiski pieejamām datu kopām, 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) noņemiet failus ar mazāk nekā 25% alfabētisko rakstzīmju, (2) izņemot XSLT valodu, filtrējiet failus, kuros virkne “<?xml version=” parādās pirmo 100 rakstzīmju robežās, (3) HTML failiem saglabājiet tikai tos failus, kuros redzamais teksts veido vismaz 20% no HTML koda un ir vismaz 100 rakstzīmju garš, (4) JSON un YAML failiem saglabājiet tikai tos failus, kuru rakstzīmju skaits ir no 50 līdz 5000 rakstzīmēm. Mēs arī anotējam GitHub problēmas, izmantojot kvalitātes metrikas kopumu, kas ietver automātiski ģenerēta teksta noņemšanu, neangļu valodas problēmu filtrēšanu, botu komentāru izslēgšanu un lietotāju iesaistīšanās skaita sarunā izmantošanu kā kvalitātes rādītāju. Mēs arī anotējam katru koda failu ar licenču informāciju, kas saistīta ar attiecīgo repozitoriju, ko iegūst, izmantojot GitHub API, un modeļu 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 izplūdusi de-dublikācija Mēs izmantojam agresīvu de-dublikācijas stratēģiju, kas ietver gan precīzu, gan izplūdušu de-dublikāciju, lai mūsu apmācības kopumā noņemtu dokumentus ar (gandrīz) identisku koda saturu. Precīzai de-dublikācijai mēs vispirms aprēķinām dokumentu satura SHA256 jaucējkodu un noņemam ierakstus ar identiskiem jaucējkodiem. Pēc precīzas de-dublikācijas mēs piemērojam izplūdušu de-dublikāciju ar mērķi noņemt koda failus, kuriem var būt nelielas atšķirības, tādējādi vēl vairāk samazinot datu aizspriedumus. Mēs izmantojam divu posmu metodi: (1) aprēķinām visu dokumentu MinHashes un pēc tam izmantojam Lokāli Jutīgu Jaucējkodu (LSH), lai grupētu dokumentus pēc to MinHash pirkstu nospiedumiem, (2) izmērām Jaccard līdzību starp katru dokumentu pāri vienā un tajā pašā grupā un anotējam dokumentus, izņemot vienu, kā dublikātus, pamatojoties uz līdzības sliekšņiem 0,7. Mēs piemērojam šo gandrīz de-dublikācijas procesu visām programmēšanas valodām, ieskaitot GitHub problēmas, lai uzlabotu apmācības datu kopuma bagātību un daudzveidību. 2.3 HAP, PII, ļaunprātīgas programmatūras filtrēšana Lai samazinātu varbūtību, ka modeļi ģenerēs naidīgu, aizskarošu vai neķītru (HAP) valodu, mēs rūpīgi cenšamies filtrēt HAP saturu no apmācības 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ā, ieskaitot komentārus. Mēs filtrējam dokumentus, kas pārsniedz HAP slieksni, kas aprēķināts, pamatojoties uz sadalījuma analīzi, kā arī koda failu manuālu pārbaudi. Turklāt, lai aizsargātu privātumu, mēs sekojam StarCoder ( , ) un rūpīgi cenšamies rediģēt personīgi identificējamu informāciju (PII) no apmācības 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 atbilstošiem 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 kopas, lai identificētu un noņemtu ļaunprātīgas programmatūras instances avota kodā. Li et al. 2023a 4 2.4 Dabiskās valodas datu kopumi Papildus koda datu vākšanai modeļu apmācībai mēs kurējam vairākas publiski pieejamas augstas kvalitātes dabiskās valodas datu kopumu, lai uzlabotu modeļa prasmi valodu izpratnē un matemātiskajā spriešanā. Reprezentatīvi datu kopumi šajā kategorijā ietver tīmekļa dokumentus (Stackexchange, CommonCrawl), matemātiskus tīmekļa tekstus (OpenWeb-Math; ( ), StackMathQA; ( )), akadēmiskus tekstus (Arxiv, Wikipedia) un instrukciju apmācības datu kopumus (FLAN; ( ), HelpSteer ( , )). Mēs nedublē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 virkni dažādu izmēru koda modeļu, kas balstīti uz transformera dekoderu arhitektūru ( , ). Modeļu hiperparametrus šiem modeļiem skatiet 1. tabulā . Visām modeļu arhitektūrām mēs izmantojam priekšnodalījuma 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, ko parasti dēvē arī par swiglu. Normalizācijai mēs izmantojam RMSNorm ( , ), jo tas ir aprēķinātiski efektīvāks nekā LayerNorm ( , ). 3B modelis tiek apmācīts ar 2048 atzīmju konteksta garumu. 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 Grouped-Query Attention (GQA) ( , ) izmantošanu. GQA izmantošana nodrošina labāku kompromisu starp modeļa veiktspēju un izvietošanas efektivitāti šajā mērogā. Mēs apmācām 8B modeli ar 4096 atzīmju konteksta garumu. 8B Ainslie et al. 2023 : 20B koda 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ākajai izvietošanai. MLP blokam mēs izmantojam GELU aktivācijas funkciju ( , ). Aktivācijas normalizēšanai mēs izmantojam LayerNorm ( , ). Šis modelis tiek apmācīts ar 8192 atzīmju konteksta garumu. 20B Shazeer 2019 Hendrycks & Gimpel 2023 Ba et al. 2016 : Lai apmācītu 34B modeli, mēs sekojam pieejai 20B modeļa dziļuma palielināšanai. Konkrēti, mēs vispirms dublējam 20B koda modeli ar 52 slāņiem, pēc tam no sākotnējā modeļa noņemam pēdējos 8 slāņus un no tā dublikāta noņemam pirmos 8 slāņus, lai izveidotu divus modeļus. 34B Kim et al. Visbeidzot, mēs savienojam abus modeļus, lai izveidotu Granite-34B-Code modeli ar 88 slāņiem (skat. 2. attēlu ilustrācijai). Pēc dziļuma palielināšanas mēs novērojam, ka veiktspējas kritums, salīdzinot ar 20B modeli, ir ļoti neliels, atšķirībā no tā, ko novērojis . Šī veiktspēja tiek diezgan ātri atjaunota pēc tam, kad mēs turpinām 2 Kim et al.