Grinding
세부 정보
파일 다운로드
이 버전에 대해
모델 설명
pussyjob alpha 업데이트 - 테스트 후, 저는 정액 분사 장면을 얻지 못하고 오직 분사 후 장면만 얻을 수 있었습니다. 일부 프롬프트 캡션에 오류가 있었음을 깨달았습니다. 지금 다시 학습 중입니다.
그녀가 당신 위에서 굴리고 있어요... 분사하지 않도록 주의하세요!
Wan T2V, 14B
프롬프트:
한 여성이 남성 위에 앉아 성교를 하고 있다.
남성은 침대 위에 누워 있다. 여성이 그 위에서 굴리고 있다.
장면은 남성의 시점에서 촬영되었다.
pussyjob v2 - alpha용 프롬프트:
한 여성이 바닥 위에 앉은 남성 위에 앉아 있다. 둘 다 벗겨져 있다.
여성이 자신의 생식기로 남성의 음경을 비비고 있다. 남성의 음경이 사정할 때 정액이 뿜어져 나온다.
장면은 남성의 시점에서 촬영된 미디엄 샷이다. 사실적이다.
Cfg: 약 3.0이 잘 작동함
학습:
이 LoRA는 4090에서 diffusion-pipe를 사용하여 생성되었습니다. 대부분 기본 설정을 사용했습니다. 아래에 내장된 toml 파일을 참조하세요.
저는 57개의 클립을 256x256 해상도, 24fps, 각각 48프레임으로 학습했습니다. 이 클립들은 6개의 공개된 긴 영상(각각 720p-1080p 해상도)에서 Davinci Resolve(무료)를 사용해 추출했습니다. 60에폭 학습 후 테스트했습니다. 결과는 괜찮았지만 뛰어나지 않았습니다. 약 10시간 동안 밤새 학습을 이어 160에폭에서 아래와 같은 결과를 얻었습니다.
각 클립은 이 글의 지침을 바탕으로 캡션을 작성했습니다. 또한 저자는 @ComfyTinker님과의 토론을 통해 캡션 작성에 대한 이해를 더 깊이 다졌습니다(감사합니다 @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은 너무 낮아서 너무 많은 스왑/느린 학습을 유발함 (180s/step 대 25s/step)
[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 리스트에서 지정된 모든 영역으로 각 이미지가 리사이즈됩니다. 이는 다중 해상도 학습을 수행하는 방법입니다. 즉, 동시에 여러 총 픽셀 영역에서 학습하는 것입니다. 데이터셋은 이 리스트의 길이만큼 효과적으로 복제됩니다.
# 사전 정의된 (width, height, frames) 크기 버킷만 사용하고 싶다면, cosmos_dataset.toml 파일을 참조하세요.
resolutions = [256]
# 해상도를 (width, height) 쌍으로도 지정할 수 있습니다. 이는 다른 효과를 주지 않으며, 단지 학습할 영역(즉, 총 픽셀 수)을 지정하는 다른 방법입니다.
# resolutions = [[1280, 720]]
# 종횡비 버킷을 활성화합니다. 다른 AR 버킷에 대해 최종 크기는 위에서 구성한 resolutions에 일치하는 면적으로 설정됩니다.
enable_ar_bucket = true
# 종횡비 및 프레임 버킷 설정은 각 [[directory]] 항목에서도 지정할 수 있습니다.
# 디렉토리 수준 설정은 상위 설정을 덮어씁니다.
# 최소 및 최대 종횡비. 너비/높이 비율로 지정합니다.
min_ar = 0.5
max_ar = 2.0
# min_ar과 max_ar 사이에 등간격(로그 공간)으로 설정된 총 종횡비 버킷 수입니다.
num_ar_buckets = 7
# 위의 범위 기반 설정 대신 수동으로 ar_buckets를 지정할 수 있습니다.
# 각 항목은 너비/높이 비율 또는 (width, height) 쌍일 수 있지만, TOML의 제약으로 둘을 혼합할 수 없습니다.
# ar_buckets = [[512, 512], [448, 576]]
# ar_buckets = [1.0, 1.5]
# 비디오 학습의 경우, 프레임 버킷을 설정해야 합니다(종횡비 버킷과 유사합니다). 이미지의 경우 항상 1의 프레임 버킷이 존재합니다. 비디오는 가능한 가장 긴 프레임 버킷에 할당되며, 비디오 길이는 프레임 버킷 길이보다 크거나 같아야 합니다.
# 그러나 비디오는 이미지 프레임 버킷(1)에 할당되지 않습니다. 비디오가 매우 짧으면 그냥 삭제됩니다.
frame_buckets = [1, 16, 32, 48]
# 24GB 이상의 VRAM이 있거나 여러 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의 가중치를 원한다면 적절한 회색 값을 사용할 수 있습니다. 실제로는 R 채널만 추출되어 마스크 가중치로 변환됩니다.
# mask_path는 마스크 이미지가 포함된 임의의 디렉토리를 가리킬 수 있습니다.
#mask_path = '/home/anon/data/images/grayscale/masks'
# 1에폭당 반복 횟수입니다. 데이터셋은 이 횟수만큼 복제된 것처럼 작동합니다.
# 이 의미는 sd-scripts와 동일합니다. num_repeats=1은 하나의 에폭이 모든 예제를 한 번씩 통과하는 것을 의미합니다(복제 없음).
num_repeats = 1
# 일부 설정을 재정의하고 ar_buckets를 직접 지정하는 예시입니다.
# ar_buckets = [[448, 576]]
# resolutions = [[448, 576]]
# frame_buckets = [1]
# 여러 디렉토리를 나열할 수 있습니다.
# 비디오 데이터셋도 있다면 다음 3줄의 주석을 제거하고 반복 횟수를 설정하세요.
# [[directory]]
# path = '/video_dataset_here'
# num_repeats = 5