Docker中配置Stable Diffusion WebUI与TensorRT

Docker中配置Stable Diffusion WebUI与TensorRT

在AIGC应用从实验走向生产的今天,如何高效部署一个既能稳定运行又能快速响应图像生成请求的服务,成为系统工程师面临的核心挑战。尤其是在电商设计、内容平台自动化出图等高并发场景下,单纯的PyTorch推理往往难以满足性能要求。而将 Stable Diffusion WebUINVIDIA TensorRT 深度集成,并通过Docker实现环境隔离和可移植性,正是一种兼顾灵活性与高性能的解决方案。

本文将围绕这一目标,基于 nvidia/cuda:11.8-devel-ubuntu20.04 基础镜像,结合 Miniconda 构建 Python 3.9 环境,逐步搭建一个支持 TensorRT 加速的 Stable Diffusion 容器化运行时。整个过程不仅适用于科研复现,更可用于生产级图像生成服务的标准化部署。


容器基础环境搭建

我们选择 NVIDIA 提供的官方 CUDA 开发镜像作为起点,确保底层驱动、编译工具链与 GPU 支持完备。相比直接使用 Ubuntu 镜像再手动安装 CUDA 工具包的方式,这种做法极大降低了版本冲突的风险。

启动容器的命令如下:

docker run -tid \ --name sd_webui_trt \ --net host \ --gpus all \ --shm-size="8gb" \ -v /data/models:/root/stable-diffusion-webui/models \ -v /data/output:/root/stable-diffusion-webui/outputs \ nvidia/cuda:11.8-devel-ubuntu20.04 \ /bin/bash 

其中几个关键参数值得特别注意:

  • --gpus all:启用所有可用 GPU 设备,这是后续运行深度学习模型的前提。
  • --shm-size="8gb":增大共享内存。Stable Diffusion WebUI 在处理大 batch 图像时容易因 /dev/shm 空间不足导致崩溃(OOM),默认 64MB 远远不够,设为 8GB 是较为稳妥的选择。
  • -v 挂载了两个目录:模型权重和输出结果,保证数据持久化且便于跨容器复用。

进入容器后,建议先设置一个醒目的 Shell 提示符,避免误操作宿主机:

echo 'export PS1="DOCKER[\u@\h \w]\$"' > ~/.bashrc source ~/.bashrc 

这样每次登录都会清楚地看到自己正处于容器环境中。


使用 Miniconda 管理 Python 依赖

虽然基础镜像自带 Python,但其版本和包管理能力有限。为了精确控制依赖关系并避免污染系统环境,我们引入 Miniconda —— 一个轻量级的 Conda 实现,非常适合在容器中创建隔离的虚拟环境。

首先安装必要的工具并下载 Miniconda:

apt update && apt install -y wget bzip2 wget -c https://repo.anaconda.com/miniconda/Miniconda3-py39_23.1.0-1-Linux-x86_64.sh sh Miniconda3-py39_23.1.0-1-Linux-x86_64.sh -b -p /opt/conda 

-b 表示静默安装,-p 指定安装路径至 /opt/conda,便于统一管理。

接下来配置环境变量:

export PATH="/opt/conda/bin:$PATH" echo 'export PATH="/opt/conda/bin:$PATH"' >> ~/.bashrc 

验证是否成功:

python --version # 应输出 Python 3.9.x conda --version 

紧接着,推荐配置国内镜像源以加速后续依赖下载。清华 TUNA 是目前最稳定的开源镜像站之一:

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --set show_channel_urls yes pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple 

最后创建独立虚拟环境:

conda create -n sd python=3.9 conda activate sd 

所有后续操作都应在该环境下进行,这不仅能防止依赖混乱,也方便日后迁移或调试。


部署 Stable Diffusion WebUI

项目主仓库来自 AUTOMATIC1111,社区活跃、功能丰富,是当前事实上的标准前端界面。

克隆代码并切换到稳定版本分支(如 v1.6.0):

git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git cd stable-diffusion-webui git checkout v1.6.0 

不建议直接运行 webui.sh 启动脚本,因为它会自动尝试安装依赖,在网络不稳定或缺少代理的情况下极易失败。更可靠的做法是分步手动安装关键组件。

安装 PyTorch(CUDA 11.8 版本)

必须确保与基础镜像中的 CUDA 版本严格匹配:

pip install torch==2.0.1+cu118 torchvision==0.15.2+cu118 torchaudio==2.0.2 --extra-index-url https://download.pytorch.org/whl/cu118 

如果跳过 --extra-index-url,pip 将只能找到 CPU 版本,导致无法使用 GPU。

安装本地缓存依赖(可选但高效)

对于一些经常需要重装的依赖包(如 CLIP、GFPGAN),可以提前打包成 .zip 文件缓存在本地,避免重复下载:

pip install ../dependencies/open_clip-bb6e834e9c70d9c27d0dc3ecedeebeaeb1ffad6b.zip pip install ../dependencies/CLIP-d50d76daa670286dd6cacf3bcd80b5e4823fc8e1.zip pip install ../dependencies/GFPGAN-8d2447a2d918f8eba5a4a01463fd48e45126a379.zip 

这些包通常体积较大且 GitHub 下载速度慢,本地化后能显著提升部署效率。

补充其他必要组件

pip install -r requirements.txt pip install opencv-python-headless pip install gdown 

这里使用 opencv-python-headless 而非标准版,因为它不含 GUI 支持,更适合无图形界面的服务器环境,同时减少攻击面。


集成 NVIDIA TensorRT 实现推理加速

TensorRT 是 NVIDIA 推出的高性能推理优化引擎,通过对计算图进行层融合、精度校准、内存优化等手段,可在保持精度的同时大幅提升推理吞吐量。在 Stable Diffusion 中,它主要作用于 UNet 和 VAE 的推理阶段,实测可将生成速度提升 1.5~2 倍。

下载并解压 TensorRT SDK

前往 NVIDIA Developer 官网注册账号并下载对应版本(需选择与 CUDA 11.8 匹配的 TensorRT 8.6.x):

tar -xzvf TensorRT-8.6.1.6.Linux.x86_64-gnu.cuda-11.8.tar.gz -C /opt/ 

推荐路径为 /opt/TensorRT-8.6.1.6,结构清晰且易于引用。

配置环境变量

编辑 .bashrc 添加以下内容:

export TENSORRT_DIR=/opt/TensorRT-8.6.1.6 export LD_LIBRARY_PATH=$TENSORRT_DIR/lib:$LD_LIBRARY_PATH export PATH=$TENSORRT_DIR/bin:$PATH 

保存后执行 source ~/.bashrc 使变更立即生效。

若未正确设置 LD_LIBRARY_PATH,后续导入 tensorrt 时会出现 libnvinfer.so not found 错误。

安装 Python 绑定

进入 $TENSORRT_DIR/python 目录,安装对应的 wheel 包:

cd $TENSORRT_DIR/python pip install tensorrt-8.6.1-cp39-none-linux_x86_64.whl 

确认 Python 版本为 3.9,否则会因 ABI 不兼容导致安装失败。

验证安装:

python -c "import tensorrt as trt; print(trt.__version__)" 

预期输出:8.6.1

安装 PyCUDA(底层依赖)

TensorRT 插件部分功能依赖 PyCUDA 进行低层 GPU 操作调度:

pip install pycuda==2021.1 

若编译报错,请先安装系统级依赖:

apt install -y build-essential libcppunit-dev autoconf libtool zlib1g-dev 

某些情况下还需软链接 CUDA 头文件:

ln -s /usr/local/cuda/include/cuda.h /usr/include/cuda.h 

配置 ONNX Runtime(用于模型转换)

Stable Diffusion + TensorRT 的典型流程是:先将 PyTorch 模型导出为 ONNX 格式,再由 TensorRT 解析并优化。因此需要安装支持 GPU 的 ONNX Runtime:

pip install onnxruntime-gpu==1.15.1 

若官方 PyPI 源不可达,可尝试微软提供的专用索引:

pip install onnxruntime-gpu==1.18.1 --extra-index-url https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/onnxruntime-cuda-11/pypi/simple/ 

注意版本必须与 CUDA 兼容,否则会出现运行时错误。


启动 WebUI 并启用 TensorRT 支持

目前主流插件 sd-webui-tensorrt 已经实现了良好的集成体验。

安装方式简单:

cd extensions git clone https://github.com/Likely-Oscuro/sd-webui-tensorrt.git 

重启 WebUI 后,界面上会出现“TensorRT”标签页,允许用户将模型转换为 TRT 引擎格式,并选择 FP16 或 FP32 精度模式。

修改启动参数(webui-user.sh)

建议在 webui-user.sh 中显式指定以下参数:

export COMMANDLINE_ARGS=" --use-cpu none \ --skip-torch-cuda-test \ --no-half-vae \ --precision full \ --api \ --listen \ --enable-insecure-extension-access " 

各参数含义如下:

  • --use-cpu none:禁用 CPU 推理,强制使用 GPU
  • --skip-torch-cuda-test:跳过启动时的 CUDA 健康检查(在某些容器环境中可能误报)
  • --no-half-vae:VAE 模块不使用半精度,避免出现黑图或色彩异常
  • --precision full:启用全精度计算,提高数值稳定性
  • --api:开启 RESTful API 接口,便于外部系统调用
  • --listen:监听 0.0.0.0,允许远程访问
  • --enable-insecure-extension-access:允许加载第三方插件(含安全风险,仅限可信环境使用)

启动服务

返回根目录并运行:

cd .. ./webui.sh 

服务启动后可通过 http://<host-ip>:7860 访问 Web 界面。

首次使用 TensorRT 插件时,需点击“Convert”按钮将原始模型转换为 TRT 引擎,此过程耗时较长但只需一次。之后每次加载都将直接使用优化后的引擎,显著加快推理速度。


常见问题排查指南

问题原因分析解决方案
ImportError: libnvinfer.so not found动态库路径未加入 LD_LIBRARY_PATH检查 .bashrc 是否正确导出 $TENSORRT_DIR/lib
WebUI 启动卡死或崩溃共享内存不足启动容器时添加 --shm-size="8gb"
ONNX 导出失败,提示 missing symbolPyCUDA 编译失败或 CUDA 头文件缺失重新安装 pycuda 并确认 /usr/local/cuda/include 存在
生成图像模糊或失真严重使用了 INT8 或 FP16 精度但未做充分校准在插件中改用 FP32 模式,或启用动态范围校准
GPU 显存溢出(OOM)Batch size 过大或未启用显存优化减小 --max-batch-size,或添加 --medvram 参数

实践中发现,FP16 模式虽快但在复杂 prompt 下容易产生 artifacts;而 FP32 虽慢约 15%,但图像质量更稳定。建议根据实际业务需求权衡速度与保真度。


镜像固化与可持续交付

完成配置后,应将当前容器状态固化为镜像,以便快速部署到其他节点或纳入 CI/CD 流程。

提交为新镜像

docker commit sd_webui_trt sd-webui-trt:v1.0 

导出与传输

docker save -o sd-webui-trt-v1.0.tar sd-webui-trt:v1.0 scp sd-webui-trt-v1.0.tar user@remote-server:/home/ 

目标机器加载:

docker load -i sd-webui-trt-v1.0.tar 

推荐长期维护方式:编写 Dockerfile

相比于 docker commit,使用 Dockerfile 才是真正实现可复现构建的最佳实践。

FROM nvidia/cuda:11.8-devel-ubuntu20.04 ENV DEBIAN_FRONTEND=noninteractive RUN apt update && apt install -y wget git vim python3-pip # Install Miniconda RUN wget -q https://repo.anaconda.com/miniconda/Miniconda3-py39_23.1.0-1-Linux-x86_64.sh && \ bash Miniconda3-py39_23.1.0-1-Linux-x86_64.sh -b -p /opt/conda && \ rm Miniconda3-py39_23.1.0-1-Linux-x86_64.sh ENV PATH="/opt/conda/bin:$PATH" # Setup conda env RUN conda create -n sd python=3.9 && \ conda init && \ echo 'conda activate sd' >> ~/.bashrc WORKDIR /root/stable-diffusion-webui CMD ["/bin/bash"] 

构建命令:

docker build -t sd-webui-trt:latest . 

未来任何更新都可以通过修改 Dockerfile 实现版本控制,配合 Git 和 CI 工具(如 Jenkins、GitHub Actions),即可实现全自动化的构建、测试与发布流程。


这种将 Miniconda、Stable Diffusion WebUI 与 TensorRT 深度整合的容器化方案,不仅解决了“在我机器上能跑”的经典难题,还通过推理优化显著提升了服务吞吐能力。无论是用于企业级 AIGC 中台建设,还是个人创作者的高性能本地工作站,这套架构都展现出极强的适应性和扩展潜力。

随着 TensorRT 对扩散模型的支持不断完善(如 TensorRT-LLM 已开始探索扩散结构),未来我们有望看到更多原生级别的优化手段被引入,进一步拉近创意生成与实时交互之间的距离。

Read more

WebForms SortedList 深入解析

WebForms SortedList 深入解析 引言 在Web开发中,数据管理是至关重要的。ASP.NET WebForms框架为我们提供了丰富的控件和功能,其中SortedList控件是用于存储和排序数据的常用工具。本文将深入探讨WebForms中的SortedList控件,包括其基本用法、优缺点以及在实际应用中的注意事项。 SortedList控件概述 SortedList控件是ASP.NET WebForms中的一种数据绑定控件,它基于System.Collections.Specialized命名空间下的SortedList类。SortedList控件可以用来存储键值对,并按照键的顺序自动排序。 SortedList的主要特点: 1. 键值对存储:SortedList控件允许我们将数据以键值对的形式存储,其中键是唯一的,值可以是任何类型的数据。 2. 自动排序:SortedList控件会根据键的顺序自动排序,默认为升序。 3. 数据绑定:SortedList控件可以与数据源进行绑定,实现数据的动态更新。 4. 丰富的API:SortedList控件提供

trae整合figma的mcp实现前端代码自动生成

1.现在trae版本在3.0及以上版本。 2.trae账号是企业版。 3.打开设置,找到mcp 这里需要token,需要从figma账号里生成,网页登录figma账号,找到设置,打开后找到security,然后点击generate new token,token名称随便取,权限都钩上。然后生成一个token,把token放到mcp中即可。 4.使用mcp,切换到mcp模式,你也可以自己创建智能体使用 5.提问使用,可参考下面的提示词使用 注意:这里面的figma链接是mcp的链接,不是figma链接,一般需要你有原型的权限才能看到 我需要根据提供的Figma链接生成一个与设计稿高度一致的网页。请严格遵循以下详细要求:

实测GLM-4.6V-Flash-WEB的OCR能力:复杂界面表现如何

实测GLM-4.6V-Flash-WEB的OCR能力:复杂界面表现如何 你有没有遇到过这样的情况:一张Windows安装界面截图,用传统OCR工具能识别出“下一步”“修复计算机”几个字,但完全不知道哪个是主操作按钮、哪个是隐藏入口、齿轮图标代表什么——更别说判断“点击哪里能跳过联网步骤”了。这次我们不聊理论,直接上手实测智谱最新开源的 GLM-4.6V-Flash-WEB,在真实复杂系统界面中跑一遍它的OCR理解力:它到底能不能看懂按钮背后的意图?面对中英混排、图标+文字、模糊截图、多分辨率窗口,它的表现稳不稳?结果可能比你预想的更实在。 1. 测试准备:三类典型复杂界面样本 要验证一个视觉模型的真实OCR能力,不能只靠标准印刷体测试图。我们选了三类微PE团队日常高频接触、也是传统OCR最容易翻车的界面类型,全部来自真实系统环境截图(非合成图): 1.1 样本说明与采集方式 * 样本A:Windows 11 安装向导(中文版) 分辨率1920×1080,含动态阴影、半透明按钮、右下角电源图标、

绿联云NAS配置webdav

绿联云NAS配置webdav

前言         zotero使用webdav服务时使用绿联自带的webdav服务只能使用http协议,并且只能在局域网内传输,故而尝试自行配置,以期实现公网文献同步。 注:非专业,自己在配置的时候也是根据前人的分享实现的,可能有很多不准确的地方,请见谅。 1. 大致思路         购买域名(腾讯云)→配置DDNS-go(docker)→获取SSL证书(乐此加密)→配置natfrp(docker) ①域名:固定域名,后续内网穿透时可以使用自定义域名; ②DDNS-go:自动更新域名解析到公网IP; ③SSL证书:https协议需要; ④natfrp:内网穿透需要,这里使用的是Sakura Frp。 2.参考文献 (31 封私信 / 80 条消息) 绿联 NAS 域名直连 DDNS-Go+IPv6 内网穿透并开启 HTTPS - 知乎https://zhuanlan.zhihu.com/p/