import { StrictMode, useEffect, useRef, useState } from 'react' import { createRoot } from 'react-dom/client' import { compareFloat32, type TensorComparison } from './models/triposplat/tensorMath' import { OrtWorkerClient, type OrtWorkerStatus } from './runtime/OrtWorkerClient' import { createTensorPayload } from './runtime/tensors' const DEFAULT_MODEL = '/models/triposplat/dit_step.onnx' const DEFAULT_FIXTURE = '/fixtures/generated/dit-step-fp32' const SESSION_ID = 'triposplat/dit-parity' const FP16_TOLERANCE = { absolute: 0.04, relative: 0.03, minimumCosineSimilarity: 0.9999 } const FP32_TOLERANCE = { absolute: 0.00002, relative: 0.001, minimumCosineSimilarity: 0.999999999 } const SHAPES = { latent: [1, 8192, 16], camera: [1, 1, 5], t: [1], feature1: [1, 4101, 1280], feature2: [1, 4101, 128], pred_latent: [1, 8192, 16], pred_camera: [1, 1, 5], } as const interface OutputGate extends TensorComparison { fractionWithinTolerance: number maxErrorIndex: number referenceAtMaxError: number candidateAtMaxError: number firstMismatches: Array<{ index: number; reference: number; candidate: number }> passed: boolean } interface DitLabResult { passed: boolean executionProvider: string modelLoadMs: number modelTransferBytes?: number inferenceMs: number readbackMs: number outputs?: { pred_latent: OutputGate pred_camera: OutputGate } probes?: Record tolerance: { absolute: number; relative: number; minimumCosineSimilarity: number } environment: { userAgent: string crossOriginIsolated: boolean webgpu: boolean } } interface ProbeManifest { includeFinalOutputs?: boolean outputs: Array<{ name: string; path: string; shape: number[]; elements: number }> } declare global { interface Window { __TRIPOSPLAT_DIT_RESULT__?: DitLabResult } } async function fetchFloat32(url: string, expectedElements: number): Promise { const response = await fetch(url) if (!response.ok) throw new Error(`Could not fetch ${url}: HTTP ${response.status}`) const buffer = await response.arrayBuffer() if (buffer.byteLength !== expectedElements * 4) { throw new Error(`${url} has ${buffer.byteLength} bytes; expected ${expectedElements * 4}.`) } return new Float32Array(buffer) } function elementCount(shape: readonly number[]): number { return shape.reduce((product, value) => product * value, 1) } type DitTolerance = typeof FP16_TOLERANCE async function fixtureTolerance(fixtureUrl: string): Promise { const response = await fetch(`${fixtureUrl}/manifest.json`) if (response.status === 404) return FP16_TOLERANCE if (!response.ok) throw new Error(`Could not fetch fixture manifest: HTTP ${response.status}`) const manifest = await response.json() as { metadata?: { internal_precision?: unknown } } return manifest.metadata?.internal_precision === 'fp32' ? FP32_TOLERANCE : FP16_TOLERANCE } function gateOutput( reference: Float32Array, candidate: Float32Array, tolerance: DitTolerance, ): OutputGate { const comparison = compareFloat32(reference, candidate) let within = 0 let maxErrorIndex = 0 let maxError = -1 const firstMismatches: OutputGate['firstMismatches'] = [] for (let index = 0; index < reference.length; index += 1) { const error = Math.abs(reference[index] - candidate[index]) const isWithin = error <= tolerance.absolute + tolerance.relative * Math.abs(reference[index]) if (error > maxError) { maxError = error maxErrorIndex = index } if (isWithin) { within += 1 } else if (firstMismatches.length < 8) { firstMismatches.push({ index, reference: reference[index], candidate: candidate[index] }) } } const fractionWithinTolerance = within / reference.length return { ...comparison, fractionWithinTolerance, maxErrorIndex, referenceAtMaxError: reference[maxErrorIndex], candidateAtMaxError: candidate[maxErrorIndex], firstMismatches, passed: comparison.finite && fractionWithinTolerance === 1 && comparison.cosineSimilarity >= tolerance.minimumCosineSimilarity, } } async function contentLength(url: string): Promise { try { const response = await fetch(url, { method: 'HEAD' }) if (!response.ok) return undefined const value = Number(response.headers.get('content-length')) return Number.isFinite(value) && value >= 0 ? value : undefined } catch { return undefined } } function initialUrl(parameter: string, fallback: string): string { return new URLSearchParams(window.location.search).get(parameter) ?? fallback } export function DitLab() { const clientRef = useRef(null) const autoRunStartedRef = useRef(false) const runRef = useRef<() => Promise>(async () => undefined) const [modelUrl, setModelUrl] = useState(() => initialUrl('model', DEFAULT_MODEL)) const [fixtureUrl, setFixtureUrl] = useState(() => initialUrl('fixture', DEFAULT_FIXTURE)) const [status, setStatus] = useState('Ready to validate one official DiT invocation.') const [busy, setBusy] = useState(false) const [error, setError] = useState(null) const [result, setResult] = useState(null) useEffect(() => () => { const client = clientRef.current clientRef.current = null if (client) void client.dispose() }, []) const run = async () => { if (busy) return setBusy(true) setError(null) setResult(null) delete window.__TRIPOSPLAT_DIT_RESULT__ let client: OrtWorkerClient | undefined try { if (clientRef.current) await clientRef.current.dispose() const onStatus = (event: OrtWorkerStatus) => setStatus(event.message) client = new OrtWorkerClient({ onStatus }) clientRef.current = client setStatus('Fetching deterministic official one-step tensors…') const tolerance = await fixtureTolerance(fixtureUrl) const names = Object.keys(SHAPES) as Array const tensors = Object.fromEntries(await Promise.all(names.map(async (name) => [ name, await fetchFloat32(`${fixtureUrl}/${name}.f32`, elementCount(SHAPES[name])), ]))) as Record let probeManifest: ProbeManifest | undefined const probeManifestResponse = await fetch(`${fixtureUrl}/probes.json`) if ( probeManifestResponse.ok && probeManifestResponse.headers.get('content-type')?.includes('application/json') ) { probeManifest = await probeManifestResponse.json() as ProbeManifest } else if (!probeManifestResponse.ok && probeManifestResponse.status !== 404) { throw new Error(`Could not fetch probe manifest: HTTP ${probeManifestResponse.status}`) } const probeReferences = probeManifest ? Object.fromEntries(await Promise.all(probeManifest.outputs.map(async ({ name, path, elements }) => [ name, await fetchFloat32(`${fixtureUrl}/${path}`, elements), ]))) as Record : undefined const sidecarUrl = `${modelUrl}.data` const externalDataPath = new URL(modelUrl, document.baseURI).pathname.split('/').at(-1) if (!externalDataPath) throw new Error(`Could not derive external-data path from ${modelUrl}.`) const transferParts = await Promise.all([contentLength(modelUrl), contentLength(sidecarUrl)]) const modelTransferBytes = transferParts.every((value) => value !== undefined) ? transferParts.reduce((sum, value) => sum + (value ?? 0), 0) : undefined const loaded = await client.loadSession({ sessionId: SESSION_ID, manifest: { graphUrl: modelUrl, externalData: [{ path: `${decodeURIComponent(externalDataPath)}.data`, url: sidecarUrl }], }, options: { allowWasmFallback: false, graphOptimizationLevel: 'disabled', }, }) if (loaded.executionProvider !== 'webgpu') { throw new Error(`Expected WebGPU, loaded ${loaded.executionProvider}.`) } const response = await client.runSession({ sessionId: SESSION_ID, inputs: { latent: createTensorPayload('float32', tensors.latent, SHAPES.latent), camera: createTensorPayload('float32', tensors.camera, SHAPES.camera), t: createTensorPayload('float32', tensors.t, SHAPES.t), feature1: createTensorPayload('float32', tensors.feature1, SHAPES.feature1), feature2: createTensorPayload('float32', tensors.feature2, SHAPES.feature2), }, outputs: [ ...(probeManifest?.includeFinalOutputs === false ? [] : ['pred_latent', 'pred_camera']), ...(probeManifest?.outputs.map(({ name }) => name) ?? []), ], tag: 'official-one-step-parity', }) const outputs = probeManifest?.includeFinalOutputs === false ? undefined : (() => { const predLatent = response.outputs.pred_latent const predCamera = response.outputs.pred_camera if (!predLatent || predLatent.type !== 'float32' || !predCamera || predCamera.type !== 'float32') { throw new Error('DiT did not return both public float32 outputs.') } return { pred_latent: gateOutput(tensors.pred_latent, predLatent.data, tolerance), pred_camera: gateOutput(tensors.pred_camera, predCamera.data, tolerance), } })() const probes = probeReferences ? Object.fromEntries(Object.entries(probeReferences).map(([name, reference]) => { const payload = response.outputs[name] if (!payload || payload.type !== 'float32') { throw new Error(`DiT probe '${name}' did not return float32 data.`) } return [name, gateOutput(reference, payload.data, tolerance)] })) : undefined const next: DitLabResult = { passed: (outputs === undefined || (outputs.pred_latent.passed && outputs.pred_camera.passed)) && (probes === undefined || Object.values(probes).every(({ passed }) => passed)), executionProvider: loaded.executionProvider, modelLoadMs: loaded.loadMs, modelTransferBytes, inferenceMs: response.timings.inferenceMs, readbackMs: response.timings.readbackMs, outputs, probes, tolerance, environment: { userAgent: navigator.userAgent, crossOriginIsolated: self.crossOriginIsolated, webgpu: 'gpu' in navigator, }, } window.__TRIPOSPLAT_DIT_RESULT__ = next setResult(next) setStatus(next.passed ? 'PASS: one WebGPU DiT invocation matches official PyTorch.' : 'FAIL: WebGPU DiT output drift exceeds tolerance.') } catch (caught) { const message = caught instanceof Error ? caught.message : String(caught) setError(message) setStatus('DiT validation failed.') } finally { setBusy(false) } } runRef.current = run useEffect(() => { const timeout = window.setTimeout(() => { if ( new URLSearchParams(window.location.search).get('autorun') === '1' && !autoRunStartedRef.current ) { autoRunStartedRef.current = true void runRef.current() } }, 0) return () => window.clearTimeout(timeout) }, []) return (

TripoSplat DiT · WebGPU parity

Loads the query-chunked official one-step graph and compares one browser invocation with an untouched PyTorch fixture.

{status}

{error ?
{error}
: null} {result ?
{JSON.stringify(result, null, 2)}
: null}
) } const style = document.createElement('style') style.textContent = ` :root { color: #ececf3; background: #101014; font: 15px/1.5 ui-monospace, SFMono-Regular, Menlo, monospace; } body { margin: 0; } main { max-width: 920px; margin: 0 auto; padding: 48px 24px; } h1 { font: 600 28px/1.2 system-ui, sans-serif; } label { display: grid; gap: 6px; margin: 18px 0; } input { box-sizing: border-box; width: 100%; padding: 10px; color: inherit; background: #1b1b22; border: 1px solid #3a3a48; border-radius: 6px; } button { padding: 10px 16px; color: #08080a; background: #f8cf00; border: 0; border-radius: 6px; font-weight: 700; cursor: pointer; } button:disabled { opacity: .55; cursor: wait; } pre { overflow: auto; padding: 16px; background: #18181f; border-radius: 8px; } .error { color: #ff9b9b; } ` document.head.append(style) createRoot(document.getElementById('root')!).render( , )