Ubuntu20.04部署stable-diffusion-webui环境小记
Ubuntu20.04部署stable-diffusion-webui环境小记
文章目录
- 前言
- 后视镜视角查看安装文档
- 聊聊我踩的那些坑
- python3.11的安装
- 执行sudo apt update报错
- 显卡驱动
- 内存优化
- 网络问题
- 无法打开系统设置和网络设置
- 查询GPU使用情况
- 总结
Stable Diffusion web UI
A web interface for Stable Diffusion, implemented using Gradio library.
前言
今天这篇算是工作学习笔记吧,主要记录下stable-diffusion-webui开源项目安装过程中遇到的问题,Stable Diffusion 是一种基于深度学习的文本到图像生成模型,能够根据给定的文本描述生成高质量的图像。它属于一种称为扩散模型(Diffusion Models)的生成模型,扩散模型在图像生成领域取得了显著的成果。
stable-diffusion-webui
是一个开源项目,旨在为 Stable Diffusion 模型提供一个简洁、用户友好的 Web 界面。这个界面使得用户能够更方便地使用 Stable Diffusion 生成图像,进行各种设置调整,甚至利用 GPU 加速来提高生成效率。它本质上是一个基于 Python 的 Web 应用程序,通常使用 Flask 或 FastAPI 作为后端框架,前端则是基于 HTML/CSS/JavaScript 实现的。
stable-diffusion-webui
作为一个开源项目的,它的安装过程已经被无数先行者实践过了,可是人们总会因为这样那样的原因遇到新的问题,可能是版本不对应,平台不熟悉、项目不熟悉、环境有问题等等,在我熬到半夜成功安装完一次以后,回过头来再看项目的 README
文件发现是那样的清晰,可是为什么在成功安装前踩了那么多坑呢?总结我遇到的坎坷有几点:英语不熟、Ubuntu恐惧、python混乱、操之过急。
所以我觉得把我安装的经历记录下来还是很有必要的,这样可以让我以后在类似的问题上少踩一些坑,安装背景是这样的,之前团队小伙伴也是用这个项目生成图,但是用的Windows版本,从 README 文件来看Windows版本在显卡驱动正常的情况下只需要 git clone
克隆库之后,运行 webui-user.bat
脚本即可,但是那台Windows配置不高,所以准备用新电脑再搭一次环境。
新入伍的电脑配置配置贼优秀:i9CPU32核、128G内存、Geforce RTX 4070Ti显卡、4TSSD硬盘,还有Windows10家庭版和Ubuntu20.04双系统,考虑到家庭版系统的限制和分配给它的小硬盘空间,我们还是决定在Ubuntu上重新部署一套环境,首先在我的认知里高配显卡和Ubuntu就不搭,所以当我遇到找不到显卡需要安装驱动时就头大,当然现在来看这只是偏见,但当时安装时并不知道,加上搜到的一些Ubuntu安装显卡驱动的繁琐教程,我走了一些弯路。
再有就是对英语的陌生感,导致查看README文件时有些急躁,有点胡乱一锅端的操作,还有就是要再安装一个新版本的Python解释器的恐惧,这也是导致我开始安装总遇到问题的主要原因,当我梳理了python3-venv功能之后,基本理解了虚拟环境的隔离概念和好处,也就理解了这些安装命令的作用。
后视镜视角查看安装文档
首先说明我的电脑系统是Ubuntu20.04,这就决定我电脑默认的Python不符合要求,下面是具体步骤:
Automatic Installation on Linux
1.Install the dependencies:
# Debian-based:
sudo apt install wget git python3 python3-venv libgl1 libglib2.0-0
# Red Hat-based:
sudo dnf install wget git python3 gperftools-libs libglvnd-glx
# openSUSE-based:
sudo zypper install wget git python3 libtcmalloc4 libglvnd
# Arch-based:
sudo pacman -S wget git python3
先看这一段,一开始我准备一股脑全执行一遍,后来发现只需要执行 sudo apt install wget git python3 python3-venv libgl1 libglib2.0-0
这一句即可,python3
是 Python 编程语言的第三版的执行文件, python3-venv
是一个用于创建 Python 3 虚拟环境的工具包, libgl1
是用于支持 OpenGL 的库,它提供了对图形硬件的低级接口,允许程序使用硬件加速进行 2D 和 3D 图形的渲染,libglib2.0-0
是 GLib 库的核心部分,它是许多 Linux 应用程序和工具的基础库之一,提供数据结构、内存管理、线程管理、文件 I/O、网络操作、正则表达式等功能,被广泛用于 GNOME 桌面环境和许多其他 C 应用程序中。
稍微新一点的Ubuntu系统执行这个命令就安装好了,比如Ubuntu22.04系统,自带的Python版本就是Python3.10,而我当前的电脑系统Ubuntu20.04自带的Python版本是Python2.7和Python3.8,所以Python相关的软件默认安装的不符合条件,接着往下看。
If your system is very new, you need to install python3.11 or python3.10:
# Ubuntu 24.04
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo apt install python3.11
# Manjaro/Arch
sudo pacman -S yay
yay -S python311 # do not confuse with python3.11 package
# Only for 3.11
# Then set up env variable in launch script
export python_cmd="python3.11"
# or in webui-user.sh
python_cmd="python3.11"
原来这个项目需要的版本是Python3.11 或者 Python3.10,所以系统自带的Python3.8是不行的,这里开头有句提示,如果系统太新(比如Ubuntu24.04)就使用这些命令安装,而我们是因为系统太老所以要使用这些命令
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo apt install python3.11
sudo apt install python3.11-venv # 这句原文档没有,我觉得安装对应版本的好一些
这里补充关键的一点,对照上面所需的命令,应该额外安装一下 sudo apt install python3.11-venv
这个虚拟环境的软件,另外的重中之重是要执行 export python_cmd="python3.11"
,或者在 webui-user.sh
文件中添加 python_cmd="python3.11"
信息,我就是没看到这一步,导致Python安装混乱,耽误了几个小时,推荐将配置放到文件中,一会告诉你这个文件在哪,接着往下看
2.Navigate to the directory you would like the webui to be installed and execute the following command:
wget -q https://raw.githubusercontent.com/AUTOMATIC1111/stable-diffusion-webui/master/webui.sh
Or just clone the repo wherever you want:
git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui
这第二步给了两种方式,一种是直接下载脚本执行,另一种是直接clone一个库,我就是为了省事选了第一种,但又没设置python_cmd
变量,导致下载过程中这种缺python库,所以这里推荐第二种,直接在自定义位置克隆一个库,然后进入stable-diffusion-webui目录,打开文件webui-user.sh
,添加python_cmd="python3.11"
信息,继续往后看:
3.Run webui.sh.
4.Check webui-user.sh for options.
第三步是执行 webui.sh
脚本,可以直接运行下载的脚本 ./webui.sh
,也可以进入克隆的项目目录stable-diffusion-webui运行命令 ./webui.sh
第四步就是检查用户参数了,我们手动添加了一个python_cmd="python3.11"
,其实在 webui.sh
文件中用这样一段描述:
#################################################
# Please do not make any changes to this file, #
# change the variables in webui-user.sh instead #
#################################################
而在webui-user.sh
也有一些被注释的默认变量供我们修改:
#!/bin/bash
#########################################################
# Uncomment and change the variables below to your need:#
#########################################################
# Install directory without trailing slash
#install_dir="/home/$(whoami)"
# Name of the subdirectory
#clone_dir="stable-diffusion-webui"
# Commandline arguments for webui.py, for example: export COMMANDLINE_ARGS="--medvram --opt-split-attention"
#export COMMANDLINE_ARGS=""
# python3 executable
#python_cmd="python3"
# git executable
#export GIT="git"
# python3 venv without trailing slash (defaults to ${install_dir}/${clone_dir}/venv)
#venv_dir="venv"
# script to launch to start the app
#export LAUNCH_SCRIPT="launch.py"
# install command for torch
#export TORCH_COMMAND="pip install torch==1.12.1+cu113 --extra-index-url https://download.pytorch.org/whl/cu113"
# Requirements file to use for stable-diffusion-webui
#export REQS_FILE="requirements_versions.txt"
# Fixed git repos
#export K_DIFFUSION_PACKAGE=""
#export GFPGAN_PACKAGE=""
# Fixed git commits
#export STABLE_DIFFUSION_COMMIT_HASH=""
#export CODEFORMER_COMMIT_HASH=""
#export BLIP_COMMIT_HASH=""
# Uncomment to enable accelerated launch
#export ACCELERATE="True"
# Uncomment to disable TCMalloc
#export NO_TCMALLOC="True"
###########################################
python_cmd="python3.11"
至此总结一下在Ubuntu20.04上配置环境的精简步骤
- 安装依赖
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo apt install python3.11 python3.11-venv libgl1 libglib2.0-0
- 在自定义位置克隆项目
git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
-
进入stable-diffusion-webui目录,在文件
webui-user.sh
中添加python_cmd="python3.11"
信息 -
运行stable-diffusion-webui目录下的脚本文件
./webui.sh
聊聊我踩的那些坑
前面描述了怎样正确搭建环境,最后总结下来就寥寥几步,但是我却兜兜转转花了几个小时,下面聊聊我都踩了哪些坑,以及用到了哪些东西?
python3.11的安装
因为自己的偏见,认为Python环境的混乱,所以在这里吃了亏,使用默认命令安装完发现是Python3.8版本,于是执行 sudo apt install python3.11
命令安装,但是因为没有导入环境变量 export python_cmd="python3.11"
,导致执行脚本时各种报 “No module named pip” 错误,我甚至想删掉自带的Python2.7版本和Python3.8版本,还好是Deepseek劝住了我,不然我就全给它卸载了,但是因为找不到pip,指定安装也不好使,我又搞起来骚操作,将 /usr/bin/
目录下的 python 和 python3都指向了 Python3.11
,勉强解决了这个问题,但却引入了更大的麻。
重启之后打不开终端了,一些软件更新和图形界面话的东西也不好使了,经过几个小时的摸索我想起了DeepSeek劝我的话,难道是因为系统的GNOME用到了他们,我赶紧将python和python3的软连接还原了,重启之后发现果然正常了。
当我意识到这个问题后,从头重新安装Python,指定了环境变量 python_cmd
, 就没遇到这个麻烦了。
这里在安装Python3.11前有一句 sudo add-apt-repository ppa:deadsnakes/ppa
,是一条在 Ubuntu 系统中用于添加 PPA(Personal Package Archive,个人包存档)的命令,让你能够从该源中获取更新的软件包。deadsnakes 是一个非常流行的 PPA,提供了 Ubuntu 官方源中不包含的 Python 版本。例如,它提供了比默认 Ubuntu 存储库中更高版本的 Python(例如 Python 3.11、3.12)供用户安装。
这个项目使用 python3.11-venv
创建虚拟隔离环境,它是通过 文件系统隔离 和 环境变量配置 的方式实现虚拟环境的隔离。具体来说,虚拟环境会创建一个包含独立 Python 解释器和依赖包的目录,这样每个项目可以有自己的依赖和库,不会影响系统的全局环境或其他虚拟环境。
执行sudo apt update报错
每次执行软件检查更新时总是报错以下错误
$ sudo apt update
命中:2 http://ppa.launchpad.net/deadsnakes/ppa/ubuntu focal InRelease
命中:1 https://packages.microsoft.com/repos/code stable InRelease
获取:3 https://dl.google.com/linux/chrome/deb stable InRelease [1,825 B]
错误:3 https://dl.google.com/linux/chrome/deb stable InRelease
由于没有公钥,无法验证下列签名: NO_PUBKEY 32EE5355A6BC6E42
命中:4 http://security.ubuntu.com/ubuntu focal-security InRelease
命中:5 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal InRelease
从错误信息来看,问题是由于缺少 Google Chrome 存储库的公钥(NO_PUBKEY 32EE5355A6BC6E42),导致无法验证软件包的签名。解决方法如下:
可以手动添加缺失的公钥 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 32EE5355A6BC6E42
如果 keyserver.ubuntu.com
无法连接,可以尝试其他密钥服务器,例如 sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 32EE5355A6BC6E42
显卡驱动
运行启动脚本后找不到GPU显卡,报错如下:
ailsa@ailsa-Server:~$ ./webui.sh
################################################################
Install script for stable-diffusion + Web UI
Tested on Debian 11 (Bullseye), Fedora 34+ and openSUSE Leap 15.4 or newer.
################################################################
################################################################
Running on ailsa user
################################################################
################################################################
Create and activate python venv
################################################################
################################################################
Launching launch.py...
################################################################
glibc version is 2.31
Cannot locate TCMalloc. Do you have tcmalloc or google-perftool installed on your system? (improves CPU memory usage)
Python 3.8.10 (default, Jan 17 2025, 14:40:23)
[GCC 9.4.0]
Version: v1.10.1
Commit hash: 82a973c04367123ae98bd9abdf80d9eda9b910e2
Traceback (most recent call last):
File "launch.py", line 48, in <module>
main()
File "launch.py", line 39, in main
prepare_environment()
File "/home/ailsa/stable-diffusion-webui/modules/launch_utils.py", line 387, in prepare_environment
raise RuntimeError(
RuntimeError: Torch is not able to use GPU; add --skip-torch-cuda-test to COMMANDLINE_ARGS variable to disable this check
按照程序人的直觉来看是驱动有问题,关于装驱动我还是有点恐惧的,之前折腾各个Ubuntu系统版本的时候没少花费时间,我的水平也就保持在用驱动精灵给Windows安装驱动的阶段,说是给Ubuntu安装显卡驱动实属有点强人所难了,我一直以为Ubuntu不需要太强劲的显卡,好显卡都是给打游戏准备的,不过最近的AI兴起确实给了NVIDIA显卡更广阔的应用空间,然后我就搜索Ubuntu安装NVIDIA显卡驱动的教程,看了大片大片天花乱坠的众多命令之后我真的傻眼了,一个都不想敲。
后来我发现了 ubuntu-drivers
,它是 Ubuntu 系统中一个非常实用的命令行工具,主要用于自动检测硬件设备,并推荐、安装合适的驱动程序,特别是针对显卡、无线网卡等设备的驱动。
安装方法如下:
sudo apt update
sudo apt install ubuntu-drivers-common
使用方法也极其简单,直接一条命令 sudo ubuntu-drivers autoinstall
,会根据系统检测到的硬件情况,自动选择并安装最合适的驱动,无需手动指定。
安装完之后重启,显卡居然好了,丝滑到让人难以置信。
内存优化
显卡问题解决好后,启动时报出一条警告
Cannot locate TCMalloc. Do you have tcmalloc or google-perftool installed on your system? (improves CPU memory usage)
这个警告是提示你没有安装 TCMalloc(Thread-Caching Malloc),它是 Google 提供的一种内存分配器,能够提高程序的内存使用效率,尤其在多线程环境下表现较好。虽然它不是必需的,但它可以帮助改善程序的内存使用效率,尤其是在使用 stable-diffusion 这类内存密集型应用时。
解决办法如下:
-
安装
google-perftools
(其中包括 TCMalloc)sudo apt update sudo apt install google-perftools
-
设置环境变量
安装完成后,可能需要设置环境变量,以便 Python 和其他程序能够找到 TCMalloc 库。你可以通过设置LD_PRELOAD
来加载 TCMalloc 库。export LD_PRELOAD="/usr/lib/x86_64-linux-gnu/libtcmalloc_minimal.so.4"
也可以将此命令添加到你的
.bashrc
或.bash_profile
文件中,以便每次启动终端时自动加载。echo 'export LD_PRELOAD="/usr/lib/x86_64-linux-gnu/libtcmalloc_minimal.so.4"' >> ~/.bashrc source ~/.bashrc
-
验证安装
确保TCMalloc
已正确安装,可以通过运行以下命令来验证:ldd $(which python3) | grep tcmalloc
如果看到类似以下输出,说明
TCMalloc
已加载:libtcmalloc_minimal.so.4 => /usr/lib/x86_64-linux-gnu/libtcmalloc_minimal.so.4 (0x00007ff0e879e000)
-
重启程序
完成以上步骤后,你可以重新运行webui.sh
脚本,就不会再看到关于 TCMalloc 的警告。
网络问题
解决完了内存又遭遇了网络问题,因为下载的库和资源多是 google.com
域名下的,为了更好的下载所以配置了代理访问,但是遭遇了以下错误
################################################################
Launching launch.py...
################################################################
Python 3.11.11 (main, Dec 4 2024, 08:55:08) [GCC 9.4.0]
Version: v1.10.1
Commit hash: 82a973c04367123ae98bd9abdf80d9eda9b910e2
Launching Web UI with arguments:
Traceback (most recent call last):
File "/home/ailsa/stable-diffusion-webui/workspace/stable-diffusion-webui/launch.py", line 48, in <module>
main()
File "/home/ailsa/stable-diffusion-webui/workspace/stable-diffusion-webui/launch.py", line 44, in main
start()
File "/home/ailsa/stable-diffusion-webui/workspace/stable-diffusion-webui/modules/launch_utils.py", line 465, in start
import webui
File "/home/ailsa/stable-diffusion-webui/workspace/stable-diffusion-webui/webui.py", line 13, in <module>
initialize.imports()
File "/home/ailsa/stable-diffusion-webui/workspace/stable-diffusion-webui/modules/initialize.py", line 23, in imports
import gradio # noqa: F401
^^^^^^^^^^^^^
File "/home/ailsa/stable-diffusion-webui/workspace/stable-diffusion-webui/venv/lib/python3.11/site-packages/gradio/__init__.py", line 3, in <module>
import gradio.components as components
File "/home/ailsa/stable-diffusion-webui/workspace/stable-diffusion-webui/venv/lib/python3.11/site-packages/gradio/components/__init__.py", line 1, in <module>
from gradio.components.annotated_image import AnnotatedImage
File "/home/ailsa/stable-diffusion-webui/workspace/stable-diffusion-webui/venv/lib/python3.11/site-packages/gradio/components/annotated_image.py", line 12, in <module>
from gradio import utils
File "/home/ailsa/stable-diffusion-webui/workspace/stable-diffusion-webui/venv/lib/python3.11/site-packages/gradio/utils.py", line 353, in <module>
class AsyncRequest:
File "/home/ailsa/stable-diffusion-webui/workspace/stable-diffusion-webui/venv/lib/python3.11/site-packages/gradio/utils.py", line 372, in AsyncRequest
client = httpx.AsyncClient()
^^^^^^^^^^^^^^^^^^^
File "/home/ailsa/stable-diffusion-webui/workspace/stable-diffusion-webui/venv/lib/python3.11/site-packages/httpx/_client.py", line 1395, in __init__
proxy_map = self._get_proxy_map(proxies, allow_env_proxies)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ailsa/stable-diffusion-webui/workspace/stable-diffusion-webui/venv/lib/python3.11/site-packages/httpx/_client.py", line 216, in _get_proxy_map
return {
^
File "/home/ailsa/stable-diffusion-webui/workspace/stable-diffusion-webui/venv/lib/python3.11/site-packages/httpx/_client.py", line 217, in <dictcomp>
key: None if url is None else Proxy(url=url)
^^^^^^^^^^^^^^
File "/home/ailsa/stable-diffusion-webui/workspace/stable-diffusion-webui/venv/lib/python3.11/site-packages/httpx/_config.py", line 336, in __init__
raise ValueError(f"Unknown scheme for proxy URL {url!r}")
ValueError: Unknown scheme for proxy URL URL('socks://127.0.0.1:7891/')
我安装了pip install httpx==0.22.0
不好使,后来在这个官方的issue里找到了答案 unset ALL_PROXY
无法打开系统设置和网络设置
因为安装项目前完整的更新了一遍系统,发现缺了一些东西,这里提到的便是其中两项,重新安装GNOME控制中心就好了
sudo apt update
sudo apt install --reinstall gnome-control-center
查询GPU使用情况
系统自带的性能查看器中没有GPU信息,所以按照下面步骤,将系统信息显示到顶部的状态条上,先安装必要软件和扩展
sudo apt update
sudo apt install gnome-tweaks
sudo apt install gnome-shell-extension-system-monitor
接着按下 Alt + F2,输入 r,然后按回车,检查扩展是否已启用,需重新打开 GNOME Tweaks,方法如下:
方法 1:通过应用菜单搜索, 按下 Super 键(Windows 键),在搜索栏中输入 Tweaks 或 优化,然后点击打开。
方法 2:通过终端启动 gnome-tweaks
总结
- Ubuntu20.04添加Python3.11软件源的方法是
sudo add-apt-repository ppa:deadsnakes/ppa
- 安装Python环境和依赖使用命令
sudo apt install python3.11 python3.11-venv libgl1 libglib2.0-0
- 安装NVIDIA显卡驱动的命令
sudo ubuntu-drivers autoinstall
- 取消代理的方法
unset HTTP_PROXY
、unset HTTPS_PROXY
或unset ALL_PROXY
记录自己做决定时的想法,哪些是经过了仔细的谋划,哪些是因为运气降临,诚然,运气确实也是一种实力,但是不可依赖,只有那些经过谋划后的成功才经得起历史的推敲和未来的检验~