Մեքենայական ուսուցման տիպիկ հետազոտական ​​կոդ վերցնելու և արտադրության համար պատրաստ միկրոծառայություն կառուցելու քայլ առ քայլ օրինակ:

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

Այս հոդվածը հաճոյանալու ուղեկից կոդը կարելի է գտնել իմ GitHub հաշվում՝ Jupyter Notebook-ի բնօրինակ այստեղ և վերջնական ամբողջական նախագծի այստեղ: Ես կներառեմ այս փոփոխությունների հատվածները՝ դրանք քննարկելու ընթացքում տարբեր թեմաներ ցուցադրելու համար, բայց սա չի լինի կատարված բոլոր փոփոխությունների ամբողջական նկարագրությունը: Այս հոդվածում ես փոխարենը կկենտրոնանամ իմ կատարած յուրաքանչյուր քայլի գործընթացի և մոտիվացիայի վրա:

Յուպիթերի նոթատետրի լուծում (կոդ)

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

Քայլ 1. Վերափոխում, կոդի ոճ և փորձարկում (կոդ)

Առաջին քայլը նոթատետրը մոդուլավորացնելն է ողջամիտ թղթապանակի կառուցվածքի, սա արդյունավետորեն նշանակում է ֆայլերը փոխարկել .ipynb ձևաչափից .py ձևաչափի, ապահովել, որ յուրաքանչյուր սցենար ունի հստակ հստակ նպատակ և կազմակերպել այդ ֆայլերը համահունչ ձևով: Ես վերցրել եմ հետևյալ ստանդարտ դասավորությունը, բայց սա ճկուն է և պետք է հարմարեցվի տարբեր օգտագործման դեպքերին համապատասխանելու համար:

Երբ նախագիծը լավ կառուցված է, մենք կարող ենք կարգի բերել կամ վերափոխել կոդը: Օրինակ, հաշվի առեք կոդի հետևյալ բլոկը, որը կատարում է տվյալների շերտավորված գնացք-թեստային բաժանման առաջադրանքը.

Իր ներկայիս ձևաչափով պարզ չէ, թե կոնկրետ ինչ է անում այս կոդը, այն կրկնակի օգտագործման ենթակա չէ և չի կարող փորձարկվել: Դա մեղմելու համար մենք կարող ենք այն վերագրել որպես գործառույթ՝ փաստաթղթերով և տիպային ակնարկներով:

Սա շատ ավելի լավ տեսք ունի և հետևում է pep8 ոճի ուղեցույցին: Փաստորեն, մենք կարող ենք ապահովել, որ ամբողջ նախագիծը համապատասխանի pep8-ին՝ օգտագործելով linting փաթեթը, ինչպիսին է pycodestyle: Այս փաթեթը տեղադրվելուց հետո մենք կարող ենք նավարկել դեպի նախագծերի արմատային գրացուցակ և հրամանի տողում գործարկել pycodestyle src-ը: Սա ցույց կտա ցանկացած pep8 խնդիրների գտնվելու վայրը և մանրամասները: Մենք կարող ենք նույնիսկ մեկ քայլ առաջ գնալ և օգտագործել այնպիսի փաթեթ, ինչպիսին է autopep8-ը, որն ավտոմատ կերպով ձևաչափում է pycodestyle-ով ճանաչված ցանկացած ծածկագիր:

Պետք է համառոտ անդրադառնալ նաև թեստավորմանը։ Կոդերի փորձարկման լայնածավալ գրականություն կա (տե՛ս այստեղ, օրինակ), բայց մենք այս նախագծում կիրականացնենք միայն միավորի թեստեր: Սրանք ստուգում են կոդի ամենափոքր հնարավոր միավորները՝ միմյանցից անկախ: Նախորդ օրինակի մեր նախորդ stratified_split() ֆունկցիայի համար միավորի թեստը կարող է այսպիսի տեսք ունենալ.

Գործարկելով այս կոդը՝ մենք ստուգում ենք՝ արդյոք ֆունկցիայի ելքը նույնն է, ինչ սպասվում է մի շարք կանխորոշված ​​դեպքերում: Սա հաստատում է, որ մեր գոյություն ունեցող կոդը աշխատում է այնպես, ինչպես պետք է, բայց նաև երաշխավորում է, որ եթե ապագա փոփոխությունները պատճառ դարձնեն, որ այս ֆունկցիան դադարի աշխատել այնպես, ինչպես նախատեսված էր, մենք կարող ենք շուտ հայտնաբերել այս սխալը, երբ այն կհանգեցնի այս թեստերի ձախողմանը:

Քայլ 2. Համագործակցություն (կոդ)

Դժվար թե որևէ մասշտաբային նախագիծ լինի միայն մեկ անհատի աշխատանքի արդյունք, այդ իսկ պատճառով մենք պատրաստվում ենք քննարկել տարբերակների վերահսկումը: Տարբերակները վերահսկելու գործիքը, ինչպիսին է git-ը, համակարգ է, որը ժամանակի ընթացքում գրանցում է նախագծի փոփոխությունները՝ մի քանի օգտատերերի հնարավորություն տալով ճյուղավորել և միավորել փոփոխությունները պահեստում: Կան բազմաթիվ հոդվածներ տարբերակների վերահսկման օգտագործման սկզբունքների և լավագույն փորձի վերաբերյալ, սակայն մենք ենթադրում ենք, որ տվյալների գիտության աշխատանքի մեծ մասն արդեն ավարտված է, ուստի փոխարենը մենք կկենտրոնանանք օգտակար ֆայլի վրա, որը կոչվում է pre-commit.sh: Սա այն է, ինչ հայտնի է որպես git hook, օգտակար հատկություն, որն առաջարկում է git-ը, որը թույլ է տալիս գործարկել հատուկ սկրիպտներ, երբ տեղի են ունենում որոշակի կարևոր գործողություններ, այս դեպքում git commit հրամանը: Մենք կարող ենք օգտագործել այս հատկությունը test-all.sh սկրիպտը ցանկացած կատարումից առաջ հարմար գործարկելու համար, և սա, իր հերթին, կատարում է մեր միավորի բոլոր թեստերը, ինչպես նաև pycodestyle-ի ստուգում, որը թույլ է տալիս կատարել միայն այն դեպքում, եթե չկան ձախողումներ: Այս գործընթացը երաշխավորում է, որ պահեստի ցանկացած փոփոխություն չի խախտում առկա ֆունկցիոնալությունը և չի համապատասխանում pep8-ին:

Համագործակցության համար մեկ այլ օգտակար ֆայլ է պահանջների ֆայլը, որը կոչվում է requirements.txt: Ծրագրի արմատային գրացուցակի տակ պահված այս ֆայլը թվարկում է Python-ի բոլոր փաթեթները, որոնք օգտագործվում են նախագծում: Ծրագրի ցանկացած նոր օգտվող կարող է պարզապես օգտագործել pip՝ այս պահանջները տեղադրելու համար հետևյալ հրամանով.

pip install -r requirements.txt

requirements.txt-ի ստեղծումը նույնպես բավականին պարզ է: Ենթադրելով, որ մենք օգտագործել ենք վիրտուալ միջավայր, ինչպիսին է venv կամ conda հենց այս նախագծի համար՝ տեղադրված բոլոր փաթեթներով, մենք կարող ենք դրանց անուններն ու տարբերակները տեղադրել requirements.txtում՝ ակտիվացնելով միջավայրը և գործարկելով:

pip freeze > requirements.txt

Քայլ 3. Պատրաստվեք տեղակայմանը (կոդ)

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

print('Splitting train and test sets')

հետ

logger.info('Splitting train and test sets')

Այժմ տեղեկամատյանները կարող են պահվել մատյան ֆայլում՝ օգտագործողի կողմից սահմանված մետա տվյալների հետ միասին, ինչպիսիք են ժամանակը, մոդուլը, ֆունկցիայի անվանումը և տողի համարը: Այս տեղեկատվությունը ոչ միայն թույլ է տալիս մեզ հետևել մեր ծրագրի առաջընթացին, այլ նաև մանրամասն տեղեկություններ է տալիս վրիպազերծման նպատակներով, որոնք ապահով կերպով պահվում են գրանցամատյանի ֆայլում:

Սա նաև լավ ժամանակ կլինի տվյալների և ֆայլերի տեղային պահեստավորումից հեռանալու համար և փոխարենը տեղափոխվելու հեռավոր պահեստ: Վերապատրաստման տվյալները, օրինակ, ներկայումս պահվում են առցանց csv ֆայլում, և եթե մենք լրացուցիչ տվյալներ ստանանք, այս ֆայլը թարմացնելու գործընթացը անհարմար է: Այլընտրանքներից մեկը MySQL բաց կոդով տվյալների բազայի կառավարման համակարգ օգտագործելն է, և դա P ython միակցիչն է: Մենք այստեղ մանրամասների վրա չենք անդրադառնա, բայց տեղադրվելուց հետո մենք կարող ենք հեշտությամբ կարդալ մեր տվյալների բազայի տվյալները՝ օգտագործելով sql հարցումները:

Մենք նաև ցանկանում ենք առաջընթաց գրանցել ֆայլերը տեղում պահելուց: Երբ գալիս է կանխատեսումներ անելու ժամանակը, մենք կարող ենք օգտագործել մոդել, որը վերապատրաստվել է ամիսներ առաջ, և այս տեսակի օբյեկտների պահպանման ծառայություն ստանալու ամենահեշտ, ամենաէժան եղանակներից մեկը Amazon S3-ն է: Կրկին մենք բաց կթողնենք այստեղ կազմաձևման որոշ մանրամասներ, սակայն boto3-ն առաջարկում է Python-ի հարմար ինտերֆեյս S3 դույլ մուտք գործելու համար: Այս հեռավոր դույլով ֆայլեր վերբեռնելը և ներբեռնելը հեշտ է մեզ հնարավորություն տալով օգտվել մեր բոլոր մոդելներից: Այս հոդվածով ես չեմ ներդրել MySQL կամ S3 նմուշի կոդում, բայց կան բազմաթիվ այլ ուղեցույցներ այս քայլերն առցանց կատարելու համար (օրինակ՝ այստեղ և այստեղ համապատասխանաբար):

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

gscv = GridSearchCV(pipeline, parameters, cv=3, scoring="accuracy")

կարող է փոխադրել խաչաձև վավերացման ծալքերի և միավորների չափման քանակը կազմաձևման ֆայլ և դառնալ

gscv = GridSearchCV(pipeline, parameters, cv=NUM_FOLDS, scoring=SCORING)

որտեղ NUM_FOLDS և SCORING փոփոխականները բեռնված են design.json կազմաձևման ֆայլից, և get_default() ֆունկցիան ավելացվում է config.pyին՝ այս արժեքներին հեշտությամբ մուտք գործելու համար:

Քայլ 4. տեղակայում (կոդ)

Նախորդ երեք քայլերի ավարտից հետո մենք վերջապես պատրաստ ենք տեղակայել մեր կոդը: Մենք կտեղակայենք այս ծառայությունը որպես վեբ հավելված, որի հետ մենք կշփվենք մի շարք api-ի վերջնակետերի միջոցով: Դա անելու համար մենք կօգտագործենք վեբ շրջանակը, որը ավտոմատացնում է շատ ծախսեր: Թեև կան շատերը, որոնք մենք կարող ենք օգտագործել, այս պարզեցված հավելվածի համար Flask-ը լավ ընտրություն է թվում, քանի որ այն հեշտ է գործի դնել և գործարկել և չափազանց ճկուն է: Հիմնական գաղափարն այն է, որ գործարկելով python3 run_app.py-ը, սա մուտք կգործի նախագծի ֆունկցիոնալությունը src/template_app թղթապանակի միջոցով և կսկսի գործարկել հավելվածը http://localhost:5000-ից: Երբ հավելվածը գործարկվի և գործարկվի, այնուհետև մենք կարող ենք օգտագործել GET և POST հարցումները՝ մուտք գործելու դրա գնացք, կանխատեսել կամ պատկերացնել ֆունկցիոնալությունը բրաուզերի կամ API մշակման հարթակի միջոցով, ինչպիսին է Postman:

Նույնիսկ այս շատ պարզ նախագծի համար պահանջների ցանկը սկսել է զգալիորեն աճել: Մեկ այլ ծրագրավորողի համար մեր կոդը գործարկելու համար կպահանջվի վիրտուալ միջավայրեր ստեղծել և փաթեթներ ներբեռնել: Այս գործընթացը ավտոմատացնելու և կախվածության հետ կապված խնդիրների վտանգից խուսափելու համար մենք կօգտագործենք Docker կոչվող գործիքը: Docker-ը արդյունավետորեն ստեղծում է դատարկ կոնտեյներ, որը տեղադրում է ամբողջ նախագիծը զրոյից: Առավելությունն այն է, որ յուրաքանչյուրը, ցանկացած մեքենայի վրա կարող է գործարկել մեր կոդը՝ տեղադրելով docker-ը և պարզապես գործարկել docker build sample_app:v.1.0 .-ը նախագծի արմատային թղթապանակից: Տեղական պատկերը կառուցելուց հետո մենք կարող ենք գործարկել և բացահայտել այն docker run -p 5000:5000 sample_app:v.1.0-ով: Եվ վերջ: Dockerfile-ը ներառում է Python-ի, pip-ի ներբեռնման հրահանգներ և պահանջներ: Այնուհետև այն գործարկում է թեստերը և pycodestyle-ը, և եթե այն հաջողությամբ ավարտվի, այն գործարկում է հավելվածը run_app.py սկրիպտի միջոցով:

Մենք այժմ վերածել ենք մեր բնօրինակ jupyter նոթատետրը լիարժեք միկրոծառայության: Մեր վերջնական կոդը մոդուլյարացված է, այն հավատարիմ է pep8-ին, ներառում է գրանցում և փորձարկում, և այն պատրաստ է տեղակայվել որպես Dockerised Flask հավելված: Մենք նաև քննարկել ենք տվյալների կառավարումը SQL-ի և Amazon s3-ի հետ: Այնտեղ, որտեղ դուք պետք է տեղակայեք ձեր հավելվածը, կախված կլինի ձեր նախագծերի կարիքներից, մասշտաբային նախագծերը հաճախ օգտագործում են AWS, Azure կամ Google Cloud, մինչդեռ Heroku հարթակները առաջարկում են անվճար հոսթինգ փոքր հոբբի նախագծերի համար: Ավելի մեծ նախագծերի համար, որոնք ունեն բազմաթիվ միկրոծառայություններ, Kubernetes-ը բաց կոդով համակարգ է՝ բեռնարկղային հավելվածների տեղակայման, մասշտաբավորման և կառավարման ավտոմատացման համար: Երբ մեծ նախագիծը կյանքի կոչվի, շարունակական ինտեգրումը կարող է դառնալ հիմնական մարտահրավեր: Այս դեպքում ավտոմատացման սերվերը, ինչպիսին Jenkins-ն է, կարող է կառավարել ծրագրային ապահովման կառուցման, փորձարկման և տեղակայման հետ կապված խնդիրները:

Շնորհակալություն կարդալու համար և խնդրում ենք ազատ զգալ կիսվել կարծիքներով կամ հարցերով մեկնաբանություններում: