Ray for the Curious

Dean Wampler

Follow

joulu 19, 2019 * 10 min lukea

(tarkennukset, helmikuu 8, 2020)

TL; DR Ray on järjestelmä Python-sovellusten skaalaamiseen laskentaklustereissa vähällä vaivalla. Tässä viestissä kerrotaan, mitä ongelmia Ray ratkaisee ja miten sitä käytetään.

Ray-hanke paikallinen,
Ray-hanke, saatavilla osoitteessa https://ray.io

Ray (website, GitHub) on avoimen lähdekoodin järjestelmä Python-sovellusten skaalaamiseen yksittäisistä koneista suuriin klustereihin. Sen suunnittelua ohjaavat seuraavan sukupolven ML/AI-järjestelmien ainutlaatuiset tarpeet, jotka kohtaavat useita ainutlaatuisia haasteita, mukaan lukien erilaiset laskennalliset mallit, hajautetun, kehittyvän tilan hallinta ja halu vastata kaikkiin näihin tarpeisiin mahdollisimman vähällä ohjelmointiponnistuksella.

tyypilliset ML / AI-järjestelmät vaativat erilaisia laskennallisia kuvioita datan puhdistamisen ja valmistelun tueksi, hyperparametrien viritystä, mallikoulutusta ja tarjoilua sekä muita askareita. Alkuperäinen MapReduce malli big data työkuormat toimii hyvin tietojen puhdistus, valmistelu, ja myös analyysi työkuormat, mutta koneoppiminen työkuormat vaativat sekoitus hienorakeinen karkearakeinen tehtäviä, sekä monipuolinen viestintä malleja komponenttien välillä. Hyperparametrien viritys ja mallikoulutus ovat hyvin laskentaintensiivisiä, mikä vaatii klusteriresurssien suorittamista kohtuullisessa ajassa. Ray tarjoaa perustan nykyaikaisten ML/AI-järjestelmien ja sovellusten rakentamiselle täyttämällä nämä erilaiset vaatimukset performant-tavalla, minimaalisella ja intuitiivisella API: lla.

toinen haaste on jaettu, kehittyvä tila. ML/AI: n yhteydessä hajautettu tila sisältää koulutuksessa käytetyt hyperparametrit, malliparametrit (esim.ja oppimisskenaarioiden vahvistamiseksi simulaatioiden tila (tai vuorovaikutus reaalimaailman kanssa). Usein tila on muuntautumiskykyinen varsinkin harjoituksissa, joten huolellisia, samanaikaisia päivityksiä tarvitaan. Yksi mahdollinen tapa käsitellä hajautettua tietojenkäsittelyä on hyödyntää suosittuja ”palvelimattomia” järjestelmiä, mutta mikään niistä ei tällä hetkellä tarjoa tiloja hajautetun, muunneltavan tilan hallintaan. Kehittäjien on turvauduttava pitämään kaikki tila tietokannassa käyttäessään serveless-järjestelmiä, mutta tietokanta voi olla pullonkaula ja yksittäinen vikapaikka.

sen sijaan Ray käyttää suosittua Näyttelijämallia tuottaakseen intuitiivisen mekanismin valtionhallinnolle. Ray-näyttelijät täydentävät valtiollisesti Ray: n tehtäviä, jotka ovat valtiottomia. Tämä tila on läpinäkyvästi tavoitettavissa mille tahansa muulle Ray-toimijalle tai tehtävälle viittaamalla vastaavaan Python-objektiin (eli Python-luokan instanssiin). Ray pitää kirjaa siitä, missä toimija sijaitsee klusterissa, ja poistaa tarpeen nimenomaisesti tietää ja hallita tällaisia sijainteja käyttäjäkoodissa. Tilan mutaatio toimijassa käsitellään kierreturvallisella tavalla, ilman eksplisiittisiä samanaikaisuuden primitiivejä. Näin ollen Ray tarjoaa intuitiivisen, hajautetun tilanhallinnan sovelluksille, mikä tarkoittaa, että Ray voi olla erinomainen alusta valtiollisten palvelimettomien sovellusten toteuttamiseen ylipäätään. Lisäksi, kun toimijoiden tai tehtävien välillä kommunikoidaan samalla koneella, valtiota hallitaan läpinäkyvästi jaetun muistin avulla siten, että toimijoiden ja tehtävien välillä on nolla-kopioinen sarjallisuus optimaalisen suorituskyvyn saavuttamiseksi.

lopuksi, koska useimmat ML/AI-järjestelmät ovat Python-pohjaisia, kehittäjät tarvitsevat tavan lisätä nämä scale-out-ominaisuudet pienin koodimuutoksin. Decorator, @ray.remote, merkitsee funktiot ja luokat loogisiksi yksiköiksi, jotka voidaan instantioida ja toteuttaa klusterissa. Ray käsittelee läpinäkyvästi kierreturvallista valtion mutaatiota, valtion jakautumista ja riippuvaisten tehtävien intuitiivista aikatauluttamista.

Ray: n jakelussa on useita TEKOÄLYSOVELLUKSIIN suunnattuja tehokirjastoja, jotka olivat myös RAY: n perustamista ajavia ongelmia. Ne sisältävät rllib vahvistaminen oppimisen ja virittää hyperparametri tuning. Molemmat osoittavat Rayn ainutlaatuiset kyvyt. Näitä kirjastoja ja muita ray: llä kirjoitettuja, mukautettuja sovelluksia käytetään jo monissa tuotannon käyttöönotoissa.

Ray on UC Berkeley Riselabissa aloitettu avoimen lähdekoodin projekti. Se on nyt kehitetty Anyscale kanssa merkittäviä panoksia monet muut organisaatiot. RAY: n kaupallisia käyttäjiä ovat muun muassa Ant Financial, JP Morgan, Intel, Microsoft, Ericsson, Skymind, Primer ja monet muut.

esimerkki Core Ray API

Huom: seuraavan koodiesimerkin täydellinen listaus löytyy tämän postauksen lopusta.

nyt kun ymmärrämme Ray: n motiivit ja edut, Tutkitaanpa, miten käyttäisit Ray API: ta sovelluksissasi. Sitten katsomme tarkemmin, miten Ray parantaa suorituskykyä parallelioinnin ja jakautumisen kautta. Ray API on suunniteltu huolellisesti, jotta käyttäjät voivat skaalata sovelluksiaan, jopa klusterin läpi, pienin koodimuutoksin.

tarkastellaan esimerkkinä parametripalvelinta, joka on avainarvovarasto, jota käytetään koneoppimismallien kouluttamiseen klusterissa. Arvot ovat koneoppimisen mallin parametreja (esim., neuroverkko). Avaimet indeksoivat mallin parametrit. Jos et tunne parametripalvelimia, ajattele mitä tahansa itsenäistä palvelua, jota saatat tarvita tietopyyntöjen tai tietojen tarjoamiseen.

esimerkiksi elokuvasuositusjärjestelmässä saattaa olla yksi avain käyttäjää ja yksi avain elokuvaa kohden. Jokaiselle käyttäjälle ja elokuvalle on olemassa vastaavat käyttäjäkohtaiset ja elokuvakohtaiset parametrit. Kieltä mallinnettavassa sovelluksessa sanat voivat olla avaimia ja niiden upotukset voivat olla arvoja.

yksinkertaisimmillaan parametripalvelimella voi olla yksi avain, jonka avulla kaikki parametrit voidaan hakea ja päivittää kerralla.

tässä on esimerkki tällaisesta yksinkertaisesta parametripalvelimesta, yhdelle NumPy-parametrijoukolle. Se toteutetaan Ray-toimijana alle 15 koodirivin:

Imports and definition of the Parametrerserver actor

the @ray.remote decorator määrittelee palvelun. Se vie tavallisen Python-luokan, ParameterServer, ja mahdollistaa sen instantioimisen etäpalveluna. Koska instanssi ylläpitää tilaa (nykyiset parametrit, jotka ovat muunnettavissa), meillä on tilallinen palvelu.

tässä esimerkissä oletamme, että parametrien päivitys esitetään gradienttina, joka tulisi lisätä nykyiseen parametrivektoriin. (Tämä gradientti voi olla yksi luku, joka lisätään kaikkiin matriisielementteihin tai joukko gradientteja.) Kehittyneemmät mallit ovat toki mahdollisia, mutta Rayta käytettäisiin samalla tavalla. Koska yksinkertainen harjoitus, kokeile muuttaa tämän avain-arvo (sanakirja) täytäntöönpanoa.

parametripalvelin on tyypillisesti olemassa etäprosessina tai-palveluna. Asiakkaat ovat sen kanssa vuorovaikutuksessa etäpuheluiden kautta. Jos haluat asentaa parametripalvelimen etätoimijana, teemme seuraavat vaiheet interaktiivisella Python-kehotteella. (Oletamme, että määrittelit jo ParameterServer – luokan samassa istunnossa). Aloita ensin Ray. Klusteria käytettäessä siirrettäisiin valinnaiset parametrit init() – menetelmään klusterin sijainnin määrittämiseksi:

Python interaktiivinen istunto: aloita Ray

seuraava, luo ParameterServer instanssi 10 parametrin joukolle:

muodosta Parametripalvelimen toimijan instanssi

sen sijaan, että kutsuisit ParameterServer(10) rakentamaan instanssin, kuten normaalille Python-instanssille, käytät remote() – menetelmää, jonka @ray.remote decorator lisäsi luokkaan. Syötät samat argumentit, jotka siirtäisit tavalliselle rakentajalle. Huomaa, että näyttelijäobjekti on rakennettu.

vastaavasti vedotaksesi metodeihin toimijaan käytät remote() alkuperäisen metodin nimen liitteenä samoja argumentteja, jotka siirtäisit alkuperäiselle metodille:

Etämenetelmän kutsuminen

Näyttelijämenetelmän kutsuminen palauttaa futuurit. Hakeaksemme todelliset arvot käytämme estoa ray.get(id) :

nouda arvot ray.get (tunnus)

kuten odotamme, alkuperäisen parametrin arvot ovat nollia. Se, mitä ray.get(id) oikeasti tekee, vetää arvon pois Ray: n tarjoamasta hajautetusta valtion kauppapalvelusta. Arvo kirjoitettiin hajautettuun valtion kauppaan, kun toimija päivitti tilaansa. Jos arvo ja asiakas ovat molemmat samalla koneella, arvo vedetään jaetusta muistista nopeaa suorituskykyä varten. Jos arvo ja asiakas asuvat eri koneissa, arvo vedetään sitä tarvitsevalle koneelle.

täydellisyyden vuoksi koodisi voi myös kirjoittaa arvot eksplisiittisesti tähän tallennustilaan käyttämällä ray.put(id, value). Kun haluat hakea useita arvoja niiden tullessa saataville, on käytettävissä kätevä ray.wait(…) – funktio. Katso lisätietoja Ray API: sta.

näyttelijämallin mukaisesti, kun asiakkaat vetoavat näihin näyttelijämenetelmiin, kutsut ohjataan näyttelijän instanssille, missä tahansa klusterissa. Koska samanaikaisia invokaatioita voi esiintyä, Ray vakuuttaa, että jokainen invokaatio käsitellään kierreturvallisella tavalla, joten tilan turmelemisen riski estetään ilman eksplisiittistä säie-synkronointikoodia. Tämä ei kuitenkaan aseta mitään maailmanlaajuista tilausta siitä, milloin nämä kutsut käsitellään; se on ensin tullut, ensin palvella.

Huom.: Pythonin dynaamisen luonteen vuoksi Ray olisi voinut sallia toimijan metodien kutsumisen ilman remote(), mutta päätettiin, että nimenomainen koodinmuutos on hyödyllinen dokumentaatio koodin lukijoille, koska sillä on merkittäviä suoritusvaikutuksia siirryttäessä paikallisesta menetelmäkutsusta RPC-tyyppiseen kutsuun. Myös palautettu kohde on nyt erilainen, tulevaisuus, joka vaatii arvon purkamiseen estokutsun, ray.get().

oletetaan nyt, että haluamme suorittaa useita työtehtäviä, joissa lasketaan jatkuvasti kaltevuuksia ja päivitetään mallin parametreja. Jokainen työntekijä ajaa silmukan, joka tekee seuraavat kolme asiaa:

  1. Hanki uusimmat parametrit.
  2. lasketaan parametrien päivitys.
  3. Päivitä parametrit.

nämä työntekijät ovat kansalaisuudettomia, joten käytämme näyttelijän sijasta Ray-tehtävää (etätoimintoa). Funktio worker vie parametripalvelimen toimijaan argumenttina kahvan, jonka avulla työtehtävä voi vedota parametripalvelimen menetelmiin:

Määrittele etätyöntekijä, joka suorittaa parametripäivityksiä

, niin voimme aloittaa kaksi näistä työtehtävistä seuraavasti. Ray: n tehtävät (funktiot) aloitetaan samalla remote() kutsulla:

käytä kahta tehtävää parametrien päivitysten laskemiseen samanaikaisesti

sitten voimme hakea parametrit ajuriprosessista toistuvasti ja nähdä, että työntekijät päivittävät niitä.:

toista kyselyt nykyisille parametriarvoille

kun päivitykset loppuvat, lopulliset arvot ovat 200.

huomaa, että Ray: n avulla etäpalvelun tai toimijan käynnistäminen on yhtä helppoa kuin Python-luokan määrittely. Kahvat toimijalle voidaan siirtää muille toimijoille ja tehtäville mielivaltaisten ja intuitiivisten viesti-ja kommunikaatiomallien mahdollistamiseksi. Nykyiset vaihtoehdot ovat paljon enemmän mukana. Mieti esimerkiksi, miten grpc: n kanssa tehtäisiin vastaava ajonaikainen palvelun luonti ja palvelukahvan läpäisy, kuten tässä dokumentaatiossa.

yhtenevät tehtävät ja näyttelijät

olemme nähneet, että tehtävät ja näyttelijät käyttävät samaa Ray API: ta ja niitä käytetään samalla tavalla. Rinnakkaisten tehtävien ja toimijoiden yhdistämisellä on merkittäviä etuja sekä Ray: n käytön yksinkertaistamisessa että tehokkaiden sovellusten rakentamisessa sommittelun kautta.

vertailun vuoksi Suositut tietojenkäsittelyjärjestelmät kuten Apache Hadoop ja Apache Spark mahdollistavat valtiottomien tehtävien (toimintojen, joilla ei ole sivuvaikutuksia) toiminnan muuttumattomalla datalla. Tämä oletus yksinkertaistaa järjestelmän kokonaissuunnittelua ja helpottaa sovellusten pohdintaa oikeellisuudesta.

jaetut mutaatiotilat ovat kuitenkin yleisiä koneoppimissovelluksissa. Tämä tila voi olla neuroverkon painot, kolmannen osapuolen simulaattorin tila tai esitys vuorovaikutuksesta fyysisen maailman kanssa. Rayn actor abstraction tarjoaa intuitiivisen tavan määritellä ja hallita muuntuvaa tilaa säiettä turvallisesti.

tästä tekee erityisen voimakkaan se, että Ray yhdistää näyttelijän abstraktion ja tehtävän-rinnakkaisen abstraktion, joka perii molempien lähestymistapojen edut. Ray käyttää taustalla olevaa dynaamista tehtäväkaaviota toteuttaakseen sekä toimijoita että valtiottomia tehtäviä samassa viitekehyksessä. Tämän seurauksena nämä kaksi abstraktiota ovat täysin yhteentoimivia. Tehtäviä ja toimijoita voidaan luoda muiden tehtävien ja toimijoiden sisältä. Molemmat tuotto-futuurit, jotka voidaan siirtää muihin tehtäviin tai toimijan menetelmiä ottaa käyttöön aikataulutus-ja datariippuvuudet luonnollisella tavalla. Tämän seurauksena Ray-Sovellukset perivät sekä tehtävien että näyttelijöiden parhaat ominaisuudet.

Tässä muutamia Ray: n sisäisesti käyttämiä ydinkäsitteitä:

dynaamiset Tehtäväkuviot: kun vedotaan etäfunktioon tai toimijamenetelmään, tehtävät lisätään dynaamisesti kasvavaan kaavioon, joka Ray ajoittaa ja suorittaa koko klusterin (tai yhden moniydinkoneen). Tehtäviä voi luoda ”driver” – sovelluksella tai muilla tehtävillä.

Data: Ray sarjallisti datan tehokkaasti Apache Arrow – tietoasettelun avulla. Esineet jaetaan työntekijöiden ja näyttelijöiden kesken samalla koneella jaetun muistin kautta, jolloin vältetään kopioiden tai autioitumisen tarve. Tämä optimointi on ehdottoman tärkeää hyvän suorituskyvyn saavuttamiseksi.

aikataulutus: Ray käyttää hajautettua aikataulumallia. Jokaisella koneella on oma aikatauluttajansa, joka hallinnoi kyseisen koneen työntekijöitä ja toimijoita. Sovellukset ja työntekijät lähettävät tehtävät aikatauluttajalle samalla koneella. Sieltä ne voidaan siirtää muille työntekijöille tai siirtää muille paikallisille aikatauluttajille. Tämä mahdollistaa Ray: lle huomattavasti suuremman tehtävien läpimenon kuin mitä voidaan saavuttaa keskitetyllä ajoituksella, mahdollisella pullonkaulalla ja yksittäisellä vikapisteellä. Tämä on välttämätöntä monille koneoppimisen sovelluksille.

Conclusion

systeemit, kuten parametripalvelimet, on yleensä toteutettu ja toimitettu erillisinä järjestelminä, joissa on ei-yksityinen määrä koodia, joka voi olla lähinnä boilerplate jakelun, kutsumisen, valtionhallinnon jne.käsittelyyn. Olemme nähneet, että Rayn abstraktioiden ja piirteiden avulla on mahdollista eliminoida suurin osa siitä kattilalevystä. Näin ollen kaikki ominaisuudet parannuksia ovat suhteellisen helppoa ja tuottavuus on maksimoitu.

monet nykyisissä tuotantoympäristöissä tarvitsemamme yhteiset palvelut voidaan toteuttaa tällä tavalla, nopeasti ja tehokkaasti. Esimerkkejä ovat kirjaaminen, stream käsittely, simulointi, malli palvelee, kuvaajan käsittely, ja monet muut.

Toivottavasti tämä lyhyt johdatus Rayhin kiehtoi. Anna se yrittää ja kerro minulle, mitä mieltä olet!

lisätietoja

lisätietoja Ray: stä löytyy seuraavista linkeistä:

  • Ray: n verkkosivu
  • Ray: n verkkosivu
  • Ray: n dokumentaatio: aloitussivu, asennusohjeet
  • Ray: n tutorials
  • a research paper describing the flexible primitives internal to Ray for deep learning
  • nopea sarjallistaminen ray: llä ja Apache arrowilla

  • rllib: skaalautuva vahvistaminen ray: llä (ja tällä rllib-tutkimuspaperilla)
  • tune: tehokas hyperparametri viritys Ray: llä
  • modin: pandojen nopeuttaminen ray: llä
  • flow: laskennallinen viitekehys, jossa käytetään tehosteoppimista liikenteenohjauksen mallinnukseen
  • Anyscale: RAY: n taustayhtiö

kysymykset tulisi suunnata Ray: n diskurssiin tai Ray Slack-työtilaan.

liite: ajetaan koodi

, jotta koko sovellus voidaan suorittaa, asenna Ray ensin numerolla pip install ray (tai katso Ray: n asennusohjeet). Suorita sitten seuraava koodi Pythonilla. Se toteuttaa parametripalvelin kuten aiemmin, mutta lisää sharding parametrien työntekijöiden. Tästä esimerkistä löytyy myös laajempi versio Jupyter-muistikirjana täältä.

huomaa, että tämä esimerkki keskittyy yksinkertaisuus ja että enemmän voidaan tehdä optimoida tämän koodin.

Vastaa

Sähköpostiosoitettasi ei julkaista.