WSL1でjupyter環境を他人に配る

仕事でjupyterでさくっと解析したのを、他の部署や一緒に研究やってる客先に渡したいことってありますよね。とはいえ、相手先にpython環境入れて下さい。って御願いするのは気が引けるので、WSLつかって環境を1ファイルにまとめて配る方法を考えてみました。WSLだとwindows標準だし、インストールに数分、起動に3秒程度なので気楽に試せる気がします。

ということで、役に立つBATファイル群をgithubにおいときました。

使い方イメージ

相手先(便宜上客先と呼ぶ)の状況をとりあえず体験したい人は、以下バッチファイルの入ったzipを展開し、そのフォルダにjupyter.tar.gzをタウンロードしてを置いて下さい。jupytar.tar.gzは後述の「イメージの作り方」で説明している方法で作った場合のものになります。実証のためのバイナリ公開しているだけなので、配布する時は改めてをUbuntu-base,miniforgeのサイト等を確認してください。

インストール作業

客先に以下の様なファイル群を送ります。客先は0_Enable_WSL.bat, 1_Install_jupyter.batのバッチファイルを順にインストールすればインストール完了。後述しますがjupyter.tar.gzが自分が作った環境です。jupyter環境だけで200MB強、pandas, scipy, scikit-learn,matplotlibを入れる500MB弱になります。

jupyter起動

3_RUN_jupyter.batを起動すると以下のような画面がでるので、表示されているURLをコピーしてブラウザに貼り付け(1行目でも、2行目でも通常は大丈夫)。

すると以下のようにjupyterが起動します。左のファイル一覧は、3_RUN_jupyter.batがあるフォルダなので、そこに予め自分が作ったipynbファイルを置いておけばすぐにファイルを開いて作業できます。

客先で弄った環境を持ち帰りたい(エクスポート)

apt/condaでパッケージを追加したりjupyterのextensionを入れた場合その弄った環境を持ち帰って検証したいですよね。EXPORT_wsl_jupyter.batを実行するとjupyter_export.tar.gzファイルができるのでそれを持ち帰ればOK。他の環境にインストールするときはjupyter.tar.gzにファイル名を変えて1_Install_jupyter.batを実行すれよいです(実行時にhowto_build_imageフォルダのinstall_gzip_for_exportWS.bat も必要なので注意)。
なお同じディストリビューション名にはインストールできないので、事前にbatファイルを書き換えるか、UNINSTALLを実行して古い方のjupyter環境を消して下さい。

イメージの作り方

できるだけ小さく作れて、aptやcondaは使いたいけど、送る客先が大企業なので、Anacondaが有料とか説明するのが面倒なので使いたくない。あるあるですね。ということで、Ubuntu-base(最小限のubuntu)とMiniforge( minicondaのconda-forgeレポジトリ版)。を使ったセットアップを説明します。

Ubuntu-baseのインストール

WSLのインストールされた環境で、how_to_build_imageフォルダのinstall_ubuntu_base.batをダブルクリックするとub_testというディストリビューション名(WSLは各環境を「ディストリビューション」って呼ぶ)のubuntuをインストールしてくれます。

wsl -d ub_test

とするとrootユーザとしてログインできるので、そこで環境を構築します。

環境構築

まずはMiniforgeをインストールするために以下の一連のコマンドを実行します。webからファイルをとってくるためにcurlをインストールして、miniforgeのインストーラを起動します。途中でyesやエンターやらを押す必要があります。

apt update
apt install -y curl
curl -OL https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh
sh Miniforge3-Linux-x86_64.sh

ここでconda環境を有効化するために一旦Ctrl-dでログアウトして、wsl -d ub_testで入りなおすか、source ~/.bashrcとしてcondaを有効化してください。次にjupyter等をインストールします。インストール後に、要らないキャッシュファイルを削除しておくと配布するtar.gzが小さくなります。

conda install -y jupyterlab
conda clean --all
apt clean

最後に、wsl -d ub_test としたら自動でjupyterが起動するようにします。jupyter labを自動起動して、jupyter labを終了したらログアウトするようにしています。こうすることで、jupyterをブラウザからshutdownすれば自動的にWSLのウィンドウも閉じるようになります。

echo "
 jupyter lab --allow-root
 logout
 " >>~/.profile

jupyterを起動せずにメンテナンスする時は?

jupyterがいきなり起動するとログインしてメンテナンスできないように思えますが、wsl -d ub_test -e bash としてシェルを直接実行すればログイン時の.profileは実行されないので、jupyterの起動を回避して中のファイルを直接メンテナンスできます。

環境をエクスポートする

客先には上の例でいうjupyter.tar.gzをエクスポートして配布する必要があります。EXPORT_wsl_jupyter_from_ub_test.batを実行すればいいのですが、ちょっとだけ解説。WSLは tar.gz形式をimportできるのにexportはtarのみです。なので以下のように、後付けでgz圧縮して上げる必要があります。

wsl --export ub_test - | gzip.exe -9 - >  jupyter.tar.gz 

なお、上のバッチファイルの中では、gzip.exeがなければ、ネットから拾ってくるようにinstall_gzip_for_exportWSL.batを呼び出しています。

なんで名前を使い分けるの?

上の説明ではub_testというディストリビューション名でイメージを作成して実際にはjupyterとディストリビューション名で配布しています。使い分けている理由は、exportしたつもりで環境を消したら、exportしわすれてたといううっかりミス発生時にデータが消えることを防ぐためです。

環境を調整しながらexportして、配布ファイルサイズ等のチェックをするという作業を手作業でやってるとうっかりミスが意外と起きるのです。