This repository has been archived on 2026-08-19. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
ROCm-Research-Archive/Scripts and Tests/test_sync_crash.py
T
2026-08-20 00:45:43 +02:00

74 lines
2.5 KiB
Python

"""Test if torch.cuda.synchronize() crashes after F.linear on gfx1010"""
import torch
import torch.nn.functional as F
import time, os, signal, sys
os.environ['HSA_OVERRIDE_GFX_VERSION'] = '10.1.0'
os.environ['HSA_ENABLE_SDMA'] = '0'
os.environ['TORCHDYNAMO_DISABLE'] = '1'
# Catch SIGSEGV
def segfault_handler(signum, frame):
print(f"\n*** SIGNAL {signum} (SIGSEGV) CAUGHT ***", flush=True)
sys.exit(1)
signal.signal(signal.SIGSEGV, segfault_handler)
print(f"Device: {torch.cuda.get_device_name(0)}", flush=True)
# Simulate exactly what the model does:
# For each layer: transfer from CPU → F.linear → sync → next layer
shapes = [
("CBW505", (1024, 256)),
("CBW506", (256, 1024)),
("CBW507", (3840, 2560)),
("CBW508", (3840, 64)),
("CBW509", (11520, 3840)), # This is where ComfyUI crashes
("CBW510", (3840, 3840)),
("CBW511", (3840, 3840)),
("CBW512", (11520, 3840)),
("CBW513", (3840, 11520)),
]
# Start with latent-like input
x = torch.randn(1, 1024, 256, dtype=torch.float16, device='cuda:0')
torch.cuda.synchronize()
print("Initial input on GPU", flush=True)
for i, (name, (out_feat, in_feat)) in enumerate(shapes):
print(f"\n--- {name}: Linear({in_feat} -> {out_feat}) ---", flush=True)
# Step 1: Pre-sync (like v20 patch)
print(f" pre-sync...", flush=True)
torch.cuda.synchronize()
print(f" pre-sync OK", flush=True)
# Step 2: CPU dequant simulation → transfer to GPU
w_cpu = torch.randn(out_feat, in_feat, dtype=torch.float16)
b_cpu = torch.randn(out_feat, dtype=torch.float16)
print(f" CPU weights created", flush=True)
w_gpu = w_cpu.to('cuda:0', non_blocking=False)
b_gpu = b_cpu.to('cuda:0', non_blocking=False)
print(f" transferred to GPU", flush=True)
# Step 3: Adjust input dimension
if x.shape[-1] != in_feat:
x = torch.randn(1, 1024, in_feat, dtype=torch.float16, device='cuda:0')
torch.cuda.synchronize()
print(f" input resized to [{1}, {1024}, {in_feat}]", flush=True)
# Step 4: F.linear (dispatches GPU kernel)
print(f" F.linear starting...", flush=True)
x = F.linear(x, w_gpu, b_gpu)
print(f" F.linear dispatched, out={list(x.shape)}", flush=True)
# Step 5: Post-sync (forces GPU to finish and report errors)
print(f" post-sync...", flush=True)
torch.cuda.synchronize()
print(f" post-sync OK", flush=True)
del w_cpu, b_cpu, w_gpu, b_gpu
print(f" {name} DONE", flush=True)
print("\n=== ALL PASSED ===")