minih33-smoothloopv3 / PROGRESSO_gameprod.md
AdwolfCzar's picture
notas: fix de chaves ComfyUI + plano gameprod
cc56ea6 verified
|
Raw History Blame Contribute Delete
5.82 kB
# gameprod — diário de bordo (LoRA MiniMax H3, assets de jogo)
Início: 2026-09-20. Sucede o `smoothloopv3` na mesma instância (Vast 51594339, RTX 5090).
Disco: overlay 250 GB, **NÃO é volume persistente**. Tudo que importa vai para o HF.
## Decisões fixadas
- Trainer: mesmo pin `ede9ed9f` (fork AkaneTendo25/musubi-tuner, branch minimax-h3).
- Receita: idêntica à v3 do smoothloopv3 (rank/alpha 32, LR 5e-5, AdamW8bit, guidance
4/sigma/normalized, jitter 0.2, swap 32, SDPA, convrot int8, AdaLN 16, fused qk/rope).
- Modo: `fl2va` (first-last), como o run anterior.
- HF: `AdwolfCzar/minih33-gameprod`, público + gated manual.
- **`--no-comfy` é o padrão** (ver PROGRESSO_smoothloopv3.md, descobertas 38-40):
usar sempre o checkpoint nativo, sem sufixo.
## O dataset
Mega `UNBnWLCR`, 37.069 arquivos / 4,15 GB. Baixado sem `_inspect`/`_logs`/`_registry`
(QA, 13.727 arquivos): **23.342 arquivos, 3,10 GB, 0 erros, 8m37s a ~5,5 MB/s**.
- **6.422 vídeos** (5.973 mp4 + 226 gif + 223 webm) em **722 packs** de assets
(pokemon_g1..g9, rpgmaker_spriteface, fx_gigapack, approved_r34, vfx, ...).
- **5.638 sidecars `.txt`** com metadata estruturada: duração, resolução, fundo,
e a lista de animações com timestamps e contagem de repetições. É exatamente o
que o perfil `game_production` consome via `{{existing_caption}}`.
- Área: p10 0,279 / mediana 0,364 / p90 0,588 / máx 10,1 MP.
- Duração: p10 5,00 / mediana 7,68 / p75 10,00 / máx 156 s.
- fps: 5.643 a 24; **779 NÃO estão a 24** (10, 12.5, 100, 8.333 fps).
## Descobertas
| # | Achado |
|---|--------|
| 1 | O dataset **já vinha majoritariamente normalizado** (24 fps, 5–12 s). Os limites batem com o perfil `smoothloop_min124` que criei em setembro — já passou por um `captioner convert`. Economizou a etapa de conversão. |
| 2 | **Listar pasta do Mega**: para nós de ARQUIVO a chave do atributo é a XOR-dobrada de 32 bytes (`file_key()`), não `nk[:16]` como nos nós de pasta. Usar `nk[:16]` num arquivo faz 100% dos nomes falharem a decifrar. |
| 3 | `frame_extraction = "full"` pega os **primeiros** F frames (F = maior valor do grid `17k+5` ≤ `min(max_frames, frames_do_video)`), `crop_pos=0`. Não é o vídeo inteiro. |
| 4 | **Por isso é obrigatório cortar ANTES de captionar.** Caption escrita sobre 8,3 s com treino vendo 3 s promete animações que não existem. Pior aqui: o sidecar traz timestamps autoritativos. Solução: corte + nota prefixada no sidecar avisando o recorte. |
| 5 | **Custo por step**: `tokens ≈ 0,00689 × duração_s × área_px`. Medido no dataset inteiro: 384×384 → 7.827 tokens (0,99× do smoothloopv3); 640×640 "480p" → 19.030 (2,42×). **480p e duração inteira são mutuamente exclusivos.** |
| 6 | Relatório seção 7.1 contradiz a premissa dos 5 s: *"a faixa de 5–15 s não é um mínimo obrigatório de duração de todo exemplo de treino"*. O grid aceita 56/73/90/107 frames. |
| 7 | Frames disponíveis têm que sair da **duração × 24**, não do `nb_frames` da fonte — senão os 779 vídeos a 10/12,5 fps são subestimados e caem num bucket curto errado. |
| 8 | O container **não tem `sqlite3` CLI**. O state do captioner (`.captioner.sqlite`) só é legível via Python. Monitor que dependia do CLI ficava mudo. |
| 9 | Contar `*.txt` no diretório **não mede progresso de caption**: os sidecars de metadata já são `.txt`. Usar a tabela `items` do sqlite. |
## Desenho das views (escada inversa, seção 7.2 do relatório)
Área maior ⇄ clipe mais curto, para manter `T_latente × tokens espaciais` constante.
Com `bucket_no_upscale = true` as dimensões são **orçamento**, não esticamento.
| view | orçamento | frames | duração | n | tokens |
|---|---|---|---|---|---|
| v384 | 448×448 (0,20 MP) | 141 | 5,88 s | 1.750 | 7.665 |
| v480 | 640×640 (0,41 MP) | 73 | 3,04 s | 2.750 | 8.783 |
| v780 | 896×896 (0,80 MP) | 56 | 2,33 s | 500 | 13.163 |
**Média ponderada 8.828 tokens/item** vs 7.869 do smoothloopv3 (11,84 s/it) → estimativa
~13 s/it, a ser **medida pela sonda** antes do cache completo.
Atribuição por área da fonte (ordenada), seed 42, seleção round-robin entre os 722
packs para diversidade. Manifesto congelado em `manifest_views.csv` — o cache é
indexado por stem, então re-sortear invalidaria o cache (lição do smoothloopv3).
## Estimativas de custo
- Cache: **~74 GB**, **~8,8 h de GPU** (latentes VAE-bound ~5,6 s/item + TE ~1 h).
- Treino: 5.000 steps × ~13 s ≈ **18 h**.
- Total ~27 h. O run anterior foi 2,9 h de cache + 19,7 h de treino = 22,6 h.
**Se o objetivo for bater o tempo total, o botão é o número de steps.**
## Pipeline (scripts)
| script | o que faz |
|---|---|
| `gp_analyze.py` | ffprobe de todos os vídeos → `manifest_source.csv` |
| `gp_assign_views.py` | seleciona N, atribui view, corta com ffmpeg, prefixa nota no sidecar |
| `gp_make_tomls.py` | TOMLs de cache/treino a partir da MESMA definição de views |
| `gp_build_probe.py` | conjunto-sonda por hardlink + TOMLs da sonda |
| `gp_pick_samples.py` | escolhe 3 clipes (1 por view, packs distintos, SAR 1:1) |
| `gp_prepare_samples.py` | primeiro frame → PNG na grade de 32, `sample_prompts.txt` |
| `gp_chain.sh` | encadeia tudo destacado; GPU nunca ociosa |
| `gp_caption_progress.py` | progresso do captioning via sqlite |
## Armadilhas reconfirmadas
- `nohup ... &` dentro do Bash tool **morre** junto com a chamada. Usar `setsid`.
- `pgrep -f`/`pkill -f` com padrão que casa a própria linha de comando: auto-detecção.
Sempre PID exato via `kill -0`.
- `/workspace/.env` não existia nesta máquina; recriado com as 3 chaves.
- O script de treino aborta se o repo do trainer tiver edições locais — o patch do
`convert_lora.py` foi movido para `/workspace/scripts/convert_lora_h3fix.py`.