```html 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, ieviest pārmaiņas programmatūras izstrādes procesā. 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 rādīt solījumu sarežģītu uzdevumu autonomā apstrādē. Lai realizētu pilnu kodu LLM potenciālu, nepieciešams plašs iespēju klāsts, tostarp kodu ģ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 dekoder-only 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ērs svārstās no 3 līdz 34 miljardiem parametru, un tie ir piemēroti lietojumiem, sākot no sarežģītiem lietojumprogrammu modernizācijas uzdevumiem līdz ierīces iekšējiem, atmiņas ierobežotiem lietošanas gadījumiem. Visaptverošu uzdevumu kopums demonstrē, ka Granite Code modeļi konsekventi sasniedz vismodernāko veiktspēju starp pieejamajiem atklātā pirmkoda kodu LLM. Granite Code modeļu saime tika optimizēta uzņēmumu programmatūras izstrādes darba plūsmu vajadzībām un labi darbojas dažādos kodēšanas uzdevumos (piemēram, kodu ģenerēšana, labošana un skaidrojums), 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 ieausties katrā mūsu sabiedrības aspektā. Tā kā pieprasījums pēc programmatūras izstrādes pieaug, ir svarīgāk nekā jebkad agrāk palielināt programmatūras izstrādes produktivitāti, un LLM nodrošina 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ātei ietver kodu ģenerēšanu, koda skaidrošanu, koda 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 notikusi strauja LLM spēja ģenerēt un manipulēt kodu attīstība, 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 vienciparu 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 atšķiras paredzētās lietošanas vispārīgumā, dažiem modeļiem cenšoties aptvert plašu lietojumu klāstu ārpus kodēšanas, savukārt citi galvenokārt koncentrējas uz 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, vispārīgi 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 kodu ģenerēšanas veiktspēju mazākā un elastīgākā paketē, taču veiktspēja kodēšanas uzdevumos ārpus ģenerēšanas (piemēram, labošanas un skaidrošanas) 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 kodu ieviešanu var vēl vairāk sarežģīt faktori, kas pārsniedz modeļu veiktspēju. Piemēram, pat atklāti modeļi dažreiz cieš no caurredzamī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 atklāto 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 dažādos kodēšanas uzdevumos. 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 pamata modeļi kodēšanas uzdevumiem; Granite Code Base: instrukciju sekošanas modeļi, kas precīzi noregulēti, izmantojot Git commitu kombināciju ar cilvēka instrukcijām un atklātā pirmkoda sintētiski ģenerētiem kodu instrukciju datu kopumiem. Granite Code Instruct: Sērijas pamata modeļi tika apmācīti no nulles ar divu fāžu apmācības stratēģiju. 1. fāzē mūsu modelis tiek apmācīts uz 3 līdz 4 triljoniem tokenu, kas iegūti no 116 programmēšanas valodām, nodrošinot visaptverošu programmēšanas valodu un sintakses izpratni. 2. fāzē mūsu modelis tiek tālāk apmācīts uz 500 miljardiem tokenu ar rūpīgi izstrādātu augstas kvalitātes datu maisījumu no koda un dabiskās valodas domēniem, lai uzlabotu modeļa spēju spriest. Mēs izmantojam neuzraudzīta valodu modelēšanas mērķi, lai apmācītu pamata modeļus abās apmācības fāzēs. Instrukciju modeļi tiek iegūti, tālāk precīzi noregulē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 ( , ) un MetaMathQA ( , )), ieskaitot sintētiski ģenerētus kodu 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 visaptverošus mūsu kodu LLM novērtējumus plašā etalonu kopumā, tostarp HumanEvalPack ( , ), MBPP(+) ( , ; , ), RepoBench ( , ), ReCode ( , ) un citus. Šis etalonu kopums aptver daudzus dažādus kodēšanas uzdevumus, kas pārsniedz tikai kodu sintēzi Python, 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 divas reizes lielāki nekā Granite). Kā ilustrācija, 1. attēla (augšējā daļa) parāda Granite-8B-Code-Base salīdzinājumu ar citiem atklātā pirmkoda bāzes kodu LLM, tostarp nesenajiem augstas veiktspējas vispārīgās lietošanas bāzes 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 konkurētspējīgāko CodeGemma-8B modeli gandrīz 12 punktos uz HumanEvalPack (33,2% pret 21,3%), neskatoties uz apmācību uz ievērojami mazāku tokenu skaitu (4,5T pret 7,5T tokeniem). Papildus bāzes modeļiem, mūsu Granite Code modeļu instrukciju noregulētie varianti arī uzrāda spēcīgu veiktspēju HumanEvalPack, pārspējot citus atklātā pirmkoda (kodu) instrukciju modeļus, demonstrējot priekšrocības plašākam kodēšanas uzdevumu kopumam ar dabiskās valodas instrukcijām (skatiet 1. attēlu (apakšdaļu)). Jiang et al. 2023b AI@Meta 2024 Muennighoff et al. 2023 Turklāt, tā kā spriešana ir kritiska 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 lielāko daļu mūsdienu 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 (skatiet 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 vismodernāko veiktspēju 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; Universāls Kodu LLM : Visi mūsu modeļi ir apmācīti uz atļautiem datiem, kas savākti saskaņā ar IBM AI ētikas principiem un vadīti ar IBM korporatīvo juridisko komandu uzticamai uzņēmumu lietošanai. Visi Granite Code modeļi tiek atbrīvoti ar Apache 2.0 licenci. Uzticams Uzņēmuma Klases LLM 1 Mēs aprakstām savu pilnu datu vākšanas, filtrēšanas un pirmapstrādes cauruļvadu 2. sadaļā. 2. sadaļa apraksta datu vākšanas procesu (4. nodaļa), modeļa arhitektūru (5. nodaļa), apmācības detaļas (6. nodaļa), instrukciju noregulēšanu (7. nodaļa) un eksperimentus un rezultātus, salīdzinot Granite Code modeļus ar citiem atklātā pirmkoda LLM (8. nodaļa). 2 Datu vākšana Šajā sadaļā mēs aprakstām indeksēšanas un filtrēšanas (4. sek.), de-dublikācijas (5. sek.), HAP/PII filtrēšanas (6. sek.) procesu, ko izmanto kodu datu sagatavošanai 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 indeksēšana un filtrēšana Pirmsapmācības kodu dati tika iegūti no publiski pieejamu datu kopu, piemēram, Github Code Clean , StarCoderdata , un papildu publisko kodu repozitoriju un GitHub jautājumu kombinācijas. Mēs filtrējam izejas datus, lai paturē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 failu 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ņemt failus ar mazāk nekā 25% alfabētisko rakstzīmju, (2) izņemot XSLT valodu, filtrēt failus, kur virkne “<?xml version=” parādās pirmās 100 rakstzīmju robežās, (3) HTML failiem saglabāt tikai tos failus, kur redzamais teksts veido vismaz 20% no HTML koda un tā 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 jautājumus, izmantojot kvalitātes metrikas kopumu, kas ietver automātiski ģenerēta teksta noņemšanu, neangļu valodas jautājumu filtrēš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 kodu failu ar repozitorijam atbilstošo licences informāciju, kas atrasta, izmantojot GitHub API, un saglabājam tikai failus ar atļautām licencēm modeļu apmācībai. 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ūdusi de-dublikāciju, lai noņemtu dokumentus ar (gandrīz) identisku kodu saturu mūsu apmācības kopumā. Precīzai de-dublikācijai mēs vispirms aprēķinām dokumenta satura SHA256 hash un noņemam ierakstus ar identiskiem hashiem. Pēc precīzas de-dublikācijas mēs piemērojam izplūdusi de-dublikāciju ar mērķi noņemt kodu failus, kuriem var būt nelielas atšķirības un tādējādi vēl vairāk neitralizēt datus. Mēs izmantojam divu pakāpju metodi: (1) aprēķinām visu dokumentu MinHash vērtības un pēc tam izmantojam Lokāli Jutīgu Hašēšanu (LSH), lai grupētu dokumentus pēc to MinHash pirkstu nospiedumiem, (2) mērām Jaccard līdzību starp katru dokumentu pāri vienā 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 de-dublikācijas procesu visām programmēšanas valodām, ieskaitot GitHub jautājumus, 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 iespēju, ka modeļi rada naidīgu, aizskarošu vai rupju (HAP) valodu, mēs 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 kodu dokumentu ar šādu atslēgvārdu sastopamības reižu skaitu saturā, ieskaitot komentārus. Mēs filtrējam dokumentus, kas pārsniedz HAP slieksni, kas aprēķināts, pamatojoties uz sadales analīzi, kā arī manuālu kodu failu pārbaudi. Turklāt, lai aizsargātu privātumu, mēs sekojam StarCoder ( , ) un cenšamies reducēt personīgi identificējošu 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 reducēšanas solis aizstāj PII tekstu ar atbilstošiem tokeniem 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 noņemtu ļaunprātīgas programmatūras gadījumus avota kodā. Li et al. 2023a 4 2.4 Dabiskās valodas datu kopumi Papildus kodu datu vākšanai modeļu apmācībai mēs izveidojam 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ātiskus tīmekļa tekstus (OpenWeb-Math; ( ), StackMathQA; ( )), akadēmiskus tekstus (Arxiv, Wikipedia) un instrukciju noregulēšanas datu kopumus (FLAN; ( ), HelpSteer ( , )). Mēs nede-dublikē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žāda izmēra kodu modeļu, kas balstīti uz transformera dekoder arhitektūru ( , ). Modeļu hipotēzes šiem modeļiem ir sniegtas 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 ievadam. Vaswani et al. 2017 1 Xiong et al. 2020 : Mazākais Granite-code modeļu saimes modelis tiek apmācīts ar RoPE iegulšanu ( , ) un daudzvirsmu uzmanību (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ēķiniāli efektīvāks nekā LayerNorm ( , ). 3B modelis tiek apmācīts ar konteksta garumu 2048 tokeni. 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 pieprasījumu uzmanības (Grouped-Query Attention - GQA) izmantošanu ( , ). GQA izmantošana nodrošina labāku kompromisu starp modeļa veiktspēju un izpildes efektivitāti šajā mērogā. Mēs apmācām 8B modeli ar konteksta garumu 4096 tokeni. 8B Ainslie et al. 2023 : 20B kodu modelis tiek apmācīts ar apgūtiem absolūtajiem pozīcijas iegulšanu. Apmācības laikā mēs izmantojam daudzvirsmu pieprasījumu uzmanību (Multi-Query Attention) ( , ) efektīvai turpmākajai izpildei. MLP blokam mēs izmantojam GELU aktivācijas funkciju ( , ). Aktivāciju normalizēšanai mēs izmantojam LayerNorm ( , ). Šis modelis tiek apmācīts ar konteksta garumu 8192 tokeni. 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 noņemam pēdējos 8 slāņus no oriģinālā modeļa un pirmos 8 slāņus no tā dublikāta, 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 (skatiet 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 mazs, atšķirībā no tā, ko novērojuši . Šī veiktspēja tiek diezgan ātri atjaunota pēc tam, kad mēs turpinām palielinātā 34B modeļa pirmsapmācību. Līdzīgi kā 20B, mēs izmantojam 8192 tokenu kontekstu pirmsapmācības laikā. 2 Kim et al. 4 Pirmsapmācība Šajā sadaļā mēs sniedzam informāciju par divu fāžu apmācību (4