2025/09/15 17:24 Speeding up my Ray Tracer using JAX

ロボ子、聞いたか? Rustでレイトレーサー作った人が、JAXで書き直したらめっちゃ速くなったらしいぞ!

JAXですか? 初めて聞きました。どのようなものなのですか?

JAXは、Google製のPythonライブラリで、数値計算を高速化できるのじゃ。特に、並列計算が得意なんじゃよ。レイトレーシングみたいに計算負荷が高い処理にはピッタリってわけ。

なるほど。記事によると、JAXはベクトル演算や交差判定が多い処理に向いているのですね。それに、逆レンダリングやニューラル放射場などの微分にも有効とのこと。

そうそう! しかも、JAXは純粋関数型だから、JAXの制約に合うんじゃな。Rayを構造体じゃなくて、関数に渡す個別の配列として表現したりする工夫もしてるみたいじゃぞ。

早期リターンがコンパイル効率を下げるから、`jnp.where()`で条件に基づいて結果をマスクする、というのも面白いですね。

じゃろ? カメラのプロパティを毎回再計算するのも、JITコンパイラが最適化してくれるから問題ないんじゃと。

`trace_pixel()`のJITコンパイル時に、`static_argnums`で不変引数を指定して最適化する、というのも参考になります。

`vmap`によるベクトル化で、Pythonループよりも効率的なレンダリングを実現してるのもポイントじゃな。

複数球を扱うために、`vmap`を使ってすべての球を同時にテストする、というのも効率的ですね。

拡散面での光の散乱を扱うために、JAXでは明示的な乱数状態として`key`を使うんじゃな。`jax.random.split`で再現性を保証しつつ、ベクトル化を維持するのも賢い。

位置調整可能なカメラや被写界深度、アンチエイリアシングなど、高度な機能も追加されているんですね。

金属や誘電体の材質も追加して、よりリアルな表現を目指してるんじゃな。フレネル反射率を計算して、反射と屈折を確率的に選択するのも面白い。

ガンマ補正(gamma=2.2)をレンダリングパイプラインに追加して、色を改善しているんですね。

JAXは、非静的引数の変更に対して再コンパイルを行わないから高速で、ベクトル化された演算で数百万のレイを並列処理できるんじゃ。XLAの最適化も活用してるらしいぞ。

Rustでのレンダリングと比較して、JAXは大幅に高速とのことですね。Rustで1200秒以上かかっていた処理が、JAXではもっと短時間で終わるなんて、すごい。

じゃろ? JAX、侮れないのじゃ! 今度、ロボ子と一緒にJAXで何か作ってみるかの?

ぜひ、ご一緒させてください! 博士、今日はJAXについて色々教えていただき、ありがとうございました。

どういたしまして。最後に一つ、JAXでレイトレーサーを作ると、光の速さでレンダリングできる…というのは、嘘じゃぞ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。