DeepMind open source S6, biblioteka sa implementacijom JIT kompajlera za CPython

DeepMind, poznat po razvoju u oblasti veštačke inteligencije, otvorio je izvorni kod projekta S6, koji je razvio JIT kompajler za jezik Python. Projekat je interesantan jer je dizajniran kao biblioteka ekstenzija koja se integriše sa standardnim CPythonom, obezbeđujući punu kompatibilnost sa CPythonom i ne zahtevajući modifikaciju koda interpretatora. Projekat se razvija od 2019. godine, ali je nažalost prekinut i više se ne razvija. Budući da kreirani razvoj može biti koristan za poboljšanje Pythona, odlučeno je da se kod otvorenog koda. JIT kompajlerski kod je napisan u C++ i baziran je na CPython 3.7. i otvorenog koda pod licencom Apache 2.0.

U pogledu zadataka koje može da reši, S6 za Python se poredi sa V8 motorom za JavaScript. Biblioteka zamjenjuje postojeći obrađivač bajtkoda ceval.c svojom vlastitom implementacijom koja koristi JIT kompilaciju za ubrzanje izvršavanja. S6 provjerava da li je trenutna funkcija već kompajlirana i, ako jeste, izvršava prevedeni kod, a ako nije, pokreće funkciju u načinu interpretacije bajtkoda, slično CPython interpreteru. Tokom interpretacije broji se broj izvršenih instrukcija i poziva povezanih sa funkcijom koja se obrađuje. Nakon postizanja određene prekretnice, pokreće se proces kompilacije kako bi se ubrzao često izvršavani kod. Kompilacija se izvodi u srednju strongjit reprezentaciju, koja se nakon optimizacije pretvara u mašinske instrukcije ciljnog sistema koristeći asmjit biblioteku.

U zavisnosti od prirode opterećenja, S6 pod optimalnim uslovima pokazuje povećanje brzine izvršavanja testa do 9.5 puta u odnosu na obični CPython. Prilikom pokretanja 100 iteracija Richardsovog testnog paketa, uočava se 7x ubrzanje, a kada se izvodi Raytrace test, koji uključuje veliku količinu matematičkih proračuna, uočava se 3-4.5x ubrzanje.

Među zadacima koje je teško optimizirati korištenjem S6 su projekti koji koriste C API, kao što je NumPy, kao i operacije vezane za potrebu provjere tipova velikog broja vrijednosti. Niske performanse se takođe primećuju za pojedinačne pozive resursno intenzivnih funkcija zbog upotrebe sopstvene neoptimizovane implementacije Python interpretera (razvoj nije dostigao fazu optimizacije režima interpretacije). Na primjer, u testu Unpack Sequence, koji raspakuje velike skupove nizova/torki, sa jednim pozivom dolazi do usporavanja do 6 puta, a sa cikličnim pozivom performanse su 5 od CPython-a.

izvor: opennet.ru

Dodajte komentar