碎碎念之安装 Stable Diffusion
转念一想认为相比去 P 站找一个漂亮的图片,显然还是用 SD 自己生成一个更好一点。
于是我就想着本地部署一个 SD 玩玩,毕竟士大也用这个东西去生成图片,他能做的我为什么不能,你说对吧。
对吗?
我不确定。
但为了逞强还是这么做吧。
于是我开始想着如何部署。我受够了沙乱的黑箱,于是我决定用自行开始部署,第一步肯定还是问 ChatGPT。显然我不可能去用干模型,GPT 给我推荐了 非常经典的 SD Webui。
这里是噩梦(暂时的)的开始。
每个部署都会这样?
好吧,我预料到会有依赖和兼容性问题,其实这没什么——尤其是在包里面有了自动脚本的时候。但这个自动脚本就给了我当头一棒。
谁不喜欢 bash 呢?zsh 当然更好,powershell 也不是不行,你可能会说我喜欢 fish 或者别的什么,但如果和 CMD 相比其实都无关紧要。但这个脚本是 bat,意味着我需要一个 CMD 来运行它。我不是说不行,但我觉得不好,因为我不能用我最喜欢的 export ALL_PROXY="socks5h://127.0.0.1:10808"了。
我只能祈祷整个安装过程中 GFW 放我一马,让我别碰到不得不想办法挂代理的问题,但坏处是这些东西要从四个不同的 web 源下载安装,每个的可访问性都不同。
第一个是 pip,我配置了清华源,所以可访问性是最好的。我看着进度条跑了一会儿,感觉还不错。
接下来要在 Github clone 仓库,不出所料地爆了。其实说实在的我并不是特别闹心,因为我可以在启动脚本里面定义环境变量,而且脚本里面已经定义过几个变量了所以我不需要现场查 CMD 的手册。于是我定义了上面的代理,然后运行。
错误产生了。
为什么呢?仔细一看是因为我不应当加双引号。不是我请问了
好吧,这是一个很古早的兼容性行为,或者别的什么,我懒得探究。于是我稍作订正,然后再次跑,这次 Clone 成功了。下一步是什么?pytorch?
没错,pytorch。听上去很好不是吗。但因为我没有安装对应的 socks 库,因此无法使用 socks 代理安装。
搞什么——————
其实我安装了。但这里是 Python 虚拟环境,所以我没安装。于是我注释掉环境变量重新运行。
很好,这次 Python 成功了,然后我接着看终端,出现了一个意料之中的域名:hunggingface。
哈哈。
Ctrl-C 终止,然后挂代理。之后 Python 又告诉我我需要 socks 库。
现在我必须想办法去搞一个 socks 库安装到虚拟环境了。我这样对自己说。祝我好运。
切换到 python 虚拟环境挺容易,运行其中的 active 脚本就行,但不知道为什么我看不出来 pip 到底安装上 pysocks库没有。经验告诉我这时候一般是没安装上,但我决定试试看。结果不出所料地报错了,但错误信息指示是因为 socks5h 为未知的代理协议。
很狗屎不是吗,socks5,socks5h,到底哪个标准哪个不标准?为什么 curl 和 git 需要 socks5h 而 python 不行?还是单纯因为我没用对库?
哈哈,其实是因为我装错了库。我需要socksio库。于是我再次进入虚拟环境,然后发现这个库已经安装了。
事实上,一阵空虚和绝望袭击了我。
BYD,这意味着我事实上之前以为自己在虚拟环境里执行安装,事实上却并没有。我不愿意再处理 cygwin 的一套狗屎了,好在我看到了 ps1 脚本(我认为这套事情完事之后应该学习一下 powershell),我相信它总会起效的。
It just works! 它起作用了!看着绿色的 venv,我感到无比的麻辣与鲜香。总之让我们赶紧 pip 吧。
pip 安装完了,下一步是继续运行脚本……
不得不说,文件资源管理器的标签页功能真是太好用了。我可以开两个标签页,一个放在虚拟环境,一个放在主目录,方便快速切换运行脚本。然后我绝望地发现又报错了。
为什么呢?哦,原来是之前安装的 pysocks 库现在需要用,但我没把它安装在虚拟环境里面。
好吧,返回 PS,再次安装……
这下我想起来为什么 pip 是清华源了,就是因为之前某个项目也被困在 socks 的依赖地狱里面,那简直是生不如死的滋味。好在这次没问题了吧?应该吧?
哈哈,然后是握手失败。
说实在的,这也是为什么我一直在纠结这个 socks5h 的地方。不用 socks5h,代理就会直接把 IP 发过去握手然后引发 TLS 错误。这已经很清楚了。然后呢?
现在想起来透明代理了?
然后,下一层地狱的大门打开了。
socks5h 并非一个标准的协议,它是 CURL 风格的 socks5 语法糖。当然,相当一部分 Python 库已经支持了这个写法,还有一部分正在支持。但——如果项目里面一半的包支持、另一半不支持呢?
就会变成这个情况。
在一部分包接受了 socks5h 这个写法后,另一部分包开始不停地报错。我询问 ChatGPT 原因,它告诉我是因为我没有安装对应的扩展。其实这么说是对的,因为这些包确实有适用的扩展,只不过这些扩展要么适用于高版本,要么这些包自己在高版本就已经支持了 socks5h 扩展。
然后,整个依赖就崩塌了。
在经历了数个小时不断修复被破坏的依赖项,然后又 pip 重新安装它们后,我放弃了。
遇见的问题包括但不限于使用未定义的函数、尝试引入已经改变的接口、未定义行为、手动安装的版本和 requirements.txt 打架等。
终于,我决定转用 http 代理。这非常快,直接解决了我的问题——现在想来是我太依赖 socks5 了。
我的大脑已经保护性地遗忘了那些在代码中跳转的记忆,希望我再也不会想起来它们。
但,为什么不用透明代理呢?
哈哈,天知道。我得配个透明代理以备不时之需。
接下来要做的就是开始调 prompt 来出图了,祝我一切顺利吧!我还从没接触过这种 prompt,看起来很难,但我相信自己。
出图啦!
第一批生成的图片不算太好,但我尝试着用 ChatGPT 帮忙后,效果迅速好了起来。于是,我要求 ChatGPT 为我写一段 prompt,帮我将酒馆的 AI 接入这个系统,便于我用 Gemim 生成 prompt。
接下来,我只要用自然语言描述就可以得到合适的 prompt 了。我在几次尝试后选出了一张很好的图片——都还不错其实,但总是差点意思,不过已经很好了。
其中一张成为了此站点的图像。

坦白讲,这让我想到太空军,或者科研船之类科幻风格的东西。我很喜欢。
接下来是生成一个 5*4 的矩阵,我想着从中挑选一些出来。速度比较慢,但是效果很好,有很多图片都满足我的喜好——甚至是,你知道,从我意想不到的角度!
这也让我意识到最好不要那么关注 Prompt,因为如果我只看着我想要的东西,大概就会忽略其它的美。
如果可能,我会把它接入酒馆,试试看色色!
时间:别忘了这也是一种资源
Linux is free if your time is free
哈哈,显然酒馆也是这样。
要知道,虽然出图很慢,但时间主要浪费在了一次次调 prompt 上。 SD 不像 LLM 这些文本操作模型,对于不会绘画的我来说,精修这些图片是不可能的,要么接受小瑕疵,要么全盘重绘——更多时候,已经不是小瑕疵的范畴了。
使用 AI 生成固然是一个好想法,但目前酒馆的破限都是针对角色扮演,很少对生成提示词几乎没什么帮助。因此,我既要忍受和 LLM 纠缠道德,又得忍受一次次生成失败、改提示词,然后重来。
而且,由于种子不同,相同参数生成的东西不一定相同,让人不禁会想“是不是多生成几张就好了?”
更让人哭笑不得的是,如果真的生成一个矩阵,其中会有相当一部分图片理解了 prompt,另一部分没能理解——无论是什么。坦白讲,这相当让人沮丧。
为了加快速度,我将屏幕分辨率从 2560*1600@240Hz 降低到 1280*800@30Hz,这确实加快了速度,但也让我失去了几乎所有的多任务能力。我放弃了刷视频,只听听音乐,然后看 SD 的图片从模糊不清到成型。
这个过程有时候是惊喜的,更多时候是失望的。很多时候,模糊不清的图片让人感到希望满满,但随着清晰化,那些要点却消失了。而如果模糊不清的图片就让人失望,那就更糟糕了,中断生成看起来也没快多少。如果迭代数量过少,生成的图片没什么意义;过多又拖累速度。
记录几张生成的图片吧,以及对应的想法。
矬子里面拔大个

好喜欢芭蕾少女。
优雅而柔软的躯体,高贵而典雅——起码对我来说,光是看着那高贵的玉体就足以让我感到一阵内心的震颤。

练习的很认真呢……如果足尖能踩在我身上的话……

姐姐坐我脸上!!!
prprprpr
🥰
如果姐姐愿意双脚并拢,让我把脸埋进去,然后坐在我的后脑上……
斯哈斯哈,不敢想了,会漏先走液出来的……

真人风格中比较不错的一张了,我总想第一人称看到大姐姐抱过来……把头埋进去……吸姐姐的味道……被姐姐呼气吹在耳边……
真可惜,SD 做不出来,或者我还没研究明白呢。

好经典的构图呢,张开的双腿就像是用来捕猎的捕兽夹一样!
等着男孩子失去理智将头伸过去的时候,用温暖有力的大腿夹住脖子,轻声说“帮人家舔舒服了才能走哦”,然后用窒息快感把男孩子玩到高潮什么的……

同样是经典又色情的构图!可不可以舔姐姐的脚wwww

好!我吃!