python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

2023-07-0318:27:06人工智能与大数据Comments1,548 views字数 6745阅读模式

本文结合Python的工具链与包管理,介绍了AIGC框架SD-WebUI源码结构与部署方法。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

本文主要介绍了以下几部分内容:
① python工具链:包括anaconda、spyder等,想搞python,一个强大方便的开发环境是非常必要的
② python包管理:深入介绍了虚拟环境、包管理、import系统、动态加载,这部分内容相对复杂
③ python与AIGC:python是人工智能领域的主流编程语言,本文分析了sd-webui的源码结构,及其在多个环境的部署方法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

学习python,除了把代码码好外,还要不断折腾python本身,本文提供了足够多的实操细节,通过实操来深入掌握python。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

Python工具链

学习一门新语言,首先搞定开发环境与工具链。
python上手很容易,比如我们用一行代码就能写个HelloWorld: python -c 'print("Hello World!")' 。
python很强大,这种强大是建立在其数量庞大的应用包,如果没有一款方便的IDE开发环境,麻烦的包管理就可以成功劝退很多新手。
笔者在学习python的过程中,摸索过很多IDE,下面介绍几个比较好用的。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

Anaconda

Anaconda是一个Python集成开发环境,功能很强大,使用简单。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

最关键的是Anaconda把数据科学和人工智能领域常用的IDE都集成起来,Anaconda本质是一个IDE容器,里面以插件的形式预置了很多开发工具。
Anaconda(官方网址)就是可以便捷获取包且对包能够进行管理,同时对环境可以统一管理的发行版本。Anaconda包含了conda、Python在内的超过180个科学包及其依赖项。
anaconda安装好后的界面:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

如何玩转Anaconda,请参考下面这篇文章的介绍:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

参考:zhuanlan.zhihu.com/p/32文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

Spyder

spyder,数据科学领域著名的IDE,早些年,笔者直接作为python编辑器使用。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

Vim

在linux环境下,经常用vim对文本文件做一些简单的增删改查编辑操作,老司机一般都会用, 建议新手做简单学习:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

其他工具,比如git、vscode等,一般办公机/开发机上都安装过了,就不在介绍了。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

Python包管理

虚拟环境

Python 虚拟环境主要是为不同 Python 项目创建一个隔离的环境,每个项目都可以拥有独立的依赖包环境,而项目间的依赖包互不影响。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

笔者最早开始学习python的时候,并没有听说过virtualenv(用于python2,一个第三方库),而且笔者负责的项目规模也不大,不太能用的上虚拟环境。
随着AIGC大规模兴起,python应用的规模会越来越大,这样在涉及多人协作开发,并在容器上大规模部署的时候,用来做执行环境隔离的虚拟环境,就是一个必不可少的概念。所以,到了python3.3,默认自带venv虚拟环境管理包。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

包管理

当前python3的最新版本,默认自带venv,venv用来创建虚拟环境,pip用来做包管理,两者搭配使用。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

conda是一个集成工具,既能管理虚拟环境,也能做包管理。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

这里有个问题:python自带了虚拟环境管理工具venv,同时conda也可以管理虚拟环境,那么当这两个工具共同存在的时候,会怎么样呢?
笔者在自己的办公机上,用venv和conda分别创建了虚拟环境,总结出了如下的规律:
① python解释器在启动是会自动设置默认的环境,sys.path里有默认的package路径。
② conda和venv各自管理自己的虚拟环境,conda和venv可以自己激活自己创建的虚拟环境,各自只能激活一个。
③ conda和venv在激活虚拟环境的时候,最终都是在sys.path里添加了虚拟环境的路径。
④ 可以看到,两种虚拟环境混合在一起的时候,包的管理很复杂,尤其是同一个package在不同的虚拟环境有不同版本时,很容易让程序在执行时抛出异常。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

import系统

写python代码的时候,关于包与模块的基础知识点,梳理如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

如果只是简单的日常写代码,上面的知识点已经够用,但如果要深究背后的技术原理,python其实有一套复杂的"import系统"。
Python的整个import过程相对复杂,概括来说主要以下3点:
① 先从模块缓存sys.modules里查找,模块被加载过一次后会放入缓存
② 在sys.meta_path里有多个finder,通过finder来查找路径
③ finder找到模块后会返回一个loader,loader负责加载模块文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

在整个import系统里,有三个关键概念,元路径查找器(meta path finder),ModuleSpec 对象,加载器(loader), 深入理解有助于从整体上把握整个import系统:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

关于imort system的详细介绍,以下两个文档值得一读,一个python官方文档,一个是技术要点梳理:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

一个python官方文档文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

技术要点梳理文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

动态加载

理解import系统的技术原理,不是为了涨知识,而是希望能做点什么。
我们知道在代码文件中,一句“import pkg”,会让程序在启动的时候导入一个pkg,有时候我们希望在程序运行过程中,动态导入一个模块,例如我们希望实现一套能动态加载的插件机制。
如何做到,可以使用动态加载,这里有三种方法:
● 方法1:使用__import__()来实现
● 方法2:import 勾子,使用path_hook实现
● 方法3:import 勾子,使用meta_hook实现,即自定义Finder与Loader
先来看第一种方法,和 import 不同的是,__import__ 是一个函数,也正是因为这个原因,使得 __import__ 的使用会更加灵活,常常用于框架中,用于插件的动态加载。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

接下来的两个方法是import 勾子,使用起来比__import__()复杂,但功能会更强大。
Python 存在两种导入钩子程序的形态:
● 一类是 meta hook(元钩子程序),
● 一类是 path hook(导入路径钩子程序)。
下面是一个path hook的例子,通过添加一个勾子(path_hook)来改变 sys.meta_path 或者 sys.path,从而来改变 import 机制的行为:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

下面是一个meta path的例子,通过自定义Finder与Loader来实现远程模块导入:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

以下是远程模块导入的执行效果,看看如何用一个很简单的方法启动一个http服务器,然后在命令行里查看效果:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

这里有几个常用变量,可以查看当前包与模块的配置情况:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

当下这个时间节点,人工智能风急浪高,聊Python如果不聊点AIGC,会显得很外行。
最近,有个很流行的AIGC应用叫Stable Diffusion WebUI(以下简称WebUI),用python开发的,可以在本地跑起来。
我们可以尝试在自己的机器上把这个程序跑起来,从而把前面讲的python知识全部用起来,通过动手实操来学习python和AIGC。
webui这个应用比较大,有很多可以折腾的地方,下面来看看笔者是怎么折腾的。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

WebUI源码分析

从开发视角来看,如果要做一款AIGC应用,Webui会是一个不错的起点,因为:
(1) 从其源代码我们可以了解到,Webui主要由四部分构成:Web界面、API网关、AI模型、AI功能模块。
(2) 源代码提供的非常完成的部署脚本,可以在windows/linux单机上快速完成部署
(3) 程序work起来后,通过浏览器就可以随便使用,甚至在修改源代码后立即查看修改效果
(4) 可以用WebUI做为参考模型,搭建一套大规模的分布式AIGC应用,这也是笔者分析其源码的原因。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

WebUI源代码:
github.com/AUTOMATIC111文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

接下来先大体看看webui的源代码,先来看看它是怎么实现的,这样在部署的时候能减少一些摸索时间。
注:笔者就是先部署,然后再看的源代码。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

代码结构

整个代码结构主要分为一下几个部分:
✧ 启动过程:这部分主要是由shell脚本实现的,主要完成检查环境变量、检查系统设置、读取参数等
✧ 包管理:启动时webui会用venv来创建虚拟环境,启动过程中创建的所有package都放在这个虚拟环境里
✧ web界面:使用Gradio框架实现,一个由python实现的web框架
✧ API网关:整个webui是一个典型的web应用,使用fastapi框架来搭建http服务
✧ AI模型:models目录专门来存放各种模型文件
✧ AI功能模块:mudules目录是各个功能的实现,比如txt2img,img2img等文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

启动过程

启动过程中,各位文件之间的关系如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

程序配置

有两个地方可以设置启动参数:
webui-user.sh: 主要用来设置环境变量
webui.sh: 启动时在命令行指定参数文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

UI界面

使用Gradio,直接用python搭建出web demo,不需要懂js开发。下图中,几行python代码即可生成右边的web界面:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

Gradio官网:gradio.app/文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

API网关

webui的API部分是通过FastAPI web框架来实现的,这是一个高性能的、支持类型提示的现代web框架:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

fastapi官网:fastapi.tiangolo.com/zh文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

WebUI部署

部署步骤

部署sd-webui,大体分为四步:
① 搭建python执行环境,最好是按照集成开发环境,这样便于包管理
② 下载sd-webui的源代码,然后用源代码里的安装脚本进行安装,首次安装会下载很多依赖包
③ 下载模型文件,sd-webui的源代码里默认没有模型文件,需要单独下载
④ 通过指定参数启动webui文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

展开来看,这个安装与运行过程如下(可以把123容器换成windows或linux,123容器本身也是linux环境):文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

Window部署

① 下载并安装Anaconda(官网
② 下载sd-webui的源代码
git地址:github.com/AUTOMATIC111
直接将压缩包下载到windows上:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

③ 下载模型文件,并放在指定目录文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

huggingface.co/CompVis/文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

在sd-webui的源代码中找到下面的路径,将下载好的模型放入该目录里:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

注:模型文件有几个G大小,下载较慢
④ 通过指定参数启动webui
在sd-webui源代码的目录里,找到webui-user.bat文件,然后执行:
./webui.bat --skip-torch-cuda-test --precision full --no-half
成功启动后显示:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

注:整个执行过程较慢,启动期间会下载很多文件,大约持续十几分钟。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

linux部署

① 下载并安装Anaconda
mkdir aigc
cd aigc
wget repo.anaconda.com/archi
chmod +x *.sh
./Anaconda3-2023.03-1-Linux-x86_64.sh
~~~开始安装,中间有几步手动确认操作
安装完成后,执行
source ~/.bashrc
然后执行 conda info,看到以下命令,说明安装成功:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

②下载sd-webui的源代码
git地址:github.com/AUTOMATIC111
执行命令:
git clone github.com/AUTOMATIC111文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

③ 下载模型文件,并放在指定目录
模型地址:huggingface.co/CompVis/
找到下载地址后,在linux上执行:
cd stable-diffusion-webui/models/Stable-diffusion/
wget huggingface.co/CompVis/
或者
curl -O huggingface.co/CompVis/
注:模型4G大小,下载大约5分钟左右文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

④ 通过指定参数启动webui
cd /root/aigc/stable-diffusion-webui
./webui.sh --listen --port 4567 --skip-torch-cuda-test --precision full --no-half文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

123容器部署

用源码安装,在123容器上整个过程及其缓慢,而且由于公司网络策略,有些依赖包下载不下来,需要手动处理,及其繁琐。
一种快速的部署方法是:
将云编译机上已经跑起来的webui整体打包成stable-diffusion-webui.tgz通过windows办公机中转到123容器上,然后解压缩,直接启动程序。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

使用这种方法,把webui.sh 启动起来后,显示如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

具体操作过程如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

看看效果

python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

webui相关参数介绍,网上很多相关介绍,摘录如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

python工具链、包管理及Stable Diffusion WebUI源码结构和部署方法

在设置页面中,您可以输入文本,选择模型并配置其他参数。
✓ 文本是必需的,它将成为图像生成的依据。
✓ 您可以选择预定义的模型或上传自己的模型。
✓ 您还可以选择一些其他参数,例如批处理大小,生成的图像尺寸等。
下面是一些参数的说明:
● 采样方法 (Sampler):这个参数允许您选择用于生成图像的采样方法。默认情况下,该参数设置为“Eulea”,但您也可以选择“DPM++”后面的新加入选项,这个会比默认的生成的图片细节内容更加丰富些。
● 迭代步数(Sampling steps): 这个参数允许您指定图像生成的迭代次数。较多的迭代次数可能会导致更好的图像质量,但也需要更长的时间来完成生成,默认50起步。
● 宽度&高度:这个参数允许您指定图片生成的高度和宽度。较大的高度宽度需要更多的显存计算资源,这里默认512*512即可,需要图片放大我们可以去更多(send to extras)模块用放大算法进行图片放大。
● 生成批次(Batch count):此参数允许您用指定模型将为每个生成的图像运行的最大迭代次数。增加这个值多次生成图片但生成的时间也会更长(有多图需要建议减少图片生成的批次改为增加单次生成图片的数量参数即可)。
● 每批数量(Batch size):此参数允许您指定一次可以生成的最大图像数量。如果您的系统资源有限,并且需要以较小的批量生成映像,那么这可能很有用。
● 提示词相关性(CFG Scale):此参数可以变更图像与提示符的一致程度(增加这个值将导致图像更接近你的提示,但过高会让图像色彩过于饱和,数值越小AI绘图发挥的自我空间越大越有可能产生有创意的结果(默认为7)。
● 种子数(Seed): 此参数允许您指定一个随机种子,将用于初始化图像生成过程。相同的种子值每次都会产生相同的图像集,这对于再现性和一致性很有用。如果将种子值保留为-1,则每次运行文本-图像特性时将生成一个随机种子。
● 优化面部(Restore faces):优绘制面部图像可勾选,头像是近角时勾选貌似容易过度拟合出现虚化,适合在远角时勾选该选项。
● 可平铺(Tiling):用于生成一个可以平铺的图像。
● Highres. fix:使用两个步骤的过程进行生成,以较小的分辨率创建图像,然后在不改变构图的情况下改进其中的细节,选择该部分会有两个新的参数Scale latent在潜空间中对图像进行缩放。另一种方法是从潜在的表象中产生完整的图像,将其升级,然后将其移回潜在的空间。Denoising strength 决定算法对图像内容的保留程度。在0处,什么都不会改变,而在1处,你会得到一个不相关的图像;
参考:
zhuanlan.zhihu.com/p/60文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

总结

本文介绍了python的工具链、包管理,以及Stable Diffusion WebUI的源码结构和部署方法。
文中提供了足够多的操作细节,这样有利于阅读本文的同学照着操作,在不断折腾不断拷打python的过程中,一步步锤炼自己的python能力。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/49613.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/ai/49613.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定