次期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
全自動除草ロボット・サービスのFarmWiseが薬物散布機能を追加
IT関連
2021-02-25 01:29
富士通、関節可動域を自動測定する「HOPE ROMREC」発売–病院などのリハビリを支援
IT関連
2021-03-01 08:24
テクノロジーセキュリティの7つのトレンド–ガートナーが指摘するリスクと課題
IT関連
2022-07-30 09:26
Zoom、約110億円のファンドを立ち上げ–開発者エコシステムの拡大に投資
IT関連
2021-04-20 06:48
DX浸透の壁を乗り越えるには–全社的な活動とするための3つのポイント
IT関連
2023-08-17 05:44
みらい翻訳、「時短メール英作文サービスβ版+」を提供–英作文を支援
IT関連
2023-07-15 21:39
法人向けIT事業を強化するKDDI–データ関連ビジネスでの実績を強調
IT関連
2023-09-07 03:14
DNAに“設計図”以外の新機能を発見 酵素活性を強める効果
科学・テクノロジー
2021-06-10 15:51
スパコン「富岳」で大規模言語モデルの分散並列学習手法を研究開発
IT関連
2023-05-24 14:31
従業員が「キャリアを選び取る」働き方へ–シスメックスが挑むジョブ型人事
IT関連
2022-04-08 20:23
WASIのフルスペルを「WebAssembly System Interface」から「WebAssembly Standard Interface」へ変更しようという提案は延期に
WebAssembly
2023-12-14 06:09
NECら、新型コロナウイルスと結合する人工DNAアプタマーの開発に成功
IT関連
2021-05-10 10:40
日立、「IT基盤/運用高度化オファリング」提供–クラウド構築・運用ベストプラクティス活用
IT関連
2022-11-15 10:29
現代パリが舞台のNetflix「ルパン」はひねりが効いておもしろい
ネットサービス
2021-02-16 22:24