FramePack LoRA 实验
更新:经过进一步测试,我意识到重新训练可能不是必需的。也许对于某些 LoRA 需要,但对于其他 LoRA,只要它们包含运动(如视频),它们似乎就能正常工作。
我一直在尝试 FramePack 对 LoRA 的支持。由于它基于 Hunyuan Video,并使用了微调的 Transformer(和一些模型更改),我决定只是简单地替换常规的 Transformer,看看训练时会发生什么(我使用 finetrainers)。长话短说:训练进行中,模型有所改进。
尽管如此,它并不完美。要么需要更长时间的训练,要么 Transformer 的差异需要一个更适合的训练脚本。但希望这能激发其他人进行更多实验。
作为测试对象,我使用了我一个比较小众的 LoRA 1970年代武侠电影,因为它具有某种风格和一些独特的摄像机运动。(我本来可以只选择一种摄像机运动,不加风格,这样可以节省时间:耸肩)
我从我的 Hunyuan 视频 LoRA 的一个 t2v 生成中选取了第一张图像。这成为了基线。
我想复现的是快速向右平移的动作。
提示:“一个穿着传统中式武术服的男人。然后相机向右平移,展示另一个穿着灰色武术服的男人。”
这是未修改的 FramePack
它从提示中获取了一些信息,但进行了旋转而不是平移。它似乎不知道我想教给它的概念(很好)。(它在一些测试生成中确实平移了,但很慢。)
这是经过600步训练的LoRA,在我的3090上训练了大约2.5小时,混合了图片和视频片段。
从质量上看,远不如基线,但另一方面,它的时长更长,训练不足,并且可能训练得不够充分。
细心的读者会发现,它并非 FramePack 演示中的默认分辨率。我选择了与原始 t2v 生成“原生”的分辨率,因为我注意到偏离训练分辨率会降低质量。因此,对于“无 LoRA”生成而言,这也可能是因为未选择 FramePack 首选分辨率而导致结果受影响。
我尝试了许多不同起始图像和提示的生成,而这是最能代表 LoRA 的一个。所以是的,这是精心挑选的。但这个实验的目的是证明 FramePack 可以被微调,即使现在也可以。
为了推理,我使用了我自己修改过的版本,它加入了 LoRA 支持
https://github.com/neph1/FramePack
我使用默认设置(除了分辨率)
更多示例
以下是一些不那么明显的更多示例。
与上面的提示类似,但我认为只有“摄像机向右平移以显示……”
手部动作在多个训练剪辑中都很普遍。更好的风格一致性。
动作很棒,比我的基线 Hunyuan LoRA 好得多。有点……泰拳?(我不是专家)
再说一次,我不是武术专家,但我认为它更像我的训练片段。动作更流畅?视觉风格也更好。
复现
我就是这样训练的。你应该可以使用其他训练器,例如diffusers-pipe。如果这种方式很复杂,我很抱歉,这是我的做法。
训练
下载 Hunyuan 视频模型 https://huggingface.co/hunyuanvideo-community/HunyuanVideo (我使用了 t2v 模型)
下载 FramePack 模型:https://huggingface.co/lllyasviel/FramePackI2V_HY(这只是 Transformer)
将 hunyuan 视频中的“transformer”文件夹替换为 framepack 中的文件夹。(我用软链接连接了它)
下载 finetrainers https://github.com/a-r-r-o-w/finetrainers (我使用 v0.0.1 标签,'git checkout v0.0.1')
可选:如果你想要用户界面,使用 https://github.com/neph1/finetrainers-ui(finetrainers v0.0.1 使用 v0.11.2)
这是我使用的配置
accelerate_config: uncompiled_1.yaml
allow_tf32: true
batch_size: 1
beta1: 0.9
beta2: 0.95
caption_column: caption
caption_dropout_p: 0.05
caption_dropout_technique: empty
checkpointing_limit: 10
checkpointing_steps: 250
data_root: 'path to your dataset'
dataloader_num_workers: 0
dataset_file: metadata.json
diffusion_options: ''
enable_model_cpu_offload: ''
enable_slicing: true
enable_tiling: true
epsilon: 1e-8
gpu_ids: '0'
gradient_accumulation_steps: 8
gradient_checkpointing: true
id_token: 70s_kungfu
image_resolution_buckets: 480x544 384x544 352x544 544x352 320x544 448x544 256x544
224x544 192x544
layerwise_upcasting_modules: transformer
layerwise_upcasting_skip_modules_pattern: patch_embed pos_embed x_embedder context_embedder
^proj_in$ ^proj_out$ norm
layerwise_upcasting_storage_dtype: float8_e4m3fn
lora_alpha: 64
lr: 0.0003
lr_num_cycles: 1
lr_scheduler: linear
lr_warmup_steps: 50
max_grad_norm: 1
model_name: hunyuan_video
nccl_timeout: 1800
num_validation_videos: 0
optimizer: adamw
output_dir: where to put the results
pin_memory: true
precompute_conditions: true
pretrained_model_name_or_path: 'path to your hunyuan video model'
rank: 64
report_to: none
resume_from_checkpoint: ''
seed: 425
target_modules: to_q to_k to_v to_out.0
text_encoder_2_dtype: bf16
text_encoder_3_dtype: bf16
text_encoder_dtype: bf16
tracker_name: finetrainers
train_steps: 600
training_type: lora
transformer_dtype: bf16
use_8bit_bnb: ''
vae_dtype: bf16
validation_epochs: 0
validation_prompt_separator: ':::'
validation_prompts: ''
validation_steps: 10000
video_column: file
video_resolution_buckets: 1x480x544 1x384x544 1x352x544 1x544x352 1x320x544 1x448x544
1x352x576 1x320x576 24x192x320 24x192x352 24x224x320 32x192x320 32x192x352 32x224x320
weight_decay: 0.001
推理
我使用了我自己修改过的 FramePack:https://github.com/neph1/FramePack
有一个 model_config.json 文件,你可以在其中添加一个可选的 lora 路径。
"lora":
{ "path": "path to lora",
"name": "pytorch_lora_weights.safetensors" <- or some other name. must be safetensors
}
我还创建了一个 PR:https://github.com/lllyasviel/FramePack/pull/157 在其中,你不需要 .json 文件,只需传递 '--lora path_to_the_lora'
默认情况下,LoRA 将不兼容 comfyui。你可以运行此脚本进行转换:https://github.com/a-r-r-o-w/finetrainers/blob/main/examples/formats/hunyuan_video/convert_to_original_format.py
但截至目前,我认为 FramePack 包装器还不支持 LoRA。