🐋

WSL2+DockerでJupyter Labが動作しない

2023/05/01に公開

最近開発用のノート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