Facebookov Cinder otvorenog koda, fork CPythona koji koristi Instagram

Facebook je objavio izvorni kod za Project Cinder, račvanje CPythona 3.8.5, glavne referentne implementacije programskog jezika Python. Cinder se koristi u Facebookovoj proizvodnoj infrastrukturi za pokretanje Instagrama i uključuje optimizacije za poboljšanje performansi.

Kod je objavljen kako bi se raspravilo o mogućnosti prijenosa pripremljenih optimizacija na glavni okvir CPython i kako bi se pomoglo drugim projektima uključenim u poboljšanje performansi CPython. Facebook nema namjeru podržati Cinder u obliku zasebnog projekta otvorenog koda te je kod predstavljen u obliku u kojem se koristi u infrastrukturi tvrtke, bez dodatnog češljanja i dokumentacije. Također ne pokušavaju promovirati Cinder kao alternativu CPythonu – glavni cilj razvoja je želja za poboljšanjem samog CPythona.

Cinder kod je označen kao prilično pouzdan i testiran u produkcijskim okruženjima, ali ako se uoče problemi, morat ćete ih riješiti sami, budući da Facebook ne jamči da će odgovoriti na vanjske poruke o pogrešci i zahtjeve za povlačenjem. Istodobno, Facebook ne isključuje konstruktivnu suradnju sa zajednicom i spreman je razgovarati o idejama kako učiniti Cinder još bržim ili kako ubrzati prijenos pripremljenih promjena u glavni dio CPythona.

Glavne optimizacije implementirane u Cinderu:

  • Ugrađeno predmemoriranje bajt koda ("bajt kod u sjeni"). Bit metode je identificirati situacije u kojima se izvodi tipični operativni kod koji se može optimizirati i dinamički zamijeniti takav operativni kod bržim specijaliziranim opcijama (na primjer, zamjena često pozivanih funkcija).
  • Nestrpljiva korutinska evaluacija. Za asinkrone pozive funkcija koji se obrađuju odmah (await ne rezultira čekanjem i funkcija ranije dolazi do povratne naredbe), rezultat takvih funkcija izravno se zamjenjuje bez stvaranja korutine ili uključivanja petlje događaja. U Facebook kodu koji intenzivno koristi async/await, optimizacija rezultira ubrzanjem od oko 5%.
  • Selektivna JIT kompilacija na razini pojedinačnih metoda i funkcija (method-at-time). Omogućeno putem opcije “-X jit” ili varijable okruženja PYTHONJIT=1 i omogućuje vam da ubrzate izvođenje mnogih testova performansi za 1.5-4 puta. Budući da je JIT kompilacija relevantna samo za funkcije koje se često izvode, nije preporučljivo koristiti je za rijetko korištene funkcije, čije opterećenje kompilacije može samo usporiti izvođenje programa.

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

    JIT prvo pretvara Python bajt kod u međureprezentaciju visoke razine (HIR), koja je prilično bliska Python bajt kodu, ali je dizajnirana za korištenje virtualnog stroja temeljenog na registru umjesto onog temeljenog na stogu, a također koristi informacije o vrsti i dodatne detalji kritični za izvedbu (kao što je brojanje referenci) . HIR se zatim pretvara u SSA (static single assignment) obrazac i prolazi kroz korake optimizacije koji uzimaju u obzir rezultate brojanja referenci i podatke o potrošnji memorije. Kao rezultat toga, generira se srednji prikaz niske razine (LIR), blizak asemblerskom jeziku. Nakon još jedne faze optimizacija temeljenih na LIR-u, upute za sklapanje generiraju se pomoću biblioteke asmjit.

  • Strogi način rada za module. Funkcionalnost uključuje tri komponente: Tip 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 jesu li moduli u strogom načinu rada (kod navodi "import __strict__"), provjerava nepostojanje križanja s drugim modulima i učitava stroge module u sys.modules kao objekt StrictModule.
  • Statički Python eksperimentalni je kompilator bajt-koda koji koristi oznake tipa za generiranje bajt-koda specifičnog tipa 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 usporedbi sa standardnim CPythonom. U mnogim situacijama, procjenjuje se da su rezultati bliski korištenju MyPyC i Cython kompilatora.

Izvor: opennet.ru

Dodajte komentar