業務でデータ分析・機械学習を行う人で、jupyter notebookを使ったことがない人はほとんどいないと思います。EDAやモデルの学習、教育など多くのユースケース利用されてきましたが、notebookは以下のようなデメリットがあると思います。
Jupyter Notebookのつらみ
- デバッグが難しく再現性の担保が難しい
- 共有されたnotebookを実行してもエラーが出て上手くいかない
https://marimo.io/blog/introducing-marimoThese problems with Jupyter notebooks are well-known and well-documented. For example, see a recent study by JetBrains that analyzed 10 million notebooks on GitHub and found that 36 percent of them weren’t reproducible, as well as Joel Grus’ famous talk on why he dislikes notebooks.
- notebook上の変数はグローバル変数で、明示的に削除するかセッションを再起動しないとメモリに残り続ける
- 異なる役割の同じ名前の変数が至るところに存在する
- 一定規模のnotebookではコードを追うのが大変で、異なる役割で同じ名前の変数が複数回で定義されていたり
- 共有されたnotebookを実行してもエラーが出て上手くいかない
- バージョン管理がめんどくさい
- notebookはplain textではなく、差分を追うのが難しい(githubは最近notebookのdiffに対応していたはず)
- 直接成果物とはしにくい
- 実験用のスクリプトを書く場合はあまり考えないですが、データ分析の結果をチームメンバーもしくは第三者に見せる場合雑多なコードが目に付くnotebookを直接共有することは多くないかもしれません。markdownに変換したり、別途ドキュメントやスライドを作ることもあるかと思います。ですがコードを変更した場合に新たに画像を差し替えるコストも大きく、インタラクティブなダッシュボードの構築はできません
よくある対処法
これらの課題への対処法として、例えば、単純にnotebookを共有する際には上から下まで問題なく実行できるか確認してから共有すること、といった決まりをチーム内で定めることも有るかと思います。
最近ではgithubのnotebookのdiff対応や、streamlitやgradioなどのエコシステムの充実により部分的に解決している箇所もあるかもしれません。
Marimo
Marimoはjupyter notebookにとってかわる新たなnotebookを提供するPythonライブラリです。
marimo is an open-source reactive notebook for Python — reproducible, git-friendly, executable as a script, and shareable as an app.
- あるセルを変更するとそれに依存するセルが自動実行するため、コードの整合性を保ち再現性を高めることが可能
- notebookが.pyファイルであるため、jsonファイルのjupyter notebookと異なりgit-friendly
- WASMで動き、ブラウザで動作可能
- 現在はβ版だが、marimo cloudを提供予定
他にもpands, polarsのGUIでのEDAや、Plotly, Altairを含む描画ライブラリのサポート、スプレッドシートとの連携機能などがあります。
また、開発体験を高めるためのIDEやEditorとの連携と、CopilotやOllamaなどのLLMによるコード補完機能も備わっています。
ビルトインのUIコンポーネントが自動で同期的に描画を行ってくれる
現在verは0.9.20です。本記事執筆中にv1へのroadmapが作られました。
Marimoの開発者の言葉を載せておきます。
Hi! I’d like to share marimo, an open-source reactive notebook for Python. It aims to solve many well-known problems with Jupyter notebooks, while giving you new capabilities: marimo notebooks are reproducible (no hidden state), git-friendly (stored as a Python file), executable as Python scripts, and deployable as web apps
I chose to develop marimo because I believe that the ML community deserves a better programming environment to do research and communicate it. I’ve seen lots of research start in Jupyter notebooks (much of my own has). I’ve also seen lots of that same research fail to reproduce or get slowed down by hidden bugs, due to shortcomings inherent to Jupyter notebooks.
I strongly believe that the quality of our work depends on the quality of our tools, and that the tools we use shape the way we think — better tools, for better minds. I worked at Google Brain as a software engineer in 2017-2018, when TensorFlow was transitioning to TensorFlow 2 and JAX was in its early stages. I saw firsthand the increase in productivity that PyTorch and JAX brought to our community, and later to my own research when I did a PhD at Stanford with Stephen Boyd. Our goal with marimo is to do something analogous but via a new programming environment.
marimo has been developed with the close input of scientists and engineers, and with inspiration from many tools, including Pluto.jl and streamlit. It’s just two of us working on it — we open sourced it recently because we feel it’s ready for broader use. Please try it out (pip install marimo && marimo tutorial intro). We’d really love any and all feedback you may have!
動かしてみる
実際に使ってみます
動作環境はApple SiliconのMacbookで、パッケージマネージャーはuvを利用しています。
marimo[recommend]をインストールすることでduckdb, altair, polars, openai, ruffも追加で含まれます。
$ uv init --python 3.12
$ uv add 'marimo[recommended]'
# uv run marimo tutorial intoでもいい
$ uv run marimo edit example.py
この各セルにpythonやmarkdown, sqlなどを書くことが可能です。実行は右上の▷ボタンか、Command + Enterで実行します。
セルの自動実行
marimoの再現可能性は、変数の依存関係を基にしたセルの自動実行にあります。
ここでx=10と変更すると、上のセルに実行されていない変更が存在することを表示してくれます。
ここで、上のセルを実行すると自動で下のセルの結果も変わってくれます。
なぜこのようなことが可能なのかというと、marimoではセル間の依存関係はDAGでモデリングされています。そのためには異なるセル間での変数の再代入や、変数のcyclicな依存関係は定義できません( e.g. x=y; y=x
)
セル間の依存関係は横のdependencyタブから見ることができます。
また、前述の通りmarimo notebookは.pyファイルで該当部分はこのようになっています。
@app.cell
def __():
x = 10
return (x,)
@app.cell
def __(x):
y = x * 10
y
return (y,)
アプリとして実行
notebookを編集するときはmario edit main.py
でしたが、mario run main.py
とすればWebアプリとして立ち上げることができます。
その他
Gallaly
公式サイトにMarimoで構築されたnotebookの例があります。
https://marimo.io/p/@mzai/on-hypothesis-testing?show-code=false
最後に
こちらで誰でも動かすことができます!