見出し画像

WindowsローカルでJupyerlabを動かす(前編)

先日PCが寿命を迎えました。お金はないものの、この機会に思い切ってそこそこのGPU(GeForce RTX 4060 Ti , VRAM 16GB)を積んだPCを買いました。計算性能はそれなりですが、VRAMの大きさが画像生成にとって魅力的です。
GoogleColabで作っていたノートブックを新PCのローカル上で動かせるようになったので、その方法をメモします。ゲーム制作の記事とは違い、狭い内容でもないのでnoteに書きます。

目標

・Diffusersを使用するノートブックをWindows機のローカルで実行し、画像生成する
・実行環境のjupyterlabはローカルで閉じる。GoogleColabからローカルにアクセスしない
・PyTorchのGPU対応パッケージを使用する。Diffusers実行時にGPUを使用するため
・jupyterlab上でIPyWidgetsを使えるようにする。ノートブックでウィジェット表示に使用しているため
・Pythonの仮想環境内にライブラリをインストール。ローカルをできるだけ汚さない
・Anacondaを使わない

具体的には、自作のColabノートブックを新PCのローカルで動かせるようにしました。(ディスコンですが…)

手順まとめ

いずれもコマンドプロンプトから実行。PowerShellだと権限がなくて怒られる。

仮想環境の作成~jupyterlab起動

PythonはWindows環境にインストール済みとする。

venvで仮想環境を作成:colabフォルダとする

$ cd C:\Path\To\venvRoot
$ python -m venv colab
venvを起動

$ cd C:\Path\To\venvRoot\colab	
$ Scripts¥activate
venv上で、jupyterlabとipywidgetsをバージョン指定してインストール
※バージョンは2024-09-10現在

(colab) $ pip install jupyterlab==4.2.5 ipywidgets==8.1.1  
jupyterlabを起動。空白に注意。ブラウザのウィンドウが表示される。
実行したいノートブックのあるフォルダをオプションで指定

(colab) $ jupyter lab --notebook-dir C:\Path\To\NotebookDir

ノートブックのセルに記述するインストール処理

PyTorch2.3.1 や PyTorch2.4.1で、fbgemm.dllの依存性の問題は解決する。PyTorch2.x.0 だと問題が再現されるのかもしれない。
requirements.txtの内容は適宜変更のこと。

txt = """
--extra-index-url https://download.pytorch.org/whl/cu124
torch
scipy
safetensors
diffusers
accelerate
transformers
"""
with open("requirements.txt", "w") as f:
    print(txt, file=f)

!pip install -r requirements.txt

ノートブックのソース変更

(次の記事に記述)

詳細・インストール時

JupyterLab

JupyterLabをデフォルトで実行すると、コマンドラインから起動したときのカレントディレクトリがjupyter内のルートディレクトリ'/'になります。上記の場合は C:\Path\To\venvRoot\colab 、つまり仮想環境の直下となります。
仮想環境はよく削除しがちなので、毎回ここに作成途中のファイルを置くような作業は避けたいです。
--notebook-dir オプションを使うと、指定したフォルダをjupyter上のルートにできます。このオプションで作業用のファイル置き場をルートとして指定してやるとよいでしょう。
なおノートブック内でpipを使うと、JupyterLabを起動した環境にライブラリがインストールされます。ノートブックごとに環境を切り分けたい場合は、仮想環境ごと切り分けましょう。(JupyterLab内では隔離できない)

IPyWidgetsとJupyterLab

IPyWidgetsとJupyterLabにはバージョンの相性があります。特定のバージョンならIPyWidgetsでのGUI表示ができます。基本的にIPyWidgetsをバージョン無指定=最新版でインストールするとGUI表示できません。
そこでJupyterLabのリリースノートを見て、JupyterLabに適合するipywidgetsのバージョンを探します。具体的には、JupyterLabのchangelogから、 Bump ipywidgets from 8.1.0 to 8.1.1 のような文面を探します。

JupyterLab 4.1.0 時点で ipywidgetsが8.1.1まで対応。これが調査時点での最新

PyTorchとCUDA

PyTorchについてはGPU対応パッケージを利用します。そのため、公式にあるようにインストール元のURLを指定します。

使うGPUに対応したCUDAのバージョンを選びます。以下の記事を参考にしてインストールするバージョンを決めました。

使うGPUはGeForce RTX 4060 Tiです。そこから表を引いてCUDAのバージョンを探しました。
・Compute Capability : 8.9
・Microarchitecture : Ada Lovelace
→ CUDA SDK Version : 11.8 以降

使用GPUに対応するCUDAはVersion 11.8 以降となるので、作業時点の最新版CUDA 12.4版のパッケージをインストールしました。

ちなみにWikipediaの"GPUs supported"の表を引くとき、緑色で塗っている表ではなく、地味な"Compute Capability, GPU semiconductors and Nvidia GPU board products"の表を先に探すのがコツです。MicroarchitectureとCUDAバージョンとの対応はこちらにあります。慣れたら緑色の表のほうが早く探せますが、初見だと表の見方に迷いました。

requirements.txt ファイルの自動生成

notebookでは、requirements.txt を使ってパッケージを一括インストールするようにしました。pip install でパッケージ名を直書きするよりも、requirements.txtを使うと依存関係を解決してくれるようです。

ただしrequirements.txtファイルを仮想環境に一旦置く必要があるので、pythonのコードでファイルを自動生成することにしました。print()の出力をリダイレクトするだけのコードですが…

pipでのインストール時にパッケージの探索先URLを追加するには、--extra-index-url オプションを使います。PyTorch公式での書き方の --index-url だと、探索先の追加ではなく上書きしてしまいます。すると requirements.txt に書いた他のパッケージもPyTorchのURLから探そうとしてエラーとなります。

Windows版PyTorchのバージョン問題

Windows環境で、PyTorchのバージョンによってはfbgemm.dllの依存性のエラーが出てPythonでのimport文がこけることがあります。PyTorch 2.4.0 ではエラーが出たのですが、2.4.1 では無事動作しました。下の記事では2.3.1のインストールで解決したそうです。
2.3.0, 2.4.0で依存性のエラーが出て、2.3.1, 2.4.1で依存性が解決しているので、2.x.0 に限って依存性の問題が出るのかもしれません。

エラーの直接の原因としては、エラーが出るバージョンではfbgemm.dllがlibomp.dllに依存していて、そのライブラリが見つからないためです。
libomp.dllはLLVMの同梱ライブラリの一つで、LLVM OpenMPのDLLです。
なので、大掛かりな対処にはなりますが、LLVMをPCにインストールするかWindows版のLLVMのパッケージからlibomp.dllをfbgemm.dllと同じフォルダ(仮想環境のルート\Lib\site-packages\torch\lib)にコピーすると問題が解決します。
なお、エラーが出ないバージョンではfbgemm.dllがlibiomp5md.dllに依存していて、こちらはPyTorchのパッケージに同梱されています。libiomp5md.dllはIntel OpenMPのDLLです。

linuxでPyTorchを使う場合、たいていはLLVMかClangが最初からインストールされていて、libomp.dllがPython外の環境に入っているため問題が表面化しにくいのだと思います。Windowsの場合は、LLVMを直接使うことがないかぎりLLVMパッケージをPCにインストールする機会はないでしょう。

ちなみにfbgemm.dllとはFacebookが公開している行列演算ライブラリだそうです。

続き

ノートブックのソース変更の内容は分量が多いので、次の記事で書きます。

いいなと思ったら応援しよう!