Upload training/NOTES.md with huggingface_hub
Browse files- training/NOTES.md +64 -0
training/NOTES.md
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# MiniMax H3 LoRA — anime loop i2v (projeto h3_loop)
|
| 2 |
+
|
| 3 |
+
## Objetivo
|
| 4 |
+
LoRA de MiniMax H3 (FL2VA) no dataset `AdwolfCzar/anime_loop_2d_dataset_captioned_29-07`.
|
| 5 |
+
Fase 1 ("quick"): 2 épocas nos ~3.9k clipes do `mega_curated` para validar o pipeline completo.
|
| 6 |
+
Fase 2: treino com o dataset completo (`loopcut_000..005`, ~49 GB) ou o que couber.
|
| 7 |
+
Foco de uso: image2video (primeiro frame → vídeo). Task de treino: `i2va`.
|
| 8 |
+
|
| 9 |
+
## Ambiente (medido em 2026-08-10)
|
| 10 |
+
- Vast.ai, RTX 5090 32 GB (sm_120), 124 GB RAM, 32 vCPU, disco 600 GB (overlay, **não persistente**)
|
| 11 |
+
- Python 3.12.13 em `/venv/main`, torch 2.10.0+cu130 (combinação validada pela comunidade)
|
| 12 |
+
- Trainer: fork `AkaneTendo25/musubi-tuner`, branch `minimax-h3`, commit **c4b84fa** (pin do relatório 2026-08-10)
|
| 13 |
+
- Instalação: `uv pip install -e .` (torch não é tocado — extras cu130 não instalados)
|
| 14 |
+
- ffmpeg 6.1.1 do sistema
|
| 15 |
+
|
| 16 |
+
## Pesos
|
| 17 |
+
`Comfy-Org/MiniMax-H3` → `/workspace/models/MiniMax-H3/`
|
| 18 |
+
- `diffusion_models/minimax_h3_fl2va_bf16.safetensors` (~66 GB; int8 convrot na carga)
|
| 19 |
+
- `text_encoders/qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors` (~15 GB; Blackwell OK)
|
| 20 |
+
- `vae/minimax_h3_video_vae_fp16.safetensors`, `vae/minimax_h3_audio_vae_fp32.safetensors`
|
| 21 |
+
|
| 22 |
+
## Dataset — fatos medidos (mega_curated)
|
| 23 |
+
- 3.889 mp4 + 3.889 .txt (captions sidecar dentro do zip; jsonl tem 6.855 linhas, 2.966 com caption nula — os .txt do zip estão completos)
|
| 24 |
+
- **Áudio: nenhum clipe tem trilha** → `h3_target_mode = "video"` (sem audio VAE no cache, sequência menor)
|
| 25 |
+
- fps caótico: ~24 (2239), 25 (341), ~30 (182), centenas de variantes 22–29 (VFR/telecine)
|
| 26 |
+
- Resoluções: 720×480 anamórfico (SAR 853:720 e 186:157, ambos DAR ~16:9) ×1852; 1920×1080 ×1093; 1280×720 ×354; 704×396 ×245; 1270×720 ×104; 960×720 ×35; 640×480 ×7
|
| 27 |
+
- Frames pós-conversão 24fps, snap 17n+5: 22×1706, 39×875, 56×480, 73×199, 90×173, 107×114, 124×139; 4 itens < 22 frames (descartados)
|
| 28 |
+
|
| 29 |
+
## Normalização (não-destrutiva)
|
| 30 |
+
`scripts/normalize_videos.py`: fonte `/workspace/datasets/mega_curated` (intocada) →
|
| 31 |
+
`/workspace/datasets/mega_24`: 24 fps CFR (`fps=24`), pixels quadrados (scale por SAR + `setsar=1`),
|
| 32 |
+
libx264 crf 15 preset fast, sem áudio. Clipes com <22 frames pós-conversão são pulados.
|
| 33 |
+
|
| 34 |
+
## Buckets multi-resolução (obrigatório no H3 — RoPE normalizado por área)
|
| 35 |
+
Diretiva do usuário (10/08): resolução pequena/média, 1024×576 é alto demais.
|
| 36 |
+
`scripts/assign_buckets.py` (seed 42, sem upscale, estratificado por resolução de origem):
|
| 37 |
+
- `v288` [512×288] ×2138 (~55%) — movimento barato
|
| 38 |
+
- `v384` [640×384] ×1087 (~28%) — bucket principal
|
| 39 |
+
- `v480` [832×480] ×660 (~17%) — âncora de densidade média
|
| 40 |
+
(v576 descartado; caches v384/v480 de smoke reaproveitados, cache v576 removido)
|
| 41 |
+
Views por symlink em `/workspace/datasets/train_quick/`; manifest em `configs/bucket_manifest_quick.csv`.
|
| 42 |
+
|
| 43 |
+
## Receita de treino (relatórios info/ de 09-10/08 + docs do fork)
|
| 44 |
+
- guidance 4 + schedule sigma + form normalized; preservation 0.02; spatial density jitter 0.2
|
| 45 |
+
- SEM adapter do Ostris; SDPA (flash_attn quebra int8 convrot); int8 convrot fwd bf16; AdaLN rank 16
|
| 46 |
+
- rank/alpha 32 (estilo amplo), LR 1e-4 AdamW8bit (recomendação do trainer), warmup 50
|
| 47 |
+
- batch físico 1 (obrigatório no H3), **gradient_accumulation = 1**
|
| 48 |
+
- 5090 32 GB: blocks_to_swap 24 h2d_only ring 2 pinned; PYTORCH_ALLOC_CONF=expandable_segments:True
|
| 49 |
+
- Sampling i2v durante treino: 3 primeiros-frames do próprio dataset + captions como estão (`--i`), TE nvfp4
|
| 50 |
+
- max_frames 73 na fase quick (mediana do dataset é 42 frames; fase 2 avalia 124)
|
| 51 |
+
|
| 52 |
+
## Fase 2 — dimensionamento (medido)
|
| 53 |
+
- loopcut_000..005: **19.747 mp4** (~50 GB descomprimido), zero overlap de nomes com mega_curated
|
| 54 |
+
- Dataset completo fase 2 = loopcut (19.7k) + mega_curated (3.9k) ≈ 23,6k clipes
|
| 55 |
+
|
| 56 |
+
## Log de execução
|
| 57 |
+
- 2026-08-10 04:1x: downloads iniciados (modelos ~86 GB, dataset completo ~52 GB) — xet, muito rápido
|
| 58 |
+
- 2026-08-10 04:2x: normalização 3.889 clipes lançada (30 jobs paralelos)
|
| 59 |
+
|
| 60 |
+
## Incidentes
|
| 61 |
+
- 2026-08-10 04:47: smoke #1 (buckets antigos c/ v576) caiu no step 1 com FileNotFoundError — causa: remoção do cache v576 com o processo ainda vivo (erro operacional meu, não bug do trainer). Antes de cair validou: carga DiT bf16→int8 convrot (~2 min), sampling i2v 3/3 (pico 14,8 GiB), 1 step com loss 0.546 a 4,8 s/it. Smoke #2 relançado com buckets novos.
|
| 62 |
+
|
| 63 |
+
## Pendências
|
| 64 |
+
- Nome do repositório HF para publicação dos checkpoints (workflow exige nome dado pelo usuário)
|