Grinding
详情
下载文件
关于此版本
模型描述
关于pussyjob alpha的更新——经过测试,我无法实现射精效果,只能得到射精后的画面。我意识到我的部分提示文案出了问题,现在正在重新训练。
她正在你身上磨蹭……尽量别射出来!
Wan T2V, 14B
提示词:
一名女性跨坐在男性身上,正在进行性交。
男性仰卧在床上,女性在他身上摩擦。
画面以男性的视角拍摄。
pussyjob v2-alpha提示词:
一名女性跨坐在地板上的男性身上,两人均裸体。
女性用阴部摩擦男性的阴茎,男性射精时阴茎喷出一股精液。
画面为男性视角的中景,写实风格。
Cfg:约3.0效果最佳
训练:
该LoRA使用diffusion-pipe在4090显卡上创建,主要使用默认设置。请参见下方内联的toml文件。
我使用了57个片段进行训练,每个片段分辨率为256x256,帧率24fps,时长48帧。这些片段是从6个公开的720p-1080p分辨率长视频中,使用DaVinci Resolve(免费版)提取的。我训练了60个epoch并测试,结果尚可但不理想。随后我让训练持续过夜,总计约10小时,最终达到160个epoch,得到你所见的结果。
我根据这篇文章的指导为每个片段编写了字幕。同时,我也通过与作者(感谢@ComfyTinker!)的讨论,深化了对字幕编写的理解。
字幕编写:
每个文件都手动编写了类似以下示例的字幕:
一名女性跨坐在男性身上,正在进行性交。
男性仰卧在床上,女性在他身上摩擦。
两人的面部不可见,男女均为裸体。女性身材健美,乳房丰满,拥有长而飘逸的金色头发。背景可见一堵绿色的墙。女性由侧方明亮的自然光照射。
画面以男性视角拍摄,写实风格。
请注意,我并未使用虚构关键词!我学到的重要经验是:对于Wan/HunYuan模型,我们并不是在训练CLIP模型,因此使用虚构词会导致一个“概念性”(即无论提示词如何都会被应用)的LoRA,而非能响应提示词的针对性LoRA。这是因为当前的训练方法无法向CLIP模型中添加新词,它要么忽略虚构词,要么以未知方式处理它。
其他经验:我此前曾使用约50个128x128分辨率的片段进行训练,并使用关键词“gr1nd1ng”。女性动作的效果非常出色,但男性部分混乱不堪,可能是由于分辨率过低导致的。
欢迎反馈与提问!
config.toml:
# 数据集配置文件。
output_dir = '/mnt/d/Projects/video-training/grinding/output'
dataset = '/mnt/d/Projects/video-training/grinding/dataset_256px.toml'
# 训练设置
epochs = 200
micro_batch_size_per_gpu = 1
pipeline_stages = 1
gradient_accumulation_steps = 4
gradient_clipping = 1.0
warmup_steps = 100
# 评估设置
eval_every_n_epochs = 1
eval_before_first_step = true
eval_micro_batch_size_per_gpu = 1
eval_gradient_accumulation_steps = 1
# 其他设置
save_every_n_epochs = 10
checkpoint_every_n_epochs = 10
#checkpoint_every_n_minutes = 30
activation_checkpointing = true
partition_method = 'parameters'
save_dtype = 'bfloat16'
caching_batch_size = 1
steps_per_print = 1
video_clip_mode = 'single_middle'
blocks_to_swap = 15 # 10太低,导致频繁交换/训练缓慢(180秒/步 vs 25秒/步)
[model]
type = 'wan'
# 1.3B
#ckpt_path = '/mnt/d/software_tools/diffusion-pipe/models/wan/Wan2.1-T2V-1.3B'
# 14B
ckpt_path = '/mnt/d/software_tools/diffusion-pipe/models/wan/Wan2.1-T2V-14B'
transformer_path = '/mnt/d/software_tools/diffusion-pipe/models/wan/Wan2_1-T2V-14B_fp8_e5m2.safetensors' #kijai
vae_path = '/mnt/d/software_tools/diffusion-pipe/models/wan/Wan_2_1_VAE_bf16.safetensors' #kijai
llm_path = '/mnt/d/software_tools/diffusion-pipe/models/wan/umt5-xxl-enc-bf16.safetensors' #kijai
dtype = 'bfloat16'
timestep_sample_method = 'logit_normal'
[adapter]
type = 'lora'
rank = 32
dtype = 'bfloat16'
[optimizer]
type = 'adamw_optimi'
lr = 5e-5
betas = [0.9, 0.99]
weight_decay = 0.01
eps = 1e-8
dataset.toml(源自hearmeman的runpod,大部分为tdrussel的默认值):
# 训练使用的分辨率,以正方形图像的边长表示。可设置多个尺寸。
# !!!警告!!!:这可能与你的预期不同。图像首先按宽高比分组,然后每个图像会被调整为resolutions列表中指定的所有尺寸。这是一种多分辨率训练方式,即同时训练多个总像素面积。你的数据集将被复制与resolutions列表长度相同的次数。
# 如果你只想使用预设的(宽,高,帧数)尺寸桶,请参考cosmos_dataset.toml文件了解如何实现。
resolutions = [256]
# 你也可以以(宽,高)对的形式提供分辨率。这不会产生任何不同,只是另一种指定训练面积(即总像素数)的方式。
# resolutions = [[1280, 720]]
# 启用宽高比桶。对于不同的宽高比桶,最终尺寸将匹配上面配置的resolutions面积。
enable_ar_bucket = true
# 宽高比和帧桶设置也可在每个[[directory]]条目中指定。目录级设置将覆盖顶层设置。
# 最小和最大宽高比,以宽/高比表示。
min_ar = 0.5
max_ar = 2.0
# 在min_ar和max_ar之间均匀分布(对数空间)的宽高比桶总数。
num_ar_buckets = 7
# 可手动指定ar_buckets,而非使用上述范围配置。
# 每个条目可以是宽/高比,或(宽,高)对。但不能混合使用,因为TOML不支持。
# ar_buckets = [[512, 512], [448, 576]]
# ar_buckets = [1.0, 1.5]
# 对于视频训练,需配置帧桶(类似宽高比桶)。总有一个帧桶为1,用于图像。视频将被分配到尽可能长的帧桶,只要其长度不低于该帧桶。
# 但视频永远不会被分配到图像帧桶(1);如果视频非常短,将被丢弃。
frame_buckets = [1, 16, 32, 48]
# 如果你拥有超过24GB显存,或使用多GPU和流水线并行,或降低空间分辨率,你或许可以训练更长的帧桶
# frame_buckets = [1, 33, 65, 97]
[[directory]]
# 图像/视频目录路径,及其对应的字幕文件。字幕文件应与媒体文件同名,但扩展名为.txt。
# 如果缺少字幕文件,会记录警告,但仍使用空字幕进行训练。
path = '/mnt/d/Projects/video-training/grinding/8-256px/'
# 你可以进行掩码训练,掩码指示图像中哪些部分需要训练。掩码在损失函数中实现。掩码目录应包含与训练图像同名(忽略扩展名)的掩码图像。例如,训练图像1.jpg可对应掩码图像1.jpg、1.png等。如果训练图像无对应掩码,会打印警告但仍继续训练,且不使用掩码。在掩码中,白色表示训练,黑色表示屏蔽,介于黑白之间的值表示0到1之间的权重,即可使用适当灰度值(如0.5灰度)表示0.5权重。实际上,仅提取R通道并转换为掩码权重。
# mask_path可指向包含掩码图像的任何目录。
#mask_path = '/home/anon/data/images/grayscale/masks'
# 每个epoch的重复次数。数据集将表现得如同被复制了这么多次。
# 语义与sd-scripts相同:num_repeats=1表示一个epoch仅遍历所有样本一次(无复制)。
num_repeats = 1
# 示例:覆盖部分设置并直接使用ar_buckets指定宽高比。
# ar_buckets = [[448, 576]]
# resolutions = [[448, 576]]
# frame_buckets = [1]
# 可列出多个目录。
# 若你有视频数据集,取消以下三行的注释并设置重复次数
# [[directory]]
# path = '/video_dataset_here'
# num_repeats = 5