本日は
Julia アドベントカレンダーネタとして自作ツール sysimage_creator の紹介をします.
using Plots.jl
など初回ロードが遅いパッケージは PackageCompiler.jl を使うことで Julia の sysimage にコンパイル情報を追加することで解決することができます. Jupyter の Julia カーネルも初回のロードやカーネルの再起動は Python のそれに比べると遅いので少しイライラする方もいると思います. sysimage_creator はそれらの問題に対処するツールです.
導入
この記事を読むにあたっては Julia/Python/Jupyter の環境はあらかじめ整っていると仮定します. 他にも pip install ...
とか jupytext とか PacakgeCompiler.jl の使い方を他の記事で読んだ経験があれば理解しやすいと思います.
ひとまず下記の手順を踏むと道具が揃います.
$ git clone https://github.com/terasakisatoshi/sysimage_creator.git
$ pip install jupyter jupytext nbconvert ipykernel
$ cd sysimage_creator && make && jupyter notebook
ノートブックを起動する際に julia-1.6.3-sys
という名前のカーネルを指定すると
初回のノートブックの起動時のもっさり感や using Plots のロードの遅さが改善されていると思います.
make
コマンドの中では
- IJulia によって jupyter カーネルが起動する際に行われるJITコンパイル情報を取得
- StatsPlots.jl を jupyter 上で実行する際に行われるJITコンパイル情報
- 得られたコンパイル情報をもとにPackageCompilerによって sysimage を作ってもらう
- その sysimage を呼び出すためにカーネルを作成する (これが julia-1.6.3-sys です)
$ make test
とすると簡単なノートブックの起動・実行に対して素の sysimage と sysimage_creator で作った sysimage で試した場合でおおよそ3倍改善される様子を見ることができます.
julia --project=@. benchmark.jl
[jupytext] Reading testout_naive.jl in format jl
[jupytext] Executing notebook with kernel julia-1.6
Starting kernel event loops.
[jupytext] Writing testout_naive.ipynb (destination file replaced [use --update to preserve cell outputs and ids])
[jupytext] Updating the timestamp of testout_naive.jl
[jupytext] Reading testout_sys.jl in format jl
[jupytext] Executing notebook with kernel julia-sys-1.6
Starting kernel event loops.
[jupytext] Writing testout_sys.ipynb (destination file replaced [use --update to preserve cell outputs and ids])
[jupytext] Updating the timestamp of testout_sys.jl
t_naive = 26.774783521 # こっちがデフォルトの状態
t_sys = 7.839323549. # 我々のツールを使った場合
Test Summary: | Pass Total
benchmark | 1 1
お試しあれ