Spaces:
Running on Zero
Running on Zero
File size: 2,076 Bytes
7826761 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | """Numerical assertions used to validate actual ZeroGPU requests."""
import gc
import torch
def native_probe():
import nvdiffrast.torch as dr
from flame_solver import FlameSolverOps, SolverContext
ops = FlameSolverOps()
report = []
for i in range(3):
ctx = SolverContext.create(ops.extension)
raster = None
try:
j_cpu = torch.tensor([[1., 2., 0.], [0., 1., 3.], [2., 0., 1.], [1., -1., 1.]], dtype=torch.float64)
r_cpu = torch.tensor([1., -2., 3., .5], dtype=torch.float64)
h = j_cpu.T @ j_cpu
expected = torch.linalg.solve(h + torch.diag(.01 * h.diag() + 1e-6), -j_cpu.T @ r_cpu)
j, r = j_cpu.float().cuda(), r_cpu.float().cuda()
actual = ops.solve_normal_equation(ctx, j, r, .01)
torch.testing.assert_close(actual.cpu().double(), expected, rtol=1e-4, atol=1e-5)
batched = ops.solve_normal_equation(ctx, j[None].repeat(2, 1, 1), r[None].repeat(2, 1), .01)
torch.testing.assert_close(batched.cpu().double(), expected[None].repeat(2, 1), rtol=1e-4, atol=1e-5)
raster = dr.RasterizeCudaContext()
v = torch.tensor([[[-.7, -.7, 0., 1.], [.7, -.7, 0., 1.], [0., .7, 0., 1.]]], device="cuda")
f = torch.tensor([[0, 1, 2]], device="cuda", dtype=torch.int32)
rast, _ = dr.rasterize(raster, v, f, resolution=[64, 64])
count = int((rast[..., 3] > 0).sum().item())
assert 500 < count < 1500, count
torch.cuda.synchronize()
report.append({"iteration": i + 1, "solver_max_error": float((actual.cpu().double() - expected).abs().max()), "raster_pixels": count})
finally:
torch.cuda.synchronize()
ops.extension.destroy_cublas_handle(ctx.cublas_handle)
ops.extension.destroy_cusolver_handle(ctx.cusolver_handle)
del raster
gc.collect()
return {"passed": True, "gpu": torch.cuda.get_device_name(0), "torch": torch.__version__, "cuda": torch.version.cuda, "tests": report}
|