文章目录
- 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 off
set 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_venv
dir "%VENV_DIR%\Scripts\Python.exe" >tmp/stdout.txt 2>tmp/stderr.txt
if %ERRORLEVEL% == 0 goto :activate_venv
for /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_stderr
echo.
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
:endofscript
echo.
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
路径配置好了,并且环境也配置好了,那么就可以直接启动程序了。
下一篇开始实践
我结合前面的本地部署内容,开始试试