WSL2+DockerでJupyter Labが動作しない
最近開発用のノートPCを更新しました。以前使っていたHP spectre x360を非常に気に入っていたんですが、ディスプレイを割ってしまい。。。
ということで、開発環境を再度構築している中で、Jupyter Labが動作しないということが起きました。結構詰まってしまったんですが、なんとかできたのでその解決メモです。
環境
まず、環境ですが、ノートPCはWindowsを使っています。これまでプログラム開発や解析ではLinuxを中心に行ってきているので、Windows10以降で使えるようになったWSL2(Linux用Windowsサブシステム)を使ってLinux環境をWindows上に作っています。
- OS:Windows11 バージョン22H2
- WSL:バージョン2(WSL2)
- ゲストOS:Ubuntu-22.04
(WSL2上) - Docker:23.0.1
- Dokcer Compose:2.16.0
Dockerファイルは以下のような感じです。
FROM pytorch/pytorch:2.0.0-cuda11.7-cudnn8-devel
# Upgrade pip.
RUN pip install --upgrade pip
RUN pip install --upgrade setuptools
# Install python library.
RUN pip install --ignore-installed \
jupyter tensorboard \
jupyterlab \
jupyterlab_vim \
numpy \
pandas \
matplotlib \
opencv-contrib-python \
scipy \
pyshp \
shapely \
geopy \
mecab-python3==0.7 \
torchtext
エラーが起きた状況
上記の環境でJupyter Labを起動させると、起動自体はします。がコマンドが実行できない、というか実行しても返ってこないという状況になりました。
実行中を示す*が表示されたままで終わりません。
そのまま待っていると、未実行の状態[ ]に戻ってしまいます。
そこで、コマンドラインを見てみると以下のようなエラーが出てました。
ImportError: version conflict: '/opt/conda/lib/python3.10/site-packages/psutil/_psutil_linux.cpython-310-x86_64-linux-gnu.so' C extension module was built for another version of psutil (5.9.0 instead of 5.9.5); you may try to 'pip uninstall psutil', manually remove /opt/conda/lib/python3.10/site-packages/psutil/_psutil_linux.cpython-310-x86_64-linux-gnu.so or clean the virtual env somehow, then reinstall
原因としては、psutilのバージョンがconflictしてるんだろうなぁということがわかります。だけど、実は以前のノートPCで同じDockerfileで動いている実績がありました。しかも、Dockerを使っているからPCが変わっても環境には依存しないはずじゃ?なんで?
動作していた環境との差異
とりあえず、動作している環境でインストールされたライブラリのバージョンを調べてみました。一部割愛してますが、以下のような差異がありました。
動作していた環境のrequirements.txt
conda==4.8.3
conda-build==3.18.11
conda-package-handling==1.6.0
・・・
jupyter==1.0.0
jupyter-client==7.3.4
jupyter-console==6.4.4
jupyter-core==4.11.1
jupyter-server==1.18.1
jupyterlab==3.4.5
jupyterlab-pygments==0.2.2
jupyterlab-server==2.15.0
jupyterlab-vim==0.15.1
jupyterlab-widgets==3.0.2
・・・
notebook==6.4.12
notebook-shim==0.1.0
numpy==1.21.6
・・・
psutil==5.9.1
・・・
torch==1.12.1
torchtext==0.13.1
torchvision==0.6.0a0+82fd1c8
エラーが起きる環境のrequirements.txt
conda==22.11.1
conda-build==3.23.3
conda-package-handling @ file:///croot/conda-package-handling_1666940373510/work
・・・
jupyter==1.0.0
jupyter-console==6.6.3
jupyter-events==0.6.3
jupyter-ydoc==0.2.3
jupyter_client==8.1.0
jupyter_core==5.3.0
jupyter_server==2.5.0
jupyter_server_fileid==0.8.0
jupyter_server_terminals==0.4.4
jupyter_server_ydoc==0.8.0
jupyterlab==3.6.3
jupyterlab-pygments==0.2.2
jupyterlab-vim==0.16.0
jupyterlab-widgets==3.0.7
jupyterlab_server==2.22.0
・・・
notebook==6.5.3
notebook_shim==0.2.2
numpy==1.24.2
・・・
psutil==5.9.4
・・・
torch==2.0.0
torchdata==0.6.0
torchelastic==0.2.2
torchtext==0.15.1
torchvision==0.14.1
確かに、動かない方はpsutil 5.9.4(エラーが出ているのは5.9.5だけど?)と動いている環境に比べて新しいバージョンがインストールされてますね。他にも全体的にバージョンが上がってました。この辺が怪しいなと。
ここで、動いている環境と同じバージョンを固定してインストールすれば解決するはずです。ですが、それだと問題を先送りすることになるだけなので、ちょっとがんばって調査をしてみます。
エラーメッセージを見てみる
ここでエラーメッセージを見ると、psutilがconflictしているから一度アンインストールしてもう一回インストールしてね、と書いてあるので試してみました。とここで、おかしなことが起きます。
ん? pip uninstall psutilしても、まだpsutilがいる。。。
とりあえず、一回uninstallしてもいるので、もう一回uninstallしてからinstallすると、なんと
動きました!!
エラーメッセージの通りpsutilのconflictが原因に間違いはなさそうです。でも、なんでpsutilの異なるバージョンが2つ入ってしまったのか。pipならパッケージ管理はしてくれるはずなのに。
エラーメッセージをよくよく見てみる
なんでそんなことが起こるのかなぁと、もう一回エラーメッセージに戻ります。現場(ログ)100回ですね(笑)。ここで気付きました!
このimage、conda使ってるんじゃ?
これが大正解でした。使用していたコンテナイメージがcondaで環境を作っていたんです。試しにimageをpython:3.9.16に変更したところ、さくっと動きました。とはいえ、これだとpytorchでGPUが使えないので、最初のイメージでも動くようにしました。pipでパッケージをインストールする前に、condaのpsutilをuninstallします。具体的には、Dockerfileを以下のようにしました。
FROM pytorch/pytorch:2.0.0-cuda11.7-cudnn8-devel
# resolve conflict psutil
RUN conda uninstall psutil==5.9.0
# Upgrade pip.
RUN pip install --upgrade pip
RUN pip install --upgrade setuptools
・・・以下、同じ
これでJupyter Labが動くようになりました!
この記事を書いていて気付いたんですが、これでGPUを使ったpytorch動かないかもですね。。。
確認してまた書きます。
Discussion