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

Дадаць каментар