paprsek pro zvědavé

Dean Wampler

následovat

19. prosince 2019 * 10 min čtení

(upřesnění, Únor 8, 2020)

TL; DR Ray je systém pro škálování aplikací Pythonu napříč výpočetními klastry s minimálním úsilím. Tento příspěvek vysvětluje problémy, které Ray řeší a jak je používat.

Ray Project Local,
Projekt Ray, k dispozici na adrese https://ray.io

Ray (website, GitHub) je open-source systém pro škálování Pythonových aplikací z jednotlivých strojů na velké klastry. Jeho design je poháněn jedinečnými potřebami systémů ml/AI nové generace, které čelí několika jedinečným výzvám, včetně různých výpočetních vzorů, řízení distribuovaného, vyvíjejícího se stavu a touhy řešit všechny tyto potřeby s minimálním programovacím úsilím.

typické systémy ML / AI vyžadují různé výpočetní vzorce pro podporu čištění a přípravy dat, ladění hyperparametrů, školení a podávání modelů a další práce. Původní model MapReduce pro velké zatížení dat funguje dobře pro čištění dat, příprava, a také pro analýzu pracovní zátěže, ale pracovní zatížení strojového učení vyžaduje směs jemnozrnných až hrubozrnných úkolů, spolu s různými komunikačními vzory mezi komponenty. Ladění hyperparametrů a školení modelů jsou velmi náročné na výpočet, vyžadující dokončení klastrových zdrojů v rozumných časových rámcích. Ray poskytuje základ pro budování moderních systémů a aplikací ML/AI tím, že splňuje tyto rozmanité požadavky výkonným způsobem, s minimálním a intuitivním API.

druhá výzva je distribuována, vyvíjející se stav. V kontextu ML/AI distribuovaný stav zahrnuje hyperparametry, parametry modelu (např. A pro scénáře posilování učení, stav simulací (nebo interakcí s reálným světem) používaných pro trénink. Stav je často proměnlivý, zejména během tréninku, takže jsou vyžadovány opatrné aktualizace bezpečné pro souběžnost. Jedním z možných způsobů zpracování distribuovaných výpočtů je využití populárních systémů „bez serverů“, ale žádný z nich v současné době nenabízí zařízení pro správu distribuovaného, měnitelného stavu. Vývojáři se musí uchýlit k udržení veškerého stavu v databázi při použití systémů bez serverů, ale databáze může být úzkým hrdlem a jediným bodem selhání.

místo toho Ray používá populární model herce, aby poskytl intuitivní mechanismus pro řízení státu. Ray herci poskytují stavový doplněk k ray úkoly, které jsou bez státní příslušnosti. Tento stav je transparentně dosažitelný pro jakýkoli jiný Ray herec nebo úkol prostřednictvím odkazu na odpovídající objekt Python (tj. Ray sleduje, kde se herec nachází v klastru, což eliminuje potřebu explicitně znát a spravovat taková umístění v uživatelském kódu. Mutace stavu v herci je řešena bezpečným způsobem, bez nutnosti explicitních primitiv souběžnosti. Proto Ray poskytuje intuitivní distribuovanou správu stavu aplikací, což znamená, že Ray může být obecně vynikající platformou pro implementaci stavových aplikací bez serverů. Navíc při komunikaci mezi herci nebo úkoly na stejném stroji je stav transparentně řízen prostřednictvím sdílené paměti, s nulovou kopií serializace mezi herci a úkoly, pro optimální výkon.

konečně, protože většina systémů ML/AI je založena na Pythonu, vývojáři potřebují způsob, jak přidat tyto možnosti škálování s minimálními změnami kódu. Dekorátor, @ray.remote, Označuje funkce a třídy jako logické jednotky, které lze vytvořit a spustit v clusteru. Ray transparentně zpracovává mutaci stavu, distribuci stavu a intuitivní plánování závislých úloh.

distribuce Ray zahrnuje několik vysoce výkonných knihoven zaměřených na aplikace AI, které také motivovaly problémy, které vedly k vytvoření Ray. Patří mezi ně RLlib pro posílení učení a naladit pro hyperparameter ladění. Oba demonstrují Rayovy jedinečné schopnosti. Tyto knihovny a další, vlastní aplikace napsané s Rayem se již používají v mnoha výrobních nasazeních.

Ray je open source projekt zahájený v UC Berkeley RISELab. Nyní je vyvíjen v Každémscale s významnými příspěvky od mnoha dalších organizací. Mezi komerční uživatele Ray patří Ant Financial, JP Morgan, Intel, Microsoft, Ericsson, Skymind, Primer a mnoho dalších.

příklad Core Ray API

Poznámka: úplný seznam následujícího příkladu kódu naleznete na konci tohoto příspěvku.

Nyní, když chápeme motivace a výhody Ray, pojďme prozkoumat, jak byste použili Ray API ve svých aplikacích. Pak se podíváme blíže na to, jak Ray zlepšuje výkon prostřednictvím paralelizace a distribuce. Ray API je pečlivě navržen tak, aby uživatelům umožnil škálovat své aplikace, a to i v klastru, s minimálními změnami kódu.

zvažte příklad parametru server, což je úložiště klíčových hodnot používané pro školení modelů strojového učení v klastru. Hodnoty jsou parametry modelu strojového učení (např., neuronová síť). Klíče indexují parametry modelu. Pokud nejste obeznámeni s parametrovými servery, přemýšlejte o jakékoli samostatné službě, kterou byste mohli potřebovat pro doručování požadavků na informace nebo data.

například v systému doporučení filmu může být jeden klíč na uživatele a jeden klíč na film. Pro každého uživatele a film existují odpovídající parametry specifické pro uživatele a pro film. V aplikaci pro modelování jazyků, slova mohou být klíče a jejich embeddings mohou být hodnoty.

ve své nejjednodušší podobě, parametr server může mít jediný klíč a umožňují všechny parametry, které mají být načteny a aktualizovány najednou.

zde je příklad takového jednoduchého parametru serveru pro jediné NumPy pole parametrů. Je implementován jako Ray herec v rámci 15 řádky kódu:

Import a definice parametruserver actor

dekorátor @ray.remote definuje službu. To trvá obyčejnou třídu Python, ParameterServer, a umožňuje to být instance jako vzdálená služba. Protože instance udržuje stav (aktuální parametry, které jsou proměnlivé), máme stavovou službu.

v tomto příkladu předpokládáme, že aktualizace parametrů je poskytována jako gradient, který by měl být přidán do aktuálního vektoru parametrů. (Tento gradient může být jediné číslo, které je přidáno ke všem prvkům pole nebo k poli gradientů.) Jsou samozřejmě možné sofistikovanější návrhy, ale Ray by byl použit stejným způsobem. Jako jednoduché cvičení zkuste to změnit na implementaci klíčové hodnoty (slovníku).

parametr server obvykle existuje jako vzdálený proces nebo služba. Klienti s ním komunikují prostřednictvím vzdálených volání procedur. Chcete-li vytvořit instanci serveru parametrů jako vzdáleného herce, provedeme následující kroky v interaktivní výzvě Pythonu. (Předpokládáme, že jste již definovali třídu ParameterServer ve stejné relaci). Nejprve musíte začít Ray. Při použití clusteru byste předali volitelné parametry metodě init(), abyste určili umístění clusteru:

Python interactive session: spusťte Ray

dále vytvořte instanci ParameterServer pro pole 10 parametrů:

postavit instanci ParameterServer actor

namísto volání ParameterServer(10) postavit instanci, tak jako byste pro normální instanci Pythonu, použijete místo toho metodu remote(), která byla přidána do třídy pomocí @ray.remote dekoratér. Předáte stejné argumenty, které byste předali běžnému konstruktoru. Všimněte si, že objekt herec je konstruován.

podobně pro vyvolání metod na herci použijete remote() připojené k původnímu názvu metody a předáte stejné argumenty, které byste předali původní metodě:

volání vzdálené metody

vyvolání metody herce vrací Futures. Chcete-li získat skutečné hodnoty, použijeme blokování ray.get(id) volání:

načíst hodnoty pomocí Raye.získat (id)

jak očekáváme, počáteční hodnoty parametrů jsou všechny nuly. Co ray.get(id) vlastně dělá, je vytáhnout hodnotu z distribuované služby státního úložiště, kterou Ray poskytuje. Hodnota byla zapsána do distribuovaného státního úložiště aktérem, když aktualizoval svůj stav. Pokud je hodnota i klient na stejném počítači, je hodnota vytažena ze sdílené paměti pro rychlý výkon. Pokud je hodnota a klient rezidentem na různých strojích, je hodnota přetažena na stroj, který ji potřebuje.

pro úplnost může váš kód také explicitně zapisovat hodnoty do tohoto úložiště pomocí ray.put(id, value). Pokud chcete načíst několik hodnot, jakmile budou k dispozici, je k dispozici pohodlná funkce ray.wait(…). Viz Ray API pro více informací.

podle modelu herce, když klienti vyvolávají tyto metody herce, jsou vyvolání směrována do instance herce, kdekoli to může být v clusteru. Protože mohou nastat souběžné vyvolání, Ray zajišťuje, že každé vyvolání je zpracováno bezpečným způsobem, takže je zabráněno riziku poškození stavu bez nutnosti výslovného synchronizačního kódu vlákna. To však neukládá žádný druh celosvětového uspořádání, kdy jsou tyto vyvolání zpracovány; je to první přijde, první sloužit.

Poznámka: Vzhledem k dynamické povaze Pythonu by bylo možné, aby vám Ray umožnil volat metody herce bez remote(), ale bylo rozhodnuto, že explicitní změna kódu je užitečná dokumentace pro čtenáře kódu, protože při přechodu z volání místní metody na vyvolání podobné RPC existují důležité důsledky pro výkon. Také vrácený objekt je nyní jiný, budoucnost, která vyžaduje použití blokovacího volání ray.get() k extrahování hodnoty.

nyní předpokládejme, že chceme spustit několik pracovních úkolů, které neustále počítají přechody a aktualizují parametry modelu. Každý pracovník poběží ve smyčce, která provede následující tři věci:

  1. Získejte nejnovější parametry.
  2. Vypočítejte aktualizaci parametrů.
  3. Aktualizujte parametry.

tito pracovníci budou bez státní příslušnosti, takže místo herce použijeme úlohu Ray (vzdálená funkce). Funkce worker bere popisovač parametru server actor jako argument, který umožňuje pracovní úloze vyvolat metody na parametru server:

Definujte vzdáleného pracovníka, který provádí aktualizace parametrů

pak můžeme spustit dvě z těchto pracovních úkolů následujícím způsobem. Ray úkoly (funkce) jsou spuštěny se stejným remote() vyvolání:

použijte dvě úlohy pro výpočet aktualizace parametrů v souběžně

pak můžeme načíst parametry z procesu ovladače opakovaně a vidět, že jsou aktualizovány pracovníky:

opakujte dotazy na aktuální hodnoty parametrů

po zastavení aktualizací budou konečné hodnoty 200.

Všimněte si, že Ray umožňuje stejně snadné spuštění vzdálené služby nebo herce, jako je definování třídy Pythonu. Rukojeti pro herce mohou být předány ostatním hercům a úkolům, aby umožnily libovolné a intuitivní vzorce zasílání zpráv a komunikace. Současné alternativy jsou mnohem více zapojeny. Zvažte například, jak by se s GRPC provádělo ekvivalentní vytváření runtime služeb a předávání obslužných úchytek, jako v této dokumentaci.

Sjednocení úkolů a herců

viděli jsme, že úkoly a herci používají stejné Ray API a používají se stejným způsobem. Toto sjednocení paralelních úkolů a aktérů má důležité výhody, a to jak pro zjednodušení používání Ray, tak pro budování výkonných aplikací prostřednictvím kompozice.

pro srovnání populární systémy pro zpracování dat, jako jsou Apache Hadoop a Apache Spark, umožňují bezstavovým úkolům (funkce bez vedlejších účinků) pracovat na neměnných datech. Tento předpoklad zjednodušuje celkový návrh systému a usnadňuje aplikacím zdůvodnění správnosti.

sdílený proměnlivý stav je však běžný v aplikacích strojového učení. Tento stav by mohl být hmotností neuronové sítě, stavem simulátoru třetí strany nebo reprezentací interakcí s fyzickým světem. Rayova abstrakce herců poskytuje intuitivní způsob, jak definovat a spravovat proměnlivý stav bezpečným způsobem.

to, co dělá toto obzvláště silné, je způsob, jakým Ray sjednocuje abstrakci herce s úlohou-paralelní abstrakce zdědí výhody obou přístupů. Ray používá podkladový dynamický graf úloh k implementaci aktérů i úkolů bez státní příslušnosti ve stejném rámci. V důsledku toho jsou tyto dvě abstrakce zcela interoperabilní. Úkoly a herci mohou být vytvořeny z jiných úkolů a herců. Obě návratové futures, které mohou být předány do jiných úkolů nebo hereckých metod, aby přirozeně zavedly závislosti na plánování a datech. Výsledkem je, že aplikace Ray dědí nejlepší vlastnosti úkolů i herců.

zde jsou některé z hlavních konceptů používaných interně Ray:

dynamické grafy úloh: když vyvoláte vzdálenou funkci nebo metodu herce, úkoly se přidávají do dynamicky rostoucího grafu, který Ray naplánuje a provede napříč clusterem (nebo jedním vícejádrovým strojem). Úkoly mohou být vytvořeny pomocí aplikace“ driver “ nebo jinými úkoly.

Data: Ray efektivně serializuje data pomocí rozložení dat Arrow Apache. Objekty jsou sdíleny mezi pracovníky a aktéry na stejném stroji prostřednictvím sdílené paměti, což zabraňuje potřebě kopií nebo deserializace. Tato optimalizace je naprosto zásadní pro dosažení dobrého výkonu.

plánování: Ray používá distribuovaný plánovací přístup. Každý stroj má svůj vlastní plánovač, který řídí pracovníky a herce na tomto stroji. Úkoly předkládají aplikace a pracovníci plánovači na stejném počítači. Odtud mohou být přeřazeni k jiným pracovníkům nebo předáni jiným místním plánovačům. To umožňuje Ray dosáhnout podstatně vyšší propustnosti úlohy, než toho, co lze dosáhnout pomocí centralizovaného plánovače, potenciálního úzkého hrdla a jediného bodu selhání. To je nezbytné pro mnoho aplikací strojového učení.

závěr

systémy jako parametrové servery jsou obvykle implementovány a dodávány jako samostatné systémy s netriviálním množstvím kódu, které by mohly být většinou kotle pro manipulaci s distribucí, vyvoláním, správou státu atd. Viděli jsme, že Rayovy abstrakce a funkce umožňují eliminovat většinu tohoto kotle. Proto jsou všechna vylepšení funkcí poměrně snadná a vaše produktivita je maximalizována.

mnoho společných služeb, které potřebujeme v dnešním výrobním prostředí, může být implementováno tímto způsobem, rychle a efektivně. Příklady zahrnují protokolování, zpracování proudu, simulaci, servírování modelu, zpracování grafů a mnoho dalších.

doufám, že vám tento krátký úvod do Raye připadal zajímavý. Zkuste to prosím a dejte mi vědět, co si myslíte!

Chcete-li se dozvědět více

pro více informací o Ray, podívejte se na následující odkazy:

  • Web ray
  • stránka Ray GitHub
  • dokumentace Ray: vstupní stránka, pokyny k instalaci
  • Návody Ray
  • výzkumná práce popisující podrobně Ray systém
  • výzkumná práce popisující flexibilní primitivy interní pro Ray pro hluboké učení
  • Rychlá serializace pomocí Ray a Apache Arrow
  • RLlib: škálovatelné zesílení učení pomocí Ray (a tento výzkum rllib paper)
  • tune: efektivní Hyperparameter Tuning s Ray
  • Modin: urychlení pandy s Ray
  • flow: výpočetní rámec využívající výztužné učení pro modelování řízení provozu
  • Anyscale: společnost za Rayem

otázky by měly být zaměřeny na diskurz Ray nebo pracovní prostor Ray Slack.

Dodatek: spuštění kódu

Chcete-li spustit kompletní aplikaci, nejprve nainstalujte Ray s pip install ray (nebo viz pokyny k instalaci Ray). Poté spusťte následující kód pomocí Pythonu. Implementuje parametr server, jak bylo uvedeno výše, ale přidává sharding parametrů v pracovnících. Rozsáhlejší verzi tohoto příkladu najdete také jako notebook Jupyter zde.

tento příklad se zaměřuje na jednoduchost a pro optimalizaci tohoto kódu lze udělat více.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.