"""量清楚 condition_proj 的 fp32 真值幅度:决定是局部修还是整条路径抬 fp32。""" import os, torch, torch.nn.functional as F BASE="/data/models/minimax-h3" os.environ.setdefault("DIFFSYNTH_ATTENTION_IMPLEMENTATION","torch") os.environ.setdefault("DIFFSYNTH_MODEL_BASE_PATH", f"{BASE}/models") os.environ.setdefault("MODELSCOPE_CACHE", f"{BASE}/.mscache") from diffsynth.pipelines.minimax_h3_audio_video import MiniMaxH3Pipeline, ModelConfig DT=torch.float16 free=torch.cuda.mem_get_info("cuda")[0]/1024**3 vc=dict(offload_dtype=DT,offload_device="cpu",onload_dtype=DT,onload_device="cpu", preparing_dtype=DT,preparing_device="cuda",computation_dtype=DT,computation_device="cuda") NF4="DiffSynth-Studio/MiniMax-H3-NF4" pipe=MiniMaxH3Pipeline.from_pretrained(torch_dtype=DT,device="cuda", model_configs=[ModelConfig(model_id=NF4,origin_file_pattern=p,**vc) for p in ["minimax-h3-fl2va-nf4.safetensors","minimax-h3-text-encoder-nf4.safetensors", "video_vae_nf4.safetensors","audio_vae_nf4.safetensors"]], processor_config=ModelConfig(model_id="MiniMax/MiniMax-H3",origin_file_pattern="FL2VA/processor/"), vram_limit=max(6.0,free-2.0)) pipe.load_lora(pipe.dit, ModelConfig(model_id="lightx2v/Minimax-h3-Turbo", origin_file_pattern="minimax_h3_fl2v_turbo_4step_v1.0_768p_bf16.safetensors")) cp = pipe.dit.condition_proj class Stop(Exception): pass res={} orig_lf = cp.linear_forward orig_lora = cp.lora_forward def lf(x, weight, bias): o32 = F.linear(x.float(), weight.float(), bias.float() if bias is not None else None) res["x_absmax"]=float(x.abs().max()); res["x_dtype"]=str(x.dtype) res["lin32_absmax"]=float(o32.abs().max()) res["lin32_over_fp16"]=float((o32.abs()>65504).float().mean())*100 res["lin32"]=o32 return o32 def lora(x, out): o = out for A,B in zip(cp.lora_A_weights, cp.lora_B_weights): o = o + x.float() @ A.T.to(device=x.device,dtype=torch.float32) @ B.T.to(device=x.device,dtype=torch.float32) res["n_lora"]=len(cp.lora_A_weights) res["final32_absmax"]=float(o.abs().max()) res["final32_over_fp16"]=float((o.abs()>65504).float().mean())*100 res["p999"]=float(torch.quantile(o.abs().flatten().float(), 0.999)) raise Stop() cp.linear_forward=lf; cp.lora_forward=lora try: pipe(prompt="一只橘猫在窗台上打哈欠", height=480,width=832,num_frames=124, num_inference_steps=1, seed=42, flow_shift=6.0) except Stop: pass print("\n===== condition_proj fp32 真值 =====") for k in ["x_dtype","x_absmax","lin32_absmax","lin32_over_fp16","n_lora","final32_absmax","final32_over_fp16","p999"]: if k in res: print(f" {k:20s} = {res[k]}") print(f" fp16 上限 = 65504")