ジャックス
めまぐるしく変化する機械学習や科学計算の分野で、強く求められるのは動作速度と柔軟性だ。グーグルリサーチチームが提供するJAXというプログラムは、数値計算やディープラーニングの分野でスピードアップを追求する上で、上位に上がってきているツールとしてよく知られている。JAXは、NumPyの基本的な機能をすべて備えており、その上、機械学習ワークロードや最新のGPU/TPUに最適化されたコードを実行し、ジャストインタイムコンパイルも可能な、自動微分などの最先端の機能を備えた非常に馴染みのある言語を導入している。本稿では、JAXの最適な使用方法を模索し、実際の能力と主張されている能力を比較し、この分野の初心者に適した簡単なチュートリアルを提供する。
JAXとは?
JAXは、NumPyの機能を拡張し、現代の機械学習や科学計算の生産性を高める様々な関数を組み込んだ強力な数値計算ライブラリである。JAXは旧来のライブラリとは異なり、関数転送の整理を中心としており、研究者やエンジニアが書くコードを短く、かつ強力なものにするのに役立っている。JAXの主な特徴は、自動微分のサポート、ハードウェアアクセラレーション、既存のPythonワークフローとの統合の容易さである。
JAXの主な特徴
JAXが他の数値計算ツールキットと異なるのは、次のようなユニークな特徴があるからである:
NumPyとの互換性:JAXはNumPyが提供する配列操作のほとんどをサポートしている。従って、ユーザーはNumpyの操作を使うときに古いコードを捨てる必要がなく、GPU/TPUアクセラレーションの恩恵も受けることができる。
自動微分:ライブラリの一部としてリバースモードとフォワードモードの自動微分を提供することにより、JAXは機械学習や最適化アプリケーションのための手間のかかる勾配計算への参入障壁を低くします。
ジャストインタイムコンパイル(JIT):jitデコレータの特徴の1つは、Python関数を効率的なマシンコードに直接コンパイルする機能です。
ハードウェアアクセラレーション:コードを変更することなく、JAXはCPU、GPU、TPU上で、単純なタスクから非常に大規模な研究タスクまで、スムーズに動作することができます。
関数の変換:grad、vmap、pmapのような非常に効率的なツールは、ベクトル化、並列化、自動バッチ化によって関数を変換(最適化)できるだけでなく、それを簡単かつ迅速に行うことができる。
JAX入門:基本チュートリアル
今回の目標は、JAXの自動分化とJITコンパイル機能を紹介する短い例を提供することである。
まず、JAXはpip経由でインストールする必要がある:
pip install jax jaxlib
次に、必要なモジュールをインポートする:
インポート jax
jnpとしてjax.numpyをインポートする。
from jax import grad, jit
ある関数の勾配を求める前に、理解しやすく説明しやすい関数をピックアップするのは良いアイデアだ:
def f(x):
return 3 * x ** 2 + 2 * x + 1
df_dx = grad(f)
print(df_dx(2.0)) # 出力:14.0
JITコンパイルによって、より高速な実行が可能になった:
ジット
def fast_f(x):
return 3 * x ** 2 + 2 * x + 1
print(fast_f(2.0)) # 出力:17.0
このチュートリアルでは、JAXがグラデーションを見つけるのに優れていること以上のことを紹介する。このような操作をコアに適合させるために、JAXはバッチ処理やデバイス並列化の目的でvmapとpmapを提供している。
結論
JAXは、NumPyの使いやすさと最新のパフォーマンス最適化を組み合わせたもので、配列計算の分野では大きな進歩である。関数型プログラミングの扱いを学ぶことは、克服すべき小さな障害ではあるが、結果として得られるスピードと適応性の広さは、非常にやりがいのあるものである。機械学習モデルのトレーニングであれ、科学シミュレーションであれ、数学関数の最適化であれ、JAXはPythonで可能なことの限界を引き上げるのに役立つツールである。
