GraalPy Quick Reference

原文はこちら。
The original article was written by Olga Gupalo (Member of Tech Staff for GraalVM at Oracle), and co-author was Tim Felgentreff (the lead of GraalPy development at Oracle).
https://medium.com/graalvm/graalpy-quick-reference-0488b661a57c

GraalPyはGraalVM上に構築されたPython 3実装です。

A Python 3 implementation built on GraalVM
https://github.com/oracle/graalpython

活発に開発が続いていて、他のPythonの実装よりも大幅なパフォーマンスの向上を示しています。GraalPyは様々な用途で利用できます。例えば、

  • 現在のJythonやCPythonランタイムの直接的な置き換えとして
  • マネージドJavaアプリケーションでNumPy、SciPy、MatplotlibのようなPythonネイティブ拡張を実行する目的で
  • ネイティブバイナリの作成目的で

などです。

Moving from Jython to GraalVM
https://medium.com/graalvm/moving-from-jython-to-graalvm-cf52c4af6106
https://logico-jp.io/2020/06/23/moving-from-jython-to-graalvm/

このエントリの目的は、開発者がGraalPyを使い始める手助けになることです。最も有用なGraalPyの情報を1ページにまとめました。以後では詳細を掘り下げます。

GraalPy 23.1 Quick Reference

このクイックリファレンスカードはA4用紙にフィットするようにできていますので、ダウンロードして印刷できます。印刷には必ずPDF版を使用してください。もし、あなたがUSレター用紙を使うのであれば、必ずUSレター版を入手してください。

GraalPyには、あなたのニーズによって異なるバージョンがあり、2つのディストリビューションがあります。

  • Oracle GraalPy
  • GraalPy Community

Oracle GraalPyはGraalPy Communityよりもかなり高速で、開発および実運用で無料で利用できます(GraalVM Free Terms and Conditions (GFTC)ライセンスの下でライセンス許諾されています)。

GraalVM Free Terms and Conditions
https://oracle.com/downloads/licenses/graal-free-license.html

両者を区別するために、GraalPy Communityディストリビューションの名前には-communityという接尾辞がついています。

各ディストリビューションには2個のランタイムがあります。

  • Native
  • JVM

ネイティブ・ランタイムはCPythonと最も互換性があります。AOTコンパイル済みのPythonランチャーとして起動するので、高速に立ち上がり、メモリ使用量も少なくてすみます。

JVMランタイムはJavaと相互運用でき、その他のGraalVM言語を追加できます。名前についている接尾辞-jvmで識別できます。

Installing

LinuxまたはmacOSにGraalPyをインストールする場合、Pythonのバージョンマネージャであるpyenvをお勧めします。

Simple Python version management
https://github.com/pyenv/pyenv/

デフォルトでは、CPythonの単純置き換えとして完璧な、GFTCライセンスのネイティブバージョンがインストールされます。バージョン23.1.0をインストールするには、以下のコマンドを実行してください。

pyenv install graalpy-23.1.0

GraalPy Communityをインストールすることもできますが、この場合はPyenvで graalpy-community-23.1.0 を呼び出します。GraalPy CommunityはConda Forgeでも利用できます。

conda-forge | community driven packaging for conda
https://conda-forge.org

最新バージョンをインストールするには、以下のコマンドを使ってください。

conda create -c conda-forge -n graalpy graalpy

あるいは、GraalPyのリリースページにアクセスし、ご利用のOS用のGraalPyをダウンロードしてください。

Releases
https://github.com/oracle/graalpython/releases

ご注意いただきたいのは、Windowsでは(NumPyのような)ネイティブ拡張をインストールできませんが、pipを使って純粋なPythonパッケージをインストールすることはできます。アーカイブを展開し、必要であれば、環境変数がGraalPyを指すように設定します。binディレクトリの中には、graalpypythonpython3というランチャーがあります。これらは、標準のCPythonと同じコマンドラインオプションを受け付けます。

graalpy <options> <-c cmd | filename>

graalpy-ltランチャーはパフォーマンスとメモリフットプリントを犠牲にして、より良いデバッグと改善されたサンドボックスのために、GraalVM LLVMツールチェーンでネイティブ拡張をコンパイルします。Oracle GraalPyディストリビューションにはgraalpy-managedも含まれています。このランチャーはネイティブ拡張をコンパイルするために、graalpy-ltランチャーと同様にGraalVM LLVMツールチェーンを使用していますが、セキュリティ向上のために、libcに至るまでのすべてのネイティブライブラリがビットコードから実行されるマネージドモードで実行されます。これには、大幅なパフォーマンス・コストと互換性の低下が伴います。

Linux、macOS、Windowsで、GraalPyをソースからビルドも可能です。

A Python 3 implementation built on GraalVM
https://github.com/oracle/graalpython/tree/master#building-from-source

GraalPy Environment Setup

プロジェクトのセットアップは通常仮想環境の作成ならびにNumPyやPyTorchといった所望のパッケージをrequirements.txtを使ったり、直接だったりしてインストールするところから始まります。

graalpy -m venv my_project

source my_project/bin/activate

graalpy -m pip install numpy torch -r requirements.txt

パッケージがGraalPyと互換性があるかを確認するための初期ツールとして、Python Compatibility Checkerの利用をお勧めします。

GraalPy Package Compatibility
https://graalvm.org/python/compatibility/

GraalPy: Package Compatibility

ほとんどのネイティブ拡張パッケージは、GraalPy用のバイナリを公開していないため、インストール時に自動的にユーザーのマシンでコンパイルしようとすることに注意してください。すべてのライブラリと開発ツールがインストールされていることを確認してください。詳細については、様々なプロジェクトのドキュメントを参照するか、Slackで尋ねてください。

Slack
https://graalvm.slack.com/channels/graalpy

Development Setup

GraalPyの開発にはPyCharmを推奨します。

PyCharm
https://jetbrains.com/pycharm/

PyCharmでGraalPyを開発環境としてセットアップするには、以下の手順に従ってください。

作業補足情報
1GraalPyをインストール
2PyCharmをインストールInstall PyCharm
https://www.jetbrains.com/help/pycharm/installation-guide.html
3Pythonプロジェクトを作成もしくは開くCreate a Python project
https://www.jetbrains.com/help/pycharm/creating-empty-project.html
Open, reopen, and close projects
https://www.jetbrains.com/help/pycharm/open-projects.html
4Pythonプロジェクト用に新しいvenv仮想環境を作成Create a virtualenv environment
https://www.jetbrains.com/help/pycharm/creating-virtual-environment.html#python_create_virtual_env
5PyCharmの指示に従ってパッケージをインストールInstall, uninstall, and upgrade packages
https://www.jetbrains.com/help/pycharm/installing-uninstalling-and-upgrading-packages.html

PyCharmの実行、デバッグ、プロファイリングツールはGraalPyでも動作します。もちろん、VS Codeのような他のコードエディタでGraalPyをセットアップすることもできます。Pythonインタプリタを選択し、GraalPyのpython実行ファイルを指定する方法については、エディタのマニュアルを参照してください。

Deployment

GraalPyアプリケーションは、他のPythonアプリケーションと同様にデプロイできます。さらに、GraalPyはメインスクリプトでPythonアプリケーションからスタンドアロンバイナリを作成するツールを提供します。以下のコマンドを実行するだけで、すべてのPython依存関係とGraalPy自身を含むmy_applicationバイナリが生成されます。これにより、追加の依存関係なしで配布できます。

graalpy -m standalone native \
--output my_application \
--module my_python_script.py
--venv <venv-dir>

この機能を使って、例えば以下のゲームのような、ゲームとそのアセット全体をデプロイすることも可能です。

Racing game utilizing a pseudo-3D rendering algorithm for race tracks. Parody of Persona 4
https://github.com/timfel/racing-all-afternoon

これはPythonにかけているユニバーサルデプロイメントオプションを補うものです。

A PyGame racer that can be deployed as a single self-contained binary with GraalPy

Embed in Java

GraalPy Polyglot APIを使って、GraalPyをJavaアプリケーションへの埋め込みが可能です。

org.graalvm.polyglot (GraalVM SDK Java API Reference)
https://www.graalvm.org/sdk/javadoc/org/graalvm/polyglot/package-summary.html

このように、GraalPyは動的スクリプト機能やモダンなデータサイエンスライブラリをJavaにもたらします。説明のために、GraalPyスタンドアロンツールを使って、Javaアプリケーションのサンプルを作成します。

graalpy -m standalone polyglot_app --output-directory MyPythonJavaEmbedding

このコマンドで、Pythonの依存関係を持つMavenプロジェクトのスケルトンを作成します。依存関係を使って、埋め込みアプリケーションの開発を進めることができます。生成されたpom.xmlを見て、Pythonパッケージを追加してください。そして、生成されたmain関数から、PythonをJavaからどのように利用するかを確認してください。その後、アプリケーションをパッケージングし、mvn exec:execで実行します。これはOpenJDKでも動作しますが、GraalVM JDKであればGraalPy上で動作するPythonコードに対してはるかに高いパフォーマンスを提供します。

既存のJavaアプリケーションにPythonを組み込むには、MavenやGradleのビルドツールの依存関係としてGraalPyを追加するか、明示的にモジュールパスにGraalPyのJARファイルを置いてください。少なくともMaven Centralのpython-languagepython-resource JARファイルが必要です。

Maven configuration:

<dependency>
  <groupId>org.graalvm.polyglot</groupId>
  <artifactId>polyglot</artifactId>
  <version>23.1.0</version>
</dependency>
<dependency>
  <groupId>org.graalvm.polyglot</groupId>
  <artifactId>python</artifactId>
  <version>23.1.0</version>
  <type>pom</type>
</dependency>

Gradle configuration

dependencies {
  implementation("org.graalvm.polyglot:polyglot:23.1.0")
  implementation("org.graalvm.polyglot:js:23.1.0")
  testImplementation("junit:junit:4.13.2")
}

GraalVM Polyglot API version 23.1の時点では、すべての必要なアーティファクトを直接Maven Centralからダウンロードできます。embedderに関連するすべてのアーティファクトはorg.graalvm.polyglotというMaven依存関係グループにあります。

org.graalvm.polyglot
https://central.sonatype.com/namespace/org.graalvm.polyglot

完全な設定例は、以下を参照してください。

Polyglot Embedding Demo with GraalVM for JDK 21
https://github.com/graalvm/polyglot-embedding-demo

Options Specific to GraalPy

他の Python 実装とは異なり、Chrome Inspector で Python コードをデバッグできます!これにより、PyCharm のような IDE を使っていなくても、シンプルなグラフィカルデバッガを利用できます。

graalpy --inspect your_script.py

GraalPyはPyCharmやpdbのようなPythonデバッガーとも一緒に使えます。

GraalPyはガベージコレクター(以下、GC)を使って、システムメモリの総量に基づいてメモリを確保します。デフォルトでは、利用可能であればGraalPyはCPythonよりもずっと多くのメモリを使います。これはGCを不必要に頻繁に実行することでパフォーマンスを向上させるためです。GCはJavaオプションを使って調整できます。例えば、--vm.Xmx1G と指定すれば、GraalPyが使う最大ヒープサイズを1GBに制限できます。NumPyやPyTorchといったネイティブコードがシステムから直接メモリをリクエストする場合、総メモリ利用量は増える可能性があります。

GraalPyは、JITコンパイラを使用しますが、JITコンパイラは複数のコアを用いコードをコンパイルする可能性があります。短時間実行のスクリプトの場合、JITコンパイラはスクリプトが終了するまでにJITコンパイルでコード最適化できない可能性があります。このような場合、--experimental-options --engine.Compilation=falseでJITコンパイルを無効にできます。このオプションの使用には注意が必要であり、その効果は具体的な作業負荷に大きく依存するため、実験的なものです。

Summary

このエントリでは、GraalPyに関する最も有用な開発者向けの情報を説明しました。この情報を1枚の紙にまとめてありますので、印刷してクイックリファレンスとして使っていただけます。Pythonアプリケーションを高性能でモダンなGraalPyで動かしてみてください!

コメントを残す

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