Facebook Cinder s otevřeným zdrojem, fork CPythonu používaný Instagramem

Facebook zveřejnil zdrojový kód pro Project Cinder, fork CPythonu 3.8.5, hlavní referenční implementace programovacího jazyka Python. Cinder se používá v produkční infrastruktuře Facebooku k napájení Instagramu a zahrnuje optimalizace pro zlepšení výkonu.

Kód je zveřejněn, aby diskutoval o možnosti portovat připravené optimalizace do hlavního frameworku CPython a pomohl dalším projektům zapojených do zlepšování výkonu CPythonu. Facebook nehodlá podporovat Cinder jako samostatný open source projekt a kód je prezentován v podobě, v jaké je používán v infrastruktuře společnosti, bez dalšího česání a dokumentace. Také se nesnaží propagovat Cinder jako alternativu k CPythonu – hlavním cílem vývoje je touha vylepšit samotný CPython.

Kód Cinder je znám jako poměrně spolehlivý a testovaný v produkčním prostředí, ale pokud jsou zjištěny problémy, budete je muset vyřešit sami, protože Facebook nezaručuje, že bude reagovat na externí chybové zprávy a žádosti o stažení. Facebook přitom nevylučuje konstruktivní spolupráci s komunitou a je připraven diskutovat o nápadech, jak Cinder ještě zrychlit nebo jak urychlit přenos připravených změn do hlavní části CPythonu.

Hlavní optimalizace implementované v Cinder:

  • Ukládání bajtkódu do mezipaměti („stínový bajtový kód“). Podstatou metody je identifikovat situace, kdy se provádí typický operační kód, který lze optimalizovat, a dynamicky nahradit takový operační kód rychlejšími specializovanými volbami (například nahrazením často volaných funkcí).
  • Dychtivé hodnocení koroutinu. U asynchronních volání funkcí, která jsou zpracována okamžitě (wait nevede k čekání a funkce dosáhne příkazu return dříve), je výsledek takových funkcí přímo nahrazen bez vytvoření korutiny nebo zapojení smyčky událostí. V kódu Facebooku, který silně využívá async/wait, optimalizace vede ke zrychlení asi o 5 %.
  • Selektivní kompilace JIT na úrovni jednotlivých metod a funkcí (method-at-a-time). Povoleno pomocí volby „-X jit“ nebo proměnné prostředí PYTHONJIT=1 a umožňuje vám zrychlit provádění mnoha testů výkonu 1.5–4krát. Protože kompilace JIT je relevantní pouze pro často prováděné funkce, není vhodné ji používat pro zřídka používané funkce, jejichž režie kompilace může pouze zpomalit provádění programu.

    Pomocí volby „-X jit-list-file=/cesta/k/jitlist.txt“ nebo proměnné prostředí „PYTHONJITLISTFILE=/cesta/k/jitlist.txt“ můžete zadat soubor se seznamem funkcí, pro které JIT lze použít (formát cesty .k.modulu:název funkce nebo cesta.k.modulu:Název_třídy.název_metody). Seznam funkcí, pro které by měl být povolen JIT, lze určit na základě výsledků profilování. Do budoucna se očekává podpora dynamické kompilace JIT na základě interní analýzy frekvence volání funkcí, ale s přihlédnutím ke specifikům spouštění procesů na Instagramu je kompilace JIT v počáteční fázi vhodná i pro Facebook.

    JIT nejprve převede bajtový kód Pythonu na vysokoúrovňovou střední reprezentaci (HIR), která je poměrně blízká bajtovému kódu Pythonu, ale je navržena tak, aby používala virtuální stroj založený na registrech namísto virtuálního stroje založeného na zásobníku, a také používá informace o typu a další podrobnosti důležité pro výkon (jako je počítání referencí) . HIR se poté převede na formu SSA (statické jednotlivé přiřazení) a prochází optimalizačními kroky, které berou v úvahu výsledky počítání referencí a údaje o spotřebě paměti. Výsledkem je generování nízkoúrovňové střední reprezentace (LIR), blízké jazyku symbolických instrukcí. Po další fázi optimalizací na bázi LIR jsou pomocí knihovny asmjit generovány montážní instrukce.

  • Přísný režim pro moduly. Funkce zahrnuje tři součásti: Typ StrictModule. Statický analyzátor, který dokáže určit, že provádění modulu nemá žádný dopad na kód mimo tento modul. Zavaděč modulů, který určí, že moduly jsou v přísném režimu (kód specifikuje „import __strict__“), zkontroluje nepřítomnost průniků s jinými moduly a načte přísné moduly do sys.modules jako objekt StrictModule.
  • Statický Python je experimentální kompilátor bajtového kódu, který používá typové anotace ke generování typově specifického bajtového kódu, který běží rychleji díky kompilaci JIT. V některých testech vykazuje kombinace statického Pythonu a JIT až 7násobné zlepšení výkonu ve srovnání se standardním CPythonem. V mnoha situacích se odhaduje, že výsledky jsou blízké použití kompilátorů MyPyC a Cython.

Zdroj: opennet.ru

Přidat komentář