Graphcore's Automatic Loss Scaling-ը կարող է օգտագործվել յուրաքանչյուրի կողմից, որը մեծ մոդելներ է վարում խառը ճշգրտությամբ:

Հեղինակ՝ Սերխիո Պերես

Այս բլոգային գրառման մեջ մենք կներկայացնենք Graphcore-ի կողմից մշակված օրիգինալ տեխնիկան՝ հուսալիորեն և հեշտությամբ բարելավելու կայունությունը խոշոր մոդելները խառը ճշգրտությամբ վարժեցնելիս: Դրա ծագումը կայանում է IPU-ների համար հավելվածների մշակման մեր եզակի փորձառության մեջ, և այն այժմ ինտեգրվել է մեր Poplar SDK-ին՝ հեշտ օգտագործման համար: Graphcore-ի մեր շարունակական նպատակն է հնարավորինս հեշտացնել մոդելների մշակման և IPU-ների վրա փորձարկումների գործընթացը տարբեր կարիքների և ծանոթության մակարդակ ունեցող օգտատերերի համար՝ ML հետազոտողներից մինչև տվյալների գիտնականներ, MLOps ինժեներներ, ամպային հավելվածների մշակողներ և ոչ միայն: .

Մենք կսկսենք բացատրելով, թե ինչու է կորուստների մասշտաբը կարևոր դեր խաղում խոշոր մոդելների խառը ճշգրտությամբ ուսուցման մեջ, հատկապես հաշվի առնելով մեքենայական ուսուցման առաջընթացը խթանող միտումները: Մենք ցույց կտանք, թե մինչ օրս կորուստների մասշտաբավորման բոլոր մեթոդները (ձեռքով և ավտոմատ) տուժել են անարդյունավետությունից կամ հակված են ձախողման: Այնուհետև մենք ցույց կտանք, թե ինչպես է Graphcore ALS ալգորիթմն առաջարկում արդյունավետության, օգտագործման հեշտության և ուշագրավ կայունության շատ անհրաժեշտ համադրություն:

Ի՞նչ է կորստի մասշտաբը և ինչու է դա կարևոր:

Մեքենայական ուսուցման մեջ շատ առաջընթացներ են ստեղծվել մոդելային ճարտարապետությունների չափի և բարդության շարունակական աճի շնորհիվ: Ավելի ցածր ճշգրտության թվային ձևաչափերը կարևոր գործիք են հաշվողական մարտահրավերները հաղթահարելու համար, որոնք ուղեկցում են դեպի ավելի մեծ մոդելների միտումը, որոնք տալիս են մի շարք առավելություններ՝ ավելի ցածր հիշողություն, ավելի մեծ թողունակություն և թողունակություն, և ավելի էներգաարդյունավետ մարզումներ՝ շնորհիվ կրճատված էներգիայի սպառման: Այնուամենայնիվ, այս առավելությունները գալիս են վերապատրաստման ընթացքում թվային անկայունությունների ներդրման և որոշ մոդելների վիճակագրական կատարողականի նվազեցման գնով: Ներկայիս խորը ուսուցման մեծ մոդելների համար պրակտիկանտները սովորաբար օգտագործում են IEEE 32-բիթանոց և 16-բիթանոց լողացող կետի ներկայացումների խառնուրդ վերապատրաստման ընթացքում, ինչը կոչվում է խառը ճշգրիտ ուսուցում: Այս բլոգային գրառման մեջ մենք բացատրում ենք, թե ինչու է անհրաժեշտ կորուստների մասշտաբը, որպեսզի խառը ճշգրտությամբ մարզումները լավ համընկնեն, և ինչպես կարող ենք ավտոմատ կերպով կարգավորել այն մարզման ընթացքում՝ գրադիենտ հիստոգրամներ դիտարկելով:

Ճշգրտությունը IEEE float-32-ից IEEE float-16-ի կրճատելով՝ նեղացնում է ակտիվացումների, կշիռների և գրադիենտների դինամիկ տիրույթը: Քանի որ մոդելներն ավելի ու ավելի են մեծանում, գրադիենտները փոքրանում են, և շատ կարևոր է ապահովել, որ դրանց ազդանշանը չկորչի float-16-ում ներհոսքի պատճառով: Նմանապես, մոդելները կարող են հանդուրժել որոշակի մակարդակի արտահոսք, բայց ավելցուկը կարող է հանգեցնել անկայունության և հանկարծակի ձախողումների: Ընդհանուր առմամբ, և՛ ներհոսքը, և՛ վարարումը խոչընդոտում են մարզումների կոնվերգենցիան: Float-16 ճշգրտության այլընտրանքը bfloat-16-ն է, որը ներդրվել է Google-ի կողմից և պահպանում է float-32-ի դինամիկ միջակայքը՝ նվազեցնելով մանտիսայի բիթերը: bfloat-16-ը նվազեցնում է գրադիենտների ներհոսքի կամ վարարման վտանգը, և կորուստների մասշտաբի կարիք չկա, բայց դա տեղի է ունենում վիճակագրական կոնվերգենցիայի հնարավոր խոչընդոտման գնով: Սա ցուցադրվել է Google-ի Gopher training paper-ում, որտեղ հեղինակները պարզել են, որ bfloat-16-ի օգտագործումը նվազեցնում է արդյունավետությունը՝ համեմատած float-32-ի հետ, նույնիսկ երբ այն լրացնում է այնպիսի տեխնիկայով, ինչպիսին է ստոխաստիկ կլորացումը:

Կորուստների մասշտաբման նպատակն է տեղափոխել գրադիենտ բաշխումը դինամիկ տիրույթում, որպեսզի ներհոսքը և վարարումը կանխվեն (հնարավորինս շատ) float-16-ում: Ինչպես անունն է հուշում, գրադիենտները չափվում են՝ բազմապատկելով կորստի ֆունկցիան հաստատուն գործակցով: Հետևաբար, հետ-տարածման միջոցով ստացված գրադիենտները նույնպես չափվում են այդ հաստատունով։ Այս մասշտաբը պետք է հաշվի առնվի քաշի թարմացման ժամանակ, քանի որ հակառակ դեպքում մարզման վրա կազդի կորստի մասշտաբի արժեքը: Ստորև բերված պատկերն ամփոփում է SGD օպտիմիզատորի կորուստների չափման մեթոդը:

Կորստի չափման գործակիցը ձեռքով ընտրելը ժամանակ և ռեսուրսներ խլող աշխատանք է: Ավելին, գրադիենտ բաշխման դինամիկ էվոլյուցիայի պատճառով կորուստների մասշտաբի ստատիկ արժեքը չի կարող օպտիմալ մնալ մարզման ընթացքում: Graphcore ALS լուծումը float-16-ում ուսուցումը դարձնում է ավելի հեշտ օգտագործման և ավելի կայուն՝ անդրադառնալով այս խնդիրներին:

Թվային անկայունություններ՝ կորուստների սխալ մասշտաբավորման պատճառով

Խոշոր մոդելները հայտնի են մարզումների ընթացքում իրենց անկայունությամբ, ինչը կարող է պայմանավորված լինել թվային խնդիրներով կամ նույնիսկ ապարատային խափանումներով: Այնուամենայնիվ, այս գործնական թեման սովորաբար չի ընդգծվում գիտական ​​հրապարակումներում. մեծագույն հետաքրքրությունը տրվում է մոդելի վավերացման միավորներին՝ բավականին քիչ ուշադրություն դարձնելով այն մարտահրավերներին, որոնք ներգրավված են մեծ մոդելներին կայուն ձևով վարժեցնելու բազմաթիվ փորձերում:

Թյունինգի կորստի մասշտաբը խառը ճշգրիտ մարզումների ժամանակ նման մարտահրավերի վառ օրինակ է: Կարգավորումը կարող է իրականացվել ձեռքով կամ դինամիկ կամ ավտոմատ ընթացակարգի միջոցով, որն ընտրում է կորստի մասշտաբային արժեքը յուրաքանչյուր քայլի կամ քայլերի ընդմիջման համաձայն որոշակի չափանիշի: Գրականության մեջ կան ավտոմատ ընթացակարգերի նախագծման մի քանի առաջարկվող մոտեցումներ: Մոտեցումներից մեկը, որը հիմնված է հաշվարկներում NaN արժեքների առաջացման վրա, վերջերս կիրառվել է Meta-ի ինժեներների կողմից իրենց վերջին OPT-175B մոդելում: Այնուամենայնիվ, Meta-ի ուսուցման մատյանում կորուստների մասշտաբի մասին հիշատակումների արագ վերանայումը ցույց է տալիս, որ շատ փորձերի համար կայուն մարզվելն անհնար էր կորուստների մասշտաբի անսպասելի պայթելու պատճառով, ինչը հանգեցրեց կորուստների ֆունկցիայի հանկարծակի անկայունության և կոնվերգենցիայի բացակայությանը: Սա ակնհայտորեն անսպասելի վարքագիծ է նրանց դինամիկ կորուստների մասշտաբային ընթացակարգի համար, որի նպատակն իսկապես կայունացնել մարզումն է:

Graphcore-ում մենք կատարելագործել ենք կորուստների մասշտաբավորման նման ընթացակարգերը՝ շնորհիվ մեր փորձի՝ հասկանալու ձախողման ռեժիմները, որոնք սովորաբար ցուցադրում են մեծ մոդելները: Սա մեզ թույլ է տվել ուժեղացնել մեծ մոդելների վերապատրաստման կայունությունը՝ մշակելով արդյունավետ ներքին գործիքներ մեր Poplar SDK-ում: Նախքան Graphcore ALS ալգորիթմի մանրամասներին ծանոթանալը, նախ տեսնենք, թե ինչպես BERT Large-ը կարող է ձախողվել ստատիկ կորուստների չափման սխալ ընտրության պատճառով:

Մենք նախապատրաստում ենք BERT Large-ի 1-ին փուլը IPU-POD64-ի վրա՝ հետևելով թղթային տրանսֆորմատորների հիպերպարամետրերին և տվյալների հավաքածուի մանրամասներին մեր 64 Խորը ուսուցման համար մեծ խմբաքանակի օպտիմալացում. ուսուցում BERT 76 րոպեում, որտեղ ներկայացվում է LAMB օպտիմիզատորը: Մենք օգտագործում ենք float-16 ներկայացումներ բոլոր կշիռների, ակտիվացումների և գրադիենտների համար: LAMB օպտիմիզատորի միայն առաջին և երկրորդ պահերը դրված են float-32: Դուք կարող եք գտնել մեր բաց կոդով իրականացումը Hugging Face GitHub պահեստի հիման վրա:

Ստորև բերված պատկերը պատկերում է BERT Large-ի վերապատրաստման էվոլյուցիան՝ կորուստների մասշտաբի չորս հաստատուն տարբեր արժեքներով: 1, 27 և 2²² կորուստների մասշտաբային արժեքների դեպքում մարզումները տարբերվում են՝ անկախ ընտրված սերմից: 27-ի և 2²²-ի միջև արժեքների դեպքում վազքը համընկնում է սերմից կախված՝ մերձեցման ավելի ցածր կամ ավելի մեծ հավանականությամբ: Մասնավորապես, կորստի մասշտաբը սահմանելը 215-ով հանգեցնում է ամենաբարձր կոնվերգենցիայի՝ 90%-ի (այսինքն՝ սերմերի միայն 10%-ն է վերջանում շեղվել մարզման ընթացքում): Պարզության համար մենք գծագրում ենք միայն շեղվող և համընկնող սերմերից մեկը, սակայն փորձերը կրկնվել են շատ այլ սերմերի համար: Սա նշանակում է, որ կորուստների ստատիկ մասշտաբավորումն օգտագործելիս կարող է լինել շեղման վտանգ՝ անկախ ընտրված կորստի մասշտաբային արժեքից: Այնուամենայնիվ, կորստի մասշտաբային արժեքի ճիշտ ընտրությունը շատ կարևոր է ապահովելու համար, որ շեղման տոկոսադրույքը հնարավորինս ցածր լինի:

Մենք նկատում ենք, որ կորուստների մասշտաբով վազքը հավասար կամ ցածր է 1-ին, և ավելի բարձր կամ հավասար է 2²²-ին, միշտ ձախողվում է բավականին վաղ: Դա պայմանավորված է float-16-ում զգալի գրադիենտ հոսանքի/հոսքի պատճառով, և վազքը չի կարող առաջընթաց անցնել մարզման սկզբից այն կողմ: 27-ին հավասար կորուստների մասշտաբով վազքը բավականաչափ առաջադիմում է մինչև 2k ուսուցման քայլերը, երբ ուսուցման արագության ժամանակացույցը հասնում է իր գագաթնակետին (ինչպես ցույց է տրված ստորև) և վազքը դառնում է ավելի անկայուն: Այս պահին վազքը աղետալիորեն ձախողվում է ընդամենը մի քանի մարզման քայլերի ընթացքում: Սա տեղի է ունենում նաև այն դեպքում, երբ կորստի 2¹5 մասշտաբով վազքները ձախողվում են սերմերի 10%-ի համար: Հանկարծակի նման խափանումները բավականին բնորոշ են մեծ մոդելներին, և համայնքում որոշակի բանավեճ կա այն մասին, թե ինչպես են դրանք առաջանում, թե արդյոք գրադիենտի ներհոսքը կամ վարարումը ներգրավված է, և կշիռների կամ ակտիվացման հետ կապված որ գրադիենտներն են պատասխանատու դրանց համար:

Ամեն դեպքում, պարզ է, որ կորստի համապատասխան մասշտաբը գտնելը կարևոր է մարզման կայունության համար. ցուցադրված BERT-ի բոլոր գործարկումները կիսում են նույն հիպերպարամետրերը, բայց տարբերվում են կորուստների մասշտաբավորման գործակիցով և սերմի առումով: Կորուստների մասշտաբի օպտիմիզացումը կարող է հանգեցնել սերմերի մեծ մասի կոնվերգենցիայի:

Պետք է նաև նկատենք, որ կորստի չափման համապատասխան արժեքներ գտնելը կարող է բավականին թանկ արժենալ՝ ծախսելով ժամեր կամ նույնիսկ օրեր՝ կախված օգտագործվող համակարգից: Եթե ​​դա անհրաժեշտ է կրկնել մի քանի կորուստների մասշտաբային մաքրման համար, սպառված հաշվողական ռեսուրսները կարող են զգալիորեն մեծանալ: Այս խնդիրը լուծվում է Graphcore ALS ալգորիթմի միջոցով, ինչպես ներկայացված է հաջորդ բաժնում, որը թույլ է տալիս մեզ հասնել 100% կոնվերգենցիայի մակարդակի վերը նշված BERT մարզման կոնֆիգուրացիայի համար:

Ինչպես է աշխատում Graphcore ALS ալգորիթմը

Graphcore ALS մոտեցումը հիմնված է թե՛ կշիռների, թե՛ ակտիվացման գրադիենտների դիտարկման վրա: Այս դիտարկումներն օգտագործվում են հիստոգրամներ ստեղծելու համար, որոնք տեղեկացնում են կորուստների մասշտաբային գործոնի ճշգրտման մասին՝ նպատակ ունենալով կանխել ավելորդ ներհոսքը կամ վարարումը գրադիենտ բաշխման մեջ: Այս մոտեցումը տարբերվում է այլ ռազմավարություններից, որոնք, ընդհանուր առմամբ, ներառում են կորուստների մասշտաբային գործոնի կարգավորում՝ հիմնված հաշվարկներում NaN/Inf արժեքների առաջացման վրա, երբ տեղի է ունենում արտահոսքի իրադարձություն: Մենք կարծում ենք, որ գրադիենտների դիտարկումը ավելի տեղեկացված ռազմավարություն է, քանի որ այն կարող է հավասարակշռել հոսանքի և ներհոսքի քանակը:

Մենք գրադիենտները միավորում ենք հիստոգրամների մեջ ընդամենը երկու աղբարկղով՝ h1 և h2, որոնք ծածկում են float-16-ի ամբողջ դինամիկ տիրույթը (այսինքն՝ 0-ից մինչև 65504): Ամեն անգամ, երբ տեղի է ունենում արտահոսքի իրադարձություն, արժեքը մնում է կտրված առավելագույն թվային ներկայացման դեպքում, որը float-16-ում համապատասխանում է 65504-ին: Այս կտրվածքի պատճառով մենք կարող ենք բաց թողնել միջանկյալ գործողությունների ընթացքում տեղի ունեցող հոսքի իրադարձությունները, եթե կենտրոնանանք միայն վերջնական արժեքների վրա: Որպեսզի հաշվի առնվեն նաև այս միջանկյալ արտահոսքերը, մենք երկու աղբամանների միջև եղած աղբամանի եզրը սահմանեցինք, որ մոտ լինի հորդառատությանը, բայց թողնելով որոշ լուսանցք, և գործնականում աղբամանների եզրերը, ինչպիսիք են 2¹3-ը, հանգեցրել են կայուն վազքի: Մենք հաշվարկում ենք երկու աղբարկղերի հարաբերակցությունը յուրաքանչյուր քաշի թարմացումով, և կախված շեմային արժեքից, որն ընդունված է որպես 10-7, մենք կրկնապատկում ենք կամ կիսով չափ կորուստների չափման արժեքը: Ստորև բերված դիագրամը տեսողականորեն նկարագրում է մեր ALS ալգորիթմը:

Ալգորիթմի հիմքում ընկած տրամաբանությունը պարզ է. կորուստների մասշտաբը կրկնապատկվում է, որպեսզի կանխվի ներհոսքը: Կորուստների մասշտաբը կրկնակի կրճատվում է՝ ավելորդ հորդումից խուսափելու համար միայն այն դեպքում, երբ վերին աղբարկղերի քանակը հասնում է որոշակի համամասնության՝ համեմատած երկու աղբարկղերի գումարի հետ:

Ալգորիթմը կարող է ճշգրտվել՝ նվազեցնելու իր հաշվողական ծախսերը. հնարավոր է ներմուծել ժամանակաշրջան, որն իմաստ ունի, քանի որ գրադիենտ բաշխումները դանդաղ են փոխվում մոդելների մեծ մասի համար, ինչը նշանակում է, որ կորուստների մասշտաբային գործոնը կարիք չունի կարգավորելու յուրաքանչյուր մարզման քայլից հետո:

Մեկ այլ հնարավոր փոփոխություն վերաբերում է հետևելու համար նախատեսված գրադիենտներին. ընտրել միայն որոշակի շերտերից/գործողություններից, քաշի գրադիենտներից, ակտիվացման գրադիենտներից և այլն, բոլոր գրադիենտների փոխարեն, բայց դա կարող է հանգեցնել մոդելից կախված ALS սխեմաների, որոնք կարող են ընդհանուր առմամբ կիրառելի չլինել: Պարզության համար այս բլոգային գրառման մեջ մենք սահմանել ենք ժամանակահատվածը որպես 1 և հետևել բոլոր գրադիենտներին:

Արդյունքներ Graphcore ALS-ով

Graphcore ALS ալգորիթմի օգտագործման հեշտությունն ու կայունությունը ստուգելու համար մենք այն կիրառում ենք վերջին տարիների խորը ուսուցման երկու ամենահայտնի մոդելներից նախնական ուսուցման համար՝ BERT large (BERT) լեզվի համար և EfficientNet-B4՝ տեսողության համար:

BERT-ը (ինչպես նախկինում ստատիկ կորուստների մասշտաբման օրինակում) վերապատրաստվում է ըստ Խորը ուսուցման համար մեծ խմբաքանակի օպտիմիզացում. ուսուցում BERT-ն 76 րոպեում, մինչդեռ Efficient-B4 բազան հետևում է EfficientNet. Rethinking Model Scaling for Convolutional Neural: Ցանցեր», սակայն ալգորիթմական բարելավումներով, որոնք առաջարկվում են Ավելի արդյունավետ դարձնել արդյունավետ ցանցը. ուսումնասիրել խմբաքանակից անկախ նորմալացում, խմբային պտույտներ և կրճատված լուծաչափերի ուսուցում:

Երկու մոդելներում էլ մենք բոլոր կշիռներն ու գրադիենտները պահում ենք float-16-ում, բացի օպտիմիզատորի վիճակից, որը գտնվում է float-32-ում: Մասնակի գործողություններ են իրականացվում նաև float-16-ում։ Օպտիմիզատորը LAMB-ն է BERT-ի և RMSProp-ի համար EfficientNet-ի համար, և ուսուցման արագությունը հետևում է տաքացման սկզբնական փուլին մինչև առավելագույնի հասնելը (2k ուսուցման քայլով BERT 1-ին փուլի համար, 275 քայլով BERT-ի 2-րդ փուլի համար և 4 դարաշրջանների համար EfficientNet-ի համար), որին հաջորդում է. գծային ուսուցման արագության նվազում BERT-ի համար (ըստ էքսպոնենցիալ EfficientNet-ի համար) մինչև վերապատրաստման ավարտը:

Graphcore-ի BERT-ի բաց կոդով իրականացումը, որը հիմնված է HuggingFace Transformers-ի վրա, կարելի է գտնել մեր GitHub պահոցում՝ Վիքիպեդիայի տվյալների բազայի վերաբերյալ մանրամասների հետ միասին: Նմանապես, EfficientNet-ի մեր ներքին բաց կոդով իրականացումը, ImageNet տվյալների բազայի մանրամասների հետ միասին, գտնվում են մեր GitHub շտեմարանում:

BERT-ի վերապատրաստման սյուժեները ցուցադրված են անմիջապես ստորև ներկայացված գրաֆիկներում: ԲԵՐՏ-ի ուսուցումը բաղկացած է երկու փուլից. առաջինն օգտագործում է 128 հաջորդականության երկարությունը, իսկ երկրորդը՝ 512: Սա հիմնականում արդյունավետության համար է. ուշադրությունը հաջորդականության երկարությամբ քառակուսի է. Ավելի կարճ հաջորդականությամբ մարզվելն ավելի էժան է, բայց ավելի երկար հաջորդականությամբ մարզվելը անհրաժեշտ է դիրքային ներկառուցումները և հեռահար կախվածությունները սովորելու համար:

Մենք նկատում ենք, որ 2-րդ փուլի վերջում կորստի ֆունկցիան հասնում է 1.24 արժեքի: Սա SOTA միավոր է, որը մեզ ստիպում է հասնել 84,38-ի և F1-ի՝ 90,92-ի ճշգրիտ համընկնումի SQuAD-ում ճշգրտման ժամանակ (BERT թերթի հղումը համապատասխանաբար 84,1 և 90,9 է): Ինչ վերաբերում է կորուստների մասշտաբային գծապատկերներին, մենք սկզբում սահմանել ենք կորուստների մասշտաբային արժեքը 1-ի, բայց այնուհետև այն ճշգրտվում է յուրաքանչյուր մարզման քայլից հետո, ինչը հանգեցնում է զիգզագման պրոֆիլի, որը հակված է տատանվել 215=32,768-ի շուրջ 1-ին փուլի և 214=16384 փուլի համար: 2. Զիգ-զագը արտադրվում է յուրաքանչյուր մարզման քայլից հետո, քանի որ կորուստների մասշտաբի թարմացման ժամկետը սահմանված է 1, բայց կարելի է նաև ավելի քիչ հաճախակի թարմացումներ օգտագործել:

Հետաքրքիր է, որ մենք տեսնում ենք, որ 1-ին փուլի համար կորուստների մասշտաբի արժեքը մնում է տատանվող և ինչ-որ կերպ հաստատուն մարզման ընթացքում, բացառությամբ 1k-ից 2k-ի միջև որոշ քայլերի, որտեղ սովորելու արագությունը հասել է իր ամենաբարձր արժեքին նախորդ նախավարժանքների օրինակում՝ օգտագործելով ստատիկ կորուստների մասշտաբում: Graphcore ALS ալգորիթմը արձագանքում է գրադիենտ բաշխման փոփոխությանը, որը կարող է պայմանավորված լինել բաշխման ավելի մեծ շեղմամբ կամ ավելի մեծ ընդհանուր արժեքներով: Ամեն դեպքում, ալգորիթմը նվազեցնում է կորուստների մասշտաբային արժեքը՝ կանխելու ավելորդ արտահոսքը:

EfficientNet-ի վերապատրաստման սյուժեները ներկայացված են ստորև ներկայացված գրաֆիկներում: Յուրաքանչյուր վերապատրաստման քայլում գծագրելու փոխարեն, մենք պարզապես գծագրում ենք կորստի և կորուստների մասշտաբի վերջնական արժեքը մեկ դարաշրջանում: Կորստի ֆունկցիան սահուն կերպով նվազում է մարզումների ընթացքում՝ հասնելով 82.33-ի վերջնական վավերացման ճշտության, որը համընկնում է 82.3-ի հղման արժեքի հետ Ավելի արդյունավետ դարձնելով EfficientNet. Exploring Batch-Independent Normalization, Group Convolutions and Reduced Resolution Training-ում:

Կորստի վերջնական անկումը առաջանում է վերջին անցակետը որպես բոլոր նախորդ անցակետերի էքսպոնենցիալ շարժվող միջին հաշվարկից: Ինչ վերաբերում է կորուստների մասշտաբային էվոլյուցիային, ապա մշտական ​​իմաստուն պրոֆիլը պայմանավորված է միայն յուրաքանչյուր դարաշրջանում մեկ անգամ գծագրելով. Իրականում կորուստների մասշտաբը դեռ թարմացվում է քաշի յուրաքանչյուր թարմացումից հետո, ինչպես վերը նշված BERT-ի դեպքում: Մարզման ընթացքում կորստի օպտիմալ մասշտաբի արժեքի որոշակի տարբերություն կա նաև:

Ե՛վ BERT, և՛ EfficientNet-ի կորստի մասշտաբային պրոֆիլներում կան հաճախակի աճեր, որոնք ցույց են տալիս, որ Graphcore ALS ալգորիթմն ի վիճակի է հայտնաբերել տեղական իրադարձությունները, որոնք կարող են հանգեցնել ուսուցման տարաձայնությունների, ինչպիսիք են խնդրահարույց տվյալների խմբաքանակները: Ի տարբերություն կորուստների մասշտաբավորման այլ ավտոմատ սխեմաների, որոնք խուսափում են կշիռների թարմացումից, երբ նույնիսկ NaN-ը տեղի է ունենում, մեր սխեման կարող է շարունակել ուսուցումը, անկախ նրանից, որ գրադիենտները կտրվում են մինչև առավելագույն float-16 արժեքը, և կորստի մասշտաբը համապատասխանաբար ճշգրտվում է:

Կայունությունը բարձրացնելու լրացուցիչ տեխնիկա

Թեև կորուստների մասշտաբը կարևոր է դինամիկ տիրույթում գրադիենտները պատշաճ կերպով տեղափոխելու և ներհոսքը կանխելու համար, այն կարող է բավարար չլինել՝ կախված մոդելից և կազմաձևից: Կայունությունը բարձրացնելու համար Graphcore-ում մենք լրացնում ենք կորուստների մասշտաբը ստոխաստիկ կլորացումով, կուտակումների համար վազող միջինով և որոշակի տարրերի համար float-32 ճշգրտությամբ, ինչպիսիք են օպտիմիզատորի վիճակի պահերը:

Ստոխաստիկ կլորացումը, որը բնիկորեն աջակցվում է IPU-ի կողմից, կարող է օգտագործվել խառը ճշգրիտ մարզումների հետ՝ օգնելու մեղմել ճշգրտության կորուստը float-16 մասնակի օգտագործման ժամանակ (16,16 AMP-ներում) կամ հնարավորություն տալ մարզվել առանց հիմնական կշիռների float-32 պատճենի: Ստոխաստիկ կլորացման դեպքում որոշումն այն մասին, թե որ արդյունքը պետք է արտադրվի, որոշիչ չէ. օրինակ, երբ 1.2-ը ստոխաստիկորեն կլորացվում է, ժամանակի 20%-ում արդյունքը 2 է, իսկ 80%-ը՝ 1: Սա տարբերվում է մոտակա արժեքի կլորացումից, որտեղ որոշումը դետերմինիստական ​​է, և 1.2-ի կլորացումը միշտ հանգեցնում է 1-ի: Մաթեմատիկորեն, x մուտքագրման համար, որն ունի քվանտացման քայլ Δ, ստոխաստիկ կլորացման բանաձևը հետևյալն է.

Ստոխաստիկ կլորացումն ունի անկողմնակալ քանակականացում առաջացնելու առավելությունը (որտեղ E{SR(x)} = x) չնայած տանելի սխալի մակարդակի ավելացմանը: . Սա նշանակում է, որ շատ նման հավելումների դեպքում ավելացված քանակական աղմուկը ունի զրոյական միջին, և ներարկվող կրիչների քանակը մոտավոր է այն բանին, ինչ կտարածվեր ավելի բարձր ճշգրտությամբ կուտակման միջոցով:

Որպես օրինակ՝ եկեք նայենք ResNet32-ում CIFAR-100-ով, SGD-ով և խմբաքանակի չափով ստոխաստիկ կլորացման ազդեցությանը: և քաշի թարմացման ձևաչափը: Ստոխաստիկ կլորացումը միացնելը կանխում է վավերացման ճշգրտության անկումը, երբ float-16-ն օգտագործվում է ինչպես թվաբանական, այնպես էլ քաշի թարմացման ձևաչափով:

Կայունության բարձրացման երկրորդ ռազմավարությունը ներառում է կուտակման գործողությունների կատարումը ընթացիկ միջինով: Նյարդային ցանցերի ճարտարապետությունը սովորաբար օգտագործում է մեծ խմբաքանակի չափսեր յուրաքանչյուր քաշի թարմացման համար՝ խնայելու կապի ծախսերը մեկ քաշի թարմացման համար: Ցավոք սրտի, նման խմբաքանակի չափերը սովորաբար չեն տեղավորվում հիշողության մեջ, ինչը նշանակում է, որ բոլոր խմբաքանակի նմուշների գրադիենտները չեն կարող հաշվարկվել մեկ քայլով: Դա հաղթահարելու համար, մինչդեռ խմբաքանակի չափերը մեծ պահելու համար, կան տարբեր ռազմավարություններ՝ զուգահեռացնելու/սերիալացնելու գրադիենտ հաշվարկը և պահպանում հիշողությունը. այստեղ մենք առանձնացրել ենք դրանցից երկուսը.

  • Տվյալների զուգահեռություն. հավասար թվով IPU-ների խմբերը (կոչվում են կրկնօրինակներ) սահմանվում են նույն հաշվողական գրաֆիկով, և նրանցից յուրաքանչյուրը հաշվարկում է տարբեր միկրոխմբաքանակների գրադիենտները որոշ տվյալների նմուշներով: Երբ գրադիենտը պատրաստ է, կրկնօրինակները շփվում են և կատարում իրենց գրադիենտների միջինը:
  • Գրադիենտ կուտակում. յուրաքանչյուր կրկնօրինակ, նախքան գրադիենտները մյուս կրկնօրինակներին հաղորդելը, ներսից կուտակում է բազմաթիվ միկրոխմբաքանակների գրադիենտները: Այս գործողությունը կատարվում է սերիական, միաժամանակ մեկ միկրո խմբաքանակով, և այնուհետև կուտակելով ստացված գրադիենտները յուրաքանչյուր կրկնօրինակի համար: Այս կերպ հիշողությունն ավելի ցածր է, քանի որ մեզ անհրաժեշտ է միաժամանակ հաշվարկել միայն մեկ միկրո խմբաքանակ:

Ինչպես տվյալների զուգահեռության, այնպես էլ գրադիենտների կուտակման դեպքում կա կուտակման գործողություն, որը պետք է կատարվի՝ գրադիենտների միջինը հաշվարկելու նպատակով: Եթե ​​միջինը հաշվարկվում է նախ՝ ավելացնելով բոլոր գրադիենտները և երկրորդը՝ բաժանելով գրադիենտների ընդհանուր թվի վրա, ապա float-16-ում առկա է հորդառատ վտանգ:

Հետևաբար, մենք իրականացրել ենք ընթացիկ միջին կուտակում, որն ապահովում է, որ կուտակված գրադիենտը մեծ չէ ամենամեծ միկրոխմբաքանակի գրադիենտի մեծությունից և՛ տվյալների զուգահեռության, և՛ գրադիենտ կուտակման համար:

Մասնավորապես, տրված g1,…,gN գրադիենտներով առաջին kգրադիենտների միջինը հաշվարկվում է կրկնվող` հաշվարկելով

M₀= 0-ով: Գործող միջինը իրականում անհրաժեշտ է կորուստների մասշտաբային թյունինգը և կուտակման սանդղակը բաժանելու համար, քանի որ դրա հետ և՛ գրադիենտները, և՛ դրանց կուտակումն ունեն մեծության նույն կարգը:

Սկսում ենք ALS-ով

Թեև կորուստների մասշտաբը կարևոր գործիք է խառը ճշգրիտ մարզումների համար, մասշտաբի գործակիցը ձեռքով սահմանելը ժամանակի և ռեսուրսների ինտենսիվ գործընթաց է. մինչդեռ ավտոմատ մոտեցումները հակված են ձախողման:

Այս բլոգային գրառման մեջ մենք ներկայացրել ենք Graphcore-ի սեփական ALS ալգորիթմը, որն օգտագործում է հիստոգրամի վրա հիմնված կորուստների մասշտաբման եզակի մոտեցում՝ կանխելու ներհոսքն ու արտահոսքը՝ ապահովելով մոդելների մերձեցումը: Մենք ցույց ենք տվել, թե ինչպես է մեր ALS ալգորիթմը տալիս 100% կոնվերգենտ նախավարժանքներ BERT-ում և EfficientNet-ում, ընդ որում կորուստների մասշտաբը ճշգրտվում է յուրաքանչյուր մարզման քայլից հետո:

Graphcore ALS-ը արագացուցիչ-ագնոստիկ է և կարող է կիրառվել IPU-ներից դուրս: Այն որոշ ժամանակ փորձնական հիմունքներով ինտեգրվել է Graphcore-ի Poplar SDK-ին, և Poplar SDK 3.0-ի թողարկմամբ անցնում է «նախադիտման»:

Graphcore ALS-ը նաև լիովին միացված է մեր PyTorch-ի շատ հավելվածներում. Ներկայումս աջակցվող հավելվածները ներառում են.

  • ԲԵՐՏ
  • ResNet
  • EfficientNet
  • ViT
  • Hugging Face Optimum Graphcore մոդելներ

Բացի այդ, շատ պարզ է միացնել Graphcore ALS-ը գրեթե ցանկացած PyTorch մոդելի համար՝ մոդելը ստեղծելիս կոդերի մի քանի լրացուցիչ տողերով.

opts.Training.setAutomaticLossScaling(True)
poptorch_model = poptorch.trainingModel(model, opts, optimizer=optimizer)

Սա երաշխավորում է, որ Graphcore ALS-ը միացված է և անցնում է այն մոդելը, որը դուք ուսուցանում եք:
Պետք է նշել, սակայն, որ չնայած Graphcore ALS-ը շատ դեպքերում հիանալի է աշխատում, այն երաշխավորված չէ, որ կաշխատի բոլոր մոդելների վրա:

Graphcore-ի մեր շարունակական նպատակն է հնարավորինս հեշտացնել մոդելների մշակման և IPU-ների վրա փորձարկումների գործընթացը տարբեր կարիքների և ծանոթության մակարդակ ունեցող օգտատերերի համար՝ ML հետազոտողներից մինչև տվյալների գիտնականներ, MLOps ինժեներներ, ամպային հավելվածների մշակողներ և ոչ միայն: .

Սկզբնապես հրապարակվել է https://www.graphcore.ai-ում 2022 թվականի հոկտեմբերի 4-ին: