28 lines
1.2 KiB
Python
28 lines
1.2 KiB
Python
|
|
"""Replay direct Qwen against an immutable per-layer Comfy trace."""
|
||
|
|
|
||
|
|
import argparse
|
||
|
|
from pathlib import Path
|
||
|
|
|
||
|
|
import torch
|
||
|
|
|
||
|
|
from h3_blackwell_runtime.qwen3vl_text import Qwen3VL32BTextEncoder
|
||
|
|
|
||
|
|
|
||
|
|
parser = argparse.ArgumentParser()
|
||
|
|
parser.add_argument("--trace-dir", type=Path, required=True)
|
||
|
|
parser.add_argument("--checkpoint", default="/text-encoders/qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors")
|
||
|
|
args = parser.parse_args()
|
||
|
|
|
||
|
|
encoder = Qwen3VL32BTextEncoder(args.checkpoint).eval()
|
||
|
|
hidden = torch.load(args.trace_dir / "qwen_input_embeds.pt", map_location="cuda", weights_only=False).to(encoder.dtype)
|
||
|
|
|
||
|
|
with torch.inference_mode():
|
||
|
|
for index, layer in enumerate(encoder.layers):
|
||
|
|
hidden = layer(hidden)
|
||
|
|
expected = torch.load(args.trace_dir / "qwen_layers" / f"{index:02d}.pt", map_location="cuda", weights_only=False)
|
||
|
|
delta = (hidden.float() - expected.float()).abs()
|
||
|
|
print(f"layer={index:02d} max_abs={delta.max().item():.6g} mean_abs={delta.mean().item():.6g}")
|
||
|
|
expected = torch.load(args.trace_dir / "qwen_layer50.pt", map_location="cuda", weights_only=False)
|
||
|
|
delta = (hidden.float() - expected.float()).abs()
|
||
|
|
print(f"layer50 max_abs={delta.max().item():.6g} mean_abs={delta.mean().item():.6g}")
|