次期Python、ついにJITコンパイラ搭載の見通し。「copy-and-patch」と呼ばれる新たなJITコンパイラの仕組みとは?

今回は「次期Python、ついにJITコンパイラ搭載の見通し。「copy-and-patch」と呼ばれる新たなJITコンパイラの仕組みとは?」についてご紹介します。

関連ワード (内部、処理、部分等) についても参考にしながら、ぜひ本記事について議論していってくださいね。

本記事は、Publickey様で掲載されている内容を参考にしておりますので、より詳しく内容を知りたい方は、ページ下の元記事リンクより参照ください。


機械学習やAI処理の分野を中心に非常に高い人気のプログラミング言語である「Python」の次期バージョンに、処理速度の向上を目指したJITコンパイラが搭載される見通しです。

このJITコンパイラは、PythonコアデベロッパーのBrandt Bucher氏が提案し、実装しています。

そしてPython Software FoundationのフェローであるAnthony Shaw氏がブログ「ython 3.13 gets a JIT」で、このJITコンパイラについて解説しています。

fig

これらの情報を元に、PythonのJITコンパイラがどのように実装されようとしているのか、少し紹介していきましょう。

RubyもJavaScriptもJITが高速化を実現してきた

Pythonは前述の通り非常に人気の高いプログラミング言語でありながら、その公式実装であるC言語で記述されたCPythonはインタプリタであるため、実行速度の面で課題を抱えていました。

JavaScriptやRubyなど人気の高いプログラミング言語の多くは、処理速度を高速化するためにすでにJITコンパイラを搭載し、さらなる実行速度の向上のために最適化を進めているところです。

例えばPythonと同様にインタプリタとして登場したRubyは、実行速度を3倍に向上させるという目標の下、2016年にリリースされたRuby 2.6で初めてJITコンパイラ(MJIT)を実験的に搭載しました。

2022年にリリースされたRuby 3.1では、それまでのJITコンパイラとは別に新たに開発されたJITコンパイラ(YJIT)をメインラインにマージし、現時点で最新版のRuby 3.3ではこのYJITがさらに改良され、実行速度の向上を実現しています。

JavaScriptもWebブラウザ上で実行可能なインタプリタ型の言語として登場していますが、現在の主要なWebブラウザやJavaScriptランタイムにはJITコンパイラが搭載されています。現在のJavaScriptの実行速度の向上は、おおむねJITコンパイラの改善によって行われていると言ってよいでしょう。

PythonもそうしたJITコンパイラ搭載言語の仲間入りを果たすことになるわけで、今後はJITコンパイラによって実行速度の改善が進められるのではないかと見られます。

今回、PythonのJITコンパイラ搭載について解説記事をブログに書いたAnthony Shaw氏も次のようにJITコンパイラへの期待を示しています。

I think that whilst the first version of this JIT isn’t going to seriously dent any benchmarks (yet), it opens the door to some huge optimizations and not just ones that benefit the toy benchmark programs in the standard benchmark suite.

JITの最初のバージョンは、(まだ)ベンチマークの結果に対して大きな影響を与えることはないだろうが、今後は標準のベンチマーク群に含まれる簡単なベンチマークで良好な結果を得るにとどまらず、大きな最適化への扉を開くものになると思う。

一般的なフル機能のJITコンパイラの仕組みとは

Anthony Shaw氏の解説によると、次期Pythonに搭載予定のJITコンパイラは、一般的なフル機能のJITコンパイラとは多少異なった仕組みのものになるとのことです。

一般的なフル機能のJITコンパイラは、インタプリタでコードを実行しつつ、バックグラウンド処理でネイティブなバイナリコードを生成し、実行をインタプリタから生成済みのバイナリコードへ切り替えていくことで高速なコードの実行を実現するという仕組みです。

おおむねネイティブコードへに実行が切り替われば高速な実行が期待できますが、十分に高速な実行速度が得られるまでネイティブコードが生成されるには時間がかかること、そしてインタプリタとコンパイラを同時に走らせることになるため、実行時には多くのメモリを消費すること、という課題もあります。

これに対し、次期Pythonに搭載予定のJITコンパイラは「copy-and-patch」(コピー&パッチ)と呼ばれる仕組みで実現されると説明されています。

新しく採用されるコピー&パッチ方式のJITとは?

コピー&パッチ方式は、2021年に提案された新しい方式のJITコンパイラです。ここではその仕組みを、Anthony Shaw氏の説明を元に手短に紹介してみましょう。

Pythonのランタイム(CPython)の内部は、Pythonのコードを読み込んで中間言語に変換する部分と、その中間言語を実行する部分の2つに大別できます。

中間言語を実行する部分には多数のif文/Case文が並んでおり、中間言語がそのif文/Case文に合致したところに、その中間言語で実際に処理すべき命令が書かれています。そしてそれが実行されることになります。

Pythonランタイムは、インタプリタとしてこの処理をPythonコードの1行目から最後の行まで延々と繰り返すわけです。

コピー&パッチ方式のJITは、このPythonランタイムの中間言語の実行部分に手を入れることで実現されます。

後半の中間言語を実行する部分を、中間言語を実行するのではなく、実行するための命令をどんどんつなぎ合わせていく、という仕組みにするのです。

A copy-and-patch JIT is the idea that you copy the instructions for each command and fill-in-the-blanks for that bytecode arguments (or patch).

コピー&パッチ方式のJITの考え方は、コード内のそれぞれのコマンド(Command)に対応する処理命令(Instructions)をコピーし、バイトコードの列(すなわちパッチ)としてどんどんつなげていく、というものです。

そして実際の処理すべき命令がある程度つながった後にJITコンパイラに渡すと、if文/Case文によるオーバーヘッドなく、まとまった処理として高速に実行可能となります。

Copy-and-patch was selected because the compilation from bytecodes to machine code is done as a set of “templates” that are then stitched together and patched at runtime with the correct values. > コピー&パッチが選択された理由は、バイトコードからマシンコードへのコンパイルが「テンプレート」のセットとして行われ、それがつなぎ合わされ、実行時には適切な値のパッチとなるからです。

これによる利点は、インタプリタの中に並列処理としてJITコンパイラを組み込むのではなく、インタプリタから別コンポーネントへ処理命令をどんどん渡していくだけ、という比較的簡単な実装で済む点です。

そして肝心のJITコンパイラ部分は、既存のLLVM JITツールなどと組み合わせることで実現できるようです。

A copy-and-patch JIT only requires the LLVM JIT tools be installed on the machine where CPython is compiled from source, and for most people that means the machines of the CI that builds and packages CPython for python.org.

コピーアンドパッチJITに必要なのは、CPythonをソースからコンパイルするマシンにLLVM JITツールをインストールしておくだけです。これは多くの人にとって、python.orgからCPythonをビルドするCIマシンにこの環境が必要となることを意味します。

現時点でのJITコンパイラによる性能向上は2%から9%

JITコンパイラの実装を進めているBrandt Bucher氏によると、現時点でのJITコンパイラによる性能向上は2%から9%としています。

しかし、前述の通りこれは今後の最適化への第一歩であり、今後さらなる改善による性能向上を期待したいところです。

COMMENTS


Recommended

TITLE
CATEGORY
DATE
安全なデジタル社会の構築に貢献–カスペルスキー・小林社長
IT関連
2023-01-13 02:49
jQuery 4.0β版が登場。バージョン3.0から8年振りのメジャーバージョンアップへ。IE10以前のサポートは終了に
JavaScript
2024-02-13 00:40
第2回サイバー保険は、企業をどの程度守ってくれるのか?
IT関連
2023-10-13 16:25
d払いの障害、バーコード表示のシステムに不具合か ドコモ「本日中の復旧目指す」
ネットトピック
2021-06-02 12:32
「Windows 11」最初のInsiderプレビューは今週にも–ハードウェア要件などあらためて詳細チェック
IT関連
2021-06-28 08:44
さくらインターネット、生成AI向けクラウドサービス「高火力 PHY(ファイ)」提供開始。NVIDIA H100を8基搭載、200GbE×4本接続可能なベアメタルサーバ
GPU
2024-01-25 10:39
「Linux」ディレクトリーを「rsync」を使用してリモートマシンにバックアップするには
IT関連
2024-02-02 15:43
大成建設と富士通、建設現場のDXを加速する「作業所ダッシュボード」を開発
IT関連
2023-08-03 13:59
ゲームインフラのスタートアップPragmaはGreylockやZyngaの創設者などから約13億円調達
ゲーム / eSports
2021-04-22 09:29
Visa、フィンテック企業Plaidの買収を断念 司法省は独禁法提訴を取り下げ
企業・業界動向
2021-01-14 20:11
開発者が仕事で幸せだと感じる要素とは
IT関連
2022-03-29 00:28
NEC、ホテル客室をサテライトオフィスとして活用するサービス提供
IT関連
2021-04-05 21:23
グラファー、スマホ活用で行政デジタル化を促進–利用自治体は100超に
IT関連
2022-02-25 00:18
TikTokが欧州で消費者、子どもの安全、プライバシーに関する訴えを受ける
ネットサービス
2021-03-08 00:47