Průmyslové strojové učení: 10 konstrukčních principů

Průmyslové strojové učení: 10 konstrukčních principů

V dnešní době každý den vznikají nové služby, aplikace a další důležité programy, které umožňují vytvářet neuvěřitelné věci: od softwaru pro ovládání rakety SpaceX až po interakci s varnou konvicí ve vedlejší místnosti prostřednictvím chytrého telefonu.

A někdy každý začínající programátor, ať už je to vášnivý startupista nebo obyčejný Full Stack nebo Data Scientist, dříve nebo později přijde na to, že pro programování a tvorbu softwaru existují určitá pravidla, která výrazně zjednodušují život.

V tomto článku stručně popíšu 10 principů, jak naprogramovat průmyslové strojové učení tak, aby jej bylo možné snadno integrovat do aplikace/služby, na základě 12faktorové metodiky App. navrhl tým Heroku. Moje iniciativa je zvýšit povědomí o této technice, která může pomoci mnoha vývojářům a lidem z oblasti datové vědy.

Tento článek je prologem k sérii článků o průmyslovém strojovém učení. Dále v nich budu mluvit o tom, jak vlastně udělat model a uvést ho do výroby, vytvořit pro něj API a také příklady z různých oblastí a firem, které mají ML ve svých systémech zabudované.

Princip 1: Jedna základna kódu

Někteří programátoři v prvních fázích, z lenosti na to přijít (nebo z nějakého vlastního důvodu), na Git zapomínají. Buď to slovo úplně zapomenou, tedy házejí si soubory do mechaniky/jen házejí text/posílají holuby, nebo svůj pracovní postup nepromyslí a zadají se každý do své pobočky a pak do mistr.

Tento princip říká: mají jednu kódovou základnu a mnoho nasazení.

Git najde uplatnění jak ve výrobě, tak ve výzkumu a vývoji (R&D), ve kterém se tak často nepoužívá.

Například ve fázi výzkumu a vývoje můžete ponechat závazky s různými metodami a modely zpracování dat, abyste pak vybrali ten nejlepší a mohli s ním snadno dále pracovat.

Za druhé, ve výrobě je to nenahraditelná věc - budete muset neustále sledovat, jak se váš kód mění, a vědět, který model přinesl nejlepší výsledky, který kód nakonec fungoval a co se stalo, že přestal fungovat nebo začal produkovat nesprávné výsledky . K tomu slouží závazky!

Můžete si také vytvořit balíček svého projektu, umístit ho například na Gemfury a pak z něj jednoduše importovat funkce pro další projekty, abyste je nepřepisovali 1000x, ale o tom později.

Zásada 2: Jasně deklarujte a izolujte závislosti

Každý projekt má různé knihovny, které importujete zvenčí, abyste je někde použili. Ať už se jedná o knihovny Pythonu nebo knihovny jiných jazyků pro různé účely nebo systémové nástroje – vaším úkolem je:

  • Jasně deklarujte závislosti, tedy soubor, který bude obsahovat všechny knihovny, nástroje a jejich verze, které se používají ve vašem projektu a které je třeba nainstalovat (například v Pythonu to lze provést pomocí Pipfile nebo requirements.txt. A odkaz, který umožňuje dobré pochopení: realpython.com/pipenv-guide)
  • Během vývoje izolujte závislosti speciálně pro váš program. Nechcete neustále měnit verze a znovu instalovat například Tensorflow?

Vývojáři, kteří se v budoucnu připojí k vašemu týmu, se tak budou moci rychle seznámit s knihovnami a jejich verzemi, které jsou ve vašem projektu použity, a také budete mít možnost spravovat samotné verze a knihovny nainstalované pro konkrétní projekt, který vám pomůže vyhnout se nekompatibilitě knihoven nebo jejich verzí.

Vaše aplikace by se také neměla spoléhat na systémové nástroje, které mohou být nainstalovány na konkrétním operačním systému. Tyto nástroje musí být také deklarovány v manifestu závislostí. To je nezbytné, aby se předešlo situacím, kdy verze nástrojů (a také jejich dostupnost) neodpovídá systémovým nástrojům konkrétního OS.

I když lze curl používat téměř na všech počítačích, měli byste jej deklarovat v závislostech, protože při migraci na jinou platformu tam nemusí být nebo verze nebude ta, kterou jste původně potřebovali.

Váš soubor requirements.txt může vypadat například takto:

# 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

Princip 3: Konfigurace

Mnozí slyšeli příběhy různých vývojářů, kteří omylem nahráli kód na GitHub do veřejných úložišť s hesly a dalšími klíči od AWS, a druhý den se probudili s dluhem 6000 50000 nebo dokonce XNUMX XNUMX $.

Průmyslové strojové učení: 10 konstrukčních principů

Tyto případy jsou samozřejmě extrémní, ale velmi významné. Pokud uvnitř kódu ukládáte své přihlašovací údaje nebo jiná data potřebná pro konfiguraci, děláte chybu a myslím, že není třeba vysvětlovat proč.

Alternativou k tomu je ukládání konfigurací do proměnných prostředí. Můžete si přečíst více o proměnných prostředí zde.

Příklady dat, která jsou obvykle uložena v proměnných prostředí:

  • Doménová jména
  • API URL/URI
  • Veřejné a soukromé klíče
  • Kontakty (e-mail, telefony atd.)

Tímto způsobem nemusíte neustále měnit kód, pokud se změní vaše konfigurační proměnné. To vám pomůže ušetřit čas, úsilí a peníze.

Pokud například používáte Kaggle API k provádění testů (například si stáhnete software a spustíte model přes něj, abyste otestovali, že model funguje dobře), pak by soukromé klíče od Kaggle, jako jsou KAGGLE_USERNAME a KAGGLE_KEY, měly být uloženy v proměnných prostředí.

Zásada 4: Služby třetích stran

Cílem je vytvořit program takovým způsobem, aby nebyl žádný rozdíl mezi místními zdroji a zdroji třetích stran, pokud jde o kód. Můžete například připojit jak místní MySQL, tak ty třetích stran. Totéž platí pro různá API, jako jsou Google Maps nebo Twitter API.

Chcete-li zakázat službu třetí strany nebo připojit jinou, stačí změnit klíče v konfiguraci v proměnných prostředí, o kterých jsem mluvil v odstavci výše.

Takže například místo toho, abyste pokaždé uváděli cestu k souborům s datovými sadami uvnitř kódu, je lepší použít knihovnu pathlib a deklarovat cestu k datovým sadám v config.py, takže bez ohledu na to, jakou službu používáte (pro například CircleCI), program byl schopen zjistit cestu k datovým sadám s přihlédnutím ke struktuře nového systému souborů v nové službě.

Princip 5. Sestavení, uvolnění, běh

Mnoho lidí v Data Science považuje za užitečné zlepšit své dovednosti psaní softwaru. Pokud chceme, aby náš program padal co nejméně a fungoval bez poruch co nejdéle, musíme rozdělit proces vydání nové verze do 3 fází:

  1. Stage sestavy. Svůj holý kód s jednotlivými prostředky transformujete do tzv. balíčku, který obsahuje veškerý potřebný kód a data. Tento balíček se nazývá montáž.
  2. Stage vydání — zde připojíme naši konfiguraci k montáži, bez které bychom nemohli vydat náš program. Nyní je toto vydání zcela připravené ke spuštění.
  3. Následuje etapa splnění. Zde uvolňujeme aplikaci spuštěním nezbytných procesů z našeho vydání.

Takový systém pro vydávání nových verzí modelu nebo celého potrubí umožňuje oddělit role mezi administrátory a vývojáře, umožňuje sledovat verze a zabraňuje nechtěným zastavením programu.

Pro úlohu vydání bylo vytvořeno mnoho různých služeb, ve kterých můžete napsat procesy, které se spouštějí sami, v souboru .yml (například v CircleCI je to config.yml pro podporu samotného procesu). Wheely umí skvěle vytvářet balíčky pro projekty.

Můžete vytvořit balíčky s různými verzemi vašeho modelu strojového učení a poté je zabalit a odkazovat na potřebné balíčky a jejich verze, abyste mohli používat funkce, které jste odtud napsali. To vám pomůže vytvořit API pro váš model a váš balíček může být hostován například na Gemfury.

Princip 6. Spusťte svůj model jako jeden nebo více procesů

Procesy by navíc neměly sdílet data. To znamená, že procesy musí existovat odděleně a všechny druhy dat musí existovat odděleně, například ve službách třetích stran, jako je MySQL nebo jiné, v závislosti na tom, co potřebujete.

To znamená, že se rozhodně nevyplatí ukládat data do procesního souborového systému, jinak to může vést k vymazání těchto dat při příštím vydání/změně konfigurací nebo přenosu systému, na kterém program běží.

Existuje však výjimka: pro projekty strojového učení můžete uložit mezipaměť knihoven, abyste je neinstalovali znovu při každém spuštění nové verze, pokud v jejich verzích nebyly provedeny žádné další knihovny nebo žádné změny. Tímto způsobem zkrátíte čas potřebný k uvedení vašeho modelu do průmyslu.

Chcete-li spustit model jako několik procesů, můžete vytvořit soubor .yml, ve kterém určíte potřebné procesy a jejich pořadí.

Zásada 7: Recyklovatelnost

Procesy, které běží ve vaší modelové aplikaci, by se měly snadno spouštět a zastavovat. To vám umožní rychle nasadit změny kódu, změny konfigurace, rychle a flexibilně škálovat a zabránit možným poruchám pracovní verze.

To znamená, že váš proces s modelem by měl:

  • Minimalizujte dobu spuštění. V ideálním případě by doba spouštění (od okamžiku, kdy byl vydán spouštěcí příkaz do okamžiku uvedení procesu do provozu) neměla být delší než několik sekund. Ukládání do mezipaměti knihovny, popsané výše, je jednou z technik, jak zkrátit dobu spouštění.
  • Konec správně. To znamená, že naslouchání na portu služby je ve skutečnosti pozastaveno a nové požadavky odeslané na tento port nebudou zpracovány. Zde musíte buď nastavit dobrou komunikaci s inženýry DevOps, nebo sami pochopit, jak to funguje (nejlépe samozřejmě to druhé, ale komunikace by měla být zachována vždy, v každém projektu!)

Zásada 8: Průběžné zavádění/integrace

Mnoho společností používá oddělení vývojových a implementačních týmů aplikací (zpřístupnění aplikace koncovým uživatelům). To může výrazně zpomalit vývoj softwaru a pokrok v jeho zlepšování. Kazí to také kulturu DevOps, kde se vývoj a integrace, zhruba řečeno, spojují.

Proto tento princip říká, že vaše vývojové prostředí by mělo být co nejblíže vašemu produkčnímu prostředí.

To umožní:

  1. Zkraťte dobu uvolnění na desítkykrát
  2. Snižte počet chyb kvůli nekompatibilitě kódu.
  3. To také snižuje pracovní zátěž zaměstnanců, protože vývojáři a lidé nasazující aplikaci jsou nyní jeden tým.

Nástroje, které s tím umožňují pracovat, jsou CircleCI, Travis CI, GitLab CI a další.

Do modelu můžete rychle přidávat doplňky, aktualizovat jej a ihned spustit, přičemž se bude snadné v případě poruch velmi rychle vrátit k pracovní verzi, takže si toho koncový uživatel ani nevšimne. To lze provést obzvláště snadno a rychle, pokud máte dobré testy.

Minimalizujte rozdíly!!!

Zásada 9. Vaše protokoly

Protokoly (neboli „Protokoly“) jsou události, obvykle zaznamenané v textovém formátu, ke kterým dochází v rámci aplikace (stream událostí). Jednoduchý příklad: "2020-02-02 - úroveň systému - název procesu." Jsou navrženy tak, aby vývojář doslova viděl, co se děje, když je program spuštěn. Vidí průběh procesů a chápe, zda je to tak, jak sám vývojář zamýšlel.

Tento princip říká, že byste neměli ukládat své protokoly do systému souborů – měli byste je pouze „vypsat“ na obrazovku, například to udělat na standardním výstupu systému. A takto bude možné sledovat tok v terminálu při vývoji.

Znamená to, že není potřeba protokoly vůbec ukládat? Samozřejmě že ne. Vaše aplikace by to prostě neměla dělat – nechte to na službách třetích stran. Vaše aplikace může přeposílat protokoly pouze do konkrétního souboru nebo terminálu pro zobrazení v reálném čase nebo je přeposílat do univerzálního systému ukládání dat (jako je Hadoop). Vaše aplikace samotná by neměla ukládat protokoly ani s nimi interagovat.

Zásada 10. Test!

Pro průmyslové strojové učení je tato fáze nesmírně důležitá, protože musíte pochopit, že model funguje správně a produkuje to, co jste chtěli.

Testy lze vytvořit pomocí pytestu a testovat pomocí malé datové sady, pokud máte regresní/klasifikační úlohu.

Nezapomeňte nastavit stejný základ pro modely hlubokého učení, aby neustále nepřinášely různé výsledky.

Toto byl stručný popis 10 principů a samozřejmě je těžké je používat, aniž byste si vyzkoušeli a viděli, jak fungují, takže tento článek je jen prologem k sérii zajímavých článků, ve kterých vám prozradím, jak vytvořit průmyslové modely strojového učení, jak je integrovat do systémů a jak tyto principy mohou usnadnit život nám všem.

Pokusím se také použít skvělé zásady, které může kdokoli zanechat v komentářích, pokud si to přeje.

Zdroj: www.habr.com

Přidat komentář