Facebookin avoimen lähdekoodin Cinder, Instagramin käyttämä CPython-haarukka

Facebook on julkaissut lähdekoodin Project Cinderille, joka on Python-ohjelmointikielen tärkeimmän referenssitoteutuksen CPython 3.8.5 -haarukka. Cinderiä käytetään Facebookin tuotantoinfrastruktuurissa Instagramin tehostamiseen, ja se sisältää optimointeja suorituskyvyn parantamiseksi.

Koodi julkaistaan ​​keskustelemaan mahdollisuudesta siirtää valmistetut optimoinnit CPython-pääkehykseen ja auttamaan muita projekteja, jotka liittyvät CPython-suorituskyvyn parantamiseen. Facebook ei aio tukea Cinderiä erillisen avoimen lähdekoodin projektin muodossa ja koodi esitetään siinä muodossa, jossa sitä käytetään yrityksen infrastruktuurissa, ilman ylimääräistä kampausta ja dokumentointia. He eivät myöskään yritä mainostaa Cinderiä vaihtoehtona CPythonille - kehityksen päätavoite on halu parantaa itse CPythonia.

Cinder-koodi on todettu melko luotettavaksi ja tuotantoympäristöissä testatuksi, mutta jos ongelmia havaitaan, ne on ratkaistava itse, koska Facebook ei takaa, että se vastaa ulkoisiin virheilmoituksiin ja vetopyyntöihin. Samaan aikaan Facebook ei sulje pois rakentavaa yhteistyötä yhteisön kanssa ja on valmis keskustelemaan ideoista kuinka Cinderistä saadaan vieläkin nopeampaa tai miten valmiiden muutosten siirtoa CPythonin pääosaan nopeuttaisi.

Tärkeimmät Cinderissä toteutetut optimoinnit:

  • Tavukoodin välimuisti ("varjotavukoodi"). Menetelmän ydin on tunnistaa tilanteet, joissa suoritetaan tyypillinen opkoodi, joka voidaan optimoida, ja korvata tällainen opkoodi dynaamisesti nopeammilla erikoisvaihtoehdoilla (esimerkiksi usein kutsuttujen toimintojen korvaaminen).
  • Innokas korutiiniarviointi. Heti käsiteltävissä asynkronisissa funktiokutsuissa (wait ei johda odotukseen ja funktio saavuttaa return-käskyn aikaisemmin) tällaisten funktioiden tulos korvataan suoraan ilman korutiinia tai tapahtumasilmukkaa. Facebook-koodissa, joka käyttää voimakkaasti async/wait-toimintoa, optimointi johtaa noin 5 %:n nopeuttamiseen.
  • Valikoiva JIT-kokoelma yksittäisten menetelmien ja toimintojen tasolla (method-at-time). Otetaan käyttöön "-X jit" -vaihtoehdon tai PYTHONJIT=1-ympäristömuuttujan kautta ja voit nopeuttaa monien suorituskykytestien suorittamista 1.5-4 kertaa. Koska JIT-käännös on merkityksellinen vain usein suoritetuille funktioille, sitä ei kannata käyttää harvoin käytetyille funktioille, joiden kääntäminen voi vain hidastaa ohjelman suorittamista.

    Vaihtoehdolla "-X jit-list-file=/path/to/jitlist.txt" tai ympäristömuuttujan "PYTHONJITLISTFILE=/path/to/jitlist.txt" avulla voit määrittää tiedoston, jossa on luettelo toiminnoista, joille JIT voidaan käyttää (polkumuoto .to.module:funcname tai path.to.module:ClassName.method_name). Lista toiminnoista, joille JIT tulee ottaa käyttöön, voidaan määrittää profiloinnin tulosten perusteella. Jatkossa dynaamisen JIT-käännöksen tukea odotetaan toimintokutsujen tiheyden sisäisen analyysin perusteella, mutta Instagramissa käynnistyvien prosessien erityispiirteet huomioon ottaen JIT-käännös sopii alkuvaiheessa myös Facebookille.

    JIT muuntaa ensin Python-tavukoodin korkean tason väliesitykseen (HIR), joka on melko lähellä Python-tavukoodia, mutta on suunniteltu käyttämään rekisteripohjaista virtuaalikonetta pinopohjaisen koneen sijaan ja käyttää myös tyyppitietoja ja muita suorituskyvyn kannalta kriittiset tiedot (kuten viitelaskenta) . HIR muunnetaan sitten SSA (staattinen yksittäinen osoitus) -muotoon ja käy läpi optimointivaiheet, jotka ottavat huomioon viitelaskennan tulokset ja muistinkulutustiedot. Tämän seurauksena luodaan matalan tason väliesitys (LIR), joka on lähellä kokoonpanokieltä. LIR-pohjaisten optimointien toisen vaiheen jälkeen kokoonpanoohjeet luodaan käyttämällä asmjit-kirjastoa.

  • Tiukka tila moduuleille. Toiminto sisältää kolme osaa: Type StrictModule. Staattinen analysaattori, joka voi määrittää, että moduulin suoritus ei vaikuta koodiin kyseisen moduulin ulkopuolella. Moduulilataaja, joka määrittää, että moduulit ovat tiukassa tilassa (koodi määrittelee "tuonti __strict__"), tarkistaa, ettei muita moduuleita ole leikkauspisteissä, ja lataa tiukat moduulit sys.modules-tiedostoon StrictModule-objektina.
  • Static Python on kokeellinen tavukoodin kääntäjä, joka käyttää tyyppimerkintöjä luodakseen tyyppikohtaista tavukoodia, joka toimii nopeammin JIT-käännöksen ansiosta. Joissakin testeissä Static Pythonin ja JIT:n yhdistelmä osoittaa jopa 7-kertaisen suorituskyvyn parannuksia tavalliseen CPythoniin verrattuna. Monissa tilanteissa tulosten arvioidaan olevan lähellä MyPyC- ja Cython-kääntäjien käyttöä.

Lähde: opennet.ru

Lisää kommentti