用ROCm来干点正事儿。
# 序
ROCm 与 CUDA 均为加速GPU运算的计算平台。而 Pytorch 与 TensorFlow 等为开源的机器学习框架(库),旨在提供一系列机器学习算法。本贴展示如何利用计算平台 ROCm 与机器学习框架 Pytorch 在 Conda 创建的虚拟环境下加速Stable-Diffusion。很痛苦,部署完 ROCm6.2.4 平台后发现Pytorch仅支持\(\text{6.2.0}\)的\(\text{ROCm}\)。同时,与安装文件 .sh 里面预先写好\(\text{5.7.0}\)不一致。
鉴此,安装前应先明确自己的\(\text{ROCm}\)和\(\text{Python}\)版本,若 webui.sh 中填写的版本与自身版本不一致,应手动编辑该文件对应的版本至自身版本。例如:
python_cmd="python3.10" 修改为 python_cmd="python3.11"
-index-url https://download.pytorch.org/nightly/rocm5.7" 修改为 /whl/rocm6.2
# 部署ROCm与Pytorch
参考此处以在 Ubuntu 系统中部署 ROCm 与 Pytorch 。
# 安装依赖
为Stable Diffusion web UI (SD)安装依赖
sudo apt install wget git python3 python3-venv
# 下载并安装SD
进入设定好的ROCm虚拟环境后便可以执行 .sh 文件以安装SD。
# 在文件夹中下载SD
git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui
可以使用文本编辑器查看该可执行程序,不难发现在检查先决条件时查看GPU型号,并根据它来安装ROCm及Pytorch。因为该系统与虚拟环境已部署上述平台与框架,因此自动安装中会跳过该部分的安装。
安装SD
进入虚拟环境,在stable-diffusion-webui文件夹中安装SD:
# 进入ROCm与Pytorch的虚拟环境
conda activate env_name
# 安装SD
bash webui.sh
若卡在\(\text{Installing requirements}\),则参考此处解决。
若提示[latex]\text{MIOpen(HIP) Warning}[/latex],则参考此处解决。
最后根据终端提示打开 http://127.0.0.1:7860 进入SD页面。
启动SD
# 进入ROCm虚拟环境
conda activate env_name
# 运行launch.py,--precision full和--no-half作用相同,使用其中一个选项即可。
python launch.py --precision full --no-half # --no-half是禁止程序完全使用fp16,以规避一些硬件不支持fp16。该选项意味支持fp16及fp32。
查看此处获取解决卡在\(\text{Installing gfpgan}\)命令的方案。
# 爆内存
若在生成较大图片时提示显存不足,则启动SD时考虑添加以下选项:
# --xformers (需要额外安装,并且仅对NVIDIA GPU有效)
python launch.py --precision full --no-half --xformers
# --medvram (无需额外安装)
python launch.py --precision full --no-half --medvram
并在SD根目录下进入 webui-user.bat 添加以下代码:
set PYTORCH_HIP_ALLOC_CONF=max_split_size_mb:3999
该值应根据错误提示Tried to allocate X.XX GiB来设置,将其换算为整数MB。
# 模型
此时已成功部署SD所依赖环境并顺利启动SD,然而,相关模型还需额外下载:
# checkpoint (ckpt) 或safetensors
下载后放入stable-diffusion-webui/models/Stable-diffusion
# LoRa,用于固定画风、服装、姿势、发型等,有文章指出以后会替代hypernetwork
下载后放入stable-diffusion-webui/models/Lora
# hypernetwork,用于切换画风
下载后放入stable-diffusion-webui/models/hypernetworks
# ControlNet
见下文详细描述
可以通过以下链接下载模型:
https://civitai.com/
https://huggingface.co/models
checkpoint模型
下载后放入对应文件夹内,然后在浏览器界面左上角的下拉框中选中模型。
LoRa模型
下载后放入对应文件夹内,在Prompt栏中调用LoRa模型。该类模型能够较好固定画风、人物的服装、发型、动作等。
# <lora:filename:multiplier>
- multiplier用于设置该LoRa模型的权重,默认为1,设置为0使其失效。
- filename应不包括后缀
<lora:DreamArtV1.3:1>
此外,在界面中可以可视化查看已有LoRa模型,左键点击即可添加至Prompt栏:
hypernetwork
同上。该类模型能够较好切换画风。
ControlNet
控制网络安装如下: 在SD中进入Extensions -> Install from URL。输入以下链接进行下载:
https://github.com/Mikubill/sd-webui-controlnet.git
安装完成后:
- 根据提示进入Installed选项卡
- 点击Check for updates按钮
- 点击Update and restart UI或Apply and quit
- 重启SD
- 下载模型并放入stable-diffusion-webui\extensions\sd-webui-controlnet\models\
具体参考此处。
openpose 模型可以精准刻画人物的动作、表情、面部朝向、手指等。 depth 模型描绘具有空间层次(深度、远近)的场景。其中Leres++预处理器精度最佳。然而在还原人物肢体交叠、人体透视时可以调用较低精度的预处理器。 canny 模型用于提取图像边缘特征,用于图像还原与固定。此外,一些文字、标识可以利用该模型确保其不会发生变形。关于ControlNet的模型应用:
然而,当 canny 由于过于约束图像而不适合发散时,切换到 softedge 模型是有效的解决途径之一。该模型与前者类似,然而仅保留轮廓,不会约束细节表现。
lineart 模型非常适合线稿上色。若线稿不是黑底白线,则开启invert选项。 scribble 模型能够利用用户的涂鸦并根据提示词进行生成。在Resize Mode中调整骨骼图与全图的位置关系。如骨骼图为正方形,而全图为16:9的矩形,那么不应选择Crop and Resize,而应根据需求选择另外两项。
关于MultiControlNet:
进入设置菜单,进入ControlNet选项卡。调整最大模型数量以实现多组模型的运用。调整后点击保存设置,然后重启前端。随后在ControlNet中可以发现多组设置选项卡。
# 扩展安装
拉取webUI官方扩展.json
默认链接,加载后可以搜索扩展名进行安装。
拉取Git
拉取Git也能实现一键安装。如安装Mikubill的ControlNet扩展。
下载扩展文件,复制到/stable-diffusion-webui/extensions/中
这也是较为简单的一种安装方式。
# 图像高清生成
直接生成高分辨率图像极容易导致 OOM ,因此对于小显存用户来说,一种在较低显存消耗的条件下生成较高分辨率并具有精致细节的图片的算法亟待提出。
这里给出的方案是: 安装以下三种扩展,其中最后一种为ControlNet的模型,基于ControlNet扩展。
MultiDiffusion - 大尺寸下重绘 Tiled VAE - 瓦片式VAE编码以降低显存 前两者被集成在一个扩展中 - https://github.com/pkuliyi2015/multidiffusion-upscaler-for-automatic1111 ControlNet Tile - 控制内容
关于 MultiDiffusion 的参数设置,建议将Tile Size设置为64-160之间的正方形,其中以96与128为最佳; Overlap推荐设置为32或48 MultiDiffusion 与16或32 Mixture of Diffusers 。此外,仅有两种情况需要调整 Tiled VAE 参数: 当OOM依旧发生时,可以降低Encoder Tile Size; 当较小Tile导致图片变得灰暗时,可以勾选Encoder Color Fix。
具体使用方法:
修改SD根目录下 ui-config.json 文件:
# 修改UI中最大图像宽度,将2048改为3840
"txt2img/Width/maximum": 3840
"img2img/Width/maximum": 3840
# 修改UI中最大图像高度
"txt2img/Height/maximum": 2160
"img2img/Height/maximum": 2160
生成一张原始图片,并发送至 img2img 。设置Resize to指定最后生成图片的大小,取消勾选保持输入图片大小,设置缩放倍数为一倍。放大算法选择 R-ESRGAN 。若想获取更多细节,可以拉高 Denoising strength 。然后使用 ControNet Tile 加载最初的原始图像,Preprocessor选择tile_resample其余参数无需改动,点击生成即可。
若想放大已生成图片,在 img2img 中选择中待放大图片后,修改Resize to指定生成图片的大小。取消勾选保持输入图片大小,设置缩放倍数为一倍。
然后启动ControlNet,选择Type为 Tile 。
注:可以填写原来的或其他提示词,以在原图下进行改动。 Control Mode 可以规定多大程度上保留或改动原图。
若想锐化图幅,预处理则选colorfix+sharp。
高清修复实例
# 手部控制
自从AI绘图问世,手部控制一直是导致无法制作精美图片的难题。然而ControlNet的提出有效地解决了该问题。除了使用上文提到的 OpenPose 控制手部,还可以使用 sd-webui-depth-lib 扩展。
# 安装扩展
https://github.com/jexom/sd-webui-depth-lib.git
# 下载更多手部map到/extensions/sd-webui-depth-lib/maps
https://civitai.com/models/67174
- ControlNet Preprocessor: lineart_realistic, depth_zoe or depth_midas
- ControlNet Model: lineart or depth
- ControlNet Starting Step: 0.1-0.2
在顶部菜单栏中进入 Depth Library 选项卡,以配置手部信息并传送给ControlNet。
出现异常Exception in ASGI application,笔者发现无法成功使用该扩展,因此在扩展文件夹中删除了该扩展,一切恢复正常。
# 采样方法
DPM++ SDE Karras
待补充
# 咒语
自用提示词记录:
提示词越靠前,权重越高。
# 基础正向提示词
(masterpiece:1.2), (best quality:1.2), (extremely detailed:1.2),stunningly beautiful girl,
# 人数
1girl,sole,
# 画风
<lora:DreamArt:0.3>,
# 镜头距离以决定绘制人体范围,如半身像,全身像,个人资料图。可以使用LoRa、OpenPose设置范围。
portrait,close-up,
# 镜头风格
face focus,
# 镜头角度
complete front view, complete front shot,front view,
# 灯光(工作室、电影照明、柔光、逆光、人物发光、云隙光等)
Natural Volumetric Lighting And Best Shadows,moonlight,light from above,underlighting,
# 构图
中心、水平、垂直、三分法、对称法、对角线等,
bilaterally symmetrical(左右对称),
# 人物(女孩,美少女等)
girl,bishoujo,
# 角色(职业等)
maid,
# 脸部
perfect face,delicate face,
# 人物神情
looking at viewer, smile,
# 体型
immature body,perfect body,
# 身着、外貌描述,这里可以分身体部分来描写,如头部、上身、下身、脚等
red flower bud on head, white and gold corselet, maid dress, green eyes, lace bra, silver hair,
# 姿势、动作。可以使用LoRa或OpenPose设置姿势。
sitting on floor,
# 环境、背景
<lora:locker_room_v0.1:0.3>,locker room,
# 环境中的其他物品
springs,
# 季节、时间
spring,night,
# 当生成NSFW内容时推荐指定的提示词
(nsfw),
# 其他LoRa
<lora:add_detail:1>,
关于 镜头距离 :
portrait,extreme close-up(超近景),close-up(近景),medium close-up(中近景),medium shot(中镜头),long shot(长镜头),establishing shot(场景镜头),point-of-view(主观视角),cowboy shot(上半身及大腿),medium full shot(中全景镜头),full shot(全景镜头),upper body(上半身),full body(全身),macro view(微距镜头),
关于 镜头角度 :
complete front view, complete front shot,front view(正面),side view,back view,from above,from behind,from below,wide angle view(广角镜头),fisheyes view(鱼眼镜头),overhead shot(俯视),top down(自上而下),bird's eye view(鸟瞰),high angle(高角度),slightly above(轻微高角度),straight on(水平拍摄),hero view,low view(低视角),worm's eye view(仰视),selfie(自拍,看得到手臂)
提示词中的符号:
# ()/{}/[] - 权重设置
(prompt) = prompt * 1.1
{prompt} = prompt * 1.05
[prompt] = prompt * 0.9
# (:) - 自定义权重
(prompt:1.2) = prompt * 1.2
# p1+_p2 - 并列权重
prompt1+_prompt2
# p1 AND p2 - 融合(注意空格)
prompt1 AND prompt2
# [:] - 分步扩散,在指定步数开始生效
[car:5]
# [p1::] - 分步扩散,在指定步数停止生效
[car::15]
# [p1:p2:] - 分步扩散,在指定步数切换生效提示词,指定步数前p1生效,之后p2生效
car:train:10
# | - 循环扩散
[pink|black]hair
咒语生成器:
https://www.wujieai.com/tag-generator
使用EasyNegative提升图像质量:
首先在C站下载EasyNegative并放入SD根目录embeddings文件夹中。在UI界面以下图方式插入在负向提示词栏目中。
除easynegative外,还有诸如badhand、ng_deepnegative等embeddings。
# 移动模型位置并创建软链接
使用过程中 /home 空间愈发不足,而 / 下还有较多剩余空间。因此在根目录下新建 workspace 文件夹以盛放模型。为使SD正常工作,创建软链接至原来的位置。
# 创建文件夹
sudo mkdir -p /workspace/stable-diffusion/models/Stable-diffusion
# 移动文件
mv ~/sd/models/Stable-diffusion/xx模型 /workspace/stable-diffusion/models/Stable-diffusion
# 创建软链接
ln -s /workspace/stable-diffusion/models/Stable-diffusion/xx模型 ~/sd/models/Stable-diffusion
# 解决安装时卡在Installing requirements
在终端按 Ctrl+C 退出安装程序,手动安装各项依赖。这些依赖存放在\(\text{SD}\)的根目录中。
pip3 install -r ./requirements.txt
pip3 install -r ./requirements_versions.txt
启动\(\text{SD}\)时,\(\text{AMD}\)显卡用户不用理会\(\text{xFormers}\)启动失败的提示。
# 使用\(\textbf{pip}\)安装\(\text{gfpgan}\)与\(\text{open-clip}\)
博主尝试利用 Conda 和\(\textbf{pip3}\)安装该库均以失败告终,最后发现缺失\(\text{cython}\)依赖是问题所在。因此需先安装该依赖项,解决方案如下:
pip install cython
pip install basicsr
pip install facexlib
# 非必须 pip install basicsr>=1.4.2 facexlib>=0.2.5 lmdb numpy opencv-python pyyaml scipy tb-nightly torch>=1.7 torchvision tqdm yapf
pip install gfpgan
pip install clip
python3 -m pip install git+https://github.com/mlfoundations/open_clip.git@bb6e834e9c70d9c27d0dc3ecedeebeaeb1ffad6b --prefer-binary