この前WindowsでTorch.CompileによってFlux画像生成を20%高速化できて、まあまあ満足していた。
しかし昨日見かけたRedditのComfyUI開発者のこちらのコメント
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の場合
1920x1088の場合
結構速くなったね!
とは言えせいぜい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の起動コマンドを
としておけば接続できるようになる。
でもWebブラウザから接続するIPアドレスは何なのか?というと以下のコマンドで調べられる。↓
wsl -e hostname -I
この場合、Webブラウザから接続するアドレスはこうなる↓
http://172.19.199.244:8188
ComfyUI自体のセットアップはこれでいいとして、FluxのモデルファイルとかをWSL内のComfyUIのモデルフォルダにコピーしなきゃいけないが、なんかダルい。
別にコピーしなくても、ComfyUIフォルダ内にextra_model_paths.yamlを作って、たとえば以下のように書けば済む。WSL2からはWindows側の全てのファイルが/mnt以下からアクセスできる。
まあこれでいいっちゃいいんだが、なんとなく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を再起動する)
それにしても今まで入れてきた大量のカスタムノードを入れ直すのもかなり面倒だ。全部コピーしちゃえば行けるんじゃね?と思ってやってみたがエラーが出たのでダメらしい。やはりComfyUI-Managerからコツコツ入れ直すしかなさそうだ。
ここまでできたのでFluxで画像生成しようとしたのだが、なんかTorch.Compileでパーミッションエラーが出た。確認したら何故かキャッシュディレクトリのオーナーがRootになってたのでchownで現在のユーザに変更したら直った。
sudo chown -R umiyuki:umiyuki /home/umiyuki/.triton ユーザ名などは適宜変更
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が起動できるようになった。