DeepMind відкрив код S6, бібліотеки з реалізацією JIT-компілятора для CPython

Компанія DeepMind, що здобула популярність своїми розробками в галузі штучного інтелекту, відкрила вихідні тексти проекту S6, що розвивав JIT-компілятор для мови Python. Проект цікавий оформленням у вигляді бібліотеки-розширення, що інтегрується зі штатним CPython, що забезпечує повну сумісність із CPython і не потребує модифікації коду інтерпретатора. Проект розвивався з 2019 року, але, на жаль, був згорнутий і більше не розвивається. Оскільки створені напрацювання можуть виявитися корисними для покращення Python, було вирішено відкрити вихідні тексти. Код JIT-компілятора написаний мовою C++, заснований на CPython 3.7. та відкрито під ліцензією Apache 2.0.

За розв'язуваними завданнями S6 для Python порівнюється з двигуном V8 для JavaScript. Бібліотека замінює існуючий обробник інтерпретатора байткоду ceval.c на власну реалізацію, що використовує JIT-компіляцію для прискорення виконання. S6 перевіряє, чи скомпільована вже поточна функція і, якщо так – виконує скомпільований код, а якщо ні – запускає функцію в режимі інтерпретації байткоду, схожому на інтерпретатор CPython. При інтерпретації підраховується кількість виконаних інструкцій та звернень, пов'язаних із оброблюваною функцією. Після досягнення певного рубежу для прискорення коду, що часто виконується, ініціюється процес компіляції. Компіляція проводиться у проміжне уявлення strongjit, яке після оптимізації перетворюється на машинні інструкції цільової системи за допомогою бібліотеки asmjit.

Залежно від характеру навантаження S6 за оптимальних умов демонструє підвищення швидкості виконання тестів до 9.5 разів у порівнянні зі звичайним CPython. При запуску 100 ітерацій тестового набору Richards спостерігається прискорення в 7 разів, а при запуску тесту Raytrace, в якому є великий обсяг математичних обчислень, - у 3-4.5 рази.

З завдань, які погано піддаються оптимізації за допомогою S6, називаються проекти, що використовують C API, такі як NumPy, а також операції, пов'язані з необхідністю перевірки типів великої кількості значень. Низька продуктивність також спостерігається для поодиноких викликів ресурсомістких функцій через використання в S6 власної неоптимізованої реалізації Python-інтерпретатора (розробка не досягла стадії проведення оптимізації режиму інтерпретації). Наприклад, у тесті Unpack Sequence, що виконує розпакування великих наборів масивів/кортежів, при одиничному виклику спостерігатиметься уповільнення до 5 разів, а при циклічному виклику – продуктивність становить 0.97 від CPython.

Джерело: opennet.ru

Додати коментар або відгук