SPAC-4B-ZeroGPU / app.py
Jack04810's picture
Build and validate native SPAC extensions for ZeroGPU Blackwell
3a68bf0 verified
Raw History Blame Contribute Delete
2.19 kB
import spaces
import torch
import gradio as gr
from native_bootstrap import ensure_native,CACHE
ensure_native()
@spaces.GPU(duration=20)
def probe_gpu():
import tempfile
from pathlib import Path
import trimesh
import torchsparse
from spac.sparse import SparseTensor,SparseConv3d
from spac.geometry import mesh_to_sdf
torchsparse.backends.allow_tf32=False
torch.backends.cuda.matmul.allow_tf32=False
torch.backends.cudnn.allow_tf32=False
torch.manual_seed(42)
xyz=torch.cartesian_prod(*(torch.arange(3,device='cuda') for _ in range(3))).int()
coords=torch.cat([torch.zeros((len(xyz),1),device='cuda',dtype=torch.int32),xyz],dim=1)
feats=torch.ones((len(xyz),4),device='cuda',dtype=torch.float32)
conv=SparseConv3d(4,4,3).to('cuda').eval()
with torch.no_grad():output=conv(SparseTensor(feats,coords))
assert output.feats.dtype==torch.float32 and torch.isfinite(output.feats).all()
with tempfile.TemporaryDirectory() as directory:
mesh=Path(directory)/'cube.obj';trimesh.creation.box().export(mesh)
sdf=mesh_to_sdf(str(mesh),torch.device('cuda'),resolution=16,band=.5)
assert len(sdf['coords'])>0 and torch.isfinite(sdf['feats']).all()
return {'gpu':torch.cuda.get_device_name(),'torch':torch.__version__,'cuda':torch.version.cuda,
'cxx11_abi':torch._C._GLIBCXX_USE_CXX11_ABI,'sparse_conv_fp32':True,'sdf_kernel':True,
'external_inference_backend':False}
def native_artifacts():
return [str(p) for p in sorted((CACHE/'wheels').glob('*.whl'))]
with gr.Blocks(title='SPAC-4B ZeroGPU') as demo:
gr.Markdown('# SPAC-4B ZeroGPU native compatibility check\nTemporary CUDA-extension test. Full model inference is not enabled yet.')
button=gr.Button('Run native GPU compatibility check')
result=gr.JSON(label='Hugging Face runtime')
button.click(probe_gpu,outputs=result,api_name='probe_gpu')
artifacts=gr.File(label='Native extension artifacts',file_count='multiple',visible=False)
gr.Button(visible=False).click(native_artifacts,outputs=artifacts,api_name='native_artifacts',queue=False)
demo.queue().launch(allowed_paths=[str(CACHE/'wheels')])