こんにちは。XI本部、AIトランスフォーメーションセンターの徳原 光です。
日ごろの業務では、お客様から預かったデータの分析や、AIシステムの開発を担当しています。
実際にやっていることは、データ理解のためにEDA(探索的データ分析)を実施したり、分析やAIモデル開発を行うためにデータのクリーニングを行ったり、いわゆるデータサイエンスのどろくさい部分がほとんどになります。
これらの作業は基本的にjupyter notebook上で行っています。jupyter notebookはAIやデータサイエンスに関わっている方なら誰もが触ったことのあるメジャーなツールです。きっと、この記事を読んでくださっている多くの方も日常的に利用しているのではないでしょうか。
jupyter notebookはこれがないと仕事にならないくらい強力なものですが欠点もあって、複数人で同じnotebookを共有して作業を進めていくには不向だったりします。
ということで、そんなjupyter notebookをGitを用いて管理することで、複数人で同時に分析プロジェクトを進めることを可能にする便利なツールJupytextを紹介しようと思います。
なぜJupytextなのか?
経験のある方もいらっしゃると思いますが、jupyter notebookが出力するipynbファイルをGitで管理しようとするとコンフリクトが頻繁に起こります。
ipynbファイルの中身はjsonになっていて、コード以外にメタデータや実行結果が含まれます。それらのデータが実行される度に書き換わるので、処理内容が一緒だとしても複数箇所で異なる部分が生じてしまいます。
また、コンフリクトを解決しようとしても、jsonファイルの差異を比較するのは不可能なので人力では無理です。
Jupytextを使用すると、notebookを保存する度にipynbファイルからコード部分を抽出したpyファイルを自動で作成してくれます。そして作成されたpyファイルのみ、Git上で管理すれば競合の発生を防げるというわけです。
もちろん、ローカルにはipynbファイルが残されるので、実行結果やメタデータはローカルにしっかりと残ります。
ファイルの復元も簡単でpullしてきたpyファイルをJupyter Notebookで読み込めば、自動でipynbファイルに復元できます。
※jupyterをVS codeで利用している場合、Jupytextは使用できません。VS codeでJupytextを適用しているnotebooのipynbファイルを開いてしまうとipynbファイルが破損します。また、jupytextが適用されていないJupyter Notebookで開いてもipynbファイルが破損するので気をつけてください。
※この記事では、頭文字が大文字のJupyter NotebookはJupyter Project純正の実行環境を指しています。JupytextはJupyter Notebook以外にJupyter Labでも使用できるようですが、挙動は確認していないです。
Jupytextの使い方
インストールの仕方
まずは導入の仕方から。公式のドキュメントに書いてあるようにJupytextの導入はpipもしくはcondaを用いて行います。
プロジェクトごとにJupytextの使用の有無を切り替えたい場合は、condaやpyenvを使って仮想環境に導入することをおすすめします。
pip install jupytext --upgrade
または
conda install jupytext -c conda-forge
これだけです。
正常にインストールできていれば、次回のJupyter Notebookの起動時に、
[I 10:28:31.646 LabApp] [Jupytext Server Extension] Changing NotebookApp.contents_manager_class from LargeFileManager to jupytext.TextFileContentsManager
と表示されます。
Jupytextの設定
ここまでで、すでにJupytextを使用する準備は整っていますが、後々のことを考えてJupytextの設定をしておきましょう。
Jupytextの設定方法は複数存在しますが、プロジェクト直下のフォルダ(Jupyter Notebookを立ち上げるフォルダ)にjupytext.ymlというyamlファイルを作成しておくのが簡単な方法みたいです
とりあえず、以下を設定ファイルに追加して、保存時にデフォルトで作成されるファイルのフォーマットを指定しましょう。
default_jupytext_formats: "ipynb,py:percent"
ipynb
はipynbファイルのことです。py:percent
を指定すると、パーセント記号2つ%%
でセル間を分けた表記でコードを抽出したpyファイルを作成できます。こうしておくことで、この表記で保存しておけばもしVS codeで開いてもセルごとに分割された形で表示、実行できます。
この他に、選択できるフォーマットが複数存在します。こちらの公式ドキュメントに選択できるフォーマットの詳細が載っています。
保存ファイルのフォーマットを2つ以上選択することも可能です。
設定はJupyter Notebookを再起動すれば、この後作成するすべてのnotebookに対してこの設定が適応されます。すでに作成済みのnotebookに対しては手動で設定する必要があるので、ツールバーからファイル→Jupyterを選択し、表示されるメニューから保存ファイルのフォーマットを選択してください。
ファイルの保存方法
通常通りnotebookを保存すれば指定された形式でファイルが保存されます。特になにかする必要はないです。
ipynb形式以外にコード部分を抽出したファイルが保存されたら、gitignoreを設定してコード部分を抽出したファイルのみが管理されるように設定します。こうすることで、Gitでjupyter notebookを安全に管理できます。
ちなみに、notebooksというフォルダ上でjupyter notebookを管理している場合、gitignoreファイルを以下のように編集すると、ipynb形式のファイルがGitの管理対象から外れます。
/notebooks/*.ipynb
pyファイルからnotebookを復元する
こちらも特に何もする必要性はありません。Jupytextが導入されたJupyter Notebookでコード部分が抽出されたpyファイルを開けば、notebookを復元できます。
Jupytextを使ってみて
使い始めてまだ日が浅いですが非常にいい感じに使えています。
jupyter notebookの用途的に、複数の人が1つのnotebookを分担して編集するという使い方はあまりないと思いますが、もし別々の人が1つのnotebookを編集してしまっても簡単にdiffを取ることができるので、gitでのバージョン管理は格段にやりやすくなりました。
さらに、一番恩恵を受けられるのが特にコードに変更を加えていないけどnotebookを実行した場合です。コードに変更がないなら変更を破棄してしまえばいいですが、Jupytextを使っていればそもそもコンフリクトすら生じないのでipynbファイルの差異を意識する必要性がなくなります。
デメリットは対応している環境が限られていること
Jupyter Notebook以外にもjupyter notebookを実行できる環境は増えてきていますよね。自分の周りではVS codeにjupyter用の拡張機能を入れて利用している人が多く、最近は私もVS codeで実行することが増えてきています。
ただ、冒頭でお伝えしたようにJupytextはVS codeには対応しておらず、プロジェクトにJupytextを導入するにはメンバー全員にJupyter Notebookまたは、Jupyter Labを使ってもらう必要があります。
現状、Jupyter NotebookよりもVS codeのほうが高機能なので、そこは残念なところですね・・・。
jupyter notebookをGitで管理しやすくしてくれるツールJupytextの紹介でした。デメリットもありますがjupyter notebookをGit上で管理している人にはmustなツールだと思います。
この記事を読んで興味が湧いた方は試しに使ってみてください。
最後に、私が所属しているAIトランスフォーメーションセンターのwebサイトでは、毎月2、3記事のペースでコラムを公開しています。
Kaggle MasterによるKaggleコンペのはじめ方解説や最新の論文に基づいたAIモデル構築手法の提案、さらにAIソフトウェア開発のリアルな現状など、データサイエンスやAIにまつわる様々な情報を発信していますのでぜひ閲覧ください。
それでは。
執筆:@tokuhara.hikaru、レビュー:@higa (Shodoで執筆されました)