文章目錄
- SD項目遷移
- 前置知識
- webui-user.bat
- webui.bat
- launch_utils.py
- 下一篇開始實踐
SD項目遷移
顯卡驅動更新:https://www.nvidia.cn/geforce/drivers/
下載安裝三個程序:
- python3.10.6: https://www.python.org/downloads/release/python-3106/
- git: https://git-scm.com/download/win
- stable-diffusion webui: https://github.com/AUTOMATIC1111/stable-diffusion-webui
快速啟動:
前置知識
bat運行腳本,看懂即可。
webui-user.bat
首先運行webui-user.bat
,但是里面的路徑設置是空的,如下。
這就意味著要么路徑有一個默認值,這么在后面設置了,我估計是有個if
判斷該值是否為空的代碼。
如果我們已經配好了環境和參數,那么直接填入即可。
@echo offset PYTHON=
set GIT=
set VENV_DIR=
set COMMANDLINE_ARGS=call webui.bat
webui.bat
主要功能是根據webui-user.bat
,設置上面的四個參數。
-
四個變量的預處理;
-
創建日志文件,為了后續發生錯誤輸出做準備。
-
檢測
python
和pip
是否可用,并升級pip
。 -
:start_venv
一段的作用是尋找python解釋器。Scripts
下沒有就自動遞歸文件夾搜索python.exe
的位置。 -
:activate_venv
的作用是利用python.exe
激活環境。 -
如果
ACCELERATE
存在就使用accelerate
啟動主程序。 -
啟動主程序,一個是
:launch
啟動主程序,一個是使用:accelerate_launch
加速啟動。
總結:設置四個變量,找到python.exe
之后啟動環境。然后根據是否依據ACCELERATE
啟動主程序。
下面是具體內容:
- 關閉命令回顯
@echo off
@
符號的作用是防止當前這行命令本身被顯示出來。echo off
用于關閉后續命令在執行過程中的顯示,讓腳本執行時只顯示命令的輸出結果,而不顯示命令本身,使輸出更加簡潔。
- 檢查并調用
webui.settings.bat
文件
if exist webui.settings.bat (call webui.settings.bat
)
if exist
是一個條件判斷語句,用于檢查當前目錄下是否存在webui.settings.bat
文件。- 如果文件存在,則使用
call
命令調用該文件并執行其中的代碼,這樣可以在主腳本中引入額外的配置或設置。
- 設置
PYTHON
變量
if not defined PYTHON (set PYTHON=python)
if not defined
用于檢查環境變量PYTHON
是否已經被定義。- 如果
PYTHON
未定義,則將其設置為python
,這意味著默認使用系統路徑中可找到的 Python 解釋器。
- 設置
GIT_PYTHON_GIT_EXECUTABLE
變量
if defined GIT (set "GIT_PYTHON_GIT_EXECUTABLE=%GIT%")
if defined
用于檢查環境變量GIT
是否已經被定義。- 如果
GIT
已定義,則將GIT_PYTHON_GIT_EXECUTABLE
變量設置為GIT
的值,這通常用于指定git
可執行文件的路徑。
- 設置
VENV_DIR
變量
if not defined VENV_DIR (set "VENV_DIR=%~dp0%venv")
if not defined
檢查環境變量VENV_DIR
是否已經被定義。- 如果未定義,則將
VENV_DIR
設置為當前批處理文件所在目錄下的venv
文件夾。%~dp0
表示當前批處理文件所在的完整路徑。
- 設置其他變量
set SD_WEBUI_RESTART=tmp/restart
set ERROR_REPORTING=FALSE
set SD_WEBUI_RESTART=tmp/restart
:將SD_WEBUI_RESTART
變量設置為tmp/restart
,可能用于標記重啟操作。set ERROR_REPORTING=FALSE
:將ERROR_REPORTING
變量設置為FALSE
,可能用于控制錯誤報告的開關。
- 創建
tmp
文件夾
mkdir tmp 2>NUL
mkdir tmp
用于創建一個名為tmp
的文件夾。2>NUL
表示將命令執行過程中的錯誤信息(標準錯誤輸出,文件描述符為 2)重定向到NUL
,即忽略錯誤信息。如果tmp
文件夾已經存在,該命令不會報錯。
- 檢查 Python 是否可正常運行
%PYTHON% -c "" >tmp/stdout.txt 2>tmp/stderr.txt
if %ERRORLEVEL% == 0 goto :check_pip
echo Couldn't launch python
goto :show_stdout_stderr
%PYTHON% -c ""
:使用PYTHON
變量指定的 Python 解釋器執行一個空的 Python 命令。>tmp/stdout.txt 2>tmp/stderr.txt
:將命令的標準輸出(文件描述符為 1)和標準錯誤輸出(文件描述符為 2)分別重定向到tmp/stdout.txt
和tmp/stderr.txt
文件中。if %ERRORLEVEL% == 0
:%ERRORLEVEL%
是一個系統變量,用于存儲上一條命令的退出狀態碼。如果退出狀態碼為 0,表示命令執行成功,跳轉到:check_pip
標簽處繼續執行。- 如果退出狀態碼不為 0,則輸出
"Couldn't launch python"
信息,并跳轉到:show_stdout_stderr
標簽處顯示錯誤信息。
- 檢查
pip
是否可用
:check_pip
%PYTHON% -mpip --help >tmp/stdout.txt 2>tmp/stderr.txt
if %ERRORLEVEL% == 0 goto :start_venv
if "%PIP_INSTALLER_LOCATION%" == "" goto :show_stdout_stderr
%PYTHON% "%PIP_INSTALLER_LOCATION%" >tmp/stdout.txt 2>tmp/stderr.txt
if %ERRORLEVEL% == 0 goto :start_venv
echo Couldn't install pip
goto :show_stdout_stderr
%PYTHON% -mpip --help
:使用 Python 解釋器調用pip
并查看其幫助信息,以此檢查pip
是否可用。- 如果
pip
可用(退出狀態碼為 0),則跳轉到:start_venv
標簽處開始創建虛擬環境。 - 如果
pip
不可用,且PIP_INSTALLER_LOCATION
變量為空,則跳轉到:show_stdout_stderr
標簽處顯示錯誤信息。 - 如果
PIP_INSTALLER_LOCATION
不為空,則使用 Python 解釋器執行該位置的腳本嘗試安裝pip
。 - 如果安裝成功,則跳轉到
:start_venv
標簽處;否則輸出"Couldn't install pip"
信息,并跳轉到:show_stdout_stderr
標簽處顯示錯誤信息。
- 創建虛擬環境
:start_venv
if ["%VENV_DIR%"] == ["-"] goto :skip_venv
if ["%SKIP_VENV%"] == ["1"] goto :skip_venvdir "%VENV_DIR%\Scripts\Python.exe" >tmp/stdout.txt 2>tmp/stderr.txt
if %ERRORLEVEL% == 0 goto :activate_venvfor /f "delims=" %%i in ('CALL %PYTHON% -c "import sys; print(sys.executable)"') do set PYTHON_FULLNAME="%%i"
echo Creating venv in directory %VENV_DIR% using python %PYTHON_FULLNAME%
%PYTHON_FULLNAME% -m venv "%VENV_DIR%" >tmp/stdout.txt 2>tmp/stderr.txt
if %ERRORLEVEL% == 0 goto :upgrade_pip
echo Unable to create venv in directory "%VENV_DIR%"
goto :show_stdout_stderr
- 首先檢查
VENV_DIR
是否為-
或者SKIP_VENV
是否為1
,如果滿足條件則跳轉到:skip_venv
標簽處跳過虛擬環境的創建。 - 然后檢查虛擬環境目錄下的
Scripts\Python.exe
文件是否存在,如果存在則跳轉到:activate_venv
標簽處激活虛擬環境。 - 如果虛擬環境不存在,則使用
for /f
循環獲取 Python 解釋器的完整路徑,并將其存儲在PYTHON_FULLNAME
變量中。 - 接著使用該 Python 解釋器創建虛擬環境,如果創建成功則跳轉到
:upgrade_pip
標簽處升級pip
;否則輸出錯誤信息并跳轉到:show_stdout_stderr
標簽處顯示錯誤信息。
- 升級
pip
:upgrade_pip
"%VENV_DIR%\Scripts\Python.exe" -m pip install --upgrade pip
if %ERRORLEVEL% == 0 goto :activate_venv
echo Warning: Failed to upgrade PIP version
- 使用虛擬環境中的 Python 解釋器調用
pip
并嘗試升級到最新版本。 - 如果升級成功,則跳轉到
:activate_venv
標簽處激活虛擬環境;否則輸出警告信息。
- 激活虛擬環境
:activate_venv
set PYTHON="%VENV_DIR%\Scripts\Python.exe"
call "%VENV_DIR%\Scripts\activate.bat"
echo venv %PYTHON%
- 將
PYTHON
變量設置為虛擬環境中的 Python 解釋器路徑。 - 使用
call
命令調用虛擬環境的激活腳本activate.bat
來激活虛擬環境。 - 輸出當前使用的虛擬環境 Python 解釋器的路徑。
- 跳過虛擬環境創建
:skip_venv
if [%ACCELERATE%] == ["True"] goto :accelerate
goto :launch
- 檢查
ACCELERATE
變量是否為True
,如果是則跳轉到:accelerate
標簽處進行加速配置;否則跳轉到:launch
標簽處啟動主程序。
- 檢查
accelerate
是否可用
:accelerate
echo Checking for accelerate
set ACCELERATE="%VENV_DIR%\Scripts\accelerate.exe"
if EXIST %ACCELERATE% goto :accelerate_launch
- 輸出檢查
accelerate
的信息。 - 將
ACCELERATE
變量設置為虛擬環境中accelerate.exe
的路徑。 - 如果該文件存在,則跳轉到
:accelerate_launch
標簽處使用accelerate
啟動主程序。
- 啟動主程序
:launch
%PYTHON% launch.py %*
if EXIST tmp/restart goto :skip_venv
pause
exit /b
- 使用
PYTHON
變量指定的 Python 解釋器執行launch.py
腳本,并傳遞所有命令行參數(%*
)。 - 如果
tmp/restart
文件存在,則跳轉到:skip_venv
標簽處重新啟動;否則暫停程序并等待用戶輸入,最后退出當前批處理腳本。
- 使用
accelerate
啟動主程序
:accelerate_launch
echo Accelerating
%ACCELERATE% launch --num_cpu_threads_per_process=6 launch.py
if EXIST tmp/restart goto :skip_venv
pause
exit /b
- 輸出加速啟動的信息。
- 使用
accelerate
工具啟動launch.py
腳本,并設置每個進程的 CPU 線程數為 6。 - 如果
tmp/restart
文件存在,則跳轉到:skip_venv
標簽處重新啟動;否則暫停程序并等待用戶輸入,最后退出當前批處理腳本。
- 顯示標準輸出和錯誤信息
:show_stdout_stderrecho.
echo exit code: %errorlevel%for /f %%i in ("tmp\stdout.txt") do set size=%%~zi
if %size% equ 0 goto :show_stderr
echo.
echo stdout:
type tmp\stdout.txt:show_stderr
for /f %%i in ("tmp\stderr.txt") do set size=%%~zi
if %size% equ 0 goto :show_stderr
echo.
echo stderr:
type tmp\stderr.txt:endofscriptecho.
echo Launch unsuccessful. Exiting.
pause
- 首先輸出上一條命令的退出狀態碼。
- 檢查
tmp/stdout.txt
文件的大小,如果不為 0,則輸出"stdout:"
并顯示該文件的內容。 - 接著檢查
tmp/stderr.txt
文件的大小,如果不為 0,則輸出"stderr:"
并顯示該文件的內容。 - 最后輸出啟動失敗的信息,暫停程序并等待用戶輸入。
launch_utils.py
首先是運行webui-user.bat
,然后運行webui.bat
,最后使用launch_utils.py
啟動程序。
launch_utils.py
文件其實是不用動的。
我粗看了一下,如果webui-user.bat
路徑配置好了,并且環境也配置好了,那么就可以直接啟動程序了。
下一篇開始實踐
我結合前面的本地部署內容,開始試試