DeepMind open source S6, biblioteka s implementacijom JIT prevoditelja za CPython

DeepMind, poznat po svojim razvojima na području umjetne inteligencije, otvorio je izvorni kod projekta S6 koji je razvio JIT kompajler za jezik Python. Projekt je zanimljiv jer je dizajniran kao biblioteka proširenja koja se integrira sa standardnim CPythonom, osiguravajući potpunu kompatibilnost s CPythonom i ne zahtijevajući modificiranje koda interpretera. Projekt se razvijao od 2019. godine, ali je nažalost prekinut i više se ne razvija. Budući da bi stvoreni razvoj mogao biti koristan za poboljšanje Pythona, odlučeno je otvoriti izvorni kod. Kod JIT kompajlera napisan je u C++ i temelji se na CPython 3.7. i otvorenog je koda pod licencom Apache 2.0.

Što se tiče zadataka koje može riješiti, S6 za Python uspoređuje se s V8 motorom za JavaScript. Knjižnica zamjenjuje postojeći obrađivač tumača bajt koda ceval.c vlastitom implementacijom koja koristi JIT kompilaciju za ubrzavanje izvršenja. S6 provjerava je li trenutna funkcija već kompilirana i, ako jest, izvršava kompajlirani kod, a ako nije, pokreće funkciju u načinu interpretacije bajtkoda, slično CPython interpreteru. Tijekom interpretacije broji se broj izvršenih instrukcija i poziva povezanih s funkcijom koja se obrađuje. Nakon dostizanja određene prekretnice, pokreće se proces kompilacije kako bi se ubrzao često izvršavani kod. Kompilacija se provodi u međureprezentaciju strongjit, koja se nakon optimizacije pretvara u strojne instrukcije ciljnog sustava pomoću biblioteke asmjit.

Ovisno o prirodi radnog opterećenja, S6 u optimalnim uvjetima pokazuje povećanje brzine izvršenja testa do 9.5 puta u usporedbi s običnim CPythonom. Prilikom izvođenja 100 iteracija Richardsovog paketa testova uočeno je ubrzanje od 7x, a pri izvođenju Raytrace testa, koji uključuje veliku količinu matematičkih izračuna, uočeno je ubrzanje od 3-4.5x.

Među zadacima koje je teško optimizirati pomoću S6 su projekti koji koriste C API, kao što je NumPy, kao i operacije vezane uz potrebu provjere tipova velikog broja vrijednosti. Niska izvedba se također primjećuje za pojedinačne pozive funkcija koje zahtijevaju velike resurse zbog korištenja S6 vlastite neoptimizirane implementacije Python interpretera (razvoj nije dosegao fazu optimizacije načina interpretacije). Na primjer, u Unpack Sequence testu, koji raspakira velike skupove nizova/torki, kod jednog poziva dolazi do usporavanja do 5 puta, a kod cikličkog poziva izvedba je 0.97 od CPythona.

Izvor: opennet.ru

Dodajte komentar