Өнеркәсіптік машиналарды оқыту: 10 жобалау принциптері

Өнеркәсіптік машиналарды оқыту: 10 жобалау принциптері

Қазіргі уақытта таңғажайып нәрселерді жасауға мүмкіндік беретін жаңа қызметтер, қосымшалар және басқа да маңызды бағдарламалар күн сайын жасалады: SpaceX зымыранын басқаруға арналған бағдарламалық жасақтамадан бастап смартфон арқылы көрші бөлмедегі шәйнекпен әрекеттесуге дейін.

Кейде әрбір жаңадан бастаған бағдарламашы, мейлі ол ынталы стартапшы немесе қарапайым Full Stack немесе Data Scientist болсын, ерте ме, кеш пе, өмірді айтарлықтай жеңілдететін бағдарламалау мен бағдарламалық жасақтаманы жасаудың белгілі бір ережелері бар екенін түсінеді.

Бұл мақалада мен 10 факторлы App әдіснамасы негізінде оны қолданбаға/қызметке оңай біріктіру үшін өнеркәсіптік машиналық оқытуды қалай бағдарламалаудың 12 қағидасын қысқаша сипаттаймын. Heroku командасы ұсынған. Менің бастамам - көптеген әзірлеушілер мен деректер ғылымының адамдарына көмектесетін осы техника туралы хабардарлықты арттыру.

Бұл мақала өнеркәсіптік машинаны үйрену туралы мақалалар топтамасының алғы сөзі. Оларда мен модельді қалай жасау және оны өндіріске енгізу, ол үшін API құру, сондай-ақ жүйелерінде ML кіріктірілген әртүрлі салалар мен компаниялардың мысалдары туралы әрі қарай сөйлесемін.

1-қағида: Бір кодтық база

Кейбір бағдарламашылар бірінші кезеңде оны анықтауға жалқаулықтан (немесе қандай да бір себептермен) Git туралы ұмытып кетеді. Олар не сөзді мүлде ұмытады, яғни бір-біріне файлдарды дискіге лақтырады/тек мәтінді лақтырады/көгершіндер арқылы жібереді, немесе олар өздерінің жұмыс барысын ойланбай, әрқайсысын өз филиалына, содан кейін шебері.

Бұл принцип былай дейді: бір код базасы және көптеген орналастырулары бар.

Git өндірісте де, ғылыми-зерттеу және тәжірибелік-конструкторлық жұмыстарда да қолданыла алады, онда ол жиі қолданылмайды.

Мысалы, ҒЗТКЖ кезеңінде сіз ең жақсысын таңдап, онымен әрі қарай оңай жұмыс істеуді жалғастыру үшін деректерді өңдеудің әртүрлі әдістері мен үлгілерімен міндеттеме қалдыра аласыз.

Екіншіден, өндірісте бұл алмастырылмайтын нәрсе - сіз өзіңіздің кодыңыздың қалай өзгеретінін үнемі қарап отыруыңыз керек және қай модель жақсы нәтиже бергенін, соңында қай код жұмыс істегенін және оның жұмысын тоқтатуға немесе дұрыс емес нәтижелерді шығаруға не себеп болғанын білуіңіз керек. . Міндеттемелер сол үшін!

Сіз сондай-ақ жобаңыздың бумасын жасай аласыз, оны, мысалы, Gemfury-ге орналастыра аласыз, содан кейін оларды 1000 рет қайта жазбас үшін, бірақ кейінірек одан да көп басқа жобалар үшін функцияларды импорттай аласыз.

2-қағида: Тәуелділіктерді анық жариялаңыз және оқшаулаңыз

Әрбір жобада оларды бір жерде қолдану үшін сырттан импорттайтын әртүрлі кітапханалар бар. Бұл Python кітапханалары немесе әртүрлі мақсаттарға арналған басқа тілдердің кітапханалары немесе жүйелік құралдар болсын - сіздің міндетіңіз:

  • Тәуелділіктерді, яғни жобаңызда қолданылатын және орнатылуы керек барлық кітапханаларды, құралдарды және олардың нұсқаларын қамтитын файлды анық жариялаңыз (мысалы, Python-да мұны Pipfile немесе талаптар.txt арқылы жасауға болады. A. жақсы түсінуге мүмкіндік беретін сілтеме: realpython.com/pipenv-guide)
  • Әзірлеу кезінде бағдарламаңыз үшін арнайы тәуелділіктерді оқшаулаңыз. Сіз нұсқаларды үнемі өзгертіп, қайта орнатқыңыз келмейді, мысалы, Tensorflow?

Осылайша, болашақта сіздің командаңызға қосылатын әзірлеушілер жобаңызда қолданылатын кітапханалармен және олардың нұсқаларымен тез танысып, белгілі бір нұсқа үшін орнатылған нұсқалар мен кітапханаларды өздері басқару мүмкіндігіне ие болады. жоба, бұл кітапханалардың немесе олардың нұсқаларының сәйкессіздігін болдырмауға көмектеседі.

Қолданбаңыз белгілі бір ОЖ-да орнатылуы мүмкін жүйелік құралдарға да сенбеуі керек. Бұл құралдар тәуелділіктер манифестінде де жариялануы керек. Бұл құралдардың нұсқасы (сонымен қатар олардың қолжетімділігі) белгілі бір ОЖ жүйелік құралдарымен сәйкес келмейтін жағдайларды болдырмау үшін қажет.

Осылайша, curl барлық дерлік компьютерлерде пайдаланылуы мүмкін болса да, сіз оны әлі де тәуелділіктерде жариялауыңыз керек, өйткені басқа платформаға көшкен кезде ол ол жерде болмауы мүмкін немесе нұсқа сізге бастапқыда қажет болмауы мүмкін.

Мысалы, талаптар.txt файлыңыз келесідей болуы мүмкін:

# Model Building Requirements
numpy>=1.18.1,<1.19.0
pandas>=0.25.3,<0.26.0
scikit-learn>=0.22.1,<0.23.0
joblib>=0.14.1,<0.15.0

# testing requirements
pytest>=5.3.2,<6.0.0

# packaging
setuptools>=41.4.0,<42.0.0
wheel>=0.33.6,<0.34.0

# fetching datasets
kaggle>=1.5.6,<1.6.0

3-қағида: Конфигурациялар

Көбісі әртүрлі әзірлеуші ​​жігіттердің кездейсоқ GitHub-қа кодты AWS құпия сөздері мен басқа кілттері бар жалпыға қолжетімді репозиторийлерге жүктеп салып, келесі күні 6000 50000 доллар, тіпті XNUMX XNUMX доллар қарызымен оянғанын естіді.

Өнеркәсіптік машиналарды оқыту: 10 жобалау принциптері

Әрине, бұл жағдайлар төтенше, бірақ өте маңызды. Тіркелгі деректерін немесе конфигурацияға қажетті басқа деректерді код ішінде сақтасаңыз, қате жіберіп жатырсыз және себебін түсіндірудің қажеті жоқ деп ойлаймын.

Бұған балама орта айнымалы мәндерінде конфигурацияларды сақтау болып табылады. Қоршаған ортаның айнымалылары туралы көбірек оқуға болады осында.

Әдетте ортаның айнымалы мәндерінде сақталатын деректер мысалдары:

  • Домен атаулары
  • API URL мекенжайлары/URI
  • Ашық және жеке кілттер
  • Контактілер (почта, телефондар және т.

Осылайша, конфигурацияның айнымалы мәндері өзгерсе, кодты үнемі өзгертудің қажеті жоқ. Бұл уақытты, күш пен ақшаны үнемдеуге көмектеседі.

Мысалы, сынақтарды жүргізу үшін Kaggle API пайдалансаңыз (мысалы, бағдарламалық құралды жүктеп алып, модельдің жақсы жұмыс істейтінін тексеру үшін сол арқылы үлгіні іске қосыңыз), онда KAGGLE_USERNAME және KAGGLE_KEY сияқты Kaggle құпия кілттері болуы керек. орта айнымалыларында сақталады.

4-қағидат: Үшінші тарап қызметтері

Мұндағы идея бағдарламаны код бойынша жергілікті және үшінші тарап ресурстарының арасында ешқандай айырмашылық болмайтындай етіп жасау. Мысалы, жергілікті MySQL және үшінші тарап екеуін қосуға болады. Бұл Google Maps немесе Twitter API сияқты әртүрлі API интерфейстеріне де қатысты.

Үшінші тарап қызметін өшіру немесе басқасын қосу үшін, мен жоғарыдағы абзацта айтқан ортаның айнымалы мәндеріндегі конфигурациядағы кілттерді өзгерту керек.

Мәселен, мысалы, код ішіндегі деректер жиыны бар файлдарға жолды әр уақытта көрсетудің орнына, pathlib кітапханасын пайдаланып, config.py ішіндегі деректер жиынына жолды жариялаған дұрыс, сонда сіз қандай қызметті пайдалансаңыз да (үшін). мысалы, CircleCI), бағдарлама жаңа қызметтегі жаңа файлдық жүйенің құрылымын ескере отырып, деректер жиынына жолды таба алды.

5-қағида. Құру, шығару, орындау уақыты

Data Science саласындағы көптеген адамдар бағдарламалық жасақтаманы жазу дағдыларын жақсартуды пайдалы деп санайды. Егер біз бағдарламамыздың мүмкіндігінше сирек бұзылуын және мүмкіндігінше ұзақ уақыт бойы ақаусыз жұмыс істеуін қаласақ, жаңа нұсқаны шығару процесін 3 кезеңге бөлуіміз керек:

  1. Кезең жиындар. Жалаң кодты жеке ресурстармен барлық қажетті код пен деректерді қамтитын бумаға түрлендіресіз. Бұл пакет құрастыру деп аталады.
  2. Кезең босату — мұнда біз конфигурациямызды ассамблеяға қосамыз, онсыз бағдарламамызды шығара алмаймыз. Енді бұл толығымен іске қосуға дайын шығарылым.
  3. Келесі кезекте сахна орындалуы. Мұнда біз шығарылымнан қажетті процестерді іске қосу арқылы қолданбаны шығарамыз.

Модельдің немесе бүкіл құбырдың жаңа нұсқаларын шығаруға арналған мұндай жүйе әкімшілер мен әзірлеушілер арасындағы рөлдерді бөлуге мүмкіндік береді, нұсқаларды қадағалауға мүмкіндік береді және бағдарламаның қажетсіз тоқтауын болдырмайды.

Шығарылым тапсырмасы үшін .yml файлында өзіңізді іске қосу үшін процестерді жазуға болатын көптеген әртүрлі қызметтер жасалды (мысалы, CircleCI ішінде бұл процестің өзін қолдау үшін config.yml). Wheely жобалар үшін пакеттер жасауда тамаша.

Сіз машиналық оқыту үлгісінің әртүрлі нұсқалары бар бумаларды жасай аласыз, содан кейін оларды буып, сол жерден жазған функцияларды пайдалану үшін қажетті бумалар мен олардың нұсқаларына сілтеме жасай аласыз. Бұл үлгіңіз үшін API жасауға көмектеседі және сіздің пакетіңізді, мысалы, Gemfury-де орналастыруға болады.

6-қағида. Үлгіңізді бір немесе бірнеше процесс ретінде іске қосыңыз

Сонымен қатар, процестерде ортақ деректер болмауы керек. Яғни, процестер бөлек болуы керек және деректердің барлық түрлері бөлек болуы керек, мысалы, MySQL немесе басқалар сияқты үшінші тарап қызметтерінде қажет нәрсеге байланысты.

Яғни, деректерді процестің файлдық жүйесінде сақтаудың қажеті жоқ, әйтпесе бұл келесі шығарылым/конфигурацияларды өзгерту немесе бағдарлама жұмыс істейтін жүйені тасымалдау кезінде бұл деректерді тазалауға әкелуі мүмкін.

Бірақ бір ерекшелік бар: машиналық оқыту жобалары үшін қосымша кітапханалар немесе олардың нұсқаларына қандай да бір өзгерістер енгізілмеген болса, жаңа нұсқаны іске қосқан сайын оларды қайта орнатпау үшін кітапханалардың кэшін сақтауға болады. Осылайша, сіз өнеркәсіпте модельді іске қосу уақытын қысқартасыз.

Модельді бірнеше процестер ретінде іске қосу үшін қажетті процестерді және олардың ретін көрсететін .yml файлын жасауға болады.

7-принцип: Қайта өңдеу

Үлгі қолданбаңызда орындалатын процестерді бастау және тоқтату оңай болуы керек. Осылайша, бұл код өзгерістерін, конфигурация өзгерістерін жылдам орналастыруға, жылдам және икемді масштабтауға және жұмыс нұсқасының ықтимал бұзылуларын болдырмауға мүмкіндік береді.

Яғни, модельмен жұмыс істеу процесі:

  • Іске қосу уақытын азайтыңыз. Ең дұрысы, іске қосу уақыты (іске қосу пәрмені берілген сәттен бастап процесс іске қосылғанға дейін) бірнеше секундтан аспауы керек. Жоғарыда сипатталған кітапханалық кэштеу іске қосу уақытын қысқартуға арналған әдістердің бірі болып табылады.
  • Дұрыс аяқтаңыз. Яғни, қызмет көрсету портында тыңдау іс жүзінде тоқтатылады және осы портқа жіберілген жаңа сұраулар өңделмейді. Мұнда сіз DevOps инженерлерімен жақсы қарым-қатынас орнатуыңыз керек немесе оның қалай жұмыс істейтінін өзіңіз түсінуіңіз керек (әрине, соңғысы жақсырақ, бірақ кез келген жобада байланыс әрқашан сақталуы керек!)

8-қағида: Үздіксіз орналастыру/интеграция

Көптеген компаниялар қолданбаларды әзірлеу және орналастыру топтары арасындағы бөлуді пайдаланады (қолданбаны соңғы пайдаланушыларға қолжетімді етеді). Бұл бағдарламалық жасақтаманы әзірлеуді және оны жақсартудағы прогресті айтарлықтай баяулатуы мүмкін. Бұл сонымен қатар даму мен интеграция, шамамен айтқанда, біріктірілген DevOps мәдениетін бұзады.

Сондықтан, бұл қағида сіздің әзірлеу ортаңыз өндірістік ортаңызға барынша жақын болуы керек екенін айтады.

Бұл мүмкіндік береді:

  1. Шығару уақытын ондаған есе қысқартыңыз
  2. Код үйлесімсіздігіне байланысты қателер санын азайтыңыз.
  3. Бұл сонымен қатар қызметкерлердің жұмыс жүктемесін азайтады, өйткені әзірлеушілер мен қолданбаны қолданатын адамдар енді бір команда.

Мұнымен жұмыс істеуге мүмкіндік беретін құралдар CircleCI, Travis CI, GitLab CI және т.б.

Модельге жылдам толықтырулар енгізуге, оны жаңартуға және оны дереу іске қосуға болады, ал сәтсіздіктер туындаған жағдайда соңғы пайдаланушы тіпті оны байқамауы үшін жұмыс нұсқасына өте жылдам оралу оңай болады. Егер сізде жақсы сынақтар болса, мұны әсіресе оңай және жылдам жасауға болады.

Айырмашылықтарды азайтыңыз!!!

9-қағида. Журналдарыңыз

Журналдар (немесе «Журналдар») әдетте қолданбада (оқиғалар ағыны) болатын мәтін пішімінде жазылған оқиғалар болып табылады. Қарапайым мысал: «2020-02-02 – жүйе деңгейі – процесс атауы». Олар әзірлеуші ​​​​бағдарлама жұмыс істеп тұрған кезде не болып жатқанын тікелей көре алатындай етіп жасалған. Ол процестердің барысын көреді және оның әзірлеушінің өзі ойлағандай екенін түсінеді.

Бұл принцип журналдарды файлдық жүйеде сақтамау керектігін айтады - оларды жай ғана экранға «шығару» керек, мысалы, мұны жүйенің стандартты шығысында орындаңыз. Және осылайша әзірлеу кезінде терминалдағы ағынды бақылауға болады.

Бұл журналдарды сақтаудың қажеті жоқ дегенді білдіре ме? Әрине жоқ. Қолданбаңыз мұны жасамауы керек — оны үшінші тарап қызметтеріне қалдырыңыз. Қолданбаңыз нақты уақытта қарау үшін журналдарды тек белгілі бір файлға немесе терминалға жібере алады немесе оны жалпы мақсаттағы деректерді сақтау жүйесіне (мысалы, Hadoop) жібере алады. Қолданбаңыздың өзі журналдарды сақтамауы немесе олармен әрекеттеспеуі керек.

10-қағида. Тест!

Өнеркәсіптік машинаны оқыту үшін бұл кезең өте маңызды, өйткені модель дұрыс жұмыс істейтінін және сіз қалаған нәрсені жасайтынын түсінуіңіз керек.

Тесттерді pytest арқылы жасауға және регрессия/жіктеу тапсырмасы болса, шағын деректер жиынын пайдаланып тексеруге болады.

Терең оқыту үлгілері үшін бір тұқымды орнатуды ұмытпаңыз, сонда олар үнемі әртүрлі нәтижелер бермейді.

Бұл 10 қағиданың қысқаша сипаттамасы болды, және, әрине, олардың қалай жұмыс істейтінін көрмей, пайдалану қиын, сондықтан бұл мақала қызықты мақалалар сериясының прологы ғана, мен оны қалай жасау керектігін ашамын. өнеркәсіптік машинамен оқыту үлгілері, оларды жүйелерге қалай біріктіру керек және бұл принциптер бәріміз үшін өмірді қалай жеңілдетеді.

Мен сондай-ақ кез келген адам қаласа, түсініктемелерде қалдыра алатын керемет принциптерді қолдануға тырысамын.

Ақпарат көзі: www.habr.com

пікір қалдыру