本地部署NovelAI:生成小黑贞

自从部署了Novel AI之后,连steam里面的游戏都没打开过了,这才叫真正的3A大作啊。

说实话以前一直想爬danbooru的图(主要是为了拿到tag),但是由于各种事情最后还是咕咕咕了。pixiv上的我倒已经爬了1个多T的日榜原图了,要不下次就一步到位爬熊猫站吧(手动狗头)。

戳这里看本地部署教程,不重复造轮子了。这里只说说自己改动的一些地方,和踩过的坑:

  1. 自己的显卡(1080 Ti)只能带得动animefull-final-pruned,并且会用掉将近10G的显存。animefull-latest大概会占用14-16G,具体哪个数值忘了,反正3090轻松秒杀。
  2. 上面的部署教程提供的sentence-transformers_all-MiniLM-L6-v2里面的tokenizer.json是有问题的,自己去hugging face下一个替换掉就好了。
  3. Novel AI的前端API有2分钟的等待时间,超时就会中断请求。改static/_next/static/chunks/pages/_app-xxx.js这个文件,Ctrl+F查找替换,把12e4(120000毫秒,即2分钟)改成36e5(1小时)就行,改长一点也没关系。
  4. Novel AI和stable diffusion的webui对prompt处理的区别:
    1. Novel AI用{}强调关键字,一个大括号权重乘1.05;stable diffusion用()强调关键字,一个小括号权重乘1.1。施法还是要注意一下这点区别的。
    2. stable diffusion支持(word:weight)直接给word更改权重,比如(1girl:1.2),但Novel AI没见到有这功能。
      为了统一一下咒语的效果,这里魔改的地方如下:

      上面的部分是把()加入到强调字符里,并且把权重改为1.1。改动的地方见行号右边标蓝的部分(比如157、165-166、171-178行)。
      下面的则是支持(word:weight)语法的(其实{word:weight}也行):
    3. Novel AI默认开启了Add Quality Tags,会在prompt前面增加masterpiece, high quality这两个prompt,negative prompt在Undesired Content这里,用它内置的其实也差不多,咏唱别人的咒语的时候需要改成None,然后把咒语粘贴到下面的框框里。

安装也不算复杂,对我来说与其折腾venv还不如直接新建一个conda环境……

1
2
3
4
5
6
7
conda create -n novelai python=3.8
conda activate novelai
conda install pytorch torchvision torchaudio cudatoolkit=11.3 -c pytorch
conda install dotmap fastapi omegaconf einops torchdiffeq jsonmerge -c conda-forge
conda install uvicorn transformers scikit-learn ftfy scikit-image
conda install faiss-cpu -c pytorch
pip install sentence_transformers pytorch_lightning

下面就从最基础的咏唱开始展示,话不多说。

混进了一只巴御前

别的不说,Novel AI这黑贞画的已经比我强了(怒摔数位板)。

给Mumu模拟器刷个Magisk

Reference: https://www.bilibili.com/read/cv18294653/

Step 1 下载模拟器#

用回mumu家的,能刷zygisk就懒得用其他模拟器了,甚至挂机脚本都不用改了(懒)。在Mumu官方的下载页面中找到Android 9的版本(在左边一栏 安卓X(win版)更新日志 里面),目前用的是9.2.3版本。

一路下载安装就完事了。

之前试过Android 12+Magisk Delta 5.2,在模拟器勾选root权限之后再打开Magisk app就卡死了,原因不明,也不打算深究。

Step 2 安装Magisk#

用的是MagiskOnEmu的方案,虽然现在不维护了但还是能用的,下最新的release v17.7(10049),在模拟器上安装。

安装完后打开桌面的Magisk Terminal Emulator,启用模拟器root权限,输入“m”启用脚本,再输入“Y”请求root权限(如果没有root权限可以输入“n”继续)。

选择1. Install/Update Magisk

online因为国内环境是用不了的,选择offline就可以了,选“a”就能安装自带的24.1版本的Magisk。愿意折腾的可以选择“x”,在Magisk release里下载其他版本(比如我在用的24.3),下好后用adb push到模拟器中,最后在这里输入apk的文件路径即可。

注:mumu连接adb:adb connect localhost:7555

安装完之后,关闭模拟器root关闭模拟器root关闭模拟器root(划重点,重复说三次),重启,打开magisk app就ok了(如果没显示的话可以手动在Magisk release里下载安装)。

默认情况下Zygisk是不开启的,需要打开Magisk在右上角的齿轮里开启Zygisk (Beta),然后重启模拟器。

(如果重启之后还没有Zygisk,多重启几次,还是不行只能换模拟器了)

Step 3 刷入magisk模块#

刷入的操作基本跟在手机上是一样的,先用adb push把模块扔模拟器上,然后在Magisk app下面条条里选“模块”再点“从本地安装”就可以了。跟手机有点不一样的地方就只有:需要先刷入X86PluginLoader,再刷入zygisk_Plugin_xxx

点安装之后如果没有找到文件的话,可以在左边的折叠栏里打开文件浏览器选。

刷入模块,重启模拟器就算安装完成了。

Step 4 安装游戏#

需要用adb强制安装arm架构的apk:adb install -r --abi arm64-v8a xxx.apk

Step 5 Enjoy everything#

在模拟器上给bgo装了个自定义帧数和资源替换,可以说跟手机上的效果完全一致。

OpenSSH 9.0升级

没想到学校的网络中心居然不是干吃饭的,偶尔还会干点像用nmap啥的查开放端口和进行弱密码攻击测试的事的。上月底好像说要求托管的服务器要升级到最新的OpenSSH以及OpenSSL修复一些CVE漏洞(依稀记得是scp的提权漏洞啥的?)。不过2202年了谁还用scp呢,主流应该还是sftp和rsync吧。

既然被叫到了,那开搞就是了。

Read More

C92 paper:动漫头像生成GAN

久仰这篇论文大名,终于找到一个空闲时间好好看了一遍。论文名是Towards the Automatic Anime Characters Creation with Generative Adversarial Networks,复旦大佬发表在Comiket 92(2017年夏)的一篇论文。 简直就是CM中独树一帜的清流。 可惜这几年一直受疫情影响,没有机会亲身体验一次CM,也不知道以后还有没有机会。

其实嘛,也并不算复杂,走的是传统GAN那一套流程。Generator Network的输入分为两部分,一部分是128维的random input,另一部分是34维的标签,用于控制生成图像的人物形象(比如白毛、红瞳啥的);用的pixel shuffler升分辨率,也算是GAN的传统艺能了;输出是128×128的图片。Discriminator Network主要有两个任务,一个是判别图片的真假(是否由generator生成),另一个任务是判别人物形象,最终的loss由这两个loss加权而成。

参考的一个tensorflow的实现代码,随便Google出来的: https://github.com/ctwxdd/Tensorflow-ACGAN-Anime-Generation

代码其实也不难理解,不过跟论文还是有点区别的:noise input是100维度,generator输出的图片是96×96大小,发色分为12类,眼睛颜色11类,加起来少于原来的34类。数据预处理用到了数据集增广,包括水平增广、顺时针/逆时针旋转5°(因为旋转会带来黑边,因此对旋转后的图片先缩放为110×110再裁剪回96×96)。

即使如此,跑起来还是挺费资源的。内存直接32G起步,显存8.6G。用2080 Ti单卡跑的训练,速度还过得去,一天216k step,所以跑满1m step大概5天就好了,外加一顿外卖的电费。

跑到一半,老黄突然升级驱动导致服务器的nvidia-smi失效了,虽然不影响当前的训练,但是新开的进程都没办法跑gpu了,于是乎只能掐掉重启一遍服务器了。最后大概跑了722k个step,整个训练流程每200个step采样一次generator生成的图片,合并之后,得到一个将近2分钟的延时,还可以看着乐一乐。前半部分看着还好,后半部分已经有严重的mode collapse了,也是传统GAN的老毛病了。

这么一想,好久(大概有两年前了吧)之前就跑过老黄开源的StyleGAN,随机生成512×512的动漫头像,效果比这强太多了:

控制人物形象最大的问题还是数据集,尤其是与人物形象有关的label……上面这个的训练集是pixiv日榜的图片(用自己另外训练的Faster RCNN识别网络anime-face-detector进行头像识别与裁剪的),P站虽然也提供tag,但是tag的类型相对比较少,最常见的tag类型有:人物的角色名称、出处,与角色的形象特征(还是比如白毛、红瞳啥的)直接相关的tag一般是不会加上去的,所以也当不了label用。这么一想,怕不是得爬danbooru才行,这个tag相对比较全。

开启Apache2的WebDAV

  1. 首先需要关闭apache2的directory listing功能,一般写在配置文件/etc/apache2/apache2.conf中:
    1
    2
    3
    4
    5
    <Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
    </Directory>
    去掉Indexes,改为:
    1
    2
    3
    4
    5
    <Directory /var/www/>
    Options FollowSymLinks
    AllowOverride None
    Require all granted
    </Directory>
  2. 开启WebDAV相关的模块:sudo a2enmod dav dav_fs auth_digest
  3. 指定一个WebDAV目录,如/var/www/webdav,我喜欢直接访问html root,所以用的是一个symbol link:ln -s /var/www/webdav /var/www/html(这个叫啥来着……WebDAV alongside HTTP service?)
  4. 指定一个存放WebDAV权限数据的目录,如/var/www/webdav-config,直接mkdir新建一个就行
  5. 将上面两步的目录owner改成www-data:www-data
  6. 更改网站的配置文件:/etc/apache2/sites-enabled/default-ssl.conf,添加WebDAV相关的配置:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Alias /webdav /var/www/webdav  # 将WebDAV路径映射到/webdav下
    DavLockDB /tmp/apache2-davlock # 随便放,用之前那个webdav-config也行
    <Directory /var/www/webdav>
    DirectoryIndex disabled # 强制关闭directory listing(确保在step 1没配置的情况下还能用)
    DAV On
    AuthType Digest
    AuthName "webdav" # 指定的realm
    AuthUserFile /var/www/webdav-config/passwd
    Require valid-user
    </Directory>
  7. 创建用户验证文件:touch /var/www/webdav-config/passwd && chown www-data:www-data /var/www/webdav-config/passwd
  8. 添加WebDAV用户:htdigest [auth_file] [realm_name] [user_name],如htdigest /var/www/webdav-config/passwd webdav user将名为user的用户添加到webdav realm中
  9. 重启apache2

然后就可以在linux和windows挂载WebDAV分区了,Windows可以通过命令行添加:net use Z: \\[your_host]@SSL\webdav,或者直接在文件浏览器上面的“映射网络驱动器”添加。

这样,HTTP请求到/webdav目录时是需要身份验证的,而默认的HTTP请求(除了/webdav以外的URL)不需要认证直接访问。

7/8更新:多个WebDAV目录的配置

有时候,有些文件只是想单纯用服务器存着,方便跨设备浏览,但不想暴露到无认证的HTTP服务中。

有两种配置方式。一种是直接在apache2配置文件上直接添加第二个Directory,开启DAV(重复上述第6步的步骤);另外一种是用mount --bind挂载其他文件夹到当前WebDAV文件夹下的子文件夹中,比如cd /var/www/webdav && mkdir html && mount --bind /var/www/html /var/www/webdav/html(更常见的是写到/etc/fstab中进行开机挂载:/var/www/html /var/www/webdav/html none bind),则将HTTP根目录挂载到WebDAV的html子文件夹中,只有该文件夹里面的内容是可以通过非WebDAV协议的一般HTTP请求获得的,其他内容则都需要登录才能访问。