logo
pub

对 Flux AI 特定层进行微调:提高图像准确性和速度

例子

真实感 vs. AI 风格

问题理解

很多用户发现,单独训练 4 层生成的图像往往看起来不自然,尤其是眼睛和下巴,感觉像“AI 脸”。但训练全部层的图像就要好得多,更像原始训练图像。

例子

  • 全层图像:看起来更真实,更接近原始图像。
  • 4 层图像:感觉有点人工,像是“屁股下巴”,眼睛位置也奇怪。

解决方案

试着训练不同层的组合,找到相似度、速度和质量之间的最佳平衡。

针对特定层改进性能

微调步骤

  1. 选择特定层:在 Replicate Flux 训练器中,用高级设置选择第 7、12、16 和 20 层。
  2. 正则表达式选择
    "transformer.single_transformer_blocks.(7|12|16|20).proj_out"
    
  3. 保持一致的描述:用自己的描述,确保它们一致。每个描述都保存在一个文本文件里,文件名和图像文件名对应(例如 photo.jpgphoto.txt)。

提高训练速度和质量

  • 结果:训练特定层可以让过程变得更快,图像质量也提升,大约能提高 15-20% 的推理速度。

使用 Replicate CLI

为了有效管理多个训练实验,可以用 Replicate CLI:

replicate train --destination your-user/your-model input_images=@local_zip_file.zip layers_to_optimize_regex="transformer.single_transformer_blocks.(7|12|16|20).proj_out"

这个命令可以让你一次排队多个有相似参数的实验。

全面层训练

为什么要训练更多层?

除了训练目标层的 proj_out,你还可以考虑训练:

  • proj_mlp:包含大部分内容知识。
  • attn.to_*:帮助模型识别和突出相关上下文。
  • norm.linear:管理风格和全局图像特征。

理由

  • proj_mlp:包含重要的内容知识。
  • attn.to_*:对上下文相关性和区分非常重要。
  • norm.linear:控制风格、光照和其他全局特征。

调试层

确定重要层

找出哪些层影响文本和图像信息可能挺难的。可以使用 Diffusers 的调试模式,找出模型中处理文本和图像信息的部分:

  1. 设置断点:通过在不同层设置断点来调试模型。
  2. 监视活动:观察哪些层处理文本,哪些处理图像信息。

特殊层用于模型采样

层关注

为了提炼或改变模型的采样行为而不影响整体内容,关注:

  • transformer.single_transformer_blocks.*.norm.linear
  • transformer.transformer_blocks.*.norm1*
  • transformer.time_text_embed.timestep_embedder*
  • transformer.proj_out
  • transformer.norm_out.linear

这些层可以帮助调整采样行为,同时保留模型知识。

额外提示

微调文本和图像主干

当引入新想法或风格时,微调文本主干(txt)和图像主干(img)能显著提升结果。

实验性见解

大部分关于层影响的见解来自反复试验。可以试试不同的组合,找出最适合你需求的。

常见问题

Q1: 为什么全层图像会显得更真实?

  • 全层训练捕捉了更多细节,让图像感觉更生动。

Q2: 为什么要针对特定层,比如 7、12、16 和 20 进行训练?

  • 这些层通过实验被发现能有效平衡训练速度和质量。

Q3: 我怎样使用 Replicate CLI 进行训练实验?

  • 使用命令 replicate train --destination your-user/your-model input_images=@local_zip_file.zip layers_to_optimize_regex="transformer.single_transformer_blocks.(7|12|16|20).proj_out"

Q4: 我总是应该针对特定层吗?

  • 看你的目标而定。针对特定层能加快训练,但全层训练可能会有更好的综合效果。

Q5: 我可以微调文本主干以改善上下文学习吗?

  • 可以,这样能帮助模型更好地理解和生成上下文相关的信息。

Q6: 我怎么调试找出哪些层影响文本和图像信息?

  • 设置断点,观察在调试过程中模型哪些部分处理文本信息,哪些处理图像信息。