DeepMind otwarty kod S6, biblioteki z implementacją kompilatora JIT dla CPython

DeepMind, znany ze swoich osiągnięć w dziedzinie sztucznej inteligencji, udostępnił open source projekt S6, w ramach którego opracowano kompilator JIT dla języka Python. Projekt jest o tyle ciekawy, że został zaprojektowany jako biblioteka rozszerzeń, którą można zintegrować ze standardowym CPythonem, co zapewnia pełną kompatybilność z CPythonem i nie wymaga modyfikacji kodu interpretera. Projekt rozwija się od 2019 roku, ale niestety został zahamowany i już się nie rozwija. Ponieważ stworzone rozwinięcia mogą być przydatne do ulepszania Pythona, postanowiono otworzyć teksty źródłowe. Kod kompilatora JIT jest napisany w C++, w oparciu o CPython 3.7. i jest otwarty na licencji Apache 2.0.

S6 dla Pythona porównuje się do silnika V8 dla JavaScript pod względem zadań, które rozwiązuje. Biblioteka zastępuje istniejący moduł obsługi interpretera kodu bajtowego ceval.c własną implementacją, która wykorzystuje kompilację JIT w celu przyspieszenia wykonywania. S6 sprawdza, czy bieżąca funkcja została już skompilowana, a jeśli tak, wykonuje skompilowany kod, a jeśli nie, uruchamia funkcję w trybie interpretacji kodu bajtowego, podobnym do interpretera CPython. Interpretacja zlicza liczbę wykonanych instrukcji i wywołań związanych z przetwarzaną funkcją. Po osiągnięciu określonego kamienia milowego inicjowany jest proces kompilacji, aby przyspieszyć często wykonywany kod. Kompilacja jest wykonywana do reprezentacji pośredniej strongjit, która po optymalizacji jest konwertowana na instrukcje maszynowe systemu docelowego za pomocą biblioteki asmjit.

W zależności od charakteru obciążenia, w optymalnych warunkach, S6 wykazuje wzrost szybkości wykonywania testów do 9.5 razy w porównaniu do zwykłego CPythona. Podczas wykonywania 100 iteracji zestawu testów Richards następuje 7-krotne przyspieszenie, a podczas uruchamiania testu Raytrace, który zawiera dużą ilość obliczeń matematycznych, jest on 3-4.5 razy szybszy.

Zadaniami trudnymi do zoptymalizowania z S6 są projekty wykorzystujące C API, takie jak NumPy, a także operacje związane z koniecznością sprawdzenia typów dużej liczby wartości. Słabą wydajność obserwuje się również w przypadku pojedynczych wywołań funkcji intensywnie korzystających z zasobów ze względu na użycie własnej, niezoptymalizowanej implementacji interpretera Pythona w S6 (rozwój nie osiągnął etapu optymalizacji trybu interpretacji). Na przykład w teście Unpack Sequence, który rozpakowuje duże zestawy tablic/krotek, jednym wywołaniem obserwuje się nawet 5-krotne spowolnienie, a przy wywołaniu cyklicznym wydajność wynosi 0.97 z CPython.

Źródło: opennet.ru

Dodaj komentarz