DeepMind odprta koda S6, knjižnice z implementacijo prevajalnika JIT za CPython

DeepMind, znan po svojem razvoju na področju umetne inteligence, je odprl izvorno kodo projekta S6, ki je razvil JIT prevajalnik za jezik Python. Projekt je zanimiv, ker je zasnovan kot razširitvena knjižnica, ki se integrira s standardnim CPython, kar zagotavlja popolno združljivost s CPython in ne zahteva spreminjanja kode tolmača. Projekt se je razvijal od leta 2019, a je bil žal prekinjen in se ne razvija več. Ker je ustvarjeni razvoj lahko koristen za izboljšanje Pythona, je bilo odločeno, da se koda odpre. Koda prevajalnika JIT je napisana v C++ in temelji na CPython 3.7. in je odprtokoden pod licenco Apache 2.0.

Kar zadeva naloge, ki jih lahko reši, se S6 za Python primerja z motorjem V8 za JavaScript. Knjižnica nadomešča obstoječega tolmača bajtne kode ceval.c z lastno izvedbo, ki uporablja prevajanje JIT za pospešitev izvajanja. S6 preveri, ali je trenutna funkcija že prevedena in, če je, izvede prevedeno kodo, in če ni, zažene funkcijo v načinu interpretacije bajtne kode, podobno kot tolmač CPython. Med interpretacijo se šteje število izvedenih ukazov in klicev, povezanih s funkcijo, ki se obdeluje. Ko je dosežen določen mejnik, se sproži postopek prevajanja, da se pospeši pogosto izvajana koda. Prevajanje se izvede v vmesno reprezentacijo strongjit, ki se po optimizaciji pretvori v strojna navodila ciljnega sistema s pomočjo knjižnice asmjit.

Glede na naravo delovne obremenitve S6 pod optimalnimi pogoji pokaže povečanje hitrosti izvajanja testa do 9.5-krat v primerjavi z običajnim CPythonom. Pri izvajanju 100 iteracij Richardsovega testnega nabora opazimo 7-kratno pospešitev, pri izvajanju testa Raytrace, ki vključuje veliko količino matematičnih izračunov, pa opazimo 3-4.5-kratno pospešitev.

Med nalogami, ki jih je težko optimizirati z uporabo S6, so projekti, ki uporabljajo C API, kot je NumPy, pa tudi operacije, povezane s potrebo po preverjanju vrst velikega števila vrednosti. Nizko zmogljivost opazimo tudi pri posameznih klicih funkcij, ki zahtevajo veliko virov, zaradi uporabe lastne neoptimizirane implementacije tolmača Python v S6 (razvoj še ni dosegel stopnje optimizacije načina tolmačenja). Na primer, pri testu Unpack Sequence, ki razpakira velike nize nizov/tork, je pri enem samem klicu upočasnitev do 5-krat, pri cikličnem klicu pa je zmogljivost 0.97 od CPython.

Vir: opennet.ru

Dodaj komentar