Flaskで作ったREST APIをGraalPyで動かす

このエントリは2024/03/28現在の情報に基づいています。将来の機能追加や変更により、記載内容からの乖離が発生する可能性があります。

Pythonはほぼ初心者ではあるが、GraalVM大好きな身としては、Graal Python (GraalPy) を使ってみたかったので試してみた。実際に「ただ試してみた」という、どこかのあれみたいな内容である。

GraalPyって何?

GraalPy (Graal Python) は、CPythonの置き換えが可能なPython実装で、現在3.10系の実装が提供されている。最新版は2024/03/28現在24.0.0。

GraalPy
https://www.graalvm.org/python
https://github.com/oracle/graalpython

依存関係

REST APIを作るとなると、FastAPIを使うことが多いと思われるが、現時点では、FastAPIではなく、Flaskが利用できる(2024/03/28現在、FastAPIの依存関係がGraalPyに対応できていないためにFastAPIは使えない。ただIssueを見ている限り、近日中に解決しそうな感じ)。

コード

お作法自体は通常のCPythonと何ら違いはない。まず仮想環境を作って入り、必要な依存関係をpipで取り込む。

$ graalpy -m venv venv
$ . venv/bin/activate
$ pip install ...

例えば、Query Parameterでnameを渡すとHello {name}が返ってくる、という非常にシンプルなREST APIを作ることにする。

from flask import Flask, request, jsonify

# create a Flask instance
app = Flask(__name__)

@app.route('/api/greeting', methods=['GET'])
def greeting():
    name = request.args['name']
    return jsonify({"message" : "Hello, " + name})

if __name__ == "__main__":
	app.run(host='0.0.0.0')

もちろん、インタープリターで動作させることもできる。

$ graalpy main.py

Postmanから試してみると…

Native Imageに仕立てる

GraalPyなので、もちろんNative Imageに仕立てることができる。以下のドキュメントに従って、Native Imageに変換する。

Python Standalone Applications
https://www.graalvm.org/latest/reference-manual/python/standalone-applications/

graalpy -m standalone native \
      --module main.py \
      --output main.bin \
      --venv venv

問題なくNative Imageを生成できた・・・のだが、生成されたNative Imageのサイズが、386,688,944 Byte (およそ369 MByte) 、ビルドに要した時間はおよそ10分。今後Quick Buildモード (-Ob) で時間短縮するとか、パフォーマンス向上のためにPGO使う (--pgo) とか、--march=nativeを指定してみるとか、Serial GCではなくG1 GCを使う (--gc=G1) とか、色々比較しながら実験できそうではあるが、今日は一旦ここまで。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください