//
24/11/27 WindowsよりもWSL2の方がFluxの画像生成がちょっと速い
Made with

24/11/27 WindowsよりもWSL2の方がFluxの画像生成がちょっと速い

作成日時
November 27, 2024 12:32 PM
タグ
Empty
この前WindowsでTorch.CompileによってFlux画像生成を20%高速化できて、まあまあ満足していた。
しかし昨日見かけたRedditのComfyUI開発者のこちらのコメント
ALT
LinuxでRTX4090でTorch.Compileすると生成速度は3.45it/sに達する…!?それが本当なら20ステップでたったの5.8秒で生成できてしまうではないか…!!
そんなバカな…私のWindows環境ではTorch.Compileしても2.63it/s…8.25秒程度を要するというのに…!
OSの違いでそんなに速度ちげえの?
メチャクチャ羨ましくなった結果、自分もWSL2のComfyUIを試してどんだけ速度上がるか見てみようと思った。
その結果、WindowsからWSL2に移行しただけで、1024x1024の画像の生成時間は10.59秒から9.74秒に0.85秒減少、生成速度は8.7%向上した!そしてWindows+Torch.CompileからWSL2+TorchCompileでは生成時間8.25秒→7.45秒に0.8秒減少、生成速度10.7%向上!
1920x1088の場合は、Windows→WSL2で生成時間27.31秒→23.38秒に3.93秒減少、生成速度16.8%向上!Windows+Torch.CompileからWSL2+TorchCompileでは生成時間23.21秒→19.78秒に3.43秒減少、生成速度17.3%向上!
1024x1024の場合
it/s
生成時間(秒)
Windows
2.02
10.59
Windows+Torch.Compile
2.63
8.25
WSL2
2.2
9.74
WSL2+Torch.Compile
2.92
7.45
1920x1088の場合
it/s
生成時間(秒)
Windows
0.78
27.31
Windows+Torch.Compile
0.93
23.21
WSL2
0.92
23.38
WSL2+Torch.Compile
1.09
19.78
結構速くなったね!
とは言えせいぜい2.92it/sであって、コメントに書かれてるような3.45it/sなんて全然出ない。やっぱりWSL2よりもネイティブのLinuxにすればもっと速いのかもしれない。あるいはWindowsの画面描画をRTX4090じゃなくてiGPUとかにやらせれば速くなるかも。
いずれにせよiGPUは無いしネイティブLinuxに移行するわけにもいかないので現状はこれで満足しとくしかないだろう。
ちなみにTorch.Compile自体もWindowsだと2分以上待たされるところをWSL2だと1分半程度で済んで速くなってる…ような気がする。
しかし、いくらComfyUIをWSL2に移行したくても、私にとってはEagleとの連携が必須なので、Eagleと連携するカスタムノードがWSL2で動作しない以上は移行できない~と思ってたのだが、その辺を何とかした話は記事の末尾に書いておく。

WSL2のUbuntuにComfyUIをセットアップする手順

まずWSL2を開いてconda環境を作る
conda create -n comfyui python==3.12
conda activate comfyui
以下、ComfyUIのLinux向け手動インストールの方法に従う
ComfyUIのリポジトリをクローン
git clone https://github.com/comfyanonymous/ComfyUI.git
cd ComfyUI
pytorchをインスコ
pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu124
諸々インスコ
pip install -r requirements.txt
以下のコマンドでComfyUIが起動する
python main.py
ただし、このままではWindows側のWebブラウザからWSL2上のComfyUIサーバを開けない。よってComfyUIの起動コマンドを
python main.py —listen 0.0.0.0
としておけば接続できるようになる。
でもWebブラウザから接続するIPアドレスは何なのか?というと以下のコマンドで調べられる。↓
wsl -e hostname -I
ALT
この場合、Webブラウザから接続するアドレスはこうなる↓
http://172.19.199.244:8188
ComfyUI自体のセットアップはこれでいいとして、FluxのモデルファイルとかをWSL内のComfyUIのモデルフォルダにコピーしなきゃいけないが、なんかダルい。
別にコピーしなくても、ComfyUIフォルダ内にextra_model_paths.yamlを作って、たとえば以下のように書けば済む。WSL2からはWindows側の全てのファイルが/mnt以下からアクセスできる。
ALT
まあこれでいいっちゃいいんだが、なんとなくmnt以下のモデルファイルの読み込みに時間がかかる気がする。原因は分からない。どうしても気になったらやっぱ素直にWSL側にモデルファイルコピーするかもしれない。
で、ComfyUI入れたらまずやる事はComfyUI-Managerのインスコだろう。というわけでComfyUI/custom_nodesディレクトリにクローンする。
それでComfyUIを再起動すればComfyUI-Managerが使えるようになる。
さっそくGitURLからカスタムノードを入れようとしたが、なんか文句言われてできない。ComfyUIを —listen引数付きで起動した場合、このままではGitURLからカスタムノード入れられないらしい。
ComfyUI/custom_nodes/ComfyUI-Manager/config.iniを開いてsecurity_level = weakと書き換えればカスタムノード入れられるようになる。(またComfyUIを再起動する)
ALT
それにしても今まで入れてきた大量のカスタムノードを入れ直すのもかなり面倒だ。全部コピーしちゃえば行けるんじゃね?と思ってやってみたがエラーが出たのでダメらしい。やはりComfyUI-Managerからコツコツ入れ直すしかなさそうだ。
ここまでできたのでFluxで画像生成しようとしたのだが、なんかTorch.Compileでパーミッションエラーが出た。確認したら何故かキャッシュディレクトリのオーナーがRootになってたのでchownで現在のユーザに変更したら直った。
sudo chown -R umiyuki:umiyuki /home/umiyuki/.triton ユーザ名などは適宜変更 
ALT

D2-Send-EagleカスタムノードをWSL2でも動くようにする

ComfyUIで生成した画像をEagleに送ってくれるD2-Send-Eagleカスタムノードを私は愛用しており、これが無いとまったく話にならないので、WSL2でComfyUI動かしてもこのノードが動作しないので移行できなくて困ってた。
この件についてSonnet3.5に相談してみたら、ノードのコードを修正していい感じにWSL2でも動くようにしてくれた!というわけでせっかくなので改造したコードのリポジトリを置いておく↓
普通にComfyUI-Managerからインスコすれば使えるはずだ。
さて、これでもう大丈夫と言いたいが、今まではComfyUIを起動するには起動バッチファイルを叩くだけでよかったのに、WSL2だとまずWSL2を開いてconda環境に入ってサーバ開いて、それからWSL2に接続できるipアドレス調べて…って手間がダルいぞ!と思ったのでその件もSonnet3.5に相談してみたら、これまたいい感じに諸々やってくれるバッチファイルを書いてくれた。
PowerShell
Copy
@echo off setlocal enabledelayedexpansion rem タイトルを設定 title ComfyUI WSL Launcher :get_wsl_ip rem WSLのIPアドレスを取得 for /f "tokens=*" %%i in ('wsl hostname -I') do set WSL_IP=%%i set WSL_IP=%WSL_IP: =% if "%WSL_IP%"=="" ( echo WSLのIPアドレスを取得できませんでした。 echo WSLが起動していることを確認してください。 pause exit /b 1 ) rem ComfyUIのURL set COMFY_URL=http://%WSL_IP%:8188 echo ComfyUI URL: %COMFY_URL% echo 接続確認中... rem 接続テスト(PowerShellを使用) powershell -Command "$res = $null; try { $res = Invoke-WebRequest -Uri '%COMFY_URL%' -TimeoutSec 2 } catch {}; exit ([int]($res -eq $null))" > nul if %errorlevel% neq 0 ( echo ComfyUIに接続できません。 echo ComfyUIが起動していることを確認してください。 echo. set /p choice="ComfyUIを起動しますか? (Y/N): " if /i "!choice!"=="Y" ( echo ComfyUIを起動中... rem WSL内でのComfyUI起動コマンドを新しいウィンドウで実行 start "ComfyUI Server" wsl -u umiyuki -d Ubuntu-20.04 -e bash -ic ". ~/.bashrc && conda activate comfyui && cd ~/ComfyUI && python main.py --listen 0.0.0.0" echo サーバーの起動を待機中... rem サーバーが応答するまで待機(最大60秒) set /a attempts=0 :wait_loop timeout /t 2 /nobreak > nul set /a attempts+=1 powershell -Command "$res = $null; try { $res = Invoke-WebRequest -Uri '%COMFY_URL%' -TimeoutSec 2 } catch {}; exit ([int]($res -eq $null))" > nul if %errorlevel% neq 0 ( if !attempts! lss 30 ( echo 起動を待機中... 試行回数: !attempts!/30 goto wait_loop ) else ( echo タイムアウト:サーバーの起動に失敗しました。 pause exit /b 1 ) ) echo サーバーが起動しました! rem 追加の待機時間(サーバーの完全な初期化を待つ) timeout /t 2 /nobreak > nul rem ブラウザでURLを開く echo ブラウザを起動しています... powershell -Command "Start-Process '%COMFY_URL%'" echo. echo すべての処理が完了しました。 echo サーバーウィンドウは閉じないでください。 echo この画面は閉じても構いません。 ) else ( pause exit /b 1 ) ) else ( echo ComfyUIは既に起動しています。 echo ブラウザを起動しています... powershell -Command "Start-Process '%COMFY_URL%'" ) echo. echo 操作を終了するには任意のキーを押してください... pause > nul endlocal
ただし以下の部分の辺りは各自の環境に合わせてガッツリ書き換えないと動かないだろう↓
start "ComfyUI Server" wsl -u umiyuki -d Ubuntu-20.04 -e bash -ic ". ~/.bashrc && conda activate comfyui && cd ~/ComfyUI && python main.py --listen 0.0.0.0"
とにかくこれで今までと同様にバッチファイル一発でComfyUIが起動できるようになった。