8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

jupyter notebookよりもMarimoが便利そう

Last updated at Posted at 2024-11-20

業務でデータ分析・機械学習を行う人で、jupyter notebookを使ったことがない人はほとんどいないと思います。EDAやモデルの学習、教育など多くのユースケース利用されてきましたが、notebookは以下のようなデメリットがあると思います。

Jupyter Notebookのつらみ

  1. 再現性の担保が難しい
    • 共有されたnotebookを実行してもエラーが出て上手くいかない
      https://marimo.io/blog/introducing-marimo

      JetBrainsがGithub上の1千万のnotebookを分析したところ、36%のnotebookに再現性がなかったとのこと

    • notebook上の変数はグローバル変数で、明示的に削除するかセッションを再起動しないとメモリに残り続ける
    • 異なる役割の同じ名前の変数が至るところに存在する
      - 一定規模のnotebookではコードを追うのが大変で、異なる役割で同じ名前の変数が複数回で定義されていたり
  2. バージョン管理がめんどくさい
    • notebookはplain textではなく、差分を追うのが難しい
  3. 直接の成果物とならない
    • 実験用のスクリプトを書く場合はあまり考えないですが、データ分析の結果をチームメンバーもしくは第三者に見せる場合雑多なコードが目に付く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によるコード補完機能も備わっています。

pythonファイルからWebアプリとして実行可能
image.gif

ビルトインのUIコンポーネントが自動で同期的に描画を行ってくれる
image.gif

image.gif

現在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!

source: https://www.reddit.com/r/MachineLearning/comments/191rdwq/p_i_built_marimo_an_opensource_reactive_python/?rdt=60096

動かしてみる

実際に使ってみます
動作環境は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 

最初は以下の画面が出てきます。
image.png

各セルにpythonやmarkdown, sqlなどを書くことが可能です。実行は右上の▷ボタンか、Command + Enterで実行します。
image.png

セルの自動実行

marimoの再現可能性は、変数の依存関係を基にしたセルの自動実行にあります。

2つのセルを書きます。
image.png

x=10と変更すると、上のセルに実行されていない変更が存在することを表示してくれます。

image.png

上のセルを実行すると自動で下のセルの結果も変わってくれます
image.png

なぜこのようなことが可能なのかというと、marimoではセル間の依存関係がDAGでモデリングされているからです。そのため異なるセル間での変数の再代入や、変数のcyclicな依存関係は定義できません( e.g. x=y; y=x )。
image.png

これは例えばループ変数のiなども再定義ができなくなるため不便にも思えますが、変数名にアンダースコアをつければ問題なく再適宜できます。

セル間の依存関係は横のdependencyタブから見ることができます。
image.png

前述の通り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アプリとして立ち上げることができます。

image.png

その他

ちゃんと補完が効くのもありがたいです
image.png

他にも色々できそう

Gallaly

公式サイトにMarimoで構築されたnotebookの例があります。
https://marimo.io/p/@mzai/on-hypothesis-testing?show-code=false

image.png

image.png

最後に

こちらで誰でも動かすことができます!

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?