Facebook otvorenog koda Cinder, fork CPython-a koji koristi Instagram

Facebook je objavio izvorni kod za Project Cinder, fork CPython-a 3.8.5, glavne referentne implementacije programskog jezika Python. Cinder se koristi u Facebookovoj produkcijskoj infrastrukturi za napajanje Instagrama i uključuje optimizacije za poboljšanje performansi.

Kod je objavljen kako bi se razgovaralo o mogućnosti prenosa pripremljenih optimizacija na glavni CPython okvir i da bi se pomogao drugim projektima uključenim u poboljšanje performansi CPython-a. Facebook ne namjerava podržati Cinder u vidu zasebnog open source projekta i kod je predstavljen u obliku u kojem se koristi u infrastrukturi kompanije, bez dodatnog pročešljavanja i dokumentacije. Oni takođe ne pokušavaju da promovišu Cinder kao alternativu CPython-u - glavni cilj razvoja je želja da se poboljša sam CPython.

Cinder kod je označen kao prilično pouzdan i testiran u proizvodnim okruženjima, ali ako se identifikuju problemi, morat ćete ih sami riješiti, jer Facebook ne garantuje da će odgovoriti na vanjske poruke o grešci i zahtjeve za povlačenjem. Istovremeno, Facebook ne isključuje konstruktivnu saradnju sa zajednicom i spreman je da razgovara o idejama kako da Cinder učinimo još bržim ili kako da ubrzamo prenos pripremljenih izmena u glavni deo CPythona.

Glavne optimizacije implementirane u Cinder:

  • Inline keširanje bajtkoda (“shadow bytecode”). Suština metode je da se identifikuju situacije u kojima se izvršava tipičan operacijski kod koji se može optimizirati, te da se dinamički zamijeni takav opkod bržim specijaliziranim opcijama (na primjer, zamjenom često nazivanih funkcija).
  • Nestrpljiva evaluacija korutine. Za pozive asinhroniziranih funkcija koji se obrađuju odmah (await ne rezultira čekanjem i funkcija dostigne izraz return ranije), rezultat takvih funkcija se direktno zamjenjuje bez kreiranja korutine ili uključivanja petlje događaja. U Facebook kodu koji u velikoj mjeri koristi async/await, optimizacija rezultira ubrzanjem od oko 5%.
  • Selektivna JIT kompilacija na nivou pojedinačnih metoda i funkcija (method-at-a-time). Omogućeno preko opcije “-X jit” ili varijable okruženja PYTHONJIT=1 i omogućava vam da ubrzate izvršenje mnogih testova performansi za 1.5-4 puta. Budući da je JIT kompilacija relevantna samo za funkcije koje se često izvršavaju, nije preporučljivo koristiti je za funkcije koje se rijetko koriste, čiji troškovi kompilacije mogu samo usporiti izvršavanje programa.

    Preko opcije “-X jit-list-file=/path/to/jitlist.txt” ili varijable okruženja “PYTHONJITLISTFILE=/path/to/jitlist.txt” možete odrediti datoteku sa listom funkcija za koje JIT može se koristiti (format putanje .to.module:funcname ili path.to.module:ClassName.method_name). Lista funkcija za koje treba omogućiti JIT može se odrediti na osnovu rezultata profiliranja. U budućnosti se očekuje podrška za dinamičku JIT kompilaciju na osnovu interne analize učestalosti poziva funkcija, ali uzimajući u obzir specifičnosti pokretanja procesa na Instagramu, JIT kompilacija je u početnoj fazi pogodna i za Facebook.

    JIT prvo konvertuje Python bajt-kod u srednju reprezentaciju visokog nivoa (HIR), koja je prilično bliska Python bajtkodu, ali je dizajnirana da koristi virtuelnu mašinu zasnovanu na registru umesto one bazirane na steku, a takođe koristi informacije o tipu i dodatne detalji kritični za performanse (kao što je brojanje referenci) . HIR se zatim pretvara u SSA (statična pojedinačna dodjela) obrazac i prolazi kroz korake optimizacije koji uzimaju u obzir rezultate brojanja referenci i podatke o potrošnji memorije. Kao rezultat, generira se srednja reprezentacija niskog nivoa (LIR), blizu asemblerskog jezika. Nakon druge faze optimizacije zasnovane na LIR-u, instrukcije za sklapanje se generišu pomoću asmjit biblioteke.

  • Strogi način rada za module. Funkcionalnost uključuje tri komponente: Type StrictModule. Statički analizator koji može utvrditi da izvođenje modula nema utjecaja na kod izvan tog modula. Učitavač modula koji utvrđuje da su moduli u strogom načinu rada (kod specificira “import __strict__”), provjerava odsustvo ukrštanja s drugim modulima i učitava stroge module u sys.modules kao objekt StrictModule.
  • Statički Python je eksperimentalni kompajler bajtkoda koji koristi napomene tipa za generiranje bajtkoda specifičnog za tip koji radi brže zahvaljujući JIT kompilaciji. U nekim testovima, kombinacija statičkog Pythona i JIT-a pokazuje poboljšanja performansi do 7 puta u poređenju sa standardnim CPython-om. U mnogim situacijama se procjenjuje da su rezultati bliski korištenju kompajlera MyPyC i Cython.

izvor: opennet.ru

Dodajte komentar