上周末花了 5 个小时,从零开始给娃训练了一个基于 flux1_dev 的 lora,用于生成娃的照片。
以下为详细(保姆级)的过程记录,有想法又没有自己训练过 lora 的程序员爸爸或妈妈们可以尝试一下。
可能的时间成本:2 ~ 5 小时,资金成本:5 ~ 10 块。
环境准备
因为我们会用到 GPU 机器,去类似于阿里云这种云平台租,太贵。
这里我们选择的是 audodl ,一个比阿里云便宜 60% 的可按小时租 GPU 服务器的算力平台。autodl 基于容器实现,在使用上有一些局限性,但是对于我们当下的需求来说,还是非常匹配的。
我们选择如图 1 所示的配置:
4090D + 50 G 额外的空间
尽量选择空闲 GPU 多的主机或所在区,因为可能会存在主机 GPU 不够的情况。
下单付款,等待容器启动。
容器启动后,直接使用官方提供的 web 的终端,这个终端有一个好处是当你关掉浏览器以后,终端还在,有点类似于 nohup 的执行状态。
需要说明一下,autodl 的存储分为系统盘和数据盘,在 /root/autodl-tmp 下为数据盘空间。我们要下载的模型、项目等都放到数据盘下。
把 commfy UI flux 跑起来
1. 创建 comfyUI 的环境并跑起来
cd ~/autodl-tmp
git clone https://github.com/comfyanonymous/ComfyUI
cd ComfyUI
conda create -n comfyui python=3.12 -y
conda init
source ~/.bashrc
conda activate comfyui
pip install -r requirements.txt
在 git clone 时可能会遇到克隆失败的情况,此时需要使用 autodl 的学术资源加速:https://www.autodl.com/docs/network_turbo/
另外,在 conda create 后无法直接 conda activate,需要先 conda init,然后 source ~/.bashrc 或重新启动一下终端
接下来是启动 ComfyUI
python main.py
启动是启动了,但是如何访问了,这台机器又不在我本地,难道要启一个外网端口监听,此时就需要启动自定义服务,当然我们也可以使用 ssh 的通道能力,让本地电脑能访问远程的服务,在本地命令行中执行如下的命令:
ssh -CNg -L 8188:127.0.0.1:8188 -p 49027 root@connect.westb.seetacloud.com
以上的 -p 后的参数对于不同的机器不同,请参考控制台上的登录指令,如图2:
输入后会提示:root@connect.westb.seetacloud.com’s password:
当时将控制台的密码复制出来,粘贴即可,回车。此时,可能没有啥反应,嗯。这是正常的。不用管他,除非报错告诉你连接失败或者密码错误,再重新输入。
在浏览器中输入:http://localhost:8188/
就可以看到 ComfyUI 的界面了。
2. 下载并运行 flux
在 ComfyUI 的 flux1 的 Demo 界面中:https://comfyui-wiki.com/tutorial/advanced/flux1-comfyui-guide-workflow-and-examples
可以把 Flux Dev ComfyUI workflow example 那张美少女的照片下载下来,直接拖到 ComfyUI 的界面上,或者下载 json 文件加载进来。如下图所示:
要把示例跑起来,我们有 4 个文件要下载,分别是:
-
放到 models/unet 目录下的 flux1.dev fp8 模型:https://hf-mirror.com/camenduru/FLUX.1-dev/resolve/main/flux1-dev-fp8.safetensors -
放到 models/vae 目录下的 VAE 模型:https://hf-mirror.com/camenduru/FLUX.1-dev/resolve/main/ae.safetensors -
放到 models/clip 目录下的 clip 编码器:https://hf-mirror.com/camenduru/FLUX.1-dev/resolve/main/clip_l.safetensors -
放到 models/clip 目录下的 T5XXL 文本编码器:https://hf-mirror.com/camenduru/FLUX.1-dev/resolve/main/t5xxl_fp8_e4m3fn.safetensors
在 hf 下可能会存在下载失败的情况,这里我们选择 hf-mirror: https://hf-mirror.com/camenduru/FLUX.1-dev/tree/main
下载可能会持续个 20 分钟左右,视网络情况,早上下载可能会快一些。
接下来就比较简单了,在本地浏览器中打开,点击运行 Queue Prompt 按钮
第一次运行会慢一点,因为需要加载模型这些,后面再次执行就大概 10 秒多一点。
把 lora 加到管线并跑起来
1. 下载 lora 模型在类似于 liblib.art 之类的网站下载一个你觉得不错的 lora 模型,将其放到 ComfyUI 的 models/loras 目录中。
在 ComfyUI 的界面中增加一个 lora 的节点,这里我选择的是纯粹的 lora 节点,如图 5 所示
点击 Queue Prompt 按钮,等一会儿就能看到生成的图片了,如果图片不符合预期,可以调整一下 prompt 试试,如你选择的 LoRA 是一个美女明星的 LoRA,简单点的:a girl,portrait, professional portrait
2. 调整 LoRA 强度与权重在 LoRA 节点中,你也可以调整 LoRA 的权重,以影响生成图片时对 LoRA 的依赖程度。通常,权重值可以设置在 0.5
到 1.0
之间,这取决于你希望模型生成的图片与 LoRA 模型的契合度。权重越高,生成的图片越接近 LoRA 模型的风格;而权重越低,则越依赖于你输入的 prompt
。
调整 LoRA 节点的参数后,再次点击 Queue Prompt
按钮,等待生成的新图片。如果生成的图片依然不符合预期,可以继续调整 LoRA 权重,或者尝试修改 prompt
来更好地引导模型。
打标
在 LoRA 跑起来并生成合适的图片后,下一步就是准备训练数据集。数据集的质量对模型的效果至关重要,因此我们需要对数据集进行打标。打标的目的是为每张图片生成准确的描述标签,使模型能够理解图片的内容,以便在未来生成类似的图像时能够参考这些标签。
打标工具
选择合适的打标工具或方案可以帮助我们生成高质量的标签。以下是一些常用的打标工具或方案:
-
Florence 2:Florence 2 是一个强大的自动打标工具,能够为图片生成高精度的标签。它的优点是标签的细节和准确性较高,适合用于需要精确描述的图片场景。 -
JoyCaption:JoyCaption 是 WD14 的替代工具,提供了更细致的标签生成能力。它能够为每张图片生成更详细的描述,适合用于生成具备复杂场景或人物的标签。不过,它也有一定的出错概率,因此需要额外的人工检查。 -
MiniCPM:MiniCPM 是一个轻量级的打标工具,适合小规模数据集的快速打标。它的优点是操作简便,生成速度快,缺点是生成的标签可能不够详细,适合用于简单场景的图片。 -
WD14:WD14 是一个非常流行的打标工具,特别适合用于文生图任务。它的标签生成能力较强,能够根据图片生成与文本 prompt 相关性较高的标签。特别适用于需要高质量和一致性的图片生成任务。
打标策略
为了确保数据集的质量,打标时可以采用以下策略:
-
多工具结合使用:如果你的图片集包含不同类型的图片,可以使用多个打标工具来生成初步标签,然后对标签进行合并和校对。比如:使用 Florence 2 生成的标签作为基础,再用 WD14 生成补充标签。 -
人工校对:虽然自动打标工具能够节省大量时间,但是人工校对是必不可少的环节。检查和修正错误标签,确保每张图片的标签描述都准确无误。 -
标签标准化:在打标过程中,确保使用一致的标签格式和风格。比如:尽量使用标准化标签(如 “portrait”, “landscape”, “girl”, “cityscape” 等)来确保不同图片的标签一致性。 -
使用特定的标签:对于我们当前这个场景,对每个图片在 AI 打标的基础上增加额外的一个标签来代表娃,比如我在这里使用的是 bbdr,具体参考打标的脚本。
WD 打标
在这里我选择的是 https://huggingface.co/SmilingWolf/wd-swinv2-tagger-v3 来实现的打标,在其 web demo 的基础上做了一点小改造,具体代码见:https://github.com/phppan/wd-swinv2-tagger-v3-script/blob/main/wd_tag.py
git clone https://github.com/phppan/wd-swinv2-tagger-v3-script
cd wd-swinv2-tagger-v3-script/
conda create -n wds python=3.12 -y
conda activate wds
pip install -r requirements.txt
mkdir data
export HF_ENDPOINT=https://hf-mirror.com
可能会存在克隆失败的情况,如:
fatal: unable to access 'https://github.com/phppan/wd-swinv2-tagger-v3-script/': GnuTLS recv error (-110): The TLS connection was non-properly terminated.
多试几次。
最后的 export HF_ENDPOINT=https://hf-mirror.com 要执行,我们从镜像网站下载模型,hf 有时候无法直接访问。
如果嫌麻烦,可以 vim ~/.bashrc,在此文件中添加后 source ~/.bashrc
上传数据集并生成打标内容
将前面准备好的 10 张照片上传到上面创建的 data 目录。执行
python wd_tag.py
在上面的打标脚本中,我将特定的标签 bbdr 加到标签中,后续在生成的时候都会带上这个标签。你也可以改成你自己的标签,赖博说这里:最好几个辅音叠加,不容易冲突
等待模型下载完成,并执行完打标工作,在 output 目录中可以看到生成和图片名称同名的 txt 文件,这就是我们打好了的标签。
开始训练模型
模型训练,这里我选择的是 ai-toolkit:https://github.com/ostris/ai-toolkit
git clone https://github.com/ostris/ai-toolkit
cd ai-toolkit/
git submodule update --init --recursive
conda create -n aitool python=3.12 -y
conda activate aitool
pip3 install torch
pip3 install -r requirements.txt
修改配置文件并执行训练
cp config/examples/train_lora_flux_24gb.yaml ./config/bbdr.yaml
vim ./config/bbdr.yaml
一些参数的修改可以参考视频:https://www.youtube.com/watch?v=HzGW_Kyermg 主要是修改:name(名字)、training_folder(训练生成的目录)、folder_path(训练集路径)
python run.py ./config/bbdr.yaml
接下来就是等待训练完成。
训练完成后,在上面参数中设置的生成目录中可以看到你想要的 lora 模型文件,如我们设置的名字是 bbdr,则生成的模型名为:bbdr.safetensors
将其复制到前面我们已经部署好了的 ComfyUI 项目的 models/loras 目录下,在界面中选择你要的 lora 模型,在 prompt 中把你自定义的标签加上,如我们这里是 bbdr,一个简单的示例:bbdr,a girl,cute,perfect body,standing,street
等一下,就能看到专属于娃的 AI 模型生成的图片了。
其它
-
如果在编写/调试代码、上传下载数据到实例、给他人做代码展示等不需要GPU卡场景时,可以关机后使用无卡模式开机,无卡模式开机的区别在于对于这次开机会使用0.5核;2GB内存;无GPU卡的配置,价格统一为¥0.1/小时 -
如果不想等训练完成,可以设置定时关机。 -
照片请准备同一时期的照片,不同时期的照片,特别是小朋友,可能相貌差别较大,会导致最终生成的效果不好
以上是程序员逻辑,主打一个学习和挑战。
不想整这么复杂的,可以选择在类似于 liblib 的 lora 训练平台上生成:https://www.liblib.art/pretrain 或者类似于 https://www.mimicpc.com/ 这样的平台。
强哥说:看了这么久的理论,这次终于破天荒来了篇工程的。
以上。
最后感谢赖博的指导