diff --git a/launch_comfyui.bat b/launch_comfyui.bat new file mode 100644 index 0000000..3207f34 --- /dev/null +++ b/launch_comfyui.bat @@ -0,0 +1,497 @@ +@echo off +title ComfyUI Unified Launcher +cd /d "%~dp0" +color 0B +cls + +echo. +echo ================================================================ +echo ComfyUI Unified Launcher +echo ================================================================ +echo. + +:: Check command line parameter +set "MODE=%1" +if "%MODE%"=="" goto :SHOW_MENU +if /i "%MODE%"=="master" goto :SETUP +if /i "%MODE%"=="all-slow" goto :SETUP +if /i "%MODE%"=="all-fast" goto :SETUP +if /i "%MODE%"=="venv" goto :ACTIVATE_VENV +if /i "%MODE%"=="update" goto :UPDATE_COMFYUI +if /i "%MODE%"=="update-nodes" goto :UPDATE_NODES + +echo. +echo ERROR: Invalid parameter: %MODE% +echo. +timeout /t 2 /nobreak >nul +goto :SHOW_MENU + +:SHOW_MENU +color 0B +echo ---------------------------------------------------------------- +echo Launch Mode Selection +echo ---------------------------------------------------------------- +echo. +echo [1] Master only +echo ^> Launch only the master instance +echo. +echo [2] All instances (fast) +echo ^> Launch all instances with 2-second delays +echo. +echo [3] All instances (sequential) +echo ^> Launch all instances, wait for each to be ready +echo. +echo [4] Activate virtual environment +echo ^> Open command prompt with venv activated +echo. +echo [5] Update ComfyUI +echo ^> Update ComfyUI to latest version +echo. +echo [6] Update custom nodes +echo ^> Update all custom nodes to latest versions +echo. +echo [Q] Quit +echo. +echo ---------------------------------------------------------------- +echo TIP: You can also launch directly from command line: +echo launch_comfyui.bat master +echo launch_comfyui.bat all-slow +echo launch_comfyui.bat all-fast +echo launch_comfyui.bat venv +echo launch_comfyui.bat update +echo launch_comfyui.bat update-nodes +echo ---------------------------------------------------------------- +echo. +set /p "CHOICE= ^> Enter your choice (1, 2, 3, 4, 5, 6, or Q): " + +if /i "%CHOICE%"=="1" ( + set "MODE=master" + goto :SETUP +) +if /i "%CHOICE%"=="2" ( + set "MODE=all-fast" + goto :SETUP +) +if /i "%CHOICE%"=="3" ( + set "MODE=all-slow" + goto :SETUP +) +if /i "%CHOICE%"=="4" ( + goto :ACTIVATE_VENV +) +if /i "%CHOICE%"=="5" ( + goto :UPDATE_COMFYUI +) +if /i "%CHOICE%"=="6" ( + goto :UPDATE_NODES +) +if /i "%CHOICE%"=="q" ( + echo Exiting... + exit /b 0 +) + +echo. +echo ERROR: Invalid choice. Please enter 1, 2, 3, 4, 5, 6, or Q. +echo. +timeout /t 2 /nobreak >nul +goto :SHOW_MENU + +:SETUP +echo Mode: %MODE% +echo. + +:: Check if gpu_config.json exists (relative path) +set "CONFIG_PATH=ComfyUI\custom_nodes\ComfyUI-Distributed\gpu_config.json" +if not exist "%CONFIG_PATH%" ( + color 0C + echo Error: Configuration file not found! + echo Expected location: %CONFIG_PATH% + echo. + echo Make sure ComfyUI-Distributed custom node is installed. + pause + exit /b 1 +) + +:: Check if venv exists (relative path) +set "VENV_PATH=venv" +if not exist "%VENV_PATH%\Scripts\activate.bat" ( + color 0C + echo Error: Virtual environment not found! + echo Expected location: %CD%\%VENV_PATH% + echo Make sure this batch file is in the ComfyUI directory with venv folder + pause + exit /b 1 +) + +:: Check if ComfyUI CLI is available in venv +call "%VENV_PATH%\Scripts\activate.bat" && comfy --help >nul 2>&1 +if %ERRORLEVEL% NEQ 0 ( + color 0C + echo Error: ComfyUI CLI not found in virtual environment! + echo Make sure ComfyUI CLI is installed in: %VENV_PATH% + pause + exit /b 1 +) + +:: Jump to appropriate mode +if /i "%MODE%"=="master" goto :MODE_MASTER +if /i "%MODE%"=="all-slow" goto :MODE_ALL_SLOW +if /i "%MODE%"=="all-fast" goto :MODE_ALL_FAST + +::============================================================================= +:: MASTER MODE - Launch only the master instance +::============================================================================= +:MODE_MASTER +echo Configuring memory management for large models... +set PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True +echo Memory management configured. + +echo Loading master configuration... + +:: Read master configuration +powershell -NoProfile -Command "try { $json = Get-Content '%CONFIG_PATH%' -Raw | ConvertFrom-Json; $master = $json.master; Write-Output \"MASTER_PORT=$($master.port)\"; Write-Output \"MASTER_CUDA=$($master.cuda_device)\"; Write-Output \"MASTER_EXTRA=$($master.extra_args)\" } catch { Write-Output \"PowerShell Error: $_\"; pause; exit 1 }" > %TEMP%\master_config.txt + +if %ERRORLEVEL% NEQ 0 ( + color 0C + echo Error reading master configuration! + pause + exit /b 1 +) + +for /f "tokens=*" %%i in (%TEMP%\master_config.txt) do ( + set %%i +) + +del %TEMP%\master_config.txt >nul 2>&1 + +:: Display master configuration +echo. +echo Master Configuration: +echo Port: %MASTER_PORT% +echo CUDA Device: %MASTER_CUDA% +echo Extra Args: %MASTER_EXTRA% +echo. + +:: Check if master is already running +echo Checking if master is already running... +powershell -NoProfile -Command "$ErrorActionPreference = 'SilentlyContinue'; $tcpClient = New-Object System.Net.Sockets.TcpClient; $connect = $tcpClient.BeginConnect('127.0.0.1', %MASTER_PORT%, $null, $null); $wait = $connect.AsyncWaitHandle.WaitOne(200, $false); if (!$wait) { exit 1 } else { $tcpClient.EndConnect($connect); $tcpClient.Close(); exit 0 }" + +if %ERRORLEVEL% == 0 ( + color 0E + echo Master is already running on port %MASTER_PORT%! + echo URL: http://localhost:%MASTER_PORT% + echo. + echo Press any key to exit... + pause >nul + exit /b 0 +) + +:: Launch master +echo Launching Master ComfyUI instance... + +:: Try Windows Terminal first, fall back to cmd +wt -w 0 new-tab --title "Master - ComfyUI CLI" --startingDirectory "%CD%" cmd /k "title Master - ComfyUI CLI && echo CUDA_VISIBLE_DEVICES=%MASTER_CUDA% && call venv\Scripts\activate.bat && set CUDA_VISIBLE_DEVICES=%MASTER_CUDA% && echo Starting ComfyUI Master... && comfy --here launch -- --port %MASTER_PORT% %MASTER_EXTRA%" 2>nul + +if %ERRORLEVEL% NEQ 0 ( + echo Windows Terminal not available, using regular command prompt... + start "Master - ComfyUI CLI" cmd /k "title Master - ComfyUI CLI && cd /d "%CD%" && echo CUDA_VISIBLE_DEVICES=%MASTER_CUDA% && call venv\Scripts\activate.bat && set CUDA_VISIBLE_DEVICES=%MASTER_CUDA% && echo Starting ComfyUI Master... && comfy --here launch -- --port %MASTER_PORT% %MASTER_EXTRA%" +) + +echo. +echo ====================================== +echo Master ComfyUI launcher started! +echo ====================================== +echo. +echo Expected URL: http://localhost:%MASTER_PORT% +echo CUDA Device: %MASTER_CUDA% +echo. +echo The ComfyUI window will open shortly. +echo This launcher will close in 1 second... + +timeout /t 1 /nobreak >nul +exit + +::============================================================================= +:: ALL-SLOW MODE - Launch all instances sequentially +::============================================================================= +:MODE_ALL_SLOW +echo Configuring memory management for large models... +set PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True +echo Memory management configured. + +:: Read configuration with PowerShell and store in environment variables +echo Loading configuration... + +powershell -NoProfile -Command "try { $json = Get-Content '%CONFIG_PATH%' -Raw | ConvertFrom-Json; $master = $json.master; $settings = $json.settings; $retryDelay = if ($settings.retry_delay_ms) { $settings.retry_delay_ms } else { 500 }; Write-Output \"RETRY_DELAY=$retryDelay\"; Write-Output \"MASTER_PORT=$($master.port)\"; Write-Output \"MASTER_CUDA=$($master.cuda_device)\"; Write-Output \"MASTER_EXTRA=$($master.extra_args)\"; foreach ($worker in $json.workers) { if ($worker.enabled -and -not $worker.host) { Write-Output \"WORKER_$($worker.id)_NAME=$($worker.name)\"; Write-Output \"WORKER_$($worker.id)_PORT=$($worker.port)\"; Write-Output \"WORKER_$($worker.id)_CUDA=$($worker.cuda_device)\"; Write-Output \"WORKER_$($worker.id)_EXTRA=$($worker.extra_args)\" } } } catch { Write-Output \"PowerShell Error: $_\"; pause; exit 1 }" > %TEMP%\config_vars.txt + +if %ERRORLEVEL% NEQ 0 ( + color 0C + echo Error running PowerShell configuration reader! + pause + exit /b 1 +) + +for /f "tokens=*" %%i in (%TEMP%\config_vars.txt) do ( + set %%i +) + +del %TEMP%\config_vars.txt >nul 2>&1 + +:: Check Master +echo Starting Master instance... +:MASTER_SLOW +powershell -NoProfile -Command "$ErrorActionPreference = 'SilentlyContinue'; $tcpClient = New-Object System.Net.Sockets.TcpClient; $connect = $tcpClient.BeginConnect('127.0.0.1', %MASTER_PORT%, $null, $null); $wait = $connect.AsyncWaitHandle.WaitOne(200, $false); if (!$wait) { exit 1 } else { $tcpClient.EndConnect($connect); $tcpClient.Close(); exit 0 }" +if %ERRORLEVEL% == 1 ( + if not defined MASTER_STARTED ( + echo Starting Master with CUDA_VISIBLE_DEVICES=%MASTER_CUDA% + start wt -w 0 new-tab --title "Master - ComfyUI CLI" --startingDirectory "%CD%" cmd /k "title Master - ComfyUI CLI && echo CUDA_VISIBLE_DEVICES=%MASTER_CUDA% && call venv\Scripts\activate.bat && set CUDA_VISIBLE_DEVICES=%MASTER_CUDA% && comfy --here launch -- --port %MASTER_PORT% %MASTER_EXTRA%" + set MASTER_STARTED=1 + ) + %TEMP%\worker_ids.txt + +for /f %%w in (%TEMP%\worker_ids.txt) do ( + call :PROCESS_WORKER_SLOW %%w +) + +del %TEMP%\worker_ids.txt >nul 2>&1 +goto :FINISH_ALL + +:PROCESS_WORKER_SLOW +set "WORKER_ID=%1" +call set "WORKER_NAME=%%WORKER_%WORKER_ID%_NAME%%" +call set "WORKER_PORT=%%WORKER_%WORKER_ID%_PORT%%" +call set "WORKER_CUDA=%%WORKER_%WORKER_ID%_CUDA%%" +call set "WORKER_EXTRA=%%WORKER_%WORKER_ID%_EXTRA%%" + +echo Starting %WORKER_NAME%... + +:WORKER_CHECK_LOOP_SLOW +powershell -NoProfile -Command "$ErrorActionPreference = 'SilentlyContinue'; $tcpClient = New-Object System.Net.Sockets.TcpClient; $connect = $tcpClient.BeginConnect('127.0.0.1', %WORKER_PORT%, $null, $null); $wait = $connect.AsyncWaitHandle.WaitOne(200, $false); if (!$wait) { exit 1 } else { $tcpClient.EndConnect($connect); $tcpClient.Close(); exit 0 }" +if %ERRORLEVEL% == 1 ( + if not defined WORKER%WORKER_ID%_STARTED ( + echo Starting %WORKER_NAME% with CUDA_VISIBLE_DEVICES=%WORKER_CUDA% + start wt -w 0 new-tab --title "%WORKER_NAME% - ComfyUI CLI" --startingDirectory "%CD%" cmd /k "title %WORKER_NAME% - ComfyUI CLI && echo CUDA_VISIBLE_DEVICES=%WORKER_CUDA% && call venv\Scripts\activate.bat && set CUDA_VISIBLE_DEVICES=%WORKER_CUDA% && comfy --here launch -- --port %WORKER_PORT% %WORKER_EXTRA% --enable-cors-header" + set WORKER%WORKER_ID%_STARTED=1 + ) + %TEMP%\config_vars.txt + +if %ERRORLEVEL% NEQ 0 ( + color 0C + echo Error running PowerShell configuration reader! + pause + exit /b 1 +) + +for /f "tokens=*" %%i in (%TEMP%\config_vars.txt) do ( + set %%i +) + +del %TEMP%\config_vars.txt >nul 2>&1 + +echo. +echo Checking running instances... +echo. + +set "INSTANCES_STARTED=0" + +:: Check and start Master if not running +echo Checking Master (port %MASTER_PORT%)... +powershell -NoProfile -Command "$ErrorActionPreference = 'SilentlyContinue'; $tcpClient = New-Object System.Net.Sockets.TcpClient; $connect = $tcpClient.BeginConnect('127.0.0.1', %MASTER_PORT%, $null, $null); $wait = $connect.AsyncWaitHandle.WaitOne(200, $false); if (!$wait) { exit 1 } else { $tcpClient.EndConnect($connect); $tcpClient.Close(); exit 0 }" +if %ERRORLEVEL% == 1 ( + echo Master NOT running - Starting with CUDA_VISIBLE_DEVICES=%MASTER_CUDA% + start wt -w 0 new-tab --title "Master - ComfyUI CLI" --startingDirectory "%CD%" cmd /k "title Master - ComfyUI CLI && echo CUDA_VISIBLE_DEVICES=%MASTER_CUDA% && call venv\Scripts\activate.bat && set CUDA_VISIBLE_DEVICES=%MASTER_CUDA% && comfy --here launch -- --port %MASTER_PORT% %MASTER_EXTRA%" + set /a INSTANCES_STARTED+=1 + echo Waiting 2 seconds before checking next instance... + timeout /t 2 /nobreak >nul +) else ( + echo Master already running on port %MASTER_PORT% +) + +:: Check and start workers +powershell -NoProfile -Command "try { $json = Get-Content '%CONFIG_PATH%' -Raw | ConvertFrom-Json; foreach ($worker in $json.workers) { if ($worker.enabled -and -not $worker.host) { Write-Output $worker.id } } } catch { exit 1 }" > %TEMP%\worker_ids.txt + +for /f %%w in (%TEMP%\worker_ids.txt) do ( + call :CHECK_AND_START_WORKER_FAST %%w +) + +del %TEMP%\worker_ids.txt >nul 2>&1 + +echo. +echo ====================================== +if %INSTANCES_STARTED% == 0 ( + echo All instances were already running! +) else ( + echo Started %INSTANCES_STARTED% new instance^(s^)! +) +echo ====================================== +goto :FINISH_ALL + +:CHECK_AND_START_WORKER_FAST +set "WORKER_ID=%1" +call set "WORKER_NAME=%%WORKER_%WORKER_ID%_NAME%%" +call set "WORKER_PORT=%%WORKER_%WORKER_ID%_PORT%%" +call set "WORKER_CUDA=%%WORKER_%WORKER_ID%_CUDA%%" +call set "WORKER_EXTRA=%%WORKER_%WORKER_ID%_EXTRA%%" + +echo Checking %WORKER_NAME% (port %WORKER_PORT%)... +powershell -NoProfile -Command "$ErrorActionPreference = 'SilentlyContinue'; $tcpClient = New-Object System.Net.Sockets.TcpClient; $connect = $tcpClient.BeginConnect('127.0.0.1', %WORKER_PORT%, $null, $null); $wait = $connect.AsyncWaitHandle.WaitOne(200, $false); if (!$wait) { exit 1 } else { $tcpClient.EndConnect($connect); $tcpClient.Close(); exit 0 }" +if %ERRORLEVEL% == 1 ( + echo %WORKER_NAME% NOT running - Starting with CUDA_VISIBLE_DEVICES=%WORKER_CUDA% + start wt -w 0 new-tab --title "%WORKER_NAME% - ComfyUI CLI" --startingDirectory "%CD%" cmd /k "title %WORKER_NAME% - ComfyUI CLI && echo CUDA_VISIBLE_DEVICES=%WORKER_CUDA% && call venv\Scripts\activate.bat && set CUDA_VISIBLE_DEVICES=%WORKER_CUDA% && comfy --here launch -- --port %WORKER_PORT% %WORKER_EXTRA% --enable-cors-header" + set /a INSTANCES_STARTED+=1 + echo Waiting 2 seconds before checking next instance... + timeout /t 2 /nobreak >nul +) else ( + echo %WORKER_NAME% already running on port %WORKER_PORT% +) +goto :eof + +::============================================================================= +:: FINISH - Common ending for all modes +::============================================================================= +:FINISH_ALL +echo. +echo Master: http://localhost:%MASTER_PORT% +powershell -NoProfile -Command "try { $json = Get-Content '%CONFIG_PATH%' -Raw | ConvertFrom-Json; foreach ($worker in $json.workers) { if ($worker.enabled -and -not $worker.host) { Write-Output \"$($worker.name): http://localhost:$($worker.port)\" } } } catch { }" +echo. +echo Launcher will close in 5 seconds... +timeout /t 5 /nobreak >nul +exit + +::============================================================================= +:: ACTIVATE VIRTUAL ENVIRONMENT - Open command prompt with venv activated +::============================================================================= +:ACTIVATE_VENV +echo. +echo ================================================================ +echo Activating Virtual Environment +echo ================================================================ +echo. + +:: Check if venv exists +set "VENV_PATH=venv" +if not exist "%VENV_PATH%\Scripts\activate.bat" ( + color 0C + echo Error: Virtual environment not found! + echo Expected location: %CD%\%VENV_PATH% + pause + exit /b 1 +) + +echo Activating virtual environment... +echo Project folder: %CD% +echo. +echo Opening new command prompt with activated environment... +echo (You can close this window) +echo. + +:: Open new command prompt with venv activated +start "ComfyUI (Active venv)" cmd /k "call "%CD%\%VENV_PATH%\Scripts\activate.bat" & cd /d "%CD%"" +exit + +::============================================================================= +:: UPDATE COMFYUI - Update ComfyUI to latest version +::============================================================================= +:UPDATE_COMFYUI +echo. +echo ================================================================ +echo Updating ComfyUI +echo ================================================================ +echo. + +:: Check if venv exists +set "VENV_PATH=venv" +if not exist "%VENV_PATH%\Scripts\activate.bat" ( + color 0C + echo Error: Virtual environment not found! + pause + exit /b 1 +) + +:: Check if ComfyUI CLI is available +call "%VENV_PATH%\Scripts\activate.bat" && comfy --help >nul 2>&1 +if %ERRORLEVEL% NEQ 0 ( + color 0C + echo Error: ComfyUI CLI not found in virtual environment! + pause + exit /b 1 +) + +echo Starting ComfyUI update... +echo This may take a few minutes... +echo. + +:: Activate venv and run update +call "%VENV_PATH%\Scripts\activate.bat" && comfy --here update + +echo. +echo Update completed! +echo. +pause +exit + +::============================================================================= +:: UPDATE CUSTOM NODES - Update all custom nodes +::============================================================================= +:UPDATE_NODES +echo. +echo ================================================================ +echo Updating Custom Nodes +echo ================================================================ +echo. + +:: Check if venv exists +set "VENV_PATH=venv" +if not exist "%VENV_PATH%\Scripts\activate.bat" ( + color 0C + echo Error: Virtual environment not found! + pause + exit /b 1 +) + +:: Check if ComfyUI CLI is available +call "%VENV_PATH%\Scripts\activate.bat" && comfy --help >nul 2>&1 +if %ERRORLEVEL% NEQ 0 ( + color 0C + echo Error: ComfyUI CLI not found in virtual environment! + pause + exit /b 1 +) + +echo Starting custom nodes update... +echo This may take several minutes... +echo. + +:: Activate venv and run node update +call "%VENV_PATH%\Scripts\activate.bat" && comfy --here node update-all + +echo. +echo Custom nodes update completed! +echo. +pause +exit \ No newline at end of file