From 2a6b1d1272d7af37b94fb4100ee6a5799503f989 Mon Sep 17 00:00:00 2001 From: kschmid Date: Mon, 9 Mar 2026 13:48:48 +1100 Subject: [PATCH 01/33] unused --- scripts/inference/sample_5b_vbench.bat | 81 ++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 scripts/inference/sample_5b_vbench.bat diff --git a/scripts/inference/sample_5b_vbench.bat b/scripts/inference/sample_5b_vbench.bat new file mode 100644 index 0000000..e7084d0 --- /dev/null +++ b/scripts/inference/sample_5b_vbench.bat @@ -0,0 +1,81 @@ +@echo off +setlocal enabledelayedexpansion + +set TOKENIZERS_PARALLELISM=false +set TF_ENABLE_ONEDNN_OPTS=0 +set LOCAL_RANK=0 +set RANK=0 +set WORLD_SIZE=1 +set MASTER_ADDR=127.0.0.1 +set MASTER_PORT=29500 + +set EXAMPLE_DIR=C:\workspace\world\Infinite-World\assets\example_case + +cd /d "%~dp0..\.." + +for /f "tokens=*" %%T in ('powershell -NoProfile -Command "Get-Date -Format ''yyyyMMdd_HHmmss''" 2^>nul') do if not "%%T"=="" set RUN_TS=%%T +for /f %%t in ('powershell -NoProfile -Command "[int64](Get-Date).Ticks"') do set OVERALL_START=%%t +echo Output: %CD%\outputs\%RUN_TS% +set CASE_NUM=0 + +:: Count total cases +set TOTAL_CASES=0 +for /d %%D in (%EXAMPLE_DIR%\*) do set /a TOTAL_CASES+=1 +echo Found %TOTAL_CASES% cases output: ./outputs/%RUN_TS% + +goto :main + +:: ------------------------------------------------------- +:: Subroutine: reads RC_DIR, RC_NAME, RC_CAPTION from env +:: ------------------------------------------------------- +:run_case + set /a CASE_NUM+=1 + echo. + echo === !CASE_NUM!/%TOTAL_CASES%: !RC_NAME! === + echo output: ./outputs/%RUN_TS%/!RC_NAME! + echo img: !RC_DIR! + echo prompt: !RC_CAPTION! + type "!RC_CAPTION!" + echo. + for /f %%t in ('powershell -NoProfile -Command "[int64](Get-Date).Ticks"') do set CASE_START=%%t + + python fastvideo/sample/sample_5b.py ^ + --seed 43 ^ + --gradient_checkpointing ^ + --train_batch_size=1 ^ + --max_sample_steps=1 ^ + --mixed_precision="bf16" ^ + --allow_tf32 ^ + --t5_cpu ^ + --video_output_dir="./outputs/%RUN_TS%/!RC_NAME!" ^ + --jpg_dir="!RC_DIR!" ^ + --caption_path="!RC_CAPTION!" ^ + --test_data_dir="./val" ^ + --num_euler_timesteps 8 ^ + --rand_num_img 0.6 ^ + --internvl_path "./InternVL3-2B-Instruct" + + powershell -NoProfile -Command "$e=([int64](Get-Date).Ticks-!CASE_START!)/1e7; $tot=([int64](Get-Date).Ticks-%OVERALL_START%)/1e7; $fps=[math]::Round(163/$e,2); $rem=(%TOTAL_CASES%-!CASE_NUM!)*($tot/!CASE_NUM!); Write-Host (' time='+[math]::Round($e,1)+'s fps='+$fps+' ETA='+[math]::Round($rem,0)+'s')" + exit /b 0 + +:main + +for /d %%D in (%EXAMPLE_DIR%\*) do ( + set RC_NAME=%%~nxD + set RC_DIR=%%D + echo A %%~nxD scene. > temp_caption_%%~nxD.txt + set RC_CAPTION=temp_caption_%%~nxD.txt + if exist "%%D\prompt.txt" set RC_CAPTION=%%D\prompt.txt + if exist "%%D\prompt.json" ( + powershell -NoProfile -Command "(Get-Content '%%D\prompt.json' -Raw | ConvertFrom-Json).prompt | Set-Content 'temp_prompt_%%~nxD.txt' -Encoding UTF8" + set RC_CAPTION=temp_prompt_%%~nxD.txt + ) + call :run_case +) + +echo. +powershell -NoProfile -Command "$e=([int64](Get-Date).Ticks-%OVERALL_START%)/1e7; Write-Host ('Total: %TOTAL_CASES% cases in '+[math]::Round($e,1)+'s avg='+[math]::Round($e/%TOTAL_CASES%,1)+'s/case')" + +del temp_caption_*.txt 2>nul +del temp_prompt_*.txt 2>nul +exit /b 0 From 64534f2591a304c3bbe6e768fa0c3b335ec6ec67 Mon Sep 17 00:00:00 2001 From: kschmid Date: Mon, 9 Mar 2026 14:02:40 +1100 Subject: [PATCH 02/33] unused --- .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 142 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 150 bytes .../__pycache__/solver.cpython-312.pyc | Bin 0 -> 16022 bytes .../flash_attn_no_pad.cpython-312.pyc | Bin 0 -> 1334 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 157 bytes .../__pycache__/constants.cpython-312.pyc | Bin 0 -> 2292 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 14188 bytes .../vae/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3202 bytes .../autoencoder_kl_causal_3d.cpython-312.pyc | Bin 0 -> 39448 bytes .../unet_causal_3d_blocks.cpython-312.pyc | Bin 0 -> 25958 bytes .../vae/__pycache__/vae.cpython-312.pyc | Bin 0 -> 15750 bytes .../modeling_hunyuan.cpython-312.pyc | Bin 0 -> 39537 bytes .../mochi_latents_utils.cpython-312.pyc | Bin 0 -> 1439 bytes .../modeling_mochi.cpython-312.pyc | Bin 0 -> 29827 bytes .../mochi_hf/__pycache__/norm.cpython-312.pyc | Bin 0 -> 6294 bytes .../pipeline_mochi.cpython-312.pyc | Bin 0 -> 36161 bytes fastvideo/models/mochi_hf/modeling_mochi.py | 9 +- fastvideo/sample/sample.py | 3 +- fastvideo/sample/sample_5b.py | 102 ++++-- fastvideo/sample/sample_tts.py | 1 + .../__pycache__/checkpoint.cpython-312.pyc | Bin 19416 -> 19393 bytes .../communications.cpython-312.pyc | Bin 0 -> 11395 bytes .../__pycache__/dataset_utils.cpython-312.pyc | Bin 0 -> 16724 bytes .../__pycache__/fsdp_util.cpython-312.pyc | Bin 0 -> 4678 bytes .../utils/__pycache__/load.cpython-312.pyc | Bin 0 -> 20810 bytes .../__pycache__/logging_.cpython-312.pyc | Bin 1260 -> 1237 bytes .../parallel_states.cpython-312.pyc | Bin 0 -> 2936 bytes requirements.txt | 344 +++++++++--------- scripts/finetune/finetune.bat | 30 ++ scripts/inference/sample.bat | 67 ++++ scripts/inference/sample.sh | 1 + scripts/inference/sample_5b.bat | 81 +++++ scripts/inference/sample_5b.sh | 1 + scripts/inference/sample_5b_vbench.bat | 46 ++- scripts/inference/sample_image.bat | 29 ++ scripts/inference/sample_image.sh | 1 + scripts/inference/sample_tts.bat | 29 ++ scripts/inference/sample_tts.sh | 1 + 38 files changed, 524 insertions(+), 221 deletions(-) create mode 100644 fastvideo/__pycache__/__init__.cpython-312.pyc create mode 100644 fastvideo/distill/__pycache__/__init__.cpython-312.pyc create mode 100644 fastvideo/distill/__pycache__/solver.cpython-312.pyc create mode 100644 fastvideo/models/__pycache__/flash_attn_no_pad.cpython-312.pyc create mode 100644 fastvideo/models/hunyuan/__pycache__/__init__.cpython-312.pyc create mode 100644 fastvideo/models/hunyuan/__pycache__/constants.cpython-312.pyc create mode 100644 fastvideo/models/hunyuan/text_encoder/__pycache__/__init__.cpython-312.pyc create mode 100644 fastvideo/models/hunyuan/vae/__pycache__/__init__.cpython-312.pyc create mode 100644 fastvideo/models/hunyuan/vae/__pycache__/autoencoder_kl_causal_3d.cpython-312.pyc create mode 100644 fastvideo/models/hunyuan/vae/__pycache__/unet_causal_3d_blocks.cpython-312.pyc create mode 100644 fastvideo/models/hunyuan/vae/__pycache__/vae.cpython-312.pyc create mode 100644 fastvideo/models/hunyuan_hf/__pycache__/modeling_hunyuan.cpython-312.pyc create mode 100644 fastvideo/models/mochi_hf/__pycache__/mochi_latents_utils.cpython-312.pyc create mode 100644 fastvideo/models/mochi_hf/__pycache__/modeling_mochi.cpython-312.pyc create mode 100644 fastvideo/models/mochi_hf/__pycache__/norm.cpython-312.pyc create mode 100644 fastvideo/models/mochi_hf/__pycache__/pipeline_mochi.cpython-312.pyc create mode 100644 fastvideo/utils/__pycache__/communications.cpython-312.pyc create mode 100644 fastvideo/utils/__pycache__/dataset_utils.cpython-312.pyc create mode 100644 fastvideo/utils/__pycache__/fsdp_util.cpython-312.pyc create mode 100644 fastvideo/utils/__pycache__/load.cpython-312.pyc create mode 100644 fastvideo/utils/__pycache__/parallel_states.cpython-312.pyc create mode 100644 scripts/finetune/finetune.bat create mode 100644 scripts/inference/sample.bat create mode 100644 scripts/inference/sample_5b.bat create mode 100644 scripts/inference/sample_image.bat create mode 100644 scripts/inference/sample_tts.bat diff --git a/fastvideo/__pycache__/__init__.cpython-312.pyc b/fastvideo/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4f899241e5593a5d515df584cdd40214e2d4c5b9 GIT binary patch literal 142 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 T6sCS1x1FWw?awHT$tnFml^&B~ literal 0 HcmV?d00001 diff --git a/fastvideo/models/__pycache__/flash_attn_no_pad.cpython-312.pyc b/fastvideo/models/__pycache__/flash_attn_no_pad.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5c28256e56e41d7d9a294d54f893bd3db0ec59f2 GIT binary patch literal 1334 zcmZ`&&1)M+6ra&*KlN#0*KzCGOPv&NO9O>MsAx^yQU{9TO9{n7Wm#)RmZH^4o>{rJ z*o8gxP@n2ROML9LIDbM9z4xM$%Q7Ui(35Wl>(oQtnbns`$P?Oq@Aqcj@6DUv{*lWW zfZO2o=jQt|0RM90Jle zO|RSYS*GVrgPj_0b!r;-B>um;4Mm#)cr;DT90Zqm5X!H~rjo4knyi#$RbQ|q766n! zACD*0{Ao9V7QhK!gceRW(I1bUDOvVjz&gVa;) zTp6#(&-VNJWbF(K@<^ZX21XzU%A__jI8)|)+<90C3SR>&yF*0t7kpme;=k+b>%O^X zQqyk`jLn9L%nvpaV10^Mebe*$<_$os5zutWh2Y?KCMO7k4esY?r|!3%Bb(M77c-^i z^r++Z=f%b`Pg0iqR)1dfurAyQzwjZ+in=nBX~XGaB3OtR3lY;JV)Ry#NnARt*uuv) z7YS;5`*z!*Et2P1rX$knc6z?uB{>lrdyZdg*tFT_9Z`J1mB$pXfgMB{JYwpRok)$T zO%F9|m@=c*vq$SFlatf1g&yT99fMqXpys;FWJAJeo?M|*C8#+ z6_17IqU!F$2VYj}4)qV42zRRO4#F<2-uO#UFQ1c25sZs?pXYASd5OThFz*)3w3k$IrBKwE284pph}PIP~$f%%VOtq^OaSj)xQ zT>QpbTv!<9)OjV^9u`4dMpIMn655^eF8 zv!&?474IKd($>Cs3)`_Yrr@U6>C)u>nK3(kA_KNK1Mco&!tZ({gG3)Axrp)n3W&*H zWQ9MN_6Z+w&&3<$4iCk*Km~p&K?q-f>bpK?FMZ%mNgd&QQsq$>_I|p@<2{`wUX^%f{I%raZqWySN}R zITggpNr{OJ^>vL&ODrxa%S=hlkIBtXNzEya$tcaMEKSUdiI30B%PfhH*DI*J#bE=K bEX_%^D`Ev2#t6j4AjU^#Mn=XWW*`dyWeF$* literal 0 HcmV?d00001 diff --git a/fastvideo/models/hunyuan/__pycache__/constants.cpython-312.pyc b/fastvideo/models/hunyuan/__pycache__/constants.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5cb432d7b783e48d616fc091a90f77a08bff3722 GIT binary patch literal 2292 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 R9o)MP`~F(vyEQ!A{}&ldvMK-o literal 0 HcmV?d00001 diff --git a/fastvideo/models/hunyuan/vae/__pycache__/unet_causal_3d_blocks.cpython-312.pyc b/fastvideo/models/hunyuan/vae/__pycache__/unet_causal_3d_blocks.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..89ee2a64fa62f11b85d4bdcd28ba18bd3dd44437 GIT binary patch literal 25958 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 literal 0 HcmV?d00001 diff --git a/fastvideo/models/hunyuan/vae/__pycache__/vae.cpython-312.pyc b/fastvideo/models/hunyuan/vae/__pycache__/vae.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a3478ba65acfcf9651a200611513c0afaadee25 GIT binary patch literal 15750 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 literal 0 HcmV?d00001 diff --git a/fastvideo/models/mochi_hf/__pycache__/norm.cpython-312.pyc b/fastvideo/models/mochi_hf/__pycache__/norm.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..da49503f3b273840dd4b5b11571623f859c59e21 GIT binary patch literal 6294 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 latent shape {model_input.shape}") latents = model_input img = model_input[:,:-latent_frame_zero] - + main_print(f"[SAMPLE] wan_i2v.generate (i2v, frame_num={frame}) ...") with torch.no_grad(): arg_c, arg_null, noise, mask2, img = wan_i2v.generate( caption[0], @@ -904,14 +907,17 @@ def sample_one( max_area=max_area, latent_frame_zero=latent_frame_zero, img=img) + main_print("[SAMPLE] wan_i2v.generate done") else: frame = 32 + main_print(f"[SAMPLE] wan_i2v.generate (t2v, frame_num={frame}) ...") with torch.no_grad(): arg_c, arg_null, noise = wan_i2v.generate( caption[0], frame_num=32, max_area=max_area, latent_frame_zero=latent_frame_zero,) + main_print("[SAMPLE] wan_i2v.generate done") @@ -949,15 +955,15 @@ def sample_one( import time start_time = time.time() - + main_print(f"[SAMPLE] Denoising step_sample={step_sample}/{sample_num-1} steps={sample_step} ...") + if not t2v or step_sample > 0: latent = torch.cat([img[0][:, :-latent_frame_zero, :, :], latent[:, -latent_frame_zero:, :, :]], dim=1) #(1. - mask2[0]) * img[0] + mask2[0] * latent - print(latent.shape, "nbxkasbcna090-") with torch.no_grad(): with torch.autocast("cuda", dtype=torch.bfloat16): - for i in range(sample_step): + for i in tqdm(range(sample_step), desc="Sampling", unit="step"): latent_model_input = [latent.squeeze(0)] if not t2v or step_sample>0: @@ -981,7 +987,6 @@ def sample_one( # ]) # timestep = temp_ts.unsqueeze(0) - print(latent_model_input[0].shape,"0-2=ffje0r=----------a") noise_pred_cond = transformer(latent_model_input, t=timestep, **arg_c)[0] if i+1 == sample_step: @@ -1010,7 +1015,6 @@ def sample_one( # timestep = torch.stack(timestep) # temp_ts = timestep.flatten() # timestep = temp_ts#.unsqueeze(0) - print(latent_model_input[0].shape,"0-2=ffje0r=----------a") noise_pred_cond = transformer(latent_model_input, t=timestep, flag=False, **arg_c)[0] # # UniPC @@ -1048,11 +1052,12 @@ def sample_one( else: model_input = latent + main_print(f"[SAMPLE] VAE decoding latents ...") + torch.cuda.empty_cache() with torch.autocast("cuda", dtype=torch.bfloat16): - video_cat = scale(vae, model_input[:,-latent_frame_zero:,:,:]) + video_cat = scale(vae, model_input[:,-latent_frame_zero:,:,:]) video = video_cat[:,-frame_zero:] video_all.append(video) - if step_sample > 0: #if video.shape[1] < frame_zero: # video = torch.cat([video[:,0].unsqueeze(1).repeat(1,frame_zero-video.shape[1],1,1),video],dim=1) @@ -1073,11 +1078,16 @@ def sample_one( else: videoid_str = str(videoid) + os.makedirs(video_output_dir, exist_ok=True) + caption_safe = re.sub(r'[\\/:*?"<>|→←↑↓·\s]+', '_', str(caption_ori))[:60] filename = os.path.join( - video_output_dir, - videoid_str+"_"+str(caption_ori)+"_"+str(repeat_num)+"_"+str(rank)+"_"+str(step_sample)+".mp4", - ) - export_to_video(video[0] , filename, fps=16) + video_output_dir, + f"{videoid_str}_{caption_safe}_{repeat_num}_{rank}_{step_sample}.mp4", + ) + main_print(f"[SAMPLE] VAE decode done -> video shape {video[0].shape if hasattr(video[0], 'shape') else len(video[0])} frames") + main_print(f"[SAVE] Output path: {filename}") + export_to_video(video[0], filename, fps=args.fps) + main_print(f"[SAVE] Saved: {filename}") if step_sample + 1 < sample_num: @@ -1124,7 +1134,10 @@ def main(args): local_rank = int(os.environ["LOCAL_RANK"]) rank = int(os.environ["RANK"]) world_size = int(os.environ["WORLD_SIZE"]) - dist.init_process_group("nccl", rank=rank, world_size=world_size) + print(f"[rank {rank}] dist init (backend={'gloo' if sys.platform == 'win32' else 'nccl'}) ...") + backend = "gloo" if sys.platform == "win32" else "nccl" + dist.init_process_group(backend, rank=rank, world_size=world_size) + print(f"[rank {rank}] dist init done") # Set independent cache directories for each rank os.environ["TRITON_CACHE_DIR"] = f"/tmp/triton_cache_{rank}" @@ -1146,20 +1159,20 @@ def main(args): ckpt_dir = "./Yume-5B-720P" # Referenced from https://github.com/Wan-Video/Wan2.2 + main_print(f"[INIT] Loading wan23.Yume from {ckpt_dir} ...") wan_i2v = wan23.Yume( config=cfg, checkpoint_dir=ckpt_dir, device_id=device, - ) - transformer = wan_i2v.model + ) + main_print("[INIT] wan23.Yume loaded") + transformer = wan_i2v.model transformer = transformer.eval().requires_grad_(False) main_print( f" Total Sample parameters = {sum(p.numel() for p in transformer.parameters() if p.requires_grad) / 1e6} M" ) - main_print( - f"--> Initializing FSDP with sharding strategy: {args.fsdp_sharding_startegy}" - ) + main_print(f"[INIT] Initializing FSDP with sharding strategy: {args.fsdp_sharding_startegy} ...") fsdp_kwargs, no_split_modules = get_dit_fsdp_kwargs( transformer, args.fsdp_sharding_startegy, @@ -1170,6 +1183,7 @@ def main(args): ) if args.resume_from_checkpoint: + main_print(f"[INIT] Resuming from checkpoint: {args.resume_from_checkpoint} ...") ( transformer, init_steps, @@ -1177,6 +1191,7 @@ def main(args): transformer, args.resume_from_checkpoint, ) + main_print(f"[INIT] Checkpoint resumed (init_steps={init_steps})") from safetensors import safe_open @@ -1238,12 +1253,14 @@ def main(args): # transformer.load_state_dict(merged_weights, strict=False) + main_print("[INIT] Casting transformer to bfloat16 and wrapping with FSDP ...") transformer = transformer.to(torch.bfloat16) transformer = FSDP( transformer, **fsdp_kwargs, use_orig_params=True, ) + main_print("[INIT] FSDP wrap done") @@ -1261,31 +1278,39 @@ def main(args): #init t5, clip and vae vae = wan_i2v.vae + main_print("[INIT] dist.barrier ...") dist.barrier() - + main_print("[INIT] barrier passed") + wan_i2v.device = device + main_print("[INIT] Loading denoiser ...") denoiser = load_denoiser() - - print("jpg_dir", args.jpg_dir) + main_print("[INIT] Denoiser loaded") + + main_print(f"[DATA] jpg_dir={args.jpg_dir} video_root_dir={args.video_root_dir} T2V={args.T2V}") image_sample = False dataset_ddp = None dataset_length = None if args.jpg_dir != None and not args.T2V: - dataset_ddp, dataset_length = create_scaled_videos(args.jpg_dir, - total_frames=33, - H1=704, - W1=1280) + main_print(f"[DATA] Building image dataset from {args.jpg_dir} ...") + dataset_ddp, dataset_length = create_scaled_videos(args.jpg_dir, + total_frames=33, + H1=args.height, + W1=args.width) + main_print(f"[DATA] Image dataset ready: {dataset_length} samples") image_sample = True elif not args.T2V: + main_print(f"[DATA] Building video dataset from {args.video_root_dir} ...") dataset_ddp, dataset_length = mp4_data(args.video_root_dir) + main_print(f"[DATA] Video dataset ready: {dataset_length} samples") image_sample = False - - print(dataset_ddp,"dataset_ddpdataset_ddpdataset_ddp") + else: + main_print("[DATA] T2V mode — no dataset loaded") step_times = deque(maxlen=100) - #image_sample = True - # If you want to load a model using multiple GPUs, please refer to the `Multiple GPUs` section. - path = '/mnt/petrelfs/maoxiaofeng/Yume_v2_release/InternVL3-2B-Instruct' + _local = os.path.abspath(args.internvl_path) + path = _local if os.path.isdir(_local) else "OpenGVLab/InternVL3-2B-Instruct" + main_print(f"[INIT] Loading InternVL caption model from {path} ...") camption_model = AutoModel.from_pretrained( path, torch_dtype=torch.bfloat16, @@ -1293,6 +1318,7 @@ def main(args): use_flash_attn=True, trust_remote_code=True).eval().to(device) tokenizer = AutoTokenizer.from_pretrained(path, trust_remote_code=True, use_fast=False) + main_print("[INIT] InternVL caption model loaded") if args.prompt!=None: prompt1 = args.prompt @@ -1304,7 +1330,9 @@ def main(args): else: date_len = int(dataset_length)//world_size + 1 + main_print(f"[LOOP] Starting inference loop: {date_len-1} step(s), world_size={world_size}") for step in range(1, date_len): + main_print(f"[LOOP] Step {step}/{date_len-1} starting ...") start_time = time.time() torch.cuda.empty_cache() torch.cuda.empty_cache() @@ -1335,6 +1363,7 @@ def main(args): step_time = time.time() - start_time step_times.append(step_time) avg_step_time = sum(step_times) / len(step_times) + main_print(f"[LOOP] Step {step}/{date_len-1} done in {step_time:.1f}s (avg {avg_step_time:.1f}s)") torch.cuda.empty_cache() @@ -1396,6 +1425,9 @@ def main(args): default=None, ) parser.add_argument("--num_frames", type=int, default=163) + parser.add_argument("--height", type=int, default=704) + parser.add_argument("--width", type=int, default=1280) + parser.add_argument("--fps", type=int, default=16) parser.add_argument( "--logging_dir", type=str, @@ -1571,6 +1603,12 @@ def main(args): type=str, default=None, ) + parser.add_argument( + "--internvl_path", + type=str, + default="./InternVL3-2B-Instruct", + help="Path to InternVL3-2B-Instruct model dir or HuggingFace repo ID.", + ) args = parser.parse_args() main(args) diff --git a/fastvideo/sample/sample_tts.py b/fastvideo/sample/sample_tts.py index 6037aab..2c82df1 100644 --- a/fastvideo/sample/sample_tts.py +++ b/fastvideo/sample/sample_tts.py @@ -902,6 +902,7 @@ def sample_one( video_output_dir, videoid_str+"_"+str(caption_ori)+"_"+str(step_sample)+"_"+str(repeat_num)+".mp4", ) + print(filename) export_to_video(video[0] , filename, fps=16) if step_sample + 1 < sample_num: diff --git a/fastvideo/utils/__pycache__/checkpoint.cpython-312.pyc b/fastvideo/utils/__pycache__/checkpoint.cpython-312.pyc index 3bca54bcb12f34ac9dcef55f0a9c3ddd4d823944..33cf5fa0381f027cb629475c3feb1aa5a0659ced 100644 GIT binary patch delta 68 zcmcaHo$=swM!wU$yj%=GaACsK%mwxv`Hpi)m^xd#RZ*5MqJR-<=YqGZYS^zT77>fV^ delta 91 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 literal 0 HcmV?d00001 diff --git a/fastvideo/utils/__pycache__/fsdp_util.cpython-312.pyc b/fastvideo/utils/__pycache__/fsdp_util.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fd09562513faaa2385c8ca6d6652c3a24bc6ed8a GIT binary patch literal 4678 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 V4`~K5r%Sn_eyRWf literal 0 HcmV?d00001 diff --git a/fastvideo/utils/__pycache__/load.cpython-312.pyc b/fastvideo/utils/__pycache__/load.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a0d67c72b68deb0483b090bc05c94f5206d3de31 GIT binary patch literal 20810 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 Lneo=-wJi1k8r%}} delta 82 zcmcc0`G%A4G%qg~0}uojpUwEhxRFnlQQyniDkiizwWv78$k@=-B*rDbJTE6dF{L;r cGSt^qH#adePuCE^-t5ij#mx9?@-!BE03s3^RR910 diff --git a/fastvideo/utils/__pycache__/parallel_states.cpython-312.pyc b/fastvideo/utils/__pycache__/parallel_states.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ec8dbb3c5224c06c9f06312ac3df35848c88bba GIT binary patch literal 2936 zcmb^zO>YxNbY{J4ukARHkc5PMu)&1j5QT)6kEW$kAfYk|PD?;7R;rcbUBV`g9cI@c zyN(o9Ii#(tg48M;K|%t=g`d!SFE)l^Z6g(_^uP_U)Ji?|&8&BAzScWUaA0dTXLyGGzXK_b) z4ypXz>d~m6@G-X{tf8n!aRU|=4`8n%0`@6h!2S#l`JPh#NW6NA4Y<0fG{a;AsVIsS z6y+2QXIvRB(IRt~qq!K!LFf{Vb4 zo@BsQ_7k8C3b`Ur=|MvILxL&HlT>=y^ytg7u4PrzKc7g=#S$`!B^S*misj3iaY0MU z7Nf`pSyMvTKezebOb&R$NDMSVFISLrOF%$_@YYGU?$OgAoRikg~D8(Ko2 zU5=4hBB3T^-G~{gKD3-MMOoI8njy>CX6G%2Y#O)|>HUCKQMt8aozMHq+uLDiD0g

n?=k}AulPnMTbN;*O34YGVO9ZOg{q!D=UAhHDp z5}=5_6hm&9=pI08sKN`v4vU9wpLoell#jXT514F#lN7u-4l)`QE`|)p4LNkT>MjgU zP_RKIF{ru9@Y*!PZ_gGQ>{)G8TncZ;sV%im9yOYQBGggoGcx#}v^cgxNVy|~KEoN4 zKRp(iH1V(%Tt2g1o|*XM>_p`Fg#7W?>9MJ)i79#J%-ER;a~E~E7E3_L$+~(mttR8D z?1Y9DYTjf#o`A?WpCZ(H)1@U1lS}EQdtNovew%0|`pteGkIrv`` zvzR13Agu*H{T!fG^w`sV9pCr#mV^BTQQ8y-3j4+$ipL&zb?3bg#EwlVc=On;@Qv{8 z^Y`MV-J>PxeM;{x@9C#waI;&w*?g9xins$$KA)Rz$rNOEf}QEYa)I zSc*Zc+`*AMm~00MTu`u*hNYZ!pH5vh-tdCfMS^fjf={Oc;UYVC7x^w0$#Eb!;OM34 zuz?I`V+Iik7NnP=Z4^0~Vs?TP-m16{cvpQF1<{t~LOL7$j` zEZDOguA|bsGGLmZ`mVSP`kEHaWhe4D`usE4RE+HM~59Hi+ma*1JkHLObR~Be>98NjP@pV+EH07f_%7`Ivwma zr0LpRLY3w+j@(+splLoR&7}=#K4nO?^P|!iD}!(0r+ch$MM43xgId%{Q5QAK4Mk@u zW{?g_p{`}c#uT6-&Z{P`Xu4r~lj>!wD-s$gb(P3Nx~UMJHBn#98nY{zUV1~)uvgJd ztT6?PI+Mq`k7R+>oZ6`tibC+|zXDoCPyCH}@?GYu%(b@b+e%ydO8z~oqx2T!0O4zVsoK&Us2q5`{I3Z_?gQk3_kYgk389;CtHTSmVt^3i-Q#b zHp;-@MjiXt!Vmb?a+gHMj`H3Eg+o)ty;B8V+6*)ow(b8pFuaa8x3*r16?P04+lHYt zUmLlaE=Y%pZHGWw(~))I$<~&Q#;c9j(xt6^>q6PT<;uaYkCuCa`EY)^JTP>xsc>+z zI5Jrrn9PSCH1tC^&xap2^gQ2!8b@9)RnA}0Al$ybVk|iSKd?~+`}Yl6E)H?o-Q%im zkW}U$Lo*WM$UZo4wkj64yi8JYRoAPYex(ZTw7Kk1uZ1LYDtQ-VeF&dUYb&^m7a#FG zMZV`DFR|N&8d%hsO-72uFAUMZA{xZ8s+j(|1+&TeJ7FP7`vL1ygw}XMYb}cmrtj5K zEq-AA{(MLd10OB2`cXj7To~hDkoR{a{pt4L9nTR(Ehy0T&E%@L+$j}M`wO=hzxSe@ W!+kG&81H@|HsfGrfWy7a_`d=2.3.0 +accelerate>=1.0.1 +aiofiles>=23.2.1 +aiohappyeyeballs>=2.6.1 +aiohttp>=3.12.13 +aiosignal>=1.3.2 +albucore>=0.0.19 +albumentations>=1.4.20 +annotated-types>=0.7.0 +antlr4-python3-runtime>=4.9.3 +anyio>=4.9.0 +async-timeout>=5.0.1 +attrs>=25.3.0 +av>=13.1.0 +beautifulsoup4>=4.12.3 +bitsandbytes>=0.42.0 +blessed>=1.21.0 +certifi>=2025.6.15 +charset-normalizer>=3.4.2 +click>=8.2.1 +codespell>=2.3.0 +contourpy>=1.3.2 +cycler>=0.12.1 +dashscope>=1.23.5 +decorator>=4.4.2 +decord>=0.6.0 +diffusers>=0.32.0 +docker-pycreds>=0.4.0 +easydict>=1.13 +einops>=0.8.0 +eval_type_backport>=0.2.2 +exceptiongroup>=1.3.0 +fastapi>=0.115.3 +ffmpeg>=1.4 +ffmpy>=0.6.0 +filelock>=3.13.1 +flash-attn>=2.7.0.post2 +fonttools>=4.58.4 +frozenlist>=1.7.0 +fsspec>=2024.6.1 +ftfy>=6.3.0 +future>=1.0.0 +fvcore>=0.1.5.post20221221 +gdown>=5.2.0 +gitdb>=4.0.12 +GitPython>=3.1.44 +gpustat>=1.1.1 +gradio>=5.3.0 +gradio_client>=1.4.2 +grpcio>=1.73.0 +h11>=0.16.0 +h5py>=3.12.1 +hf-xet>=1.1.5 +hjson>=3.1.0 +httpcore>=1.0.9 +httpx>=0.28.1 +huggingface-hub>=0.26.1 +idna>=3.6 +imageio>=2.36.0 +imageio-ffmpeg>=0.5.1 +importlib_metadata>=8.7.0 +inquirerpy>=0.3.4 +iopath>=0.1.10 +isort>=5.13.2 +Jinja2>=3.1.4 +joblib>=1.5.1 +kiwisolver>=1.4.8 +liger_kernel>=0.4.1 +lightning-utilities>=0.14.3 +loguru>=0.7.3 +Markdown>=3.8 +markdown-it-py>=3.0.0 +MarkupSafe>=2.1.5 +matplotlib>=3.9.2 +mdurl>=0.1.2 +moviepy>=1.0.3 +mpmath>=1.3.0 +msgpack>=1.1.1 +multidict>=6.5.0 +mypy>=1.11.1 +mypy_extensions>=1.1.0 +networkx>=3.3 +ninja>=1.11.1.4 +numpy>=1.26.3 +omegaconf>=2.3.0 +opencv-python>=4.10.0.84 +opencv-python-headless>=4.10.0.84 +orjson>=3.10.18 +packaging>=25.0 +pandas>=2.2.3 +parameterized>=0.9.0 +peft>=0.13.2 +pfzy>=0.3.4 +pillow>=10.2.0 +platformdirs>=4.3.8 +polib>=1.2.0 +portalocker>=3.2.0 +proglog>=0.1.12 +prompt_toolkit>=3.0.51 +propcache>=0.3.2 +protobuf>=5.28.3 +psutil>=7.0.0 +py-cpuinfo>=9.0.0 +pydantic>=2.9.2 +pydantic_core>=2.23.4 +pydub>=0.25.1 +Pygments>=2.19.1 +pyparsing>=3.2.3 +PySocks>=1.7.1 +python-dateutil>=2.9.0.post0 +python-multipart>=0.0.20 +pytorch-lightning>=2.4.0 +pytorchvideo>=0.1.5 +pytz>=2025.2 +PyYAML>=6.0.1 +regex>=2024.9.11 +requests>=2.31.0 +rich>=14.0.0 +ruff>=0.6.5 +safetensors>=0.5.3 +scikit-learn>=1.5.2 +scikit-video>=1.1.11 +scipy>=1.14.1 +semantic-version>=2.10.0 +sentencepiece>=0.2.0 +sentry-sdk>=2.30.0 +setproctitle>=1.3.6 +shellingham>=1.5.4 +six>=1.16.0 +smmap>=5.0.2 +sniffio>=1.3.1 +soupsieve>=2.7 +sphinx-lint>=1.0.0 +starlette>=0.41.3 +stringzilla>=3.12.5 +sympy>=1.13.1 +tabulate>=0.9.0 +tensorboard>=2.18.0 +tensorboard-data-server>=0.7.2 +termcolor>=3.1.0 +test_tube>=0.7.5 +threadpoolctl>=3.6.0 +timm>=1.0.11 +tokenizers>=0.20.1 +toml>=0.10.2 +tomli>=2.0.2 +tomlkit>=0.12.0 +#torch>=2.5.0+cu121 +torchdiffeq>=0.2.4 +torchmetrics>=1.5.1 +#torchvision>=0.20.0+cu121 +tqdm>=4.66.5 +transformers>=4.46.1 +#triton>=3.1.0 +typer>=0.16.0 +types-PyYAML>=6.0.12.20250516 +types-requests>=2.32.4.20250611 +types-setuptools>=80.9.0.20250529 +typing_extensions>=4.12.2 +tzdata>=2025.2 +urllib3>=2.2.0 +uvicorn>=0.32.0 +wandb>=0.18.5 +watch>=0.2.7 +wcwidth>=0.2.13 +websocket-client>=1.8.0 +websockets>=12.0 +Werkzeug>=3.1.3 +yacs>=0.1.8 +yapf>=0.32.0 +yarl>=1.20.1 +zipp>=3.23.0 \ No newline at end of file diff --git a/scripts/finetune/finetune.bat b/scripts/finetune/finetune.bat new file mode 100644 index 0000000..9c4c7d3 --- /dev/null +++ b/scripts/finetune/finetune.bat @@ -0,0 +1,30 @@ +@echo off +setlocal + +set TOKENIZERS_PARALLELISM=false +set USE_LIBUV=0 + +cd /d "%~dp0..\.." + +torchrun --nproc_per_node 8 --master_port 29607 ^ + fastvideo/distill_model.py ^ + --seed 42 ^ + --gradient_checkpointing ^ + --train_batch_size=1 ^ + --dataloader_num_workers 4 ^ + --gradient_accumulation_steps=1 ^ + --max_train_steps=600000 ^ + --learning_rate=1e-5 ^ + --discriminator_learning_rate=1e-5 ^ + --mixed_precision="bf16" ^ + --checkpointing_steps=25 ^ + --validation_steps 24 ^ + --allow_tf32 ^ + --MVDT ^ + --Distil ^ + --t5_cpu ^ + --root_dir="./mp4_frame" ^ + --full_mp4="./Sekai/" ^ + --output_dir="./outputs" + +exit /b %ERRORLEVEL% diff --git a/scripts/inference/sample.bat b/scripts/inference/sample.bat new file mode 100644 index 0000000..5739059 --- /dev/null +++ b/scripts/inference/sample.bat @@ -0,0 +1,67 @@ +@echo off +setlocal enabledelayedexpansion + +set TOKENIZERS_PARALLELISM=false +set TF_ENABLE_ONEDNN_OPTS=0 +set LOCAL_RANK=0 +set RANK=0 +set WORLD_SIZE=1 +set MASTER_ADDR=127.0.0.1 +set MASTER_PORT=29500 + +set EXAMPLE_DIR=C:\workspace\world\Infinite-World\assets\example_case + +cd /d "%~dp0..\.." + +:: Write default caption file once +echo A first-person view exploring an interactive game scene. > temp_caption_default.txt + +for /f %%T in ('powershell -NoProfile -Command "Get-Date -Format ''yyyyMMdd_HHmmss''"') do set RUN_TS=%%T +for /f %%t in ('powershell -NoProfile -Command "[int64](Get-Date).Ticks"') do set OVERALL_START=%%t +set CASE_NUM=0 + +goto :main + +:: ------------------------------------------------------- +:: Subroutine: reads RC_DIR, RC_NAME, RC_CAPTION from env +:: ------------------------------------------------------- +:run_case + set /a CASE_NUM+=1 + echo. + echo === !CASE_NUM!: !RC_NAME! === + echo output: ./outputs/%RUN_TS%/!RC_NAME! + for /f %%t in ('powershell -NoProfile -Command "[int64](Get-Date).Ticks"') do set CASE_START=%%t + + python fastvideo/sample/sample.py ^ + --seed 42 ^ + --gradient_checkpointing ^ + --train_batch_size=1 ^ + --max_sample_steps=600000 ^ + --mixed_precision="bf16" ^ + --allow_tf32 ^ + --video_output_dir="./outputs/%RUN_TS%/!RC_NAME!" ^ + --jpg_dir="!RC_DIR!" ^ + --caption_path="!RC_CAPTION!" ^ + --test_data_dir="./val" ^ + --num_euler_timesteps 50 ^ + --rand_num_img 0.6 ^ + --t5_cpu + + powershell -NoProfile -Command "$e=([int64](Get-Date).Ticks-!CASE_START!)/1e7; $fps=[math]::Round(163/$e,2); Write-Host (' time='+[math]::Round($e,1)+'s inference='+$fps+'fps video=16fps')" + exit /b 0 + +:main + +for /d %%D in (%EXAMPLE_DIR%\*) do ( + set RC_NAME=%%~nxD + set RC_DIR=%%D + set RC_CAPTION=temp_caption_default.txt + if exist "%%D\prompt.txt" set RC_CAPTION=%%D\prompt.txt + call :run_case +) + +echo. +powershell -NoProfile -Command "$e=([int64](Get-Date).Ticks-%OVERALL_START%)/1e7; Write-Host ('Total: !CASE_NUM! cases')" + +del temp_caption_default.txt 2>nul +exit /b 0 diff --git a/scripts/inference/sample.sh b/scripts/inference/sample.sh index 06f4468..b6c4ca2 100644 --- a/scripts/inference/sample.sh +++ b/scripts/inference/sample.sh @@ -3,6 +3,7 @@ # DATA_DIR=./data # IP=[MASTER NODE IP] export TOKENIZERS_PARALLELISM=false +export USE_LIBUV=0 torchrun --nproc_per_node 1 --master_port 29709 \ fastvideo/sample/sample.py \ diff --git a/scripts/inference/sample_5b.bat b/scripts/inference/sample_5b.bat new file mode 100644 index 0000000..e7084d0 --- /dev/null +++ b/scripts/inference/sample_5b.bat @@ -0,0 +1,81 @@ +@echo off +setlocal enabledelayedexpansion + +set TOKENIZERS_PARALLELISM=false +set TF_ENABLE_ONEDNN_OPTS=0 +set LOCAL_RANK=0 +set RANK=0 +set WORLD_SIZE=1 +set MASTER_ADDR=127.0.0.1 +set MASTER_PORT=29500 + +set EXAMPLE_DIR=C:\workspace\world\Infinite-World\assets\example_case + +cd /d "%~dp0..\.." + +for /f "tokens=*" %%T in ('powershell -NoProfile -Command "Get-Date -Format ''yyyyMMdd_HHmmss''" 2^>nul') do if not "%%T"=="" set RUN_TS=%%T +for /f %%t in ('powershell -NoProfile -Command "[int64](Get-Date).Ticks"') do set OVERALL_START=%%t +echo Output: %CD%\outputs\%RUN_TS% +set CASE_NUM=0 + +:: Count total cases +set TOTAL_CASES=0 +for /d %%D in (%EXAMPLE_DIR%\*) do set /a TOTAL_CASES+=1 +echo Found %TOTAL_CASES% cases output: ./outputs/%RUN_TS% + +goto :main + +:: ------------------------------------------------------- +:: Subroutine: reads RC_DIR, RC_NAME, RC_CAPTION from env +:: ------------------------------------------------------- +:run_case + set /a CASE_NUM+=1 + echo. + echo === !CASE_NUM!/%TOTAL_CASES%: !RC_NAME! === + echo output: ./outputs/%RUN_TS%/!RC_NAME! + echo img: !RC_DIR! + echo prompt: !RC_CAPTION! + type "!RC_CAPTION!" + echo. + for /f %%t in ('powershell -NoProfile -Command "[int64](Get-Date).Ticks"') do set CASE_START=%%t + + python fastvideo/sample/sample_5b.py ^ + --seed 43 ^ + --gradient_checkpointing ^ + --train_batch_size=1 ^ + --max_sample_steps=1 ^ + --mixed_precision="bf16" ^ + --allow_tf32 ^ + --t5_cpu ^ + --video_output_dir="./outputs/%RUN_TS%/!RC_NAME!" ^ + --jpg_dir="!RC_DIR!" ^ + --caption_path="!RC_CAPTION!" ^ + --test_data_dir="./val" ^ + --num_euler_timesteps 8 ^ + --rand_num_img 0.6 ^ + --internvl_path "./InternVL3-2B-Instruct" + + powershell -NoProfile -Command "$e=([int64](Get-Date).Ticks-!CASE_START!)/1e7; $tot=([int64](Get-Date).Ticks-%OVERALL_START%)/1e7; $fps=[math]::Round(163/$e,2); $rem=(%TOTAL_CASES%-!CASE_NUM!)*($tot/!CASE_NUM!); Write-Host (' time='+[math]::Round($e,1)+'s fps='+$fps+' ETA='+[math]::Round($rem,0)+'s')" + exit /b 0 + +:main + +for /d %%D in (%EXAMPLE_DIR%\*) do ( + set RC_NAME=%%~nxD + set RC_DIR=%%D + echo A %%~nxD scene. > temp_caption_%%~nxD.txt + set RC_CAPTION=temp_caption_%%~nxD.txt + if exist "%%D\prompt.txt" set RC_CAPTION=%%D\prompt.txt + if exist "%%D\prompt.json" ( + powershell -NoProfile -Command "(Get-Content '%%D\prompt.json' -Raw | ConvertFrom-Json).prompt | Set-Content 'temp_prompt_%%~nxD.txt' -Encoding UTF8" + set RC_CAPTION=temp_prompt_%%~nxD.txt + ) + call :run_case +) + +echo. +powershell -NoProfile -Command "$e=([int64](Get-Date).Ticks-%OVERALL_START%)/1e7; Write-Host ('Total: %TOTAL_CASES% cases in '+[math]::Round($e,1)+'s avg='+[math]::Round($e/%TOTAL_CASES%,1)+'s/case')" + +del temp_caption_*.txt 2>nul +del temp_prompt_*.txt 2>nul +exit /b 0 diff --git a/scripts/inference/sample_5b.sh b/scripts/inference/sample_5b.sh index b0bc4b2..3777baf 100755 --- a/scripts/inference/sample_5b.sh +++ b/scripts/inference/sample_5b.sh @@ -3,6 +3,7 @@ # DATA_DIR=./data # IP=[MASTER NODE IP] export TOKENIZERS_PARALLELISM=false +export USE_LIBUV=0 torchrun --nproc_per_node 2 --master_port 29717 \ fastvideo/sample/sample_5b.py \ diff --git a/scripts/inference/sample_5b_vbench.bat b/scripts/inference/sample_5b_vbench.bat index e7084d0..edc8dde 100644 --- a/scripts/inference/sample_5b_vbench.bat +++ b/scripts/inference/sample_5b_vbench.bat @@ -11,16 +11,21 @@ set MASTER_PORT=29500 set EXAMPLE_DIR=C:\workspace\world\Infinite-World\assets\example_case -cd /d "%~dp0..\.." +cd /d "%~dp0..\\.." for /f "tokens=*" %%T in ('powershell -NoProfile -Command "Get-Date -Format ''yyyyMMdd_HHmmss''" 2^>nul') do if not "%%T"=="" set RUN_TS=%%T for /f %%t in ('powershell -NoProfile -Command "[int64](Get-Date).Ticks"') do set OVERALL_START=%%t echo Output: %CD%\outputs\%RUN_TS% set CASE_NUM=0 -:: Count total cases +:: Count matching cases (scenery=nature, indoor=kitchen) set TOTAL_CASES=0 -for /d %%D in (%EXAMPLE_DIR%\*) do set /a TOTAL_CASES+=1 +for /d %%D in (%EXAMPLE_DIR%\*) do ( + set _MATCH=0 + if /i "%%~nxD"=="nature" set _MATCH=1 + if /i "%%~nxD"=="kitchen" set _MATCH=1 + if "!_MATCH!"=="1" set /a TOTAL_CASES+=1 +) echo Found %TOTAL_CASES% cases output: ./outputs/%RUN_TS% goto :main @@ -35,12 +40,13 @@ goto :main echo output: ./outputs/%RUN_TS%/!RC_NAME! echo img: !RC_DIR! echo prompt: !RC_CAPTION! + echo seed: !SEED! type "!RC_CAPTION!" echo. for /f %%t in ('powershell -NoProfile -Command "[int64](Get-Date).Ticks"') do set CASE_START=%%t python fastvideo/sample/sample_5b.py ^ - --seed 43 ^ + --seed !SEED! ^ --gradient_checkpointing ^ --train_batch_size=1 ^ --max_sample_steps=1 ^ @@ -51,9 +57,13 @@ goto :main --jpg_dir="!RC_DIR!" ^ --caption_path="!RC_CAPTION!" ^ --test_data_dir="./val" ^ - --num_euler_timesteps 8 ^ + --num_euler_timesteps 5 ^ --rand_num_img 0.6 ^ - --internvl_path "./InternVL3-2B-Instruct" + --internvl_path "./InternVL3-2B-Instruct" ^ + --height 720 ^ + --width 960 ^ + --num_frames 161 ^ + --fps 24 powershell -NoProfile -Command "$e=([int64](Get-Date).Ticks-!CASE_START!)/1e7; $tot=([int64](Get-Date).Ticks-%OVERALL_START%)/1e7; $fps=[math]::Round(163/$e,2); $rem=(%TOTAL_CASES%-!CASE_NUM!)*($tot/!CASE_NUM!); Write-Host (' time='+[math]::Round($e,1)+'s fps='+$fps+' ETA='+[math]::Round($rem,0)+'s')" exit /b 0 @@ -61,16 +71,22 @@ goto :main :main for /d %%D in (%EXAMPLE_DIR%\*) do ( - set RC_NAME=%%~nxD - set RC_DIR=%%D - echo A %%~nxD scene. > temp_caption_%%~nxD.txt - set RC_CAPTION=temp_caption_%%~nxD.txt - if exist "%%D\prompt.txt" set RC_CAPTION=%%D\prompt.txt - if exist "%%D\prompt.json" ( - powershell -NoProfile -Command "(Get-Content '%%D\prompt.json' -Raw | ConvertFrom-Json).prompt | Set-Content 'temp_prompt_%%~nxD.txt' -Encoding UTF8" - set RC_CAPTION=temp_prompt_%%~nxD.txt + set _MATCH=0 + if /i "%%~nxD"=="nature" set _MATCH=1 + if /i "%%~nxD"=="kitchen" set _MATCH=1 + if "!_MATCH!"=="1" ( + set RC_NAME=%%~nxD + set RC_DIR=%%D + set /a SEED=%RANDOM% * 32768 + %RANDOM% + echo A %%~nxD scene. > temp_caption_%%~nxD.txt + set RC_CAPTION=temp_caption_%%~nxD.txt + if exist "%%D\prompt.txt" set RC_CAPTION=%%D\prompt.txt + if exist "%%D\prompt.json" ( + powershell -NoProfile -Command "(Get-Content '%%D\prompt.json' -Raw | ConvertFrom-Json).prompt | Set-Content 'temp_prompt_%%~nxD.txt' -Encoding UTF8" + set RC_CAPTION=temp_prompt_%%~nxD.txt + ) + call :run_case ) - call :run_case ) echo. diff --git a/scripts/inference/sample_image.bat b/scripts/inference/sample_image.bat new file mode 100644 index 0000000..be64dc6 --- /dev/null +++ b/scripts/inference/sample_image.bat @@ -0,0 +1,29 @@ +@echo off +setlocal + +set TOKENIZERS_PARALLELISM=false +set TF_ENABLE_ONEDNN_OPTS=0 +set LOCAL_RANK=0 +set RANK=0 +set WORLD_SIZE=1 +set MASTER_ADDR=127.0.0.1 +set MASTER_PORT=29500 + +cd /d "%~dp0..\.." + +python fastvideo/sample/sample.py ^ + --seed 42 ^ + --gradient_checkpointing ^ + --train_batch_size=1 ^ + --max_sample_steps=600000 ^ + --mixed_precision="bf16" ^ + --allow_tf32 ^ + --video_output_dir="./outputs" ^ + --jpg_dir="./jpg/" ^ + --caption_path="./caption.txt" ^ + --test_data_dir="./val" ^ + --num_euler_timesteps 50 ^ + --rand_num_img 0.6 ^ + --t5_cpu + +exit /b %ERRORLEVEL% diff --git a/scripts/inference/sample_image.sh b/scripts/inference/sample_image.sh index e2f3e16..779b58c 100644 --- a/scripts/inference/sample_image.sh +++ b/scripts/inference/sample_image.sh @@ -3,6 +3,7 @@ # DATA_DIR=./data # IP=[MASTER NODE IP] export TOKENIZERS_PARALLELISM=false +export USE_LIBUV=0 torchrun --nproc_per_node 1 --master_port 29707 \ fastvideo/sample/sample.py \ diff --git a/scripts/inference/sample_tts.bat b/scripts/inference/sample_tts.bat new file mode 100644 index 0000000..cd162a8 --- /dev/null +++ b/scripts/inference/sample_tts.bat @@ -0,0 +1,29 @@ +@echo off +setlocal + +set TOKENIZERS_PARALLELISM=false +set TF_ENABLE_ONEDNN_OPTS=0 +set LOCAL_RANK=0 +set RANK=0 +set WORLD_SIZE=1 +set MASTER_ADDR=127.0.0.1 +set MASTER_PORT=29500 + +cd /d "%~dp0..\.." + +python fastvideo/sample/sample_tts.py ^ + --seed 42 ^ + --gradient_checkpointing ^ + --train_batch_size=1 ^ + --max_sample_steps=600000 ^ + --mixed_precision="bf16" ^ + --allow_tf32 ^ + --video_output_dir="./outputs" ^ + --jpg_dir="./jpg/" ^ + --caption_path="./caption.txt" ^ + --test_data_dir="./val" ^ + --num_euler_timesteps 50 ^ + --rand_num_img 0.6 ^ + --t5_cpu + +exit /b %ERRORLEVEL% diff --git a/scripts/inference/sample_tts.sh b/scripts/inference/sample_tts.sh index 37a4251..d1807fe 100644 --- a/scripts/inference/sample_tts.sh +++ b/scripts/inference/sample_tts.sh @@ -3,6 +3,7 @@ # DATA_DIR=./data # IP=[MASTER NODE IP] export TOKENIZERS_PARALLELISM=false +export USE_LIBUV=0 torchrun --nproc_per_node 1 --master_port 29708 \ fastvideo/sample/sample_tts.py \ From 6b5ac712bbac5360b444a3e66c36031681e93f15 Mon Sep 17 00:00:00 2001 From: kschmid Date: Mon, 9 Mar 2026 14:27:29 +1100 Subject: [PATCH 03/33] down --- .gitignore | 3 + scripts/inference/sample_5b_vbench.bat | 99 ++++++-------------------- 2 files changed, 23 insertions(+), 79 deletions(-) diff --git a/.gitignore b/.gitignore index 2641667..811bd9f 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ *.mp4 +**/__pycache__/ +**/*.pyc +**/*.pyo diff --git a/scripts/inference/sample_5b_vbench.bat b/scripts/inference/sample_5b_vbench.bat index edc8dde..27c1e5e 100644 --- a/scripts/inference/sample_5b_vbench.bat +++ b/scripts/inference/sample_5b_vbench.bat @@ -9,89 +9,30 @@ set WORLD_SIZE=1 set MASTER_ADDR=127.0.0.1 set MASTER_PORT=29500 -set EXAMPLE_DIR=C:\workspace\world\Infinite-World\assets\example_case +set VBENCH_JSON=C:\workspace\world\VBench\vbench2_beta_i2v\vbench2_beta_i2v\data\i2v-bench-info.json +set VBENCH_CROP=C:\workspace\world\VBench\vbench2_beta_i2v\vbench2_beta_i2v\data\crop\1-1 +set PS_SCRIPT=%~dp0vbench_runner.ps1 cd /d "%~dp0..\\.." -for /f "tokens=*" %%T in ('powershell -NoProfile -Command "Get-Date -Format ''yyyyMMdd_HHmmss''" 2^>nul') do if not "%%T"=="" set RUN_TS=%%T -for /f %%t in ('powershell -NoProfile -Command "[int64](Get-Date).Ticks"') do set OVERALL_START=%%t -echo Output: %CD%\outputs\%RUN_TS% -set CASE_NUM=0 +powershell -NoProfile -Command "Get-Date -Format 'yyyyMMdd_HHmmss'" > _tmp_ts.txt +set /p RUN_TS=<_tmp_ts.txt +del _tmp_ts.txt -:: Count matching cases (scenery=nature, indoor=kitchen) -set TOTAL_CASES=0 -for /d %%D in (%EXAMPLE_DIR%\*) do ( - set _MATCH=0 - if /i "%%~nxD"=="nature" set _MATCH=1 - if /i "%%~nxD"=="kitchen" set _MATCH=1 - if "!_MATCH!"=="1" set /a TOTAL_CASES+=1 -) -echo Found %TOTAL_CASES% cases output: ./outputs/%RUN_TS% +powershell -NoProfile -Command "Get-Random -Maximum 2000000000" > _tmp_seed.txt +set /p BASE_SEED=<_tmp_seed.txt +del _tmp_seed.txt -goto :main +echo Output: %CD%\outputs\%RUN_TS% +echo VBench: %VBENCH_JSON% +echo Crop: %VBENCH_CROP% +echo Base seed: %BASE_SEED% -:: ------------------------------------------------------- -:: Subroutine: reads RC_DIR, RC_NAME, RC_CAPTION from env -:: ------------------------------------------------------- -:run_case - set /a CASE_NUM+=1 - echo. - echo === !CASE_NUM!/%TOTAL_CASES%: !RC_NAME! === - echo output: ./outputs/%RUN_TS%/!RC_NAME! - echo img: !RC_DIR! - echo prompt: !RC_CAPTION! - echo seed: !SEED! - type "!RC_CAPTION!" - echo. - for /f %%t in ('powershell -NoProfile -Command "[int64](Get-Date).Ticks"') do set CASE_START=%%t +powershell -NoProfile -ExecutionPolicy Bypass -File "%PS_SCRIPT%" ^ + -RunTs "%RUN_TS%" ^ + -BaseSeed %BASE_SEED% ^ + -VbenchJson "%VBENCH_JSON%" ^ + -VbenchCrop "%VBENCH_CROP%" ^ + -WorkDir "%CD%" - python fastvideo/sample/sample_5b.py ^ - --seed !SEED! ^ - --gradient_checkpointing ^ - --train_batch_size=1 ^ - --max_sample_steps=1 ^ - --mixed_precision="bf16" ^ - --allow_tf32 ^ - --t5_cpu ^ - --video_output_dir="./outputs/%RUN_TS%/!RC_NAME!" ^ - --jpg_dir="!RC_DIR!" ^ - --caption_path="!RC_CAPTION!" ^ - --test_data_dir="./val" ^ - --num_euler_timesteps 5 ^ - --rand_num_img 0.6 ^ - --internvl_path "./InternVL3-2B-Instruct" ^ - --height 720 ^ - --width 960 ^ - --num_frames 161 ^ - --fps 24 - - powershell -NoProfile -Command "$e=([int64](Get-Date).Ticks-!CASE_START!)/1e7; $tot=([int64](Get-Date).Ticks-%OVERALL_START%)/1e7; $fps=[math]::Round(163/$e,2); $rem=(%TOTAL_CASES%-!CASE_NUM!)*($tot/!CASE_NUM!); Write-Host (' time='+[math]::Round($e,1)+'s fps='+$fps+' ETA='+[math]::Round($rem,0)+'s')" - exit /b 0 - -:main - -for /d %%D in (%EXAMPLE_DIR%\*) do ( - set _MATCH=0 - if /i "%%~nxD"=="nature" set _MATCH=1 - if /i "%%~nxD"=="kitchen" set _MATCH=1 - if "!_MATCH!"=="1" ( - set RC_NAME=%%~nxD - set RC_DIR=%%D - set /a SEED=%RANDOM% * 32768 + %RANDOM% - echo A %%~nxD scene. > temp_caption_%%~nxD.txt - set RC_CAPTION=temp_caption_%%~nxD.txt - if exist "%%D\prompt.txt" set RC_CAPTION=%%D\prompt.txt - if exist "%%D\prompt.json" ( - powershell -NoProfile -Command "(Get-Content '%%D\prompt.json' -Raw | ConvertFrom-Json).prompt | Set-Content 'temp_prompt_%%~nxD.txt' -Encoding UTF8" - set RC_CAPTION=temp_prompt_%%~nxD.txt - ) - call :run_case - ) -) - -echo. -powershell -NoProfile -Command "$e=([int64](Get-Date).Ticks-%OVERALL_START%)/1e7; Write-Host ('Total: %TOTAL_CASES% cases in '+[math]::Round($e,1)+'s avg='+[math]::Round($e/%TOTAL_CASES%,1)+'s/case')" - -del temp_caption_*.txt 2>nul -del temp_prompt_*.txt 2>nul -exit /b 0 +exit /b %ERRORLEVEL% From 22969c539a3d4092c53d5d09b4a3f7f20340f5a5 Mon Sep 17 00:00:00 2001 From: kschmid Date: Mon, 9 Mar 2026 15:23:49 +1100 Subject: [PATCH 04/33] down --- .gitignore | 13 +++++++++++++ download_model.py | 14 ++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 download_model.py diff --git a/.gitignore b/.gitignore index 811bd9f..eea1e5a 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,16 @@ **/__pycache__/ **/*.pyc **/*.pyo + +InternVL3-2B-Instruct/ +Yume-5B-720P/ +_vbench_caption.txt +_vbench_tmp/ +outputs/ +requirements-cog.txt +scripts/inference/vbench_runner.ps1 +temp_caption_3th person.txt +temp_caption_bus.txt +temp_caption_default.txt +temp_caption_gc.txt +temp_caption_kitchen.txt diff --git a/download_model.py b/download_model.py new file mode 100644 index 0000000..cb3e402 --- /dev/null +++ b/download_model.py @@ -0,0 +1,14 @@ +"""Download Yume model weights from HuggingFace.""" + +from huggingface_hub import snapshot_download + +REPOS = [ + "stdstu123/Yume-5B-720P", + "OpenGVLab/InternVL3-2B-Instruct", +] + +for repo_id in REPOS: + local_dir = f"./{repo_id.split('/')[-1]}" + print(f"Downloading {repo_id} -> {local_dir}") + snapshot_download(repo_id=repo_id, local_dir=local_dir) + print(f"Done: {local_dir}") From df4c8ba9408a89471295b6eb0f338571bc1882bf Mon Sep 17 00:00:00 2001 From: kschmid Date: Mon, 9 Mar 2026 15:40:19 +1100 Subject: [PATCH 05/33] stats --- .../utils/__pycache__/__init__.cpython-312.pyc | Bin 441 -> 0 bytes .../__pycache__/fm_solvers.cpython-312.pyc | Bin 42693 -> 0 bytes .../fm_solvers_unipc.cpython-312.pyc | Bin 35188 -> 0 bytes wan23/utils/__pycache__/utils.cpython-312.pyc | Bin 6990 -> 0 bytes 4 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 wan23/utils/__pycache__/__init__.cpython-312.pyc delete mode 100644 wan23/utils/__pycache__/fm_solvers.cpython-312.pyc delete mode 100644 wan23/utils/__pycache__/fm_solvers_unipc.cpython-312.pyc delete mode 100644 wan23/utils/__pycache__/utils.cpython-312.pyc diff --git a/wan23/utils/__pycache__/__init__.cpython-312.pyc b/wan23/utils/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 072aa215d0df0c108d94136d8b39395aefcb03ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 441 zcmZXQKTiTN7{=TC0|vzybz^Y8L`(o(h;adl3x)(4yj*N9Tsa!s9%=6&xcL=a+}#`< z{1kqJu1;<$F(yp5_=mxFc=Eh``u_6feJU0UK-b0N!|()tXx=R9FxPh>h(ToEK|eQjJoiPjfM=_n7ELD2PP?1XF&6ENrbMQA)a?&( zlu<0yR*X|5LpGv>$4HWxg;H$_oC<=+7^Q?^Gax;vN`}?rq|^A%@m#filEtxx48lG> zOD-`dS6B!~?;%_xwvn8cQ!lRy1BT>cC;1)x{Zkvu2xXj%`imizM<}Eep?fgX3@~ps z>OoIpA%kkIa4QngtF<6Y36%jtgp(AZz0q{Oa>x>M liX*YEvF2>Dq~+Cy5PmuiwBCT0j{<=8cgJ3}uJd9|=U+8`eyacg diff --git a/wan23/utils/__pycache__/fm_solvers.cpython-312.pyc b/wan23/utils/__pycache__/fm_solvers.cpython-312.pyc deleted file mode 100644 index 593a987ab274d067d535de604c4c56b6ecb52c5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42693 zcmeIbd30M>nkR;bg#-zJAPDX&xQT>Fag(T>k|Tav=eYUMz#DjO)X*pWa(x`0jibgfQ=e(f+-DxM^jXF-`Z74_duE@N#n0-?!mnvG zd(75n8?*P>*?04(V=SjHXUy5>9Lw#?W$!GbuCctnyfJs5n>}ZY=8qNh6>tWl!SDV| z21Veq41DJMhQ7iqgY=KL@z(dbz9OUHxPi}l-@s@4oqpSAW+_2m@g(Q9|C%0pz2=1Z zbRZl_SkI0}0->O9G+{Y6F+S=~Sl$fc*=tPLj)a0kf#EZO>w#b*Pw)>Tx?kvzg!%{B z2d^nna>^$NzHm=qXlNpgRBsH9`1y%ZzYtF3sP|F^PWAchL}Yv-f&#L5|G3~E^hNxM zyg;}=JQx_C?Dt*u1x9_BM*UtcVHbQsKG+}e2g4y@&?r}%eyBA}_!Xgr*-ghv8H5&Q&($9!Qb(&O>`=ERY` z7vBs6ITt&&w|DNi*b}-I91Z#S@Wr>^Jacs0m@g3A)~?-OyygpbY`-`W35

4vqDP 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 Cf_cRN diff --git a/wan23/utils/__pycache__/utils.cpython-312.pyc b/wan23/utils/__pycache__/utils.cpython-312.pyc deleted file mode 100644 index 10ae6f6d473d007e923ef0ae75daf6b5da4ce948..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6990 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 From c0146b0c8aa8ded3a7f373233ac9b7764a942d08 Mon Sep 17 00:00:00 2001 From: kschmid Date: Mon, 9 Mar 2026 17:11:25 +1100 Subject: [PATCH 06/33] dowmloads models --- .gitignore | 1 - scripts/inference/sample_5b_vbench.bat | 31 +--- scripts/inference/vbench_runner.py | 220 +++++++++++++++++++++++++ 3 files changed, 229 insertions(+), 23 deletions(-) create mode 100644 scripts/inference/vbench_runner.py diff --git a/.gitignore b/.gitignore index eea1e5a..187e562 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,6 @@ _vbench_caption.txt _vbench_tmp/ outputs/ requirements-cog.txt -scripts/inference/vbench_runner.ps1 temp_caption_3th person.txt temp_caption_bus.txt temp_caption_default.txt diff --git a/scripts/inference/sample_5b_vbench.bat b/scripts/inference/sample_5b_vbench.bat index 27c1e5e..fa2bffd 100644 --- a/scripts/inference/sample_5b_vbench.bat +++ b/scripts/inference/sample_5b_vbench.bat @@ -1,38 +1,25 @@ @echo off setlocal enabledelayedexpansion -set TOKENIZERS_PARALLELISM=false -set TF_ENABLE_ONEDNN_OPTS=0 -set LOCAL_RANK=0 -set RANK=0 -set WORLD_SIZE=1 -set MASTER_ADDR=127.0.0.1 -set MASTER_PORT=29500 - set VBENCH_JSON=C:\workspace\world\VBench\vbench2_beta_i2v\vbench2_beta_i2v\data\i2v-bench-info.json set VBENCH_CROP=C:\workspace\world\VBench\vbench2_beta_i2v\vbench2_beta_i2v\data\crop\1-1 -set PS_SCRIPT=%~dp0vbench_runner.ps1 +set PY_SCRIPT=%~dp0vbench_runner.py cd /d "%~dp0..\\.." -powershell -NoProfile -Command "Get-Date -Format 'yyyyMMdd_HHmmss'" > _tmp_ts.txt -set /p RUN_TS=<_tmp_ts.txt -del _tmp_ts.txt - -powershell -NoProfile -Command "Get-Random -Maximum 2000000000" > _tmp_seed.txt -set /p BASE_SEED=<_tmp_seed.txt -del _tmp_seed.txt +for /f "tokens=*" %%i in ('python -c "from datetime import datetime; print(datetime.now().strftime(\"%%Y%%m%%d_%%H%%M%%S\"))"') do set RUN_TS=%%i +for /f "tokens=*" %%i in ('python -c "import random; print(random.randint(0,1999999999))"') do set BASE_SEED=%%i echo Output: %CD%\outputs\%RUN_TS% echo VBench: %VBENCH_JSON% echo Crop: %VBENCH_CROP% echo Base seed: %BASE_SEED% -powershell -NoProfile -ExecutionPolicy Bypass -File "%PS_SCRIPT%" ^ - -RunTs "%RUN_TS%" ^ - -BaseSeed %BASE_SEED% ^ - -VbenchJson "%VBENCH_JSON%" ^ - -VbenchCrop "%VBENCH_CROP%" ^ - -WorkDir "%CD%" +python "%PY_SCRIPT%" ^ + --run-ts "%RUN_TS%" ^ + --base-seed %BASE_SEED% ^ + --vbench-json "%VBENCH_JSON%" ^ + --vbench-crop "%VBENCH_CROP%" ^ + --work-dir "%CD%" exit /b %ERRORLEVEL% diff --git a/scripts/inference/vbench_runner.py b/scripts/inference/vbench_runner.py new file mode 100644 index 0000000..4a020d6 --- /dev/null +++ b/scripts/inference/vbench_runner.py @@ -0,0 +1,220 @@ +""" +vbench_runner.py -- Python replacement for vbench_runner.ps1 +""" +import argparse +import csv +import json +import os +import re +import shutil +import subprocess +import sys +import threading +import time +from datetime import datetime, timezone +from pathlib import Path + +ALLOWED_TYPES = ['indoor', 'scenery'] +NUM_SAMPLES = 5 +NUM_FRAMES = 161 + + +# ---------- helpers ---------- + +def _safe(s, maxlen=80): + return re.sub(r'[<>:"/\\|?*]', '_', s)[:maxlen] + +def _poll_vram(stop_event, readings): + while not stop_event.is_set(): + try: + out = subprocess.check_output( + ['nvidia-smi', '--query-gpu=memory.used', '--format=csv,noheader,nounits'], + stderr=subprocess.DEVNULL, text=True + ).strip().splitlines()[0].strip() + if out.isdigit(): + readings.append(int(out)) + except Exception: + pass + time.sleep(5) + +def _ram_gb(): + try: + import psutil + vm = psutil.virtual_memory() + return round(vm.used / (1024 ** 3), 2) + except Exception: + return '' + +def _vram_peak_gb(readings): + if not readings: + return '' + return round(max(readings) / 1024.0, 2) + + +# ---------- main ---------- + +def main(): + ap = argparse.ArgumentParser() + ap.add_argument('--run-ts', required=True) + ap.add_argument('--base-seed', required=True, type=int) + ap.add_argument('--vbench-json', required=True) + ap.add_argument('--vbench-crop', required=True) + ap.add_argument('--work-dir', required=True) + args = ap.parse_args() + + work_dir = Path(args.work_dir) + out_base = work_dir / 'outputs' / args.run_ts / 'vbench' / 'videos' + stats_path = work_dir / 'outputs' / args.run_ts / 'vbench' / 'stats.csv' + + if not Path(args.vbench_json).exists(): + sys.exit(f'[vbench] ERROR: JSON not found: {args.vbench_json}') + if not Path(args.vbench_crop).exists(): + sys.exit(f'[vbench] ERROR: crop dir not found: {args.vbench_crop}') + + with open(args.vbench_json, encoding='utf-8') as f: + entries = json.load(f) + + seen, prompts = set(), [] + for e in entries: + fn = e.get('file_name', '') + if fn in seen: + continue + if e.get('type') not in ALLOWED_TYPES: + continue + seen.add(fn) + cap = e.get('caption') or Path(fn).stem + prompts.append({'file': fn, 'caption': cap, 'type': e['type']}) + + total = len(prompts) * NUM_SAMPLES + print(f'\n=== VBench prompt list ({len(prompts)} prompts, types: {", ".join(ALLOWED_TYPES)}) ===') + for i, p in enumerate(prompts): + img_ok = ' ' if (Path(args.vbench_crop) / p['file']).exists() else 'MISSING' + print(f' [{i+1:2}/{len(prompts)}] ({p["type"]:<8}) {img_ok} {p["caption"]}') + print(f'=== {len(prompts)} prompts x {NUM_SAMPLES} samples = {total} runs ===\n') + + out_base.mkdir(parents=True, exist_ok=True) + stats_path.parent.mkdir(parents=True, exist_ok=True) + + stats_is_new = not stats_path.exists() + stats_f = open(stats_path, 'a', newline='', encoding='utf-8') + writer = csv.writer(stats_f) + if stats_is_new: + writer.writerow(['task_idx', 'prompt', 'type', 'sample_idx', 'seed', + 'duration_s', 'gen_fps', 'vram_gb', 'ram_gb', 'out_path', 'status']) + stats_f.flush() + + done = generated = errors = skipped = 0 + t_start = time.time() + + for ti, p in enumerate(prompts): + img_src = Path(args.vbench_crop) / p['file'] + if not img_src.exists(): + print(f'[vbench] skip {ti}: image not found - {img_src}') + continue + + tmp_dir = work_dir / '_vbench_tmp' + tmp_dir.mkdir(exist_ok=True) + shutil.copy(img_src, tmp_dir) + + cap_file = work_dir / '_vbench_caption.txt' + cap_file.write_text(p['caption'], encoding='utf-8') + + out_sub = out_base / _safe(p['caption']) + out_sub.mkdir(parents=True, exist_ok=True) + + existing_mp4s = sorted(out_sub.glob('*.mp4')) + + for si in range(NUM_SAMPLES): + seed = args.base_seed + si + + if si < len(existing_mp4s): + skipped += 1; done += 1 + writer.writerow([ti, p['caption'], p['type'], si, seed, + '', '', '', '', str(existing_mp4s[si]), 'skipped']) + stats_f.flush() + continue + + pct = round(100 * done / total) if total else 0 + eta = '' + if done > 0: + elapsed = time.time() - t_start + rem = int(elapsed / done * (total - done)) + eta = f' ETA {rem//3600}:{(rem%3600)//60:02d}:{rem%60:02d}' + short_cap = p['caption'][:60] + print(f'[vbench] [{done+1}/{total} {pct}%{eta}] ' + f'prompt {ti+1}/{len(prompts)} ({p["type"]}) ' + f'sample {si+1}/{NUM_SAMPLES} : {short_cap}') + + # start VRAM polling thread + vram_readings = [] + stop_evt = threading.Event() + vram_thread = threading.Thread(target=_poll_vram, args=(stop_evt, vram_readings), daemon=True) + vram_thread.start() + + t0 = datetime.now(timezone.utc) + env = {**os.environ, + 'TOKENIZERS_PARALLELISM': 'false', + 'TF_ENABLE_ONEDNN_OPTS': '0', + 'LOCAL_RANK': '0', 'RANK': '0', 'WORLD_SIZE': '1', + 'MASTER_ADDR': '127.0.0.1', 'MASTER_PORT': '29500'} + subprocess.run([ + sys.executable, 'fastvideo/sample/sample_5b.py', + '--seed', str(seed), + '--gradient_checkpointing', + '--train_batch_size=1', + '--max_sample_steps=1', + '--mixed_precision=bf16', + '--allow_tf32', + '--t5_cpu', + f'--video_output_dir={out_sub}', + f'--jpg_dir={tmp_dir}', + f'--caption_path={cap_file}', + '--test_data_dir=./val', + '--num_euler_timesteps', '5', + '--rand_num_img', '0.6', + '--internvl_path', './InternVL3-2B-Instruct', + '--height', '384', + '--width', '512', + '--num_frames', str(NUM_FRAMES), + '--fps', '24', + ], cwd=str(work_dir), env=env) + + stop_evt.set() + vram_thread.join(timeout=10) + + dur = (datetime.now(timezone.utc) - t0).total_seconds() + fps = round(NUM_FRAMES / dur, 2) + vram = _vram_peak_gb(vram_readings) + ram = _ram_gb() + + # detect actual output mp4 + new_mp4s = [f for f in out_sub.glob('*.mp4') + if f.stat().st_mtime >= t0.timestamp()] + new_mp4s.sort(key=lambda f: f.stat().st_mtime, reverse=True) + + if new_mp4s: + out_path = str(new_mp4s[0]) + print(f' done in {dur:.1f}s ({fps} gen-fps) VRAM {vram}GB RAM {ram}GB') + writer.writerow([ti, p['caption'], p['type'], si, seed, + round(dur, 2), fps, vram, ram, out_path, 'ok']) + generated += 1 + else: + print(f' ERROR - no mp4 found') + writer.writerow([ti, p['caption'], p['type'], si, seed, + '', '', vram, ram, '', 'error']) + errors += 1 + + stats_f.flush() + done += 1 + + shutil.rmtree(tmp_dir, ignore_errors=True) + cap_file.unlink(missing_ok=True) + + stats_f.close() + elapsed_m = round((time.time() - t_start) / 60, 1) + print(f'\n[vbench] done - generated={generated} skipped={skipped} errors={errors} elapsed={elapsed_m}m') + print(f'[vbench] stats -> {stats_path}') + + +if __name__ == '__main__': + main() From d59939ec12cceb3d9195bfd12bb56096c83b4f1e Mon Sep 17 00:00:00 2001 From: kschmid Date: Mon, 9 Mar 2026 17:47:31 +1100 Subject: [PATCH 07/33] dowmloads models --- scripts/inference/vbench_runner.py | 111 ++++++++++++++++------------- 1 file changed, 61 insertions(+), 50 deletions(-) diff --git a/scripts/inference/vbench_runner.py b/scripts/inference/vbench_runner.py index 4a020d6..5935cb0 100644 --- a/scripts/inference/vbench_runner.py +++ b/scripts/inference/vbench_runner.py @@ -5,13 +5,13 @@ import csv import json import os +import random import re import shutil import subprocess import sys import threading import time -from datetime import datetime, timezone from pathlib import Path ALLOWED_TYPES = ['indoor', 'scenery'] @@ -124,8 +124,12 @@ def main(): existing_mp4s = sorted(out_sub.glob('*.mp4')) + # generate NUM_SAMPLES distinct random seeds, reproducible per (base_seed, prompt) + rng = random.Random(args.base_seed ^ hash(p['caption'])) + seeds = [rng.randint(0, 2**31 - 1) for _ in range(NUM_SAMPLES)] + for si in range(NUM_SAMPLES): - seed = args.base_seed + si + seed = seeds[si] if si < len(existing_mp4s): skipped += 1; done += 1 @@ -151,60 +155,67 @@ def main(): vram_thread = threading.Thread(target=_poll_vram, args=(stop_evt, vram_readings), daemon=True) vram_thread.start() - t0 = datetime.now(timezone.utc) - env = {**os.environ, - 'TOKENIZERS_PARALLELISM': 'false', - 'TF_ENABLE_ONEDNN_OPTS': '0', - 'LOCAL_RANK': '0', 'RANK': '0', 'WORLD_SIZE': '1', - 'MASTER_ADDR': '127.0.0.1', 'MASTER_PORT': '29500'} - subprocess.run([ - sys.executable, 'fastvideo/sample/sample_5b.py', - '--seed', str(seed), - '--gradient_checkpointing', - '--train_batch_size=1', - '--max_sample_steps=1', - '--mixed_precision=bf16', - '--allow_tf32', - '--t5_cpu', - f'--video_output_dir={out_sub}', - f'--jpg_dir={tmp_dir}', - f'--caption_path={cap_file}', - '--test_data_dir=./val', - '--num_euler_timesteps', '5', - '--rand_num_img', '0.6', - '--internvl_path', './InternVL3-2B-Instruct', - '--height', '384', - '--width', '512', - '--num_frames', str(NUM_FRAMES), - '--fps', '24', - ], cwd=str(work_dir), env=env) - - stop_evt.set() - vram_thread.join(timeout=10) - - dur = (datetime.now(timezone.utc) - t0).total_seconds() - fps = round(NUM_FRAMES / dur, 2) - vram = _vram_peak_gb(vram_readings) - ram = _ram_gb() - - # detect actual output mp4 - new_mp4s = [f for f in out_sub.glob('*.mp4') - if f.stat().st_mtime >= t0.timestamp()] - new_mp4s.sort(key=lambda f: f.stat().st_mtime, reverse=True) - - if new_mp4s: - out_path = str(new_mp4s[0]) - print(f' done in {dur:.1f}s ({fps} gen-fps) VRAM {vram}GB RAM {ram}GB') + t0 = time.time() + vram = ram = dur = fps = '' + out_path = '' + status = 'error' + try: + env = {**os.environ, + 'TOKENIZERS_PARALLELISM': 'false', + 'TF_ENABLE_ONEDNN_OPTS': '0', + 'LOCAL_RANK': '0', 'RANK': '0', 'WORLD_SIZE': '1', + 'MASTER_ADDR': '127.0.0.1', 'MASTER_PORT': '29500'} + subprocess.run([ + sys.executable, 'fastvideo/sample/sample_5b.py', + '--seed', str(seed), + '--gradient_checkpointing', + '--train_batch_size=1', + '--max_sample_steps=1', + '--mixed_precision=bf16', + '--allow_tf32', + '--t5_cpu', + f'--video_output_dir={out_sub}', + f'--jpg_dir={tmp_dir}', + f'--caption_path={cap_file}', + '--test_data_dir=./val', + '--num_euler_timesteps', '5', + '--rand_num_img', '0.6', + '--internvl_path', './InternVL3-2B-Instruct', + '--height', '384', + '--width', '512', + '--num_frames', str(NUM_FRAMES), + '--fps', '24', + ], cwd=str(work_dir), env=env) + + dur = round(time.time() - t0, 2) + fps = round(NUM_FRAMES / dur, 2) + + # detect actual output mp4 + new_mp4s = sorted( + [f for f in out_sub.glob('*.mp4') if f.stat().st_mtime >= t0], + key=lambda f: f.stat().st_mtime, reverse=True + ) + if new_mp4s: + out_path = str(new_mp4s[0]) + status = 'ok' + except Exception as exc: + print(f' EXCEPTION: {exc}', file=sys.stderr) + finally: + stop_evt.set() + vram_thread.join(timeout=10) + vram = _vram_peak_gb(vram_readings) + ram = _ram_gb() writer.writerow([ti, p['caption'], p['type'], si, seed, - round(dur, 2), fps, vram, ram, out_path, 'ok']) + dur, fps, vram, ram, out_path, status]) + stats_f.flush() + + if status == 'ok': + print(f' done in {dur}s ({fps} gen-fps) VRAM {vram}GB RAM {ram}GB') generated += 1 else: print(f' ERROR - no mp4 found') - writer.writerow([ti, p['caption'], p['type'], si, seed, - '', '', vram, ram, '', 'error']) errors += 1 - stats_f.flush() done += 1 shutil.rmtree(tmp_dir, ignore_errors=True) From c4ab0d87d54de3cec98a6f8a1e3c4668e9d150df Mon Sep 17 00:00:00 2001 From: kschmid Date: Mon, 9 Mar 2026 19:07:39 +1100 Subject: [PATCH 08/33] down --- scripts/inference/vbench_runner.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/scripts/inference/vbench_runner.py b/scripts/inference/vbench_runner.py index 5935cb0..0eeac15 100644 --- a/scripts/inference/vbench_runner.py +++ b/scripts/inference/vbench_runner.py @@ -119,10 +119,11 @@ def main(): cap_file = work_dir / '_vbench_caption.txt' cap_file.write_text(p['caption'], encoding='utf-8') - out_sub = out_base / _safe(p['caption']) + out_sub = out_base out_sub.mkdir(parents=True, exist_ok=True) - existing_mp4s = sorted(out_sub.glob('*.mp4')) + safe_cap = _safe(p['caption']) + existing_mp4s = sorted(f for f in out_sub.glob('*.mp4') if safe_cap in f.name) # generate NUM_SAMPLES distinct random seeds, reproducible per (base_seed, prompt) rng = random.Random(args.base_seed ^ hash(p['caption'])) @@ -190,9 +191,10 @@ def main(): dur = round(time.time() - t0, 2) fps = round(NUM_FRAMES / dur, 2) - # detect actual output mp4 + # detect actual output mp4 (match by prompt name + mtime) new_mp4s = sorted( - [f for f in out_sub.glob('*.mp4') if f.stat().st_mtime >= t0], + [f for f in out_sub.glob('*.mp4') + if safe_cap in f.name and f.stat().st_mtime >= t0], key=lambda f: f.stat().st_mtime, reverse=True ) if new_mp4s: From b97d6b20eaff7b4c37d97c7118a0c81c35622702 Mon Sep 17 00:00:00 2001 From: kschmid Date: Mon, 9 Mar 2026 19:10:10 +1100 Subject: [PATCH 09/33] down --- scripts/inference/vbench_runner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/inference/vbench_runner.py b/scripts/inference/vbench_runner.py index 0eeac15..d0c3c23 100644 --- a/scripts/inference/vbench_runner.py +++ b/scripts/inference/vbench_runner.py @@ -148,7 +148,7 @@ def main(): short_cap = p['caption'][:60] print(f'[vbench] [{done+1}/{total} {pct}%{eta}] ' f'prompt {ti+1}/{len(prompts)} ({p["type"]}) ' - f'sample {si+1}/{NUM_SAMPLES} : {short_cap}') + f'sample {si+1}/{NUM_SAMPLES} seed {seed} : {short_cap}') # start VRAM polling thread vram_readings = [] From ff1d44754f128e4497c233c79f4840905ce2fb7f Mon Sep 17 00:00:00 2001 From: kschmid Date: Mon, 9 Mar 2026 20:58:07 +1100 Subject: [PATCH 10/33] stats --- scripts/inference/sample_5b_vbench.bat | 4 +- scripts/inference/vbench_runner.py | 234 ++++++++++++++----------- 2 files changed, 131 insertions(+), 107 deletions(-) diff --git a/scripts/inference/sample_5b_vbench.bat b/scripts/inference/sample_5b_vbench.bat index fa2bffd..f36a587 100644 --- a/scripts/inference/sample_5b_vbench.bat +++ b/scripts/inference/sample_5b_vbench.bat @@ -7,16 +7,14 @@ set PY_SCRIPT=%~dp0vbench_runner.py cd /d "%~dp0..\\.." -for /f "tokens=*" %%i in ('python -c "from datetime import datetime; print(datetime.now().strftime(\"%%Y%%m%%d_%%H%%M%%S\"))"') do set RUN_TS=%%i for /f "tokens=*" %%i in ('python -c "import random; print(random.randint(0,1999999999))"') do set BASE_SEED=%%i -echo Output: %CD%\outputs\%RUN_TS% +echo Output: %CD%\outputs\vbench echo VBench: %VBENCH_JSON% echo Crop: %VBENCH_CROP% echo Base seed: %BASE_SEED% python "%PY_SCRIPT%" ^ - --run-ts "%RUN_TS%" ^ --base-seed %BASE_SEED% ^ --vbench-json "%VBENCH_JSON%" ^ --vbench-crop "%VBENCH_CROP%" ^ diff --git a/scripts/inference/vbench_runner.py b/scripts/inference/vbench_runner.py index d0c3c23..eb4e585 100644 --- a/scripts/inference/vbench_runner.py +++ b/scripts/inference/vbench_runner.py @@ -1,5 +1,7 @@ """ vbench_runner.py -- Python replacement for vbench_runner.ps1 +Calls sample_5b.py once per prompt with NUM_SAMPLES caption lines, +so the model loads once per prompt instead of once per sample. """ import argparse import csv @@ -55,7 +57,6 @@ def _vram_peak_gb(readings): def main(): ap = argparse.ArgumentParser() - ap.add_argument('--run-ts', required=True) ap.add_argument('--base-seed', required=True, type=int) ap.add_argument('--vbench-json', required=True) ap.add_argument('--vbench-crop', required=True) @@ -63,8 +64,8 @@ def main(): args = ap.parse_args() work_dir = Path(args.work_dir) - out_base = work_dir / 'outputs' / args.run_ts / 'vbench' / 'videos' - stats_path = work_dir / 'outputs' / args.run_ts / 'vbench' / 'stats.csv' + out_base = work_dir / 'outputs' / 'vbench' / 'videos' + stats_path = work_dir / 'outputs' / 'vbench' / 'stats.csv' if not Path(args.vbench_json).exists(): sys.exit(f'[vbench] ERROR: JSON not found: {args.vbench_json}') @@ -109,116 +110,141 @@ def main(): for ti, p in enumerate(prompts): img_src = Path(args.vbench_crop) / p['file'] if not img_src.exists(): - print(f'[vbench] skip {ti}: image not found - {img_src}') + print(f'[vbench] skip prompt {ti+1}: image not found - {img_src}') + done += NUM_SAMPLES continue - tmp_dir = work_dir / '_vbench_tmp' + safe_cap = _safe(p['caption']) + + # check how many samples already completed (renamed with _s{i}_seed suffix) + already = sorted(out_base.glob(f'*{safe_cap}*_s[0-9]*_seed*.mp4')) + n_already = len(already) + n_needed = NUM_SAMPLES - n_already + + if n_needed <= 0: + print(f'[vbench] skip prompt {ti+1}: all {NUM_SAMPLES} samples already done') + for i, f in enumerate(already): + writer.writerow([ti, p['caption'], p['type'], i, '', '', '', '', '', str(f), 'skipped']) + stats_f.flush() + skipped += NUM_SAMPLES + done += NUM_SAMPLES + continue + + if n_already > 0: + print(f'[vbench] prompt {ti+1}: {n_already} done, resuming {n_needed} remaining') + + # seed for this prompt (reproducible) + rng = random.Random(args.base_seed ^ hash(p['caption'])) + seed = rng.randint(0, 2**31 - 1) + + pct = round(100 * done / total) if total else 0 + eta = '' + if done > 0: + elapsed = time.time() - t_start + rem = int(elapsed / done * (total - done)) + eta = f' ETA {rem//3600}:{(rem%3600)//60:02d}:{rem%60:02d}' + short_cap = p['caption'][:60] + print(f'[vbench] [{done+1}/{total} {pct}%{eta}] ' + f'prompt {ti+1}/{len(prompts)} ({p["type"]}) ' + f'{n_needed} samples seed {seed} : {short_cap}') + + # prepare temp dir with exactly this image + tmp_dir = work_dir / '_vbench_tmp' tmp_dir.mkdir(exist_ok=True) + for f in tmp_dir.iterdir(): + f.unlink(missing_ok=True) shutil.copy(img_src, tmp_dir) + # write n_needed identical caption lines so sample_5b generates n_needed videos cap_file = work_dir / '_vbench_caption.txt' - cap_file.write_text(p['caption'], encoding='utf-8') + cap_file.write_text('\n'.join([p['caption']] * n_needed), encoding='utf-8') - out_sub = out_base - out_sub.mkdir(parents=True, exist_ok=True) + # start VRAM polling + vram_readings = [] + stop_evt = threading.Event() + vram_thread = threading.Thread(target=_poll_vram, args=(stop_evt, vram_readings), daemon=True) + vram_thread.start() - safe_cap = _safe(p['caption']) - existing_mp4s = sorted(f for f in out_sub.glob('*.mp4') if safe_cap in f.name) - - # generate NUM_SAMPLES distinct random seeds, reproducible per (base_seed, prompt) - rng = random.Random(args.base_seed ^ hash(p['caption'])) - seeds = [rng.randint(0, 2**31 - 1) for _ in range(NUM_SAMPLES)] - - for si in range(NUM_SAMPLES): - seed = seeds[si] - - if si < len(existing_mp4s): - skipped += 1; done += 1 - writer.writerow([ti, p['caption'], p['type'], si, seed, - '', '', '', '', str(existing_mp4s[si]), 'skipped']) - stats_f.flush() - continue - - pct = round(100 * done / total) if total else 0 - eta = '' - if done > 0: - elapsed = time.time() - t_start - rem = int(elapsed / done * (total - done)) - eta = f' ETA {rem//3600}:{(rem%3600)//60:02d}:{rem%60:02d}' - short_cap = p['caption'][:60] - print(f'[vbench] [{done+1}/{total} {pct}%{eta}] ' - f'prompt {ti+1}/{len(prompts)} ({p["type"]}) ' - f'sample {si+1}/{NUM_SAMPLES} seed {seed} : {short_cap}') - - # start VRAM polling thread - vram_readings = [] - stop_evt = threading.Event() - vram_thread = threading.Thread(target=_poll_vram, args=(stop_evt, vram_readings), daemon=True) - vram_thread.start() - - t0 = time.time() - vram = ram = dur = fps = '' - out_path = '' - status = 'error' - try: - env = {**os.environ, - 'TOKENIZERS_PARALLELISM': 'false', - 'TF_ENABLE_ONEDNN_OPTS': '0', - 'LOCAL_RANK': '0', 'RANK': '0', 'WORLD_SIZE': '1', - 'MASTER_ADDR': '127.0.0.1', 'MASTER_PORT': '29500'} - subprocess.run([ - sys.executable, 'fastvideo/sample/sample_5b.py', - '--seed', str(seed), - '--gradient_checkpointing', - '--train_batch_size=1', - '--max_sample_steps=1', - '--mixed_precision=bf16', - '--allow_tf32', - '--t5_cpu', - f'--video_output_dir={out_sub}', - f'--jpg_dir={tmp_dir}', - f'--caption_path={cap_file}', - '--test_data_dir=./val', - '--num_euler_timesteps', '5', - '--rand_num_img', '0.6', - '--internvl_path', './InternVL3-2B-Instruct', - '--height', '384', - '--width', '512', - '--num_frames', str(NUM_FRAMES), - '--fps', '24', - ], cwd=str(work_dir), env=env) - - dur = round(time.time() - t0, 2) - fps = round(NUM_FRAMES / dur, 2) - - # detect actual output mp4 (match by prompt name + mtime) - new_mp4s = sorted( - [f for f in out_sub.glob('*.mp4') - if safe_cap in f.name and f.stat().st_mtime >= t0], - key=lambda f: f.stat().st_mtime, reverse=True - ) - if new_mp4s: - out_path = str(new_mp4s[0]) - status = 'ok' - except Exception as exc: - print(f' EXCEPTION: {exc}', file=sys.stderr) - finally: - stop_evt.set() - vram_thread.join(timeout=10) - vram = _vram_peak_gb(vram_readings) - ram = _ram_gb() - writer.writerow([ti, p['caption'], p['type'], si, seed, - dur, fps, vram, ram, out_path, status]) - stats_f.flush() - - if status == 'ok': - print(f' done in {dur}s ({fps} gen-fps) VRAM {vram}GB RAM {ram}GB') - generated += 1 + t0 = time.time() + status = 'error' + new_mp4s = [] + try: + env = {**os.environ, + 'TOKENIZERS_PARALLELISM': 'false', + 'TF_ENABLE_ONEDNN_OPTS': '0', + 'LOCAL_RANK': '0', 'RANK': '0', 'WORLD_SIZE': '1', + 'MASTER_ADDR': '127.0.0.1', 'MASTER_PORT': '29500'} + subprocess.run([ + sys.executable, 'fastvideo/sample/sample_5b.py', + '--seed', str(seed), + '--gradient_checkpointing', + '--train_batch_size=1', + '--max_sample_steps=1', + '--mixed_precision=bf16', + '--allow_tf32', + '--t5_cpu', + f'--video_output_dir={out_base}', + f'--jpg_dir={tmp_dir}', + f'--caption_path={cap_file}', + '--test_data_dir=./val', + '--num_euler_timesteps', '5', + '--rand_num_img', '0.6', + '--internvl_path', './InternVL3-2B-Instruct', + '--height', '384', + '--width', '512', + '--num_frames', str(NUM_FRAMES), + '--fps', '24', + ], cwd=str(work_dir), env=env) + + dur = round(time.time() - t0, 2) + fps = round(NUM_FRAMES * n_needed / dur, 2) + + # collect new output files by mtime and caption match + raw_mp4s = sorted( + [f for f in out_base.glob('*.mp4') + if safe_cap in f.name and f.stat().st_mtime >= t0 - 2 + and '_seed' not in f.name], + key=lambda f: f.name # sort by name → _0, _1, _2 ... order + ) + + for i, src in enumerate(raw_mp4s): + si_abs = n_already + i + dst = src.with_stem(f'{src.stem}_s{si_abs}_seed{seed}') + src.rename(dst) + new_mp4s.append(dst) + + if len(new_mp4s) == n_needed: + status = 'ok' else: - print(f' ERROR - no mp4 found') - errors += 1 - - done += 1 + print(f' WARNING: expected {n_needed} mp4s, got {len(new_mp4s)}') + + except Exception as exc: + print(f' EXCEPTION: {exc}', file=sys.stderr) + finally: + stop_evt.set() + vram_thread.join(timeout=10) + vram = _vram_peak_gb(vram_readings) + ram = _ram_gb() + + if status == 'ok': + print(f' done in {dur}s ({fps} gen-fps) VRAM {vram}GB RAM {ram}GB') + for i, mp4 in enumerate(new_mp4s): + si_abs = n_already + i + row_stat = 'ok' if status == 'ok' else 'partial' + writer.writerow([ti, p['caption'], p['type'], si_abs, seed, + dur if i == 0 else '', fps if i == 0 else '', + vram if i == 0 else '', ram if i == 0 else '', + str(mp4), row_stat]) + stats_f.flush() + if status == 'ok': + generated += len(new_mp4s) + done += n_needed + else: + writer.writerow([ti, p['caption'], p['type'], '', seed, + '', '', '', '', '', 'error']) + stats_f.flush() + stats_f.close() + sys.exit(f'[vbench] FATAL error on prompt {ti+1} "{short_cap}" - stopping') shutil.rmtree(tmp_dir, ignore_errors=True) cap_file.unlink(missing_ok=True) From f7125aecbb9bd079d4fe6a479644a4a55dabe257 Mon Sep 17 00:00:00 2001 From: kschmid Date: Mon, 9 Mar 2026 21:31:39 +1100 Subject: [PATCH 11/33] stats --- scripts/inference/vbench_runner.py | 44 ++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/scripts/inference/vbench_runner.py b/scripts/inference/vbench_runner.py index eb4e585..ab8a7a1 100644 --- a/scripts/inference/vbench_runner.py +++ b/scripts/inference/vbench_runner.py @@ -119,9 +119,14 @@ def main(): # check how many samples already completed (renamed with _s{i}_seed suffix) already = sorted(out_base.glob(f'*{safe_cap}*_s[0-9]*_seed*.mp4')) n_already = len(already) - n_needed = NUM_SAMPLES - n_already - if n_needed <= 0: + # also check for un-renamed files left by an interrupted run + orphans = sorted([f for f in out_base.glob(f'*{safe_cap}*.mp4') + if '_seed' not in f.name]) + + n_needed = NUM_SAMPLES - n_already - len(orphans) + + if n_needed <= 0 and not orphans: print(f'[vbench] skip prompt {ti+1}: all {NUM_SAMPLES} samples already done') for i, f in enumerate(already): writer.writerow([ti, p['caption'], p['type'], i, '', '', '', '', '', str(f), 'skipped']) @@ -130,13 +135,32 @@ def main(): done += NUM_SAMPLES continue - if n_already > 0: - print(f'[vbench] prompt {ti+1}: {n_already} done, resuming {n_needed} remaining') + if n_already > 0 or orphans: + print(f'[vbench] prompt {ti+1}: {n_already} renamed + {len(orphans)} unfinished, resuming {max(0,n_needed)} new') # seed for this prompt (reproducible) rng = random.Random(args.base_seed ^ hash(p['caption'])) seed = rng.randint(0, 2**31 - 1) + # recover any orphan files left by a previous interrupted run + for i, src in enumerate(orphans): + si_abs = n_already + i + dst = src.with_stem(f'{src.stem}_s{si_abs}_seed{seed}') + print(f' [recover] {src.name} -> {dst.name}') + src.rename(dst) + writer.writerow([ti, p['caption'], p['type'], si_abs, seed, + '', '', '', '', str(dst), 'recovered']) + stats_f.flush() + already.append(dst) + n_already = len(already) + n_needed = max(0, NUM_SAMPLES - n_already) + + if n_needed <= 0: + print(f'[vbench] skip prompt {ti+1}: all {NUM_SAMPLES} samples recovered/done') + skipped += NUM_SAMPLES + done += NUM_SAMPLES + continue + pct = round(100 * done / total) if total else 0 eta = '' if done > 0: @@ -169,6 +193,9 @@ def main(): status = 'error' new_mp4s = [] try: + # snapshot existing files so we can find new ones after subprocess + pre_existing = set(out_base.glob('*.mp4')) + env = {**os.environ, 'TOKENIZERS_PARALLELISM': 'false', 'TF_ENABLE_ONEDNN_OPTS': '0', @@ -199,13 +226,14 @@ def main(): dur = round(time.time() - t0, 2) fps = round(NUM_FRAMES * n_needed / dur, 2) - # collect new output files by mtime and caption match + # collect new output files via set-difference (avoids mtime issues) + all_now = set(out_base.glob('*.mp4')) raw_mp4s = sorted( - [f for f in out_base.glob('*.mp4') - if safe_cap in f.name and f.stat().st_mtime >= t0 - 2 - and '_seed' not in f.name], + [f for f in (all_now - pre_existing) + if safe_cap in f.name and '_seed' not in f.name], key=lambda f: f.name # sort by name → _0, _1, _2 ... order ) + print(f' [detect] {len(raw_mp4s)} new mp4s found (pre={len(pre_existing)}, now={len(all_now)})') for i, src in enumerate(raw_mp4s): si_abs = n_already + i From 99999d52c25fccef2e3f02af744e606fd8fbd14a Mon Sep 17 00:00:00 2001 From: kschmid Date: Mon, 9 Mar 2026 21:40:28 +1100 Subject: [PATCH 12/33] stats --- scripts/inference/sample_5b_vbench.bat | 4 ---- scripts/inference/vbench_runner.py | 11 +++++++---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/scripts/inference/sample_5b_vbench.bat b/scripts/inference/sample_5b_vbench.bat index f36a587..abc9985 100644 --- a/scripts/inference/sample_5b_vbench.bat +++ b/scripts/inference/sample_5b_vbench.bat @@ -7,15 +7,11 @@ set PY_SCRIPT=%~dp0vbench_runner.py cd /d "%~dp0..\\.." -for /f "tokens=*" %%i in ('python -c "import random; print(random.randint(0,1999999999))"') do set BASE_SEED=%%i - echo Output: %CD%\outputs\vbench echo VBench: %VBENCH_JSON% echo Crop: %VBENCH_CROP% -echo Base seed: %BASE_SEED% python "%PY_SCRIPT%" ^ - --base-seed %BASE_SEED% ^ --vbench-json "%VBENCH_JSON%" ^ --vbench-crop "%VBENCH_CROP%" ^ --work-dir "%CD%" diff --git a/scripts/inference/vbench_runner.py b/scripts/inference/vbench_runner.py index ab8a7a1..0226123 100644 --- a/scripts/inference/vbench_runner.py +++ b/scripts/inference/vbench_runner.py @@ -57,7 +57,7 @@ def _vram_peak_gb(readings): def main(): ap = argparse.ArgumentParser() - ap.add_argument('--base-seed', required=True, type=int) + ap.add_argument('--base-seed', required=False, type=int, default=None) ap.add_argument('--vbench-json', required=True) ap.add_argument('--vbench-crop', required=True) ap.add_argument('--work-dir', required=True) @@ -138,9 +138,12 @@ def main(): if n_already > 0 or orphans: print(f'[vbench] prompt {ti+1}: {n_already} renamed + {len(orphans)} unfinished, resuming {max(0,n_needed)} new') - # seed for this prompt (reproducible) - rng = random.Random(args.base_seed ^ hash(p['caption'])) - seed = rng.randint(0, 2**31 - 1) + # seed for this prompt + if args.base_seed is not None: + rng = random.Random(args.base_seed ^ hash(p['caption'])) + seed = rng.randint(0, 2**31 - 1) + else: + seed = random.randint(0, 2**31 - 1) # recover any orphan files left by a previous interrupted run for i, src in enumerate(orphans): From 760ca1605089a634b43156402ee69483dbb7d7b1 Mon Sep 17 00:00:00 2001 From: kschmid Date: Mon, 9 Mar 2026 21:43:55 +1100 Subject: [PATCH 13/33] stats --- scripts/inference/vbench_runner.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/scripts/inference/vbench_runner.py b/scripts/inference/vbench_runner.py index 0226123..73fa142 100644 --- a/scripts/inference/vbench_runner.py +++ b/scripts/inference/vbench_runner.py @@ -64,8 +64,9 @@ def main(): args = ap.parse_args() work_dir = Path(args.work_dir) - out_base = work_dir / 'outputs' / 'vbench' / 'videos' - stats_path = work_dir / 'outputs' / 'vbench' / 'stats.csv' + run_seed = args.base_seed if args.base_seed is not None else random.randint(0, 2**31 - 1) + out_base = work_dir / 'outputs' / 'vbench' / f'seed{run_seed}' / 'videos' + stats_path = work_dir / 'outputs' / 'vbench' / f'seed{run_seed}' / 'stats.csv' if not Path(args.vbench_json).exists(): sys.exit(f'[vbench] ERROR: JSON not found: {args.vbench_json}') @@ -87,7 +88,8 @@ def main(): prompts.append({'file': fn, 'caption': cap, 'type': e['type']}) total = len(prompts) * NUM_SAMPLES - print(f'\n=== VBench prompt list ({len(prompts)} prompts, types: {", ".join(ALLOWED_TYPES)}) ===') + print(f'\n=== VBench run_seed={run_seed} out={out_base} ===') + print(f'=== VBench prompt list ({len(prompts)} prompts, types: {", ".join(ALLOWED_TYPES)}) ===') for i, p in enumerate(prompts): img_ok = ' ' if (Path(args.vbench_crop) / p['file']).exists() else 'MISSING' print(f' [{i+1:2}/{len(prompts)}] ({p["type"]:<8}) {img_ok} {p["caption"]}') @@ -138,12 +140,9 @@ def main(): if n_already > 0 or orphans: print(f'[vbench] prompt {ti+1}: {n_already} renamed + {len(orphans)} unfinished, resuming {max(0,n_needed)} new') - # seed for this prompt - if args.base_seed is not None: - rng = random.Random(args.base_seed ^ hash(p['caption'])) - seed = rng.randint(0, 2**31 - 1) - else: - seed = random.randint(0, 2**31 - 1) + # seed for this prompt (derived from run_seed for reproducibility) + rng = random.Random(run_seed ^ hash(p['caption'])) + seed = rng.randint(0, 2**31 - 1) # recover any orphan files left by a previous interrupted run for i, src in enumerate(orphans): From f98b6ad8366186b8fc2f31466c4c0610aa2c69da Mon Sep 17 00:00:00 2001 From: kschmid Date: Mon, 9 Mar 2026 21:56:49 +1100 Subject: [PATCH 14/33] stats --- scripts/inference/vbench_runner.py | 248 +++++++++++++---------------- 1 file changed, 115 insertions(+), 133 deletions(-) diff --git a/scripts/inference/vbench_runner.py b/scripts/inference/vbench_runner.py index 73fa142..0839a3f 100644 --- a/scripts/inference/vbench_runner.py +++ b/scripts/inference/vbench_runner.py @@ -1,7 +1,6 @@ """ vbench_runner.py -- Python replacement for vbench_runner.ps1 -Calls sample_5b.py once per prompt with NUM_SAMPLES caption lines, -so the model loads once per prompt instead of once per sample. +Calls sample_5b.py once per sample with a fresh random seed each time. """ import argparse import csv @@ -57,16 +56,14 @@ def _vram_peak_gb(readings): def main(): ap = argparse.ArgumentParser() - ap.add_argument('--base-seed', required=False, type=int, default=None) ap.add_argument('--vbench-json', required=True) ap.add_argument('--vbench-crop', required=True) ap.add_argument('--work-dir', required=True) args = ap.parse_args() work_dir = Path(args.work_dir) - run_seed = args.base_seed if args.base_seed is not None else random.randint(0, 2**31 - 1) - out_base = work_dir / 'outputs' / 'vbench' / f'seed{run_seed}' / 'videos' - stats_path = work_dir / 'outputs' / 'vbench' / f'seed{run_seed}' / 'stats.csv' + out_base = work_dir / 'outputs' / 'vbench' / 'videos' + stats_path = work_dir / 'outputs' / 'vbench' / 'stats.csv' if not Path(args.vbench_json).exists(): sys.exit(f'[vbench] ERROR: JSON not found: {args.vbench_json}') @@ -88,8 +85,7 @@ def main(): prompts.append({'file': fn, 'caption': cap, 'type': e['type']}) total = len(prompts) * NUM_SAMPLES - print(f'\n=== VBench run_seed={run_seed} out={out_base} ===') - print(f'=== VBench prompt list ({len(prompts)} prompts, types: {", ".join(ALLOWED_TYPES)}) ===') + print(f'\n=== VBench prompt list ({len(prompts)} prompts, types: {", ".join(ALLOWED_TYPES)}) ===') for i, p in enumerate(prompts): img_ok = ' ' if (Path(args.vbench_crop) / p['file']).exists() else 'MISSING' print(f' [{i+1:2}/{len(prompts)}] ({p["type"]:<8}) {img_ok} {p["caption"]}') @@ -118,36 +114,19 @@ def main(): safe_cap = _safe(p['caption']) - # check how many samples already completed (renamed with _s{i}_seed suffix) + # samples already completed (renamed with _s{i}_seed{n} suffix) already = sorted(out_base.glob(f'*{safe_cap}*_s[0-9]*_seed*.mp4')) n_already = len(already) - # also check for un-renamed files left by an interrupted run + # orphans: files from an interrupted run that were never renamed orphans = sorted([f for f in out_base.glob(f'*{safe_cap}*.mp4') if '_seed' not in f.name]) - n_needed = NUM_SAMPLES - n_already - len(orphans) - - if n_needed <= 0 and not orphans: - print(f'[vbench] skip prompt {ti+1}: all {NUM_SAMPLES} samples already done') - for i, f in enumerate(already): - writer.writerow([ti, p['caption'], p['type'], i, '', '', '', '', '', str(f), 'skipped']) - stats_f.flush() - skipped += NUM_SAMPLES - done += NUM_SAMPLES - continue - - if n_already > 0 or orphans: - print(f'[vbench] prompt {ti+1}: {n_already} renamed + {len(orphans)} unfinished, resuming {max(0,n_needed)} new') - - # seed for this prompt (derived from run_seed for reproducibility) - rng = random.Random(run_seed ^ hash(p['caption'])) - seed = rng.randint(0, 2**31 - 1) - - # recover any orphan files left by a previous interrupted run + # recover orphans with new random seeds for i, src in enumerate(orphans): si_abs = n_already + i - dst = src.with_stem(f'{src.stem}_s{si_abs}_seed{seed}') + seed = random.randint(0, 2**31 - 1) + dst = src.with_stem(f'{src.stem}_s{si_abs}_seed{seed}') print(f' [recover] {src.name} -> {dst.name}') src.rename(dst) writer.writerow([ti, p['caption'], p['type'], si_abs, seed, @@ -155,126 +134,129 @@ def main(): stats_f.flush() already.append(dst) n_already = len(already) - n_needed = max(0, NUM_SAMPLES - n_already) + + n_needed = NUM_SAMPLES - n_already if n_needed <= 0: - print(f'[vbench] skip prompt {ti+1}: all {NUM_SAMPLES} samples recovered/done') + print(f'[vbench] skip prompt {ti+1}: all {NUM_SAMPLES} samples already done') + for i, f in enumerate(already): + writer.writerow([ti, p['caption'], p['type'], i, '', '', '', '', '', str(f), 'skipped']) + stats_f.flush() skipped += NUM_SAMPLES done += NUM_SAMPLES continue - pct = round(100 * done / total) if total else 0 - eta = '' - if done > 0: - elapsed = time.time() - t_start - rem = int(elapsed / done * (total - done)) - eta = f' ETA {rem//3600}:{(rem%3600)//60:02d}:{rem%60:02d}' + if n_already > 0: + print(f'[vbench] prompt {ti+1}: {n_already} done, running {n_needed} remaining') + short_cap = p['caption'][:60] - print(f'[vbench] [{done+1}/{total} {pct}%{eta}] ' - f'prompt {ti+1}/{len(prompts)} ({p["type"]}) ' - f'{n_needed} samples seed {seed} : {short_cap}') - # prepare temp dir with exactly this image + # prepare temp dir with this image (shared across all samples for this prompt) tmp_dir = work_dir / '_vbench_tmp' tmp_dir.mkdir(exist_ok=True) for f in tmp_dir.iterdir(): f.unlink(missing_ok=True) shutil.copy(img_src, tmp_dir) - # write n_needed identical caption lines so sample_5b generates n_needed videos cap_file = work_dir / '_vbench_caption.txt' - cap_file.write_text('\n'.join([p['caption']] * n_needed), encoding='utf-8') - # start VRAM polling - vram_readings = [] - stop_evt = threading.Event() - vram_thread = threading.Thread(target=_poll_vram, args=(stop_evt, vram_readings), daemon=True) - vram_thread.start() - - t0 = time.time() - status = 'error' - new_mp4s = [] - try: - # snapshot existing files so we can find new ones after subprocess - pre_existing = set(out_base.glob('*.mp4')) - - env = {**os.environ, - 'TOKENIZERS_PARALLELISM': 'false', - 'TF_ENABLE_ONEDNN_OPTS': '0', - 'LOCAL_RANK': '0', 'RANK': '0', 'WORLD_SIZE': '1', - 'MASTER_ADDR': '127.0.0.1', 'MASTER_PORT': '29500'} - subprocess.run([ - sys.executable, 'fastvideo/sample/sample_5b.py', - '--seed', str(seed), - '--gradient_checkpointing', - '--train_batch_size=1', - '--max_sample_steps=1', - '--mixed_precision=bf16', - '--allow_tf32', - '--t5_cpu', - f'--video_output_dir={out_base}', - f'--jpg_dir={tmp_dir}', - f'--caption_path={cap_file}', - '--test_data_dir=./val', - '--num_euler_timesteps', '5', - '--rand_num_img', '0.6', - '--internvl_path', './InternVL3-2B-Instruct', - '--height', '384', - '--width', '512', - '--num_frames', str(NUM_FRAMES), - '--fps', '24', - ], cwd=str(work_dir), env=env) - - dur = round(time.time() - t0, 2) - fps = round(NUM_FRAMES * n_needed / dur, 2) - - # collect new output files via set-difference (avoids mtime issues) - all_now = set(out_base.glob('*.mp4')) - raw_mp4s = sorted( - [f for f in (all_now - pre_existing) - if safe_cap in f.name and '_seed' not in f.name], - key=lambda f: f.name # sort by name → _0, _1, _2 ... order - ) - print(f' [detect] {len(raw_mp4s)} new mp4s found (pre={len(pre_existing)}, now={len(all_now)})') - - for i, src in enumerate(raw_mp4s): - si_abs = n_already + i - dst = src.with_stem(f'{src.stem}_s{si_abs}_seed{seed}') - src.rename(dst) - new_mp4s.append(dst) - - if len(new_mp4s) == n_needed: - status = 'ok' + for si in range(n_needed): + si_abs = n_already + si + seed = random.randint(0, 2**31 - 1) + + pct = round(100 * done / total) if total else 0 + eta = '' + if done > 0: + elapsed = time.time() - t_start + rem = int(elapsed / done * (total - done)) + eta = f' ETA {rem//3600}:{(rem%3600)//60:02d}:{rem%60:02d}' + print(f'[vbench] [{done+1}/{total} {pct}%{eta}] ' + f'prompt {ti+1}/{len(prompts)} sample {si_abs+1}/{NUM_SAMPLES} ' + f'seed {seed} : {short_cap}') + + cap_file.write_text(p['caption'], encoding='utf-8') + + vram_readings = [] + stop_evt = threading.Event() + vram_thread = threading.Thread(target=_poll_vram, args=(stop_evt, vram_readings), daemon=True) + vram_thread.start() + + t0 = time.time() + status = 'error' + new_mp4 = None + try: + pre_existing = set(out_base.glob('*.mp4')) + + env = {**os.environ, + 'TOKENIZERS_PARALLELISM': 'false', + 'TF_ENABLE_ONEDNN_OPTS': '0', + 'LOCAL_RANK': '0', 'RANK': '0', 'WORLD_SIZE': '1', + 'MASTER_ADDR': '127.0.0.1', 'MASTER_PORT': '29500'} + subprocess.run([ + sys.executable, 'fastvideo/sample/sample_5b.py', + '--seed', str(seed), + '--gradient_checkpointing', + '--train_batch_size=1', + '--max_sample_steps=1', + '--mixed_precision=bf16', + '--allow_tf32', + '--t5_cpu', + f'--video_output_dir={out_base}', + f'--jpg_dir={tmp_dir}', + f'--caption_path={cap_file}', + '--test_data_dir=./val', + '--num_euler_timesteps', '5', + '--rand_num_img', '0.6', + '--internvl_path', './InternVL3-2B-Instruct', + '--height', '384', + '--width', '512', + '--num_frames', str(NUM_FRAMES), + '--fps', '24', + ], cwd=str(work_dir), env=env) + + dur = round(time.time() - t0, 2) + fps = round(NUM_FRAMES / dur, 2) + + all_now = set(out_base.glob('*.mp4')) + raw_mp4s = sorted( + [f for f in (all_now - pre_existing) + if safe_cap in f.name and '_seed' not in f.name], + key=lambda f: f.name + ) + print(f' [detect] {len(raw_mp4s)} new mp4s (pre={len(pre_existing)}, now={len(all_now)})') + + if raw_mp4s: + src = raw_mp4s[0] + dst = src.with_stem(f'{src.stem}_s{si_abs}_seed{seed}') + src.rename(dst) + new_mp4 = dst + status = 'ok' + if len(raw_mp4s) > 1: + print(f' WARNING: expected 1 mp4, got {len(raw_mp4s)} — using first') + else: + print(f' WARNING: no new mp4 found for sample {si_abs}') + + except Exception as exc: + print(f' EXCEPTION: {exc}', file=sys.stderr) + finally: + stop_evt.set() + vram_thread.join(timeout=10) + vram = _vram_peak_gb(vram_readings) + ram = _ram_gb() + + if status == 'ok': + print(f' done in {dur}s ({fps} gen-fps) VRAM {vram}GB RAM {ram}GB') + writer.writerow([ti, p['caption'], p['type'], si_abs, seed, + dur, fps, vram, ram, str(new_mp4), 'ok']) + stats_f.flush() + generated += 1 + done += 1 else: - print(f' WARNING: expected {n_needed} mp4s, got {len(new_mp4s)}') - - except Exception as exc: - print(f' EXCEPTION: {exc}', file=sys.stderr) - finally: - stop_evt.set() - vram_thread.join(timeout=10) - vram = _vram_peak_gb(vram_readings) - ram = _ram_gb() - - if status == 'ok': - print(f' done in {dur}s ({fps} gen-fps) VRAM {vram}GB RAM {ram}GB') - for i, mp4 in enumerate(new_mp4s): - si_abs = n_already + i - row_stat = 'ok' if status == 'ok' else 'partial' - writer.writerow([ti, p['caption'], p['type'], si_abs, seed, - dur if i == 0 else '', fps if i == 0 else '', - vram if i == 0 else '', ram if i == 0 else '', - str(mp4), row_stat]) - stats_f.flush() - if status == 'ok': - generated += len(new_mp4s) - done += n_needed - else: - writer.writerow([ti, p['caption'], p['type'], '', seed, - '', '', '', '', '', 'error']) - stats_f.flush() - stats_f.close() - sys.exit(f'[vbench] FATAL error on prompt {ti+1} "{short_cap}" - stopping') + writer.writerow([ti, p['caption'], p['type'], si_abs, seed, + '', '', '', '', '', 'error']) + stats_f.flush() + stats_f.close() + sys.exit(f'[vbench] FATAL error on prompt {ti+1} sample {si_abs} "{short_cap}" - stopping') shutil.rmtree(tmp_dir, ignore_errors=True) cap_file.unlink(missing_ok=True) From 2399567d19a8d9a4cbb9b69989fc22d3b75770ab Mon Sep 17 00:00:00 2001 From: kschmid Date: Mon, 9 Mar 2026 22:11:40 +1100 Subject: [PATCH 15/33] stats --- scripts/inference/sample_5b_vbench.bat | 9 +- scripts/inference/vbench_runner.py | 198 +++++++++++++------------ 2 files changed, 107 insertions(+), 100 deletions(-) diff --git a/scripts/inference/sample_5b_vbench.bat b/scripts/inference/sample_5b_vbench.bat index abc9985..7a084bd 100644 --- a/scripts/inference/sample_5b_vbench.bat +++ b/scripts/inference/sample_5b_vbench.bat @@ -1,11 +1,14 @@ @echo off setlocal enabledelayedexpansion -set VBENCH_JSON=C:\workspace\world\VBench\vbench2_beta_i2v\vbench2_beta_i2v\data\i2v-bench-info.json -set VBENCH_CROP=C:\workspace\world\VBench\vbench2_beta_i2v\vbench2_beta_i2v\data\crop\1-1 set PY_SCRIPT=%~dp0vbench_runner.py -cd /d "%~dp0..\\.." +cd /d "%~dp0..\.." + +:: Default paths relative to this repo — override by passing them as arguments: +:: sample_5b_vbench.bat [VBENCH_JSON] [VBENCH_CROP] +if not "%~1"=="" (set VBENCH_JSON=%~1) else (set VBENCH_JSON=%CD%\..\VBench\vbench2_beta_i2v\vbench2_beta_i2v\data\i2v-bench-info.json) +if not "%~2"=="" (set VBENCH_CROP=%~2) else (set VBENCH_CROP=%CD%\..\VBench\vbench2_beta_i2v\vbench2_beta_i2v\data\crop\1-1) echo Output: %CD%\outputs\vbench echo VBench: %VBENCH_JSON% diff --git a/scripts/inference/vbench_runner.py b/scripts/inference/vbench_runner.py index 0839a3f..2f67a23 100644 --- a/scripts/inference/vbench_runner.py +++ b/scripts/inference/vbench_runner.py @@ -1,6 +1,7 @@ """ vbench_runner.py -- Python replacement for vbench_runner.ps1 -Calls sample_5b.py once per sample with a fresh random seed each time. +Calls sample_5b.py once per prompt with NUM_SAMPLES caption lines and a +fresh random seed, so the model loads once per prompt instead of once per sample. """ import argparse import csv @@ -149,114 +150,117 @@ def main(): if n_already > 0: print(f'[vbench] prompt {ti+1}: {n_already} done, running {n_needed} remaining') + seed = random.randint(0, 2**31 - 1) short_cap = p['caption'][:60] - # prepare temp dir with this image (shared across all samples for this prompt) + pct = round(100 * done / total) if total else 0 + eta = '' + if done > 0: + elapsed = time.time() - t_start + rem = int(elapsed / done * (total - done)) + eta = f' ETA {rem//3600:02d}h{(rem%3600)//60:02d}m{rem%60:02d}s' + print(f'[vbench] [{done+1}/{total} {pct}%{eta}] ' + f'prompt {ti+1}/{len(prompts)} ({p["type"]}) ' + f'{n_needed} samples seed {seed} : {short_cap}') + + # prepare temp dir with exactly this image tmp_dir = work_dir / '_vbench_tmp' tmp_dir.mkdir(exist_ok=True) for f in tmp_dir.iterdir(): f.unlink(missing_ok=True) shutil.copy(img_src, tmp_dir) + # write n_needed identical caption lines → sample_5b generates n_needed videos cap_file = work_dir / '_vbench_caption.txt' + cap_file.write_text('\n'.join([p['caption']] * n_needed), encoding='utf-8') - for si in range(n_needed): - si_abs = n_already + si - seed = random.randint(0, 2**31 - 1) + vram_readings = [] + stop_evt = threading.Event() + vram_thread = threading.Thread(target=_poll_vram, args=(stop_evt, vram_readings), daemon=True) + vram_thread.start() - pct = round(100 * done / total) if total else 0 - eta = '' - if done > 0: - elapsed = time.time() - t_start - rem = int(elapsed / done * (total - done)) - eta = f' ETA {rem//3600}:{(rem%3600)//60:02d}:{rem%60:02d}' - print(f'[vbench] [{done+1}/{total} {pct}%{eta}] ' - f'prompt {ti+1}/{len(prompts)} sample {si_abs+1}/{NUM_SAMPLES} ' - f'seed {seed} : {short_cap}') - - cap_file.write_text(p['caption'], encoding='utf-8') - - vram_readings = [] - stop_evt = threading.Event() - vram_thread = threading.Thread(target=_poll_vram, args=(stop_evt, vram_readings), daemon=True) - vram_thread.start() - - t0 = time.time() - status = 'error' - new_mp4 = None - try: - pre_existing = set(out_base.glob('*.mp4')) - - env = {**os.environ, - 'TOKENIZERS_PARALLELISM': 'false', - 'TF_ENABLE_ONEDNN_OPTS': '0', - 'LOCAL_RANK': '0', 'RANK': '0', 'WORLD_SIZE': '1', - 'MASTER_ADDR': '127.0.0.1', 'MASTER_PORT': '29500'} - subprocess.run([ - sys.executable, 'fastvideo/sample/sample_5b.py', - '--seed', str(seed), - '--gradient_checkpointing', - '--train_batch_size=1', - '--max_sample_steps=1', - '--mixed_precision=bf16', - '--allow_tf32', - '--t5_cpu', - f'--video_output_dir={out_base}', - f'--jpg_dir={tmp_dir}', - f'--caption_path={cap_file}', - '--test_data_dir=./val', - '--num_euler_timesteps', '5', - '--rand_num_img', '0.6', - '--internvl_path', './InternVL3-2B-Instruct', - '--height', '384', - '--width', '512', - '--num_frames', str(NUM_FRAMES), - '--fps', '24', - ], cwd=str(work_dir), env=env) - - dur = round(time.time() - t0, 2) - fps = round(NUM_FRAMES / dur, 2) - - all_now = set(out_base.glob('*.mp4')) - raw_mp4s = sorted( - [f for f in (all_now - pre_existing) - if safe_cap in f.name and '_seed' not in f.name], - key=lambda f: f.name - ) - print(f' [detect] {len(raw_mp4s)} new mp4s (pre={len(pre_existing)}, now={len(all_now)})') - - if raw_mp4s: - src = raw_mp4s[0] - dst = src.with_stem(f'{src.stem}_s{si_abs}_seed{seed}') - src.rename(dst) - new_mp4 = dst - status = 'ok' - if len(raw_mp4s) > 1: - print(f' WARNING: expected 1 mp4, got {len(raw_mp4s)} — using first') - else: - print(f' WARNING: no new mp4 found for sample {si_abs}') - - except Exception as exc: - print(f' EXCEPTION: {exc}', file=sys.stderr) - finally: - stop_evt.set() - vram_thread.join(timeout=10) - vram = _vram_peak_gb(vram_readings) - ram = _ram_gb() - - if status == 'ok': - print(f' done in {dur}s ({fps} gen-fps) VRAM {vram}GB RAM {ram}GB') - writer.writerow([ti, p['caption'], p['type'], si_abs, seed, - dur, fps, vram, ram, str(new_mp4), 'ok']) - stats_f.flush() - generated += 1 - done += 1 + t0 = time.time() + status = 'error' + new_mp4s = [] + try: + pre_existing = set(out_base.glob('*.mp4')) + + env = {**os.environ, + 'TOKENIZERS_PARALLELISM': 'false', + 'TF_ENABLE_ONEDNN_OPTS': '0', + 'LOCAL_RANK': '0', 'RANK': '0', 'WORLD_SIZE': '1', + 'MASTER_ADDR': '127.0.0.1', 'MASTER_PORT': '29500'} + subprocess.run([ + sys.executable, 'fastvideo/sample/sample_5b.py', + '--seed', str(seed), + '--gradient_checkpointing', + '--train_batch_size=1', + '--max_sample_steps=1', + '--mixed_precision=bf16', + '--allow_tf32', + '--t5_cpu', + f'--video_output_dir={out_base}', + f'--jpg_dir={tmp_dir}', + f'--caption_path={cap_file}', + '--test_data_dir=./val', + '--num_euler_timesteps', '5', + '--rand_num_img', '0.6', + '--internvl_path', './InternVL3-2B-Instruct', + '--height', '384', + '--width', '512', + '--num_frames', str(NUM_FRAMES), + '--fps', '24', + ], cwd=str(work_dir), env=env) + + dur = round(time.time() - t0, 2) + fps = round(NUM_FRAMES * n_needed / dur, 2) + + all_now = set(out_base.glob('*.mp4')) + raw_mp4s = sorted( + [f for f in (all_now - pre_existing) + if safe_cap in f.name and '_seed' not in f.name], + key=lambda f: f.name + ) + print(f' [detect] {len(raw_mp4s)} new mp4s (pre={len(pre_existing)}, now={len(all_now)})') + + for i, src in enumerate(raw_mp4s): + si_abs = n_already + i + dst = src.with_stem(f'{src.stem}_s{si_abs}_seed{seed}') + src.rename(dst) + new_mp4s.append(dst) + + if len(new_mp4s) == n_needed: + status = 'ok' else: - writer.writerow([ti, p['caption'], p['type'], si_abs, seed, - '', '', '', '', '', 'error']) - stats_f.flush() - stats_f.close() - sys.exit(f'[vbench] FATAL error on prompt {ti+1} sample {si_abs} "{short_cap}" - stopping') + print(f' WARNING: expected {n_needed} mp4s, got {len(new_mp4s)}') + + except Exception as exc: + print(f' EXCEPTION: {exc}', file=sys.stderr) + finally: + stop_evt.set() + vram_thread.join(timeout=10) + vram = _vram_peak_gb(vram_readings) + ram = _ram_gb() + + if status == 'ok': + print(f' done in {dur}s ({fps} gen-fps) VRAM {vram}GB RAM {ram}GB') + for i, mp4 in enumerate(new_mp4s): + si_abs = n_already + i + row_stat = 'ok' if status == 'ok' else 'partial' + writer.writerow([ti, p['caption'], p['type'], si_abs, seed, + dur if i == 0 else '', fps if i == 0 else '', + vram if i == 0 else '', ram if i == 0 else '', + str(mp4), row_stat]) + stats_f.flush() + if status == 'ok': + generated += len(new_mp4s) + else: + writer.writerow([ti, p['caption'], p['type'], '', seed, + '', '', '', '', '', 'error']) + stats_f.flush() + errors += 1 + print(f'[vbench] ERROR prompt {ti+1} "{short_cap}" — continuing') + done += n_needed shutil.rmtree(tmp_dir, ignore_errors=True) cap_file.unlink(missing_ok=True) From f4a2c7a2b86d43e485af56d1b9247e7ff4202492 Mon Sep 17 00:00:00 2001 From: kschmid Date: Mon, 9 Mar 2026 22:38:19 +1100 Subject: [PATCH 16/33] down --- scripts/inference/vbench_runner.py | 189 ++++++++++++++--------------- 1 file changed, 91 insertions(+), 98 deletions(-) diff --git a/scripts/inference/vbench_runner.py b/scripts/inference/vbench_runner.py index 2f67a23..6753ef9 100644 --- a/scripts/inference/vbench_runner.py +++ b/scripts/inference/vbench_runner.py @@ -150,117 +150,110 @@ def main(): if n_already > 0: print(f'[vbench] prompt {ti+1}: {n_already} done, running {n_needed} remaining') - seed = random.randint(0, 2**31 - 1) short_cap = p['caption'][:60] - pct = round(100 * done / total) if total else 0 - eta = '' - if done > 0: - elapsed = time.time() - t_start - rem = int(elapsed / done * (total - done)) - eta = f' ETA {rem//3600:02d}h{(rem%3600)//60:02d}m{rem%60:02d}s' - print(f'[vbench] [{done+1}/{total} {pct}%{eta}] ' - f'prompt {ti+1}/{len(prompts)} ({p["type"]}) ' - f'{n_needed} samples seed {seed} : {short_cap}') - - # prepare temp dir with exactly this image + # prepare temp dir with exactly this image (shared across samples) tmp_dir = work_dir / '_vbench_tmp' tmp_dir.mkdir(exist_ok=True) for f in tmp_dir.iterdir(): f.unlink(missing_ok=True) shutil.copy(img_src, tmp_dir) - # write n_needed identical caption lines → sample_5b generates n_needed videos cap_file = work_dir / '_vbench_caption.txt' - cap_file.write_text('\n'.join([p['caption']] * n_needed), encoding='utf-8') + cap_file.write_text(p['caption'], encoding='utf-8') - vram_readings = [] - stop_evt = threading.Event() - vram_thread = threading.Thread(target=_poll_vram, args=(stop_evt, vram_readings), daemon=True) - vram_thread.start() + for si in range(n_needed): + si_abs = n_already + si + seed = random.randint(0, 2**31 - 1) - t0 = time.time() - status = 'error' - new_mp4s = [] - try: - pre_existing = set(out_base.glob('*.mp4')) - - env = {**os.environ, - 'TOKENIZERS_PARALLELISM': 'false', - 'TF_ENABLE_ONEDNN_OPTS': '0', - 'LOCAL_RANK': '0', 'RANK': '0', 'WORLD_SIZE': '1', - 'MASTER_ADDR': '127.0.0.1', 'MASTER_PORT': '29500'} - subprocess.run([ - sys.executable, 'fastvideo/sample/sample_5b.py', - '--seed', str(seed), - '--gradient_checkpointing', - '--train_batch_size=1', - '--max_sample_steps=1', - '--mixed_precision=bf16', - '--allow_tf32', - '--t5_cpu', - f'--video_output_dir={out_base}', - f'--jpg_dir={tmp_dir}', - f'--caption_path={cap_file}', - '--test_data_dir=./val', - '--num_euler_timesteps', '5', - '--rand_num_img', '0.6', - '--internvl_path', './InternVL3-2B-Instruct', - '--height', '384', - '--width', '512', - '--num_frames', str(NUM_FRAMES), - '--fps', '24', - ], cwd=str(work_dir), env=env) - - dur = round(time.time() - t0, 2) - fps = round(NUM_FRAMES * n_needed / dur, 2) - - all_now = set(out_base.glob('*.mp4')) - raw_mp4s = sorted( - [f for f in (all_now - pre_existing) - if safe_cap in f.name and '_seed' not in f.name], - key=lambda f: f.name - ) - print(f' [detect] {len(raw_mp4s)} new mp4s (pre={len(pre_existing)}, now={len(all_now)})') - - for i, src in enumerate(raw_mp4s): - si_abs = n_already + i - dst = src.with_stem(f'{src.stem}_s{si_abs}_seed{seed}') - src.rename(dst) - new_mp4s.append(dst) - - if len(new_mp4s) == n_needed: - status = 'ok' + pct = round(100 * done / total) if total else 0 + eta = '' + if done > 0: + elapsed = time.time() - t_start + rem = int(elapsed / done * (total - done)) + eta = f' ETA {rem//3600:02d}h{(rem%3600)//60:02d}m{rem%60:02d}s' + print(f'[vbench] [{done+1}/{total} {pct}%{eta}] ' + f'prompt {ti+1}/{len(prompts)} ({p["type"]}) ' + f'sample {si_abs+1}/{NUM_SAMPLES} seed {seed} : {short_cap}') + + vram_readings = [] + stop_evt = threading.Event() + vram_thread = threading.Thread(target=_poll_vram, args=(stop_evt, vram_readings), daemon=True) + vram_thread.start() + + t0 = time.time() + new_mp4 = None + dur = 0.0 + fps = 0.0 + try: + pre_existing = set(out_base.glob('*.mp4')) + + env = {**os.environ, + 'TOKENIZERS_PARALLELISM': 'false', + 'TF_ENABLE_ONEDNN_OPTS': '0', + 'LOCAL_RANK': '0', 'RANK': '0', 'WORLD_SIZE': '1', + 'MASTER_ADDR': '127.0.0.1', 'MASTER_PORT': '29500'} + subprocess.run([ + sys.executable, 'fastvideo/sample/sample_5b.py', + '--seed', str(seed), + '--gradient_checkpointing', + '--train_batch_size=1', + '--max_sample_steps=1', + '--mixed_precision=bf16', + '--allow_tf32', + '--t5_cpu', + f'--video_output_dir={out_base}', + f'--jpg_dir={tmp_dir}', + f'--caption_path={cap_file}', + '--test_data_dir=./val', + '--num_euler_timesteps', '5', + '--rand_num_img', '0.6', + '--internvl_path', './InternVL3-2B-Instruct', + '--height', '384', + '--width', '512', + '--num_frames', str(NUM_FRAMES), + '--fps', '24', + ], cwd=str(work_dir), env=env) + + dur = round(time.time() - t0, 2) + fps = round(NUM_FRAMES / dur, 2) + + all_now = set(out_base.glob('*.mp4')) + raw_mp4s = sorted( + [f for f in (all_now - pre_existing) + if safe_cap in f.name and '_seed' not in f.name], + key=lambda f: f.name + ) + print(f' [detect] {len(raw_mp4s)} new mp4s (pre={len(pre_existing)}, now={len(all_now)})') + + if raw_mp4s: + src = raw_mp4s[0] + dst = src.with_stem(f'{src.stem}_s{si_abs}_seed{seed}') + src.rename(dst) + new_mp4 = dst + else: + print(f' WARNING: expected 1 mp4, got 0') + + except Exception as exc: + print(f' EXCEPTION: {exc}', file=sys.stderr) + finally: + stop_evt.set() + vram_thread.join(timeout=10) + vram = _vram_peak_gb(vram_readings) + ram = _ram_gb() + + if new_mp4: + print(f' done in {dur}s ({fps} gen-fps) VRAM {vram}GB RAM {ram}GB') + writer.writerow([ti, p['caption'], p['type'], si_abs, seed, + dur, fps, vram, ram, str(new_mp4), 'ok']) + generated += 1 else: - print(f' WARNING: expected {n_needed} mp4s, got {len(new_mp4s)}') - - except Exception as exc: - print(f' EXCEPTION: {exc}', file=sys.stderr) - finally: - stop_evt.set() - vram_thread.join(timeout=10) - vram = _vram_peak_gb(vram_readings) - ram = _ram_gb() - - if status == 'ok': - print(f' done in {dur}s ({fps} gen-fps) VRAM {vram}GB RAM {ram}GB') - for i, mp4 in enumerate(new_mp4s): - si_abs = n_already + i - row_stat = 'ok' if status == 'ok' else 'partial' - writer.writerow([ti, p['caption'], p['type'], si_abs, seed, - dur if i == 0 else '', fps if i == 0 else '', - vram if i == 0 else '', ram if i == 0 else '', - str(mp4), row_stat]) - stats_f.flush() - if status == 'ok': - generated += len(new_mp4s) - else: - writer.writerow([ti, p['caption'], p['type'], '', seed, - '', '', '', '', '', 'error']) + writer.writerow([ti, p['caption'], p['type'], si_abs, seed, + '', '', '', '', '', 'error']) + errors += 1 + print(f'[vbench] ERROR prompt {ti+1} sample {si_abs} "{short_cap}" — continuing') stats_f.flush() - errors += 1 - print(f'[vbench] ERROR prompt {ti+1} "{short_cap}" — continuing') - done += n_needed + done += 1 shutil.rmtree(tmp_dir, ignore_errors=True) cap_file.unlink(missing_ok=True) From 4c4e50408087aba277342fbfb6ed47c9b18bc54c Mon Sep 17 00:00:00 2001 From: kschmid Date: Tue, 10 Mar 2026 11:59:15 +1100 Subject: [PATCH 17/33] down --- scripts/inference/vbench_runner.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/inference/vbench_runner.py b/scripts/inference/vbench_runner.py index 6753ef9..927dd18 100644 --- a/scripts/inference/vbench_runner.py +++ b/scripts/inference/vbench_runner.py @@ -209,8 +209,8 @@ def main(): '--num_euler_timesteps', '5', '--rand_num_img', '0.6', '--internvl_path', './InternVL3-2B-Instruct', - '--height', '384', - '--width', '512', + '--height', '720', + '--width', '960', '--num_frames', str(NUM_FRAMES), '--fps', '24', ], cwd=str(work_dir), env=env) From a07c11613015abcfb5a625076dbdd4662bd817db Mon Sep 17 00:00:00 2001 From: kschmid Date: Tue, 10 Mar 2026 12:09:04 +1100 Subject: [PATCH 18/33] down --- scripts/inference/sample_5b_vbench.bat | 7 +++++-- scripts/inference/vbench_runner.py | 7 ++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/scripts/inference/sample_5b_vbench.bat b/scripts/inference/sample_5b_vbench.bat index 7a084bd..d39b587 100644 --- a/scripts/inference/sample_5b_vbench.bat +++ b/scripts/inference/sample_5b_vbench.bat @@ -6,17 +6,20 @@ set PY_SCRIPT=%~dp0vbench_runner.py cd /d "%~dp0..\.." :: Default paths relative to this repo — override by passing them as arguments: -:: sample_5b_vbench.bat [VBENCH_JSON] [VBENCH_CROP] +:: sample_5b_vbench.bat [VBENCH_JSON] [VBENCH_CROP] [NUM_FRAMES] if not "%~1"=="" (set VBENCH_JSON=%~1) else (set VBENCH_JSON=%CD%\..\VBench\vbench2_beta_i2v\vbench2_beta_i2v\data\i2v-bench-info.json) if not "%~2"=="" (set VBENCH_CROP=%~2) else (set VBENCH_CROP=%CD%\..\VBench\vbench2_beta_i2v\vbench2_beta_i2v\data\crop\1-1) +if not "%~3"=="" (set NUM_FRAMES=%~3) else (set NUM_FRAMES=29) echo Output: %CD%\outputs\vbench echo VBench: %VBENCH_JSON% echo Crop: %VBENCH_CROP% +echo Frames: %NUM_FRAMES% python "%PY_SCRIPT%" ^ --vbench-json "%VBENCH_JSON%" ^ --vbench-crop "%VBENCH_CROP%" ^ - --work-dir "%CD%" + --work-dir "%CD%" ^ + --num-frames %NUM_FRAMES% exit /b %ERRORLEVEL% diff --git a/scripts/inference/vbench_runner.py b/scripts/inference/vbench_runner.py index 927dd18..2c58012 100644 --- a/scripts/inference/vbench_runner.py +++ b/scripts/inference/vbench_runner.py @@ -18,7 +18,7 @@ ALLOWED_TYPES = ['indoor', 'scenery'] NUM_SAMPLES = 5 -NUM_FRAMES = 161 +NUM_FRAMES = 29 # default: latent_frame_zero=8, VAE stride 4 → (8-1)*4+1=29 # ---------- helpers ---------- @@ -60,6 +60,7 @@ def main(): ap.add_argument('--vbench-json', required=True) ap.add_argument('--vbench-crop', required=True) ap.add_argument('--work-dir', required=True) + ap.add_argument('--num-frames', type=int, default=NUM_FRAMES) args = ap.parse_args() work_dir = Path(args.work_dir) @@ -211,12 +212,12 @@ def main(): '--internvl_path', './InternVL3-2B-Instruct', '--height', '720', '--width', '960', - '--num_frames', str(NUM_FRAMES), + '--num_frames', str(args.num_frames), '--fps', '24', ], cwd=str(work_dir), env=env) dur = round(time.time() - t0, 2) - fps = round(NUM_FRAMES / dur, 2) + fps = round(args.num_frames / dur, 2) all_now = set(out_base.glob('*.mp4')) raw_mp4s = sorted( From b455542cd7ae8d630430851d4d6ccdd10cc01559 Mon Sep 17 00:00:00 2001 From: kschmid Date: Tue, 10 Mar 2026 14:08:34 +1100 Subject: [PATCH 19/33] dist --- scripts/inference/vbench_runner.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/scripts/inference/vbench_runner.py b/scripts/inference/vbench_runner.py index 2c58012..7cc4148 100644 --- a/scripts/inference/vbench_runner.py +++ b/scripts/inference/vbench_runner.py @@ -189,11 +189,15 @@ def main(): try: pre_existing = set(out_base.glob('*.mp4')) + import socket as _socket + with _socket.socket() as _s: + _s.bind(('127.0.0.1', 0)) + _free_port = str(_s.getsockname()[1]) env = {**os.environ, 'TOKENIZERS_PARALLELISM': 'false', 'TF_ENABLE_ONEDNN_OPTS': '0', 'LOCAL_RANK': '0', 'RANK': '0', 'WORLD_SIZE': '1', - 'MASTER_ADDR': '127.0.0.1', 'MASTER_PORT': '29500'} + 'MASTER_ADDR': '127.0.0.1', 'MASTER_PORT': _free_port} subprocess.run([ sys.executable, 'fastvideo/sample/sample_5b.py', '--seed', str(seed), @@ -210,8 +214,8 @@ def main(): '--num_euler_timesteps', '5', '--rand_num_img', '0.6', '--internvl_path', './InternVL3-2B-Instruct', - '--height', '720', - '--width', '960', + '--height', '704', + '--width', '1216', '--num_frames', str(args.num_frames), '--fps', '24', ], cwd=str(work_dir), env=env) From 8f080db7cdb2821f38f2481ade237fe2c5bd5d44 Mon Sep 17 00:00:00 2001 From: kschmid Date: Tue, 10 Mar 2026 16:02:26 +1100 Subject: [PATCH 20/33] dist --- scripts/inference/sample_5b_vbench.bat | 2 +- scripts/inference/vbench_runner.py | 17 +++++++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/scripts/inference/sample_5b_vbench.bat b/scripts/inference/sample_5b_vbench.bat index d39b587..ad72d7e 100644 --- a/scripts/inference/sample_5b_vbench.bat +++ b/scripts/inference/sample_5b_vbench.bat @@ -9,7 +9,7 @@ cd /d "%~dp0..\.." :: sample_5b_vbench.bat [VBENCH_JSON] [VBENCH_CROP] [NUM_FRAMES] if not "%~1"=="" (set VBENCH_JSON=%~1) else (set VBENCH_JSON=%CD%\..\VBench\vbench2_beta_i2v\vbench2_beta_i2v\data\i2v-bench-info.json) if not "%~2"=="" (set VBENCH_CROP=%~2) else (set VBENCH_CROP=%CD%\..\VBench\vbench2_beta_i2v\vbench2_beta_i2v\data\crop\1-1) -if not "%~3"=="" (set NUM_FRAMES=%~3) else (set NUM_FRAMES=29) +if not "%~3"=="" (set NUM_FRAMES=%~3) else (set NUM_FRAMES=161) echo Output: %CD%\outputs\vbench echo VBench: %VBENCH_JSON% diff --git a/scripts/inference/vbench_runner.py b/scripts/inference/vbench_runner.py index 7cc4148..9ee3c71 100644 --- a/scripts/inference/vbench_runner.py +++ b/scripts/inference/vbench_runner.py @@ -18,7 +18,7 @@ ALLOWED_TYPES = ['indoor', 'scenery'] NUM_SAMPLES = 5 -NUM_FRAMES = 29 # default: latent_frame_zero=8, VAE stride 4 → (8-1)*4+1=29 +NUM_FRAMES = 161 # ---------- helpers ---------- @@ -114,15 +114,20 @@ def main(): done += NUM_SAMPLES continue - safe_cap = _safe(p['caption']) + safe_cap = _safe(p['caption']) + safe_cap_u = safe_cap.replace(' ', '_') # sample_5b replaces spaces → underscores + + def _cap_match(name): + return safe_cap in name or safe_cap_u in name # samples already completed (renamed with _s{i}_seed{n} suffix) - already = sorted(out_base.glob(f'*{safe_cap}*_s[0-9]*_seed*.mp4')) + already = sorted([f for f in out_base.glob('*.mp4') + if _cap_match(f.name) and '_seed' in f.name]) n_already = len(already) # orphans: files from an interrupted run that were never renamed - orphans = sorted([f for f in out_base.glob(f'*{safe_cap}*.mp4') - if '_seed' not in f.name]) + orphans = sorted([f for f in out_base.glob('*.mp4') + if _cap_match(f.name) and '_seed' not in f.name]) # recover orphans with new random seeds for i, src in enumerate(orphans): @@ -226,7 +231,7 @@ def main(): all_now = set(out_base.glob('*.mp4')) raw_mp4s = sorted( [f for f in (all_now - pre_existing) - if safe_cap in f.name and '_seed' not in f.name], + if _cap_match(f.name) and '_seed' not in f.name], key=lambda f: f.name ) print(f' [detect] {len(raw_mp4s)} new mp4s (pre={len(pre_existing)}, now={len(all_now)})') From bb997f0d6d1f5d785d15efbdb608a98b0d3d4d90 Mon Sep 17 00:00:00 2001 From: kschmid Date: Tue, 10 Mar 2026 16:30:44 +1100 Subject: [PATCH 21/33] dist --- scripts/inference/vbench_runner.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/inference/vbench_runner.py b/scripts/inference/vbench_runner.py index 9ee3c71..8b5d102 100644 --- a/scripts/inference/vbench_runner.py +++ b/scripts/inference/vbench_runner.py @@ -198,7 +198,9 @@ def _cap_match(name): with _socket.socket() as _s: _s.bind(('127.0.0.1', 0)) _free_port = str(_s.getsockname()[1]) + _pythonpath = str(work_dir) + os.pathsep + os.environ.get('PYTHONPATH', '') env = {**os.environ, + 'PYTHONPATH': _pythonpath, 'TOKENIZERS_PARALLELISM': 'false', 'TF_ENABLE_ONEDNN_OPTS': '0', 'LOCAL_RANK': '0', 'RANK': '0', 'WORLD_SIZE': '1', From 8b7348f421c35391a1aed40f69fb71a9b4d38d81 Mon Sep 17 00:00:00 2001 From: kschmid Date: Tue, 10 Mar 2026 17:30:14 +1100 Subject: [PATCH 22/33] dist --- wan23/textimage2video.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/wan23/textimage2video.py b/wan23/textimage2video.py index 53efcb7..b0e4405 100644 --- a/wan23/textimage2video.py +++ b/wan23/textimage2video.py @@ -1,5 +1,6 @@ # Copyright 2024-2025 The Alibaba Wan Team Authors. All rights reserved. import gc +import json import logging import math import os @@ -153,7 +154,11 @@ def __init__( torch.zeros(1, 1, self.model.dim, device=self.model.device) ) - self.model = WanModel.from_pretrained(checkpoint_dir) + # Load config only — weights are loaded below via load_file, so + # from_pretrained's weight loading (which reads the full file into RAM) is skipped. + with open(os.path.join(checkpoint_dir, "config.json")) as _f: + _cfg = json.load(_f) + self.model = WanModel.from_config(_cfg) state_dict = load_file(checkpoint_dir+"/diffusion_pytorch_model.safetensors") self.model.load_state_dict(state_dict) From 4f01e0b25173f68c882c8fad090859cee8e2d87e Mon Sep 17 00:00:00 2001 From: kschmid Date: Tue, 10 Mar 2026 17:50:48 +1100 Subject: [PATCH 23/33] Fix MemoryError: use load_file instead of from_pretrained, keep model with custom attrs --- wan23/textimage2video.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/wan23/textimage2video.py b/wan23/textimage2video.py index b0e4405..e08ec82 100644 --- a/wan23/textimage2video.py +++ b/wan23/textimage2video.py @@ -154,12 +154,8 @@ def __init__( torch.zeros(1, 1, self.model.dim, device=self.model.device) ) - # Load config only — weights are loaded below via load_file, so - # from_pretrained's weight loading (which reads the full file into RAM) is skipped. - with open(os.path.join(checkpoint_dir, "config.json")) as _f: - _cfg = json.load(_f) - self.model = WanModel.from_config(_cfg) - state_dict = load_file(checkpoint_dir+"/diffusion_pytorch_model.safetensors") + # Use load_file (mmap, low RAM) instead of from_pretrained (reads full file into RAM). + state_dict = load_file(checkpoint_dir + "/diffusion_pytorch_model.safetensors") self.model.load_state_dict(state_dict) From cc191a57dcba48621f80fb589ad874753bda970e Mon Sep 17 00:00:00 2001 From: kschmid Date: Tue, 10 Mar 2026 20:22:50 +1100 Subject: [PATCH 24/33] fix: use strict=False in load_state_dict for YUME custom params sideblock, mask_token, and patch_embedding_* are YUME additions not saved in diffusion_pytorch_model.safetensors; they must stay freshly initialized. strict=True failed with 'Missing key(s) in state_dict'. Co-Authored-By: Claude Sonnet 4.6 --- wan23/textimage2video.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/wan23/textimage2video.py b/wan23/textimage2video.py index e08ec82..9af4fcf 100644 --- a/wan23/textimage2video.py +++ b/wan23/textimage2video.py @@ -155,8 +155,10 @@ def __init__( ) # Use load_file (mmap, low RAM) instead of from_pretrained (reads full file into RAM). + # strict=False: sideblock/mask_token/patch_embedding_* are YUME-only additions not + # present in the base checkpoint; they stay freshly initialized (same as original flow). state_dict = load_file(checkpoint_dir + "/diffusion_pytorch_model.safetensors") - self.model.load_state_dict(state_dict) + self.model.load_state_dict(state_dict, strict=False) self.sp_size = 1 From 72421218523c6f5721c185a1c69b16d3e23a3e38 Mon Sep 17 00:00:00 2001 From: kschmid Date: Tue, 10 Mar 2026 20:23:31 +1100 Subject: [PATCH 25/33] fix: use os.path.join for Windows-compatible path Co-Authored-By: Claude Sonnet 4.6 --- wan23/textimage2video.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wan23/textimage2video.py b/wan23/textimage2video.py index 9af4fcf..5405df0 100644 --- a/wan23/textimage2video.py +++ b/wan23/textimage2video.py @@ -157,7 +157,7 @@ def __init__( # Use load_file (mmap, low RAM) instead of from_pretrained (reads full file into RAM). # strict=False: sideblock/mask_token/patch_embedding_* are YUME-only additions not # present in the base checkpoint; they stay freshly initialized (same as original flow). - state_dict = load_file(checkpoint_dir + "/diffusion_pytorch_model.safetensors") + state_dict = load_file(os.path.join(checkpoint_dir, "diffusion_pytorch_model.safetensors")) self.model.load_state_dict(state_dict, strict=False) From 2498896b1c6fc4ae5c9f07b895f7bc07d53ccdaf Mon Sep 17 00:00:00 2001 From: kschmid Date: Wed, 11 Mar 2026 07:46:23 +1100 Subject: [PATCH 26/33] loading --- wan23/textimage2video.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wan23/textimage2video.py b/wan23/textimage2video.py index 5405df0..f84b2d8 100644 --- a/wan23/textimage2video.py +++ b/wan23/textimage2video.py @@ -157,7 +157,7 @@ def __init__( # Use load_file (mmap, low RAM) instead of from_pretrained (reads full file into RAM). # strict=False: sideblock/mask_token/patch_embedding_* are YUME-only additions not # present in the base checkpoint; they stay freshly initialized (same as original flow). - state_dict = load_file(os.path.join(checkpoint_dir, "diffusion_pytorch_model.safetensors")) + state_dict = load_file(os.path.join(checkpoint_dir, "diffusion_pytorch_model.safetensors"), device=str(self.device)) self.model.load_state_dict(state_dict, strict=False) From 7008deff0d0ba100652a0765fd4b723ee5fd3656 Mon Sep 17 00:00:00 2001 From: kschmid Date: Wed, 11 Mar 2026 08:52:05 +1100 Subject: [PATCH 27/33] default --- fastvideo/sample/sample_5b.py | 1 + wan23/textimage2video.py | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/fastvideo/sample/sample_5b.py b/fastvideo/sample/sample_5b.py index 5a91ee1..cf5b431 100644 --- a/fastvideo/sample/sample_5b.py +++ b/fastvideo/sample/sample_5b.py @@ -1311,6 +1311,7 @@ def main(args): _local = os.path.abspath(args.internvl_path) path = _local if os.path.isdir(_local) else "OpenGVLab/InternVL3-2B-Instruct" main_print(f"[INIT] Loading InternVL caption model from {path} ...") + torch.set_default_device(None) # FSDP may leave default device as 'meta'; reset before loading InternVL camption_model = AutoModel.from_pretrained( path, torch_dtype=torch.bfloat16, diff --git a/wan23/textimage2video.py b/wan23/textimage2video.py index f84b2d8..e683331 100644 --- a/wan23/textimage2video.py +++ b/wan23/textimage2video.py @@ -157,7 +157,13 @@ def __init__( # Use load_file (mmap, low RAM) instead of from_pretrained (reads full file into RAM). # strict=False: sideblock/mask_token/patch_embedding_* are YUME-only additions not # present in the base checkpoint; they stay freshly initialized (same as original flow). - state_dict = load_file(os.path.join(checkpoint_dir, "diffusion_pytorch_model.safetensors"), device=str(self.device)) + # load_file uses mmap which fails on Windows when the paging file is too small. + # Reading into bytes first uses regular file I/O, bypassing the mmap requirement. + import safetensors.torch as _st + _ckpt = os.path.join(checkpoint_dir, "diffusion_pytorch_model.safetensors") + with open(_ckpt, "rb") as _f: + state_dict = _st.load(_f.read()) + state_dict = {k: v.to(self.device) for k, v in state_dict.items()} self.model.load_state_dict(state_dict, strict=False) From 5f9e46f795a6edfe07f1751f681c773d3fccfe5c Mon Sep 17 00:00:00 2001 From: kschmid Date: Wed, 11 Mar 2026 21:00:34 +1100 Subject: [PATCH 28/33] fix: set default device to cpu before InternVL load to avoid get_default_device() crash torch.set_default_device(None) left the default as None; newer transformers calls torch.get_default_device() and tries to access .device on the result, crashing with AttributeError. Setting "cpu" gives transformers a valid device while still allowing low_cpu_mem_usage load followed by .to(device). Co-Authored-By: Claude Sonnet 4.6 --- fastvideo/sample/sample_5b.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastvideo/sample/sample_5b.py b/fastvideo/sample/sample_5b.py index cf5b431..bda5e08 100644 --- a/fastvideo/sample/sample_5b.py +++ b/fastvideo/sample/sample_5b.py @@ -1311,7 +1311,7 @@ def main(args): _local = os.path.abspath(args.internvl_path) path = _local if os.path.isdir(_local) else "OpenGVLab/InternVL3-2B-Instruct" main_print(f"[INIT] Loading InternVL caption model from {path} ...") - torch.set_default_device(None) # FSDP may leave default device as 'meta'; reset before loading InternVL + torch.set_default_device("cpu") # FSDP may leave default device as 'meta'; reset before loading InternVL camption_model = AutoModel.from_pretrained( path, torch_dtype=torch.bfloat16, From 1d3ca309d0ece303a3dbba393a888f4a179831d1 Mon Sep 17 00:00:00 2001 From: kschmid Date: Wed, 11 Mar 2026 21:16:25 +1100 Subject: [PATCH 29/33] fix: load safetensors checkpoint directly to device, skip CPU buffer The previous workaround (_st.load(_f.read())) read the full safetensors file into a Python bytes object then deserialized it, requiring ~2x the checkpoint size in CPU RAM and causing pyo3 OOM panic on large models. load_file(device=) streams each tensor directly to the target device via mmap, avoiding the intermediate CPU copy entirely. Co-Authored-By: Claude Sonnet 4.6 --- wan23/textimage2video.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/wan23/textimage2video.py b/wan23/textimage2video.py index e683331..254b53d 100644 --- a/wan23/textimage2video.py +++ b/wan23/textimage2video.py @@ -157,13 +157,12 @@ def __init__( # Use load_file (mmap, low RAM) instead of from_pretrained (reads full file into RAM). # strict=False: sideblock/mask_token/patch_embedding_* are YUME-only additions not # present in the base checkpoint; they stay freshly initialized (same as original flow). - # load_file uses mmap which fails on Windows when the paging file is too small. - # Reading into bytes first uses regular file I/O, bypassing the mmap requirement. - import safetensors.torch as _st + # Load directly to the target device to avoid holding two copies in RAM. + # load_file with device= loads each tensor directly to CUDA, skipping the + # intermediate CPU buffer that causes OOM on machines with limited RAM. + from safetensors.torch import load_file as _load_file _ckpt = os.path.join(checkpoint_dir, "diffusion_pytorch_model.safetensors") - with open(_ckpt, "rb") as _f: - state_dict = _st.load(_f.read()) - state_dict = {k: v.to(self.device) for k, v in state_dict.items()} + state_dict = _load_file(_ckpt, device=str(self.device)) self.model.load_state_dict(state_dict, strict=False) From be8b7f956b1d61832fb8e64a1bb92c85bf5224d9 Mon Sep 17 00:00:00 2001 From: kschmid Date: Wed, 11 Mar 2026 21:59:00 +1100 Subject: [PATCH 30/33] fix: remove low_cpu_mem_usage from InternVL load to avoid meta tensor error low_cpu_mem_usage=True triggers init_empty_weights() which creates tensors on meta device. InternVL3's __init__ calls torch.linspace().item() during construction, which raises RuntimeError on meta tensors. Loading without low_cpu_mem_usage uses more CPU RAM transiently but avoids the meta device context entirely. Co-Authored-By: Claude Sonnet 4.6 --- fastvideo/sample/sample_5b.py | 1 - 1 file changed, 1 deletion(-) diff --git a/fastvideo/sample/sample_5b.py b/fastvideo/sample/sample_5b.py index bda5e08..8607391 100644 --- a/fastvideo/sample/sample_5b.py +++ b/fastvideo/sample/sample_5b.py @@ -1315,7 +1315,6 @@ def main(args): camption_model = AutoModel.from_pretrained( path, torch_dtype=torch.bfloat16, - low_cpu_mem_usage=True, use_flash_attn=True, trust_remote_code=True).eval().to(device) tokenizer = AutoTokenizer.from_pretrained(path, trust_remote_code=True, use_fast=False) From 26631ef56be09ab72ca0e397af45161b383f57cf Mon Sep 17 00:00:00 2001 From: kschmid Date: Thu, 12 Mar 2026 15:32:17 +1100 Subject: [PATCH 31/33] works --- fastvideo/sample/sample_5b.py | 3 ++- requirements.txt | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/fastvideo/sample/sample_5b.py b/fastvideo/sample/sample_5b.py index 8607391..98f8bdb 100644 --- a/fastvideo/sample/sample_5b.py +++ b/fastvideo/sample/sample_5b.py @@ -1315,7 +1315,8 @@ def main(args): camption_model = AutoModel.from_pretrained( path, torch_dtype=torch.bfloat16, - use_flash_attn=True, + low_cpu_mem_usage=False, + use_flash_attn=False, trust_remote_code=True).eval().to(device) tokenizer = AutoTokenizer.from_pretrained(path, trust_remote_code=True, use_fast=False) main_print("[INIT] InternVL caption model loaded") diff --git a/requirements.txt b/requirements.txt index c384f4f..6aae4f1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -34,7 +34,6 @@ fastapi>=0.115.3 ffmpeg>=1.4 ffmpy>=0.6.0 filelock>=3.13.1 -flash-attn>=2.7.0.post2 fonttools>=4.58.4 frozenlist>=1.7.0 fsspec>=2024.6.1 @@ -151,7 +150,7 @@ torchmetrics>=1.5.1 #torchvision>=0.20.0+cu121 tqdm>=4.66.5 transformers>=4.46.1 -#triton>=3.1.0 +triton-windows>=3.1.0 typer>=0.16.0 types-PyYAML>=6.0.12.20250516 types-requests>=2.32.4.20250611 @@ -169,4 +168,5 @@ Werkzeug>=3.1.3 yacs>=0.1.8 yapf>=0.32.0 yarl>=1.20.1 -zipp>=3.23.0 \ No newline at end of file +zipp>=3.23.0 +flash-attn>=2.7.0.post2 \ No newline at end of file From cbb1590e7ff794944599bba0c2c6b0174e168a7a Mon Sep 17 00:00:00 2001 From: kschmid Date: Thu, 12 Mar 2026 16:55:25 +1100 Subject: [PATCH 32/33] wan --- fastvideo/sample/sample_5b.py | 18 ++++++++++------- wan23/__pycache__/__init__.cpython-312.pyc | Bin 372 -> 346 bytes wan23/__pycache__/image2video.cpython-312.pyc | Bin 19414 -> 19391 bytes wan23/__pycache__/text2video.cpython-312.pyc | Bin 16620 -> 16597 bytes .../textimage2video.cpython-312.pyc | Bin 25699 -> 28992 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 854 -> 831 bytes .../__pycache__/shared_config.cpython-312.pyc | Bin 1062 -> 1039 bytes .../__pycache__/wan_i2v_A14B.cpython-312.pyc | Bin 1345 -> 1322 bytes .../__pycache__/wan_t2v_A14B.cpython-312.pyc | Bin 1328 -> 1305 bytes .../__pycache__/wan_ti2v_5B.cpython-312.pyc | Bin 1220 -> 1197 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 173 -> 150 bytes .../__pycache__/fsdp.cpython-312.pyc | Bin 1901 -> 1878 bytes .../sequence_parallel.cpython-312.pyc | Bin 9611 -> 9588 bytes .../__pycache__/ulysses.cpython-312.pyc | Bin 1508 -> 1485 bytes .../__pycache__/util.cpython-312.pyc | Bin 2601 -> 2578 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 574 -> 551 bytes .../__pycache__/attention.cpython-312.pyc | Bin 7042 -> 7019 bytes .../modules/__pycache__/model.cpython-312.pyc | Bin 54617 -> 54594 bytes wan23/modules/__pycache__/t5.cpython-312.pyc | Bin 25092 -> 22963 bytes .../__pycache__/tokenizers.cpython-312.pyc | Bin 4091 -> 4068 bytes .../__pycache__/vae2_1.cpython-312.pyc | Bin 31274 -> 31247 bytes .../__pycache__/vae2_2.cpython-312.pyc | Bin 40396 -> 40369 bytes wan23/modules/t5.py | 19 +++--------------- 23 files changed, 14 insertions(+), 23 deletions(-) diff --git a/fastvideo/sample/sample_5b.py b/fastvideo/sample/sample_5b.py index 98f8bdb..8f1067a 100644 --- a/fastvideo/sample/sample_5b.py +++ b/fastvideo/sample/sample_5b.py @@ -1311,13 +1311,17 @@ def main(args): _local = os.path.abspath(args.internvl_path) path = _local if os.path.isdir(_local) else "OpenGVLab/InternVL3-2B-Instruct" main_print(f"[INIT] Loading InternVL caption model from {path} ...") - torch.set_default_device("cpu") # FSDP may leave default device as 'meta'; reset before loading InternVL - camption_model = AutoModel.from_pretrained( - path, - torch_dtype=torch.bfloat16, - low_cpu_mem_usage=False, - use_flash_attn=False, - trust_remote_code=True).eval().to(device) + # FSDP may leave an active DeviceContext("meta") TorchFunctionMode on the stack. + # torch.set_default_device("cpu") only sets a C++ variable and is overridden by + # the higher-priority Python TorchFunctionMode. Pushing a DeviceContext("cpu") + # via the context manager sits on top of any lingering meta context and wins. + with torch.device("cpu"): + camption_model = AutoModel.from_pretrained( + path, + torch_dtype=torch.bfloat16, + low_cpu_mem_usage=False, + use_flash_attn=False, + trust_remote_code=True).eval().to(device) tokenizer = AutoTokenizer.from_pretrained(path, trust_remote_code=True, use_fast=False) main_print("[INIT] InternVL caption model loaded") diff --git a/wan23/__pycache__/__init__.cpython-312.pyc b/wan23/__pycache__/__init__.cpython-312.pyc index 6f8d53d4e40867c8a93e3736e4caed07de1d3997..d8b037bda1b2ffc988f9b4eb0acd4c88508a5279 100644 GIT binary patch delta 85 zcmeyubc>1iG%qg~0}x!8Fg5e`MBW*!ERm(TsT0?RYHK=M#gyk4WfvDDCZ~c}IVmxb lp}wv$<%xMl#xe2nnR%Hd@$q^EmA59lFlwXien-}eO+~P6EpL44H4{^^29tNpHvs^6QWd!X delta 84 zcmdl#o$=aqM!wU$yj%=G5Vv(>M!dsDzJ7jvXJ@OJ(Bjmh;us@iLsOF&m;Ca)oczR; e;+V)#Usv7S#LPThLj-&CR{nNt#$S_dy_*1xkQ}uD diff --git a/wan23/__pycache__/text2video.cpython-312.pyc b/wan23/__pycache__/text2video.cpython-312.pyc index 97d448cb23f5273a505df265c179008844af686a..0790da14068fe2dd7c7850cd052afa9606c52739 100644 GIT binary patch delta 61 zcmaFU$auApk?%AwFBbz4T$nI5^P<&8z6yQ`ZD*^P^8BLg;)2BFR1hmCB_=Y|*LCw& O{=Ei_wIL64>(9|TxCBHl`CqFTz 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 k+sxK~U^*6vyH%t-w7uu< z;$2&{nh|`QIp^FvbIjZW!-#lf$o4nl6Ax>W&UdUHjK@w6z zqM!?Uz^Wy6N*%XFE3AZ>PqZSWK2;?Oq(NyYMH)$yvae(}lNKIrRifNeZMBhhrJdW7 z)j>Lx4rbTrL93H=DP7zSS>2>Z=^?#JZ=O49tv=GP^mDt;ijlYy=XTiIPX?3$Zbz&^ zGNcS~yWToLhLvG5qKpt(k-4wI8YN@O7`Gd(`^dO5P9~HIQK%9Y1-SSpPE(uEZZu-{vM3lxq8TLTeqW-oO1etN9F zrL$^BEPA#DwP!E3Eu5WW(UH~d;C9V+c)RY++8ybCqy?eLJG!@Mr)02=`uBWxP_L`J z-xkj87WqT|Eo^^krs9%!a*=n$uq z15pXEQuIh?Z$9EzyM~p91I*z!q}GkpxvXQ_o~oMw9n1;C7zuha#Rm?cYd^vWf{ZYT zfCqOY3}O}6=Zg=_CeOGAxXHxSp_%FA3Fo|RIhyV!pFDHw!Ey31d#mw7r5k1^&ueyK zD(M*)Jd+U(eBuBk-##GVJA?_LrMv91Ym?c-?g)#&(@==f{) zN717ft1s24* z<>7_GqVV$g(wgO@&bi1`sXnlP!C3~mj@u_nIdV% zWo(%_16FbA8HC3W9!Gcr;YozAAtV{dRer!sZ2AE&u_-qd-w=0!6$BOGQG|PLr(m?S z=U14Co5I%-o?_rOF{oghoBUXQC}Y?LXr57KYtQpCy)pg+cBb6KYmw;dB4GKTlfml& z=tjGT&deQ`Ei{iKEHLmRw&P?~+fm&uJC%#?6^tE>ez?{qo}_Qj9U8wM(~$yS$}s^G zm_oanXx_SCoia=drZHmU^G9E8p3_-i2~c8y;}S9qwahPfv~{sn$zrZSN>f#I>E+#hk+j~5wpq^SIzY404nG2?3Z0P zz6@FRM~?YY@pzmBqy}0T_yM9_U^=xu@X)t`z$w~9>pa2*ge?Rl404AN`Dwm^);7Xz z^1;R1Zz9YiR4_;vPA3+5qn6v?QOx-QT=8B=Vsfzo=r2x>^?wWRkuLZ)!uJrKLHG{B zcWGcH-sA_fny$0C&g%%z(}OErHP2%F`*eBbaQgz9PctZ!%9?hm@ROBaHg+MWU?6bb zkWx+_tkb7!TIu9+-~XX)s3a8no3*}tgz2J88$8c;V~w$)YqH3D&zClAGn+ceR5OZC z!V%-Q;#WuCvNd9+m_W@mexu~7V*N2AC+S%-Hdb;m;hGtuxxQplT~2l8QK9n8-86EUly$+SQ|w<{d2fYav@DPc319%#Ula{j3AQhcP=Of9`4L}AS&nV^ElZB~5Xo8wF>KG!9|R_SXvIAK zX?TMc^g~TA;VvQDIIprLE~xaMdMsa7;TIhis6D^MGc@*<29#gceuvbIe*@T9Rww0}SxS#uUI6@F4=f zEhozn_&vI>+>Y_hIj?u7!k<_QZeBOUcZWaRv4n@=68eg}|A^do_!!>KBCH|cfaMJd zzeDS;Vc3Q~g#9!{4g{A)Y4)aGMPDL6A3eSok`MY-nH2Cb#l<_05w2D~$`+|(5BBh3 z<~Q*F+9t3ICm0j(2ByA6e`ODf4;QZ4hsA0Bw7Xv8^Uyr|4}mqn=&nG^m1 delta 80 zcmdnbc8!hqG%qg~0}#Y*-I&q8kvEk|-^1A|CbT%Us5r*R*wEA@#wEWzFDE}Sr8p)s a)YnxvH!(9$*AT&;+{Glt_-pb~rda^^1sa3^ diff --git a/wan23/configs/__pycache__/shared_config.cpython-312.pyc b/wan23/configs/__pycache__/shared_config.cpython-312.pyc index bad711b24c545062aa14faf05ab0d79d16d137f3..602d543625070598b19f37b8f5d51c863ea2b12a 100644 GIT binary patch delta 57 zcmZ3+(a*tqnwOW00SGQkn3{QXBd;g3gqgEdOnH7$c5y*saw>?GlM)jd>gzhWm06zg J*5swkjQ|H?6IK8K delta 80 zcmeC@SjNG7nwOW00SMx@Zp_%Yk=K)1-`CkHCbT%Us5r*R*wEA@#wEWzFDE}Sr8p)s a)YnxvH!(9$*AT&;oX0HB_-k?>b0YxVmKpB= diff --git a/wan23/configs/__pycache__/wan_i2v_A14B.cpython-312.pyc b/wan23/configs/__pycache__/wan_i2v_A14B.cpython-312.pyc index 56450e446ced06439a6bdeae6762bfe9251c3fdc..658607a0abf498608bd3b713718c7e5dd85cb464 100644 GIT binary patch delta 57 zcmX@ewTg@PG%qg~0}x!8Ff~(aBkzA^2~%gQnDYFh?BasN=#N<>ED<>r;GSt^~vNnqx Kd4!YqG%qg~0}#Y*-I!6mk++Z8*W1}DCbT%Us5r*R*wEA@#wEWzFDE}Sr8p)s w)YnxvH!(9$*AT&uDNoEZGLA{k&r8cpF9z}AOEQhh;!U0O3Mzk1zQ}wB0Oy$`kpKVy diff --git a/wan23/distributed/__pycache__/__init__.cpython-312.pyc b/wan23/distributed/__pycache__/__init__.cpython-312.pyc index a5a5c0ee1401a1a4c2d1989bc97dae0a3d6ac85b..f27ab25ab9402675a8dedf2f4d968c63826e13b5 100644 GIT binary patch delta 54 zcmZ3>IE|6_G%qg~0}x!8Fg4R_BCnx@sk2o~d45rLaY15oDu|Vn5)&Ef>pC%4j`7yS G9z_7c7!m^j delta 77 zcmbQnxR#OkG%qg~0}#Y*-I(Dyk=Ib)$Jr_-v^ce>IL64>(9|TxCBHl`CqFTzI3_aG X*Ht$+F*8rs5W$`pCdc?|VyPkke|s3O diff --git a/wan23/distributed/__pycache__/fsdp.cpython-312.pyc b/wan23/distributed/__pycache__/fsdp.cpython-312.pyc index 8efbfd8389ac4666c6b6922309e5c94a31958d5f..cdf2ea44ae2c417684563650a898bb48b93c744f 100644 GIT binary patch delta 85 zcmaFMca4wtG%qg~0}x!8Fg4R{Bd;}+v7xh7OnH7$c5y*saw>?GlM)jd>gyU)o|tE3 l9Fvk+TvC*oR9cdn5|dV(QlM8*d290|rVugM?S(g3179Jl}g diff --git a/wan23/distributed/__pycache__/sequence_parallel.cpython-312.pyc b/wan23/distributed/__pycache__/sequence_parallel.cpython-312.pyc index 8d313e73347a53943c6fa4fd1b647789823405ae..920cfae5906be32fd85c2b2c813b41449e743e3e 100644 GIT binary patch delta 58 zcmeD7{^G@ZnwOW00SGQkn40-@Bkx5f2|H)2nDYFh?BasNgUsM_ZOp6^2 diff --git a/wan23/distributed/__pycache__/ulysses.cpython-312.pyc b/wan23/distributed/__pycache__/ulysses.cpython-312.pyc index 6f754c9f29051d628b1efb4c27c3344e939b8513..80518877d4b91db8253b76a67c9550a4c4da37b4 100644 GIT binary patch delta 58 zcmaFDeU_W|G%qg~0}x!8Ff}uBBd-aIgo(3NOnH7$c5y*saw>?GlM)jd>g&3>fW?N9 K@z&(EtmXhA+7mzk delta 81 zcmX@h{e+wMG%qg~0}#Y*-I$@Zk=KMp-`m+LCbT%Us5r*R*wEA@#wEWzFDE}Sr8p)s b)YnxvH!(9$*AT(p9LZwC$oOmWG*)u}_ud)4 diff --git a/wan23/distributed/__pycache__/util.cpython-312.pyc b/wan23/distributed/__pycache__/util.cpython-312.pyc index 4f321cf9dcb1d27860666f7ca8e67b8427c1b553..3e5c246874388dd25c74b5495a04f82f883a28fb 100644 GIT binary patch delta 58 zcmZ1}GD(E@G%qg~0}x!8Fg0`9MqY152}5VAnDYFh?BasN=#N<>ED<>r;GSt^KraUpv f$T%i9KczG$wKyg|J~J<~BtBlRpz_vaMkZST^)wq1 delta 81 zcmZ3^vX6!DG%qg~0}#Y*-I(!-aU$Byj%=GaACsK%!Y{@`8Zi6^qj3?%JYk|iwhEyQ$ehpl$gj+U)RlU PtT)av-r6jG#flLCrPdam delta 85 zcmX@KiuvX$X1>$Byj%=Gp!3-`b9wJZK2BDBS7)o3(Bjmh;us@iLsOF&m;Ca)oczR; g;+V)#Usv7S#LPThLj-%XKI@HhjK4N>T(M#V0H<6X761SM diff --git a/wan23/modules/__pycache__/t5.cpython-312.pyc b/wan23/modules/__pycache__/t5.cpython-312.pyc index 43c5ef295e502191e24d264e73f20c751c051fb8..6f6b62d1db0df970ea03603b41546c4adf398beb 100644 GIT binary patch delta 4122 zcmb7Hdr(x@8Rsm!%Pt6ryg>mGg#|=Fu@M~wA2ddUs2Jm8a#?mSuwl8ooV$pwwrfYM zld4U})0$)wolM)bF_Weyx38G#G?{7Bq^2=RGo9ub|I19{v}x1YOfsFe>GwN#SwOKf zy~F-E_dDNr9>4E#&Yk=vvn-Z#B|AGajh;)rFND6;`Fu{hv!r2D`+y70kR;{wGcyQ|rG4y9b9t@5XIC=s z5DDn{c!Ma)9c4?zWbWy%1qzN5$#+mm7E~srxde%N&pDoHx>&^k`bh2*or_rUyf#GF^|F(qR}PnpadL z-4l9fXgKC`@@1sUn*lB2vAjj)E2tSSm@z@q)HwCl+j+0C+#3$kxbZnXeLe?o7Ek9_ z=hcu%I!ATC!CNp?o4A(0c)?O?n$WJQvbR_(atcaVv#2e&u(=L;K0rMH({j)vvo$Rc z_M2uv4~I4FBIBz`YBGWjdlc+WZLv;x3(Hxf;$?kdlj5Z_7SoMbC}LP+g|D)0P0-y8 zP!nLE(nEA;{#eYAUSoVz8`k|nQ+n`EqaNN09d~!g(EVJpG08?GJ1AL1B#H~SPP274 z2HgtS0Z@x{Q>zNkF?*#`T&5P4;6B4xMI);fT15%lY8|S0o2~6Y=SG5=tSb@$Sf`my@Y!VAC(dkF!>1M1 zt~@(NH&4ZAuFURh>(cdLSAZD!~$6WaZ1@$|)n%p5c@XIAw6qu<6g-rH_rn zkNz;<21O)?bPoArx=bGov;bQ9z35Tfa?J>1V@hiK#6_=3m!Qd4h&QUsS=9QldKbG} zrHzx1p(C2I<7nL;yd;em&e~PepuM{z;&{z{HAr;c0l1YrwO4>4{#{efMifim*wktT zm!4ojMaMYoQZdR^bg7-d-7*V-Ixrp>(PO5}B&Tvcs6`{Do#`%v>OhMf=7UgIf>w?h ziK#(D=8Mku{9Q7eOf-FTKo15(#?VFY4Ay2($m3Yf5x{hGd+8NS;+YC?@p$bbcEWnG zmN~lmq3$Q}d2G{T5bOq^a&jz<9|e3F@FfCY(s2b4^aK27>x(K-2jazjZM*dF;B@XJ z$v!Vu)t{;xCKaEfr)O@$6`O$L;*a%9*f-FVF9XpSc78L^x z7X4^v&dKH1(65$s3N3JH&vzO&8Mb3>R>dRD)o!?jPl{hO7gj2AOZwV2Vb!;>`--^P z{PX$~7{%E`&)obf<^WF#+0w#JCIfoDXlq^K#+Cyv5nWOschV=s{m7_ z>@cZIqA+epXyxQ<8;o`FYiUwtX#oRIF=nWgl9R_BvKm z2eA(@`&i_ULe>e`DBi3uVQ-0d*H*DalKGWZ=ek};VuJd8Wj5Ct(7j_t$wWm7;}T&` zN4m@mnIXfB`Hg_C9Ki(*B6DMr5#5+B9DF*c@5Ll25i)aoB$yZv>)qr;>9T1=21@rp zI1(61mMSMom2~-|(ePoukh(9Pka7;-KWXA7k7xVI>O+54KqNBoCSxdb=~P}^)o3wz~R77$M1KN3%Lm8F>6tj}h$ z*}B>_kFlSMGbN?gCtp0{NT}#v1Irf)e7QD_Dy5t;9t!hSB$kd?#Ll(*p}7|#w|*$< zH-dAzV%iItcH&=#SwGHh+&wMCwJOt^h5>_P)E=@5HrzOW8TW_Ag~0h}!*I z5)uY416+V>1auKnwf@f#q{iYO;q@;B(u1p9P@`)vtkp-~R5hFN1wl8VWHFoV-`_H_ zd4mk;dvk&Hr~R5^Zy&u;Wy9oZEz&U*lj-L8D1QYI4NH$KN7TUR=;hvJi&+b3mDRMJr}k z#CzJ-vcEx~jz3ipJX8e&!%YTV^~JjWrCSf6`yBvylNp-k$A_PNXGArUZrV1TEcO?& zs#my&*_SLFF?Kaeh-dm2w!*U<9_3y@86fqIEj{Zfrf8`3+(X>aUz(XNKI>oZN@w1G K%o7d%_x=lrU*xX< delta 5419 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 diff --git a/wan23/modules/__pycache__/tokenizers.cpython-312.pyc b/wan23/modules/__pycache__/tokenizers.cpython-312.pyc index 91cb8050acca848a3749f2083806e5a66de81de8..c6f06dd8127d401f76810fa427f5d6a2f3cd1853 100644 GIT binary patch delta 65 zcmew@|3semG%qg~0}x!8Fg5eyM&8+s62{I}G3EJ1*~JBk$*CY#PD)Hx`S3 S8Eb8xG-UArc~@kJ`olPeP^qf^8BLg;)2BFR1hmCB_=Y|*L8Cs si*o^E#pJ0aX>1I9Iv07hH#3)NGcmSJ)-NxCiL5SfU}U^CS*P+J03QV)mjD0& delta 124 zcmeDG!no=SBj0IWUM>b8h}*g`qd96Lp9qV-o3m9+XmM&$ag33%p{YrXOMZD?PJUua zaZF^Wud8luVrHJMA%eZxip9Brv1)Q%Ng4+WC*MZ~AhG#Xi8d2s$7Hec5)M|77?9XJ Op}c{S@z-R*%6|aF{wNaw diff --git a/wan23/modules/__pycache__/vae2_2.cpython-312.pyc b/wan23/modules/__pycache__/vae2_2.cpython-312.pyc index c2e308bc396bce6ee63ebfde35a9e8372a25b1d4..64c4caf91da212c131a7a0daeb577adcf563c66e 100644 GIT binary patch delta 98 zcmX@Jn`z^2Cce|Wyj%=GaACsKOxKo;d?#2W^qs9@%JYk|iwhEyQ$ehpl$gj+U)Rm7 utl|?Hw@sFv*2=~pWN=YXfAgwoX3UHyCO@1x9VXH+>n|hYt<80F{1^eLT_dUh delta 125 zcmdnEo9WDMCce|Wyj%=Gz$|nrL$qNd-w76dH)pGu(Bjmh;us@iLsOF&m;Ca)oczR; z;+V)#Usv7S#LPThLj-&CI~MVYj5{W?O>5;~~* RbLy Date: Thu, 12 Mar 2026 19:26:33 +1100 Subject: [PATCH 33/33] req --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 6aae4f1..83181d6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -149,7 +149,7 @@ torchdiffeq>=0.2.4 torchmetrics>=1.5.1 #torchvision>=0.20.0+cu121 tqdm>=4.66.5 -transformers>=4.46.1 +transformers>=4.46.1,<5.0 triton-windows>=3.1.0 typer>=0.16.0 types-PyYAML>=6.0.12.20250516