DeepMind open source S6, ett bibliotek med en JIT-kompilatorimplementering för CPython

DeepMind, känt för sin utveckling inom området artificiell intelligens, har öppnat källkoden för S6-projektet, som utvecklade en JIT-kompilator för Python-språket. Projektet är intressant eftersom det är utformat som ett tilläggsbibliotek som integreras med standard CPython, vilket säkerställer full kompatibilitet med CPython och inte kräver modifiering av tolkkoden. Projektet har utvecklats sedan 2019, men tyvärr lades det ner och utvecklas inte längre. Eftersom utvecklingen som skapats kan vara användbar för att förbättra Python, beslutades det att öppna källkod för koden. JIT-kompilatorkoden är skriven i C++ och är baserad på CPython 3.7. och är öppen källkod under Apache 2.0-licensen.

När det gäller uppgifterna den kan lösa, jämför S6 för Python med V8-motorn för JavaScript. Biblioteket ersätter den befintliga bytecode-tolkhanteraren ceval.c med en egen implementering som använder JIT-kompilering för att påskynda exekvering. S6 kontrollerar om den aktuella funktionen redan är kompilerad och, i så fall, exekverar den kompilerade koden, och om inte, kör funktionen i bytecode-tolkningsläge, liknande CPython-tolken. Under tolkningen räknas antalet exekverade instruktioner och anrop associerade med funktionen som bearbetas. Efter att ha nått en viss milstolpe initieras en kompileringsprocess för att påskynda ofta exekverad kod. Kompileringen utförs till en mellanliggande strongjit-representation, som efter optimering omvandlas till maskininstruktioner för målsystemet med hjälp av asmjit-biblioteket.

Beroende på typen av arbetsbelastning visar S6 under optimala förhållanden en ökning av testkörningshastigheten med upp till 9.5 gånger jämfört med vanlig CPython. När man kör 100 iterationer av Richards testsvit observeras en 7x speedup, och när man kör Raytrace-testet, som involverar en stor mängd matematiska beräkningar, observeras en 3-4.5x speedup.

Bland de uppgifter som är svåra att optimera med S6 finns projekt som använder C API, såsom NumPy, samt operationer relaterade till behovet av att kontrollera typen av ett stort antal värden. Låg prestanda observeras också för enstaka anrop av resurskrävande funktioner på grund av användningen av S6:s egen ooptimerade implementering av Python-tolken (utvecklingen har inte nått stadiet att optimera tolkningsläget). Till exempel, i Unpack Sequence-testet, som packar upp stora uppsättningar av arrayer/tupler, med ett enda anrop sker en avmattning på upp till 5 gånger, och med ett cykliskt anrop är prestandan 0.97 från CPython.

Källa: opennet.ru

Lägg en kommentar