borch

같은 페이지 · 같은 GPU · 같은 가중치 · 숫자마다 어댑터

유사 솔루션 실측 비교

오늘 브라우저에서 WebGPU 로 신경망을 학습하는 라이브러리는 셋 — TF.js, jax-js, Burn — 이고, 추론만 하는 런타임이 하나, ONNX Runtime Web 이다. 이 페이지는 그 넷을 borch.ts 와 같은 페이지, 같은 GPU 에서, 같은 시드 데이터 또는 torch 에서 내보낸 같은 가중치로 돌리고, 숫자 아래마다 어댑터를 찍는다. borch 가 지는 행은 남기고, 모든 표를 재현하는 명령은 맨 아래에 있다. Chrome 과 WebGPU 가 필요하다. 숫자는 그날 그 카드의 것이고, run 이 움직일 때 움직인다.

한 줄로. 학습: TF.js 보다 4.5–10×, jax-js 보다 2.8–7.5×, Burn 보다 14–18× 빠르다. 추론: 캡처한 forward 가 세 어댑터·두 배치 모두에서 ONNX Runtime Web 의 f32 파일을 앞선다, ResNet 도 ViT 도. 가장 가까운 행은 Metal batch 16 의 ORT f16 파일로, 무승부다. ORT 의 int8 파일은 브라우저에서 GPU 경로가 아니고, borch 의 int8 forward 는 같은 top-1 에서 ORT 최선의 4 분의 1 이다. 대가: 첫 호출이 컴파일한다(0.05–0.2 초, 기계당·모양당 한 번, 브라우저가 보관), 그리고 eager 경로는 되감기보다 느리다.

학습 — ResNet-18 (CIFAR), 스텝당 ms

같은 구조, SGD 0.05/0.9, 교차엔트로피, 같은 시드 픽셀; 워밍업 2회 뒤 5회 측정, 매 스텝 손실 리드백을 넣어 GPU 가 끝나는 시점까지 시계에 들어간다. 라이브러리마다 자기 레이아웃(NHWC 또는 NCHW)과 자기 옵티마이저로 돈다 — 그 차이가 비교의 일부다.

어댑터 · 날짜라이브러리batch 163264borch 대비
apple / metal-3 · 2026-09-22, borch-ts 0.6.0 게시본borch.ts19.331.755.11×
TF.js 4.22.0 (WebGPU)86.5172.8349.14.5× · 5.5× · 6.3× 느림
jax-js 0.1.25 + optax 0.1.268.197.1152.23.5× · 3.1× · 2.8×
Burn 0.21 (Rust → wasm, wgpu)264.7520.71025.613.7× · 16.4× · 18.5×
nvidia / blackwell (RTX 5080, Linux, Vulkan, Chrome 151) · 2026-09-22, borch-ts 0.6.0 게시본 (두 run)borch.ts10.7–11.314.2–14.722.6–23.11×
TF.js 4.22.075.0121.4223.36.6× · 8.3× · 9.9×
jax-js 0.1.25 + optax 0.1.272.286.3114.16.7× · 6.1× · 4.9×
Burn 0.21이 기계엔 Rust 툴체인이 없어 빌드하지 않음 — Burn 의 NVIDIA 값은 아래 4090 행
nvidia / lovelace (RTX 4090, Linux, Vulkan, Chrome 153) · 2026-09-22, borch-ts 0.6.0 게시본 (두 run)borch.ts10.0–10.510.9–12.317.7–17.91×
TF.js 4.22.067.5113.7211.76.4× · 10.4× · 12.0×
jax-js 0.1.25 + optax 0.1.267.374.4103.66.7× · 6.0× · 5.8×
Burn 0.21 (Rust → wasm, wgpu)115.7248.5516.911.6× · 20.2× · 28.9×
nvidia / blackwell, Direct3D 12 경유 (RTX 5050 Laptop, Windows 11) · 2026-09-21borch.ts32.353.798.11×
TF.js 4.22.0174.8334.9659.25.4× · 6.2× · 6.7×

2026-09-03 에 같은 페이지는 TF.js 대비 2.2–2.9× 였다. TF.js 는 움직이지 않았고(같은 바이트, 86.4 → 86.5), borch 가 움직였다 — subgroup 행렬 위의 합성곱 backward, 융합된 옵티마이저 스텝, 카드마다 측정으로 고른 커널. jax-js 에는 BatchNorm 과 교차엔트로피 모듈이 없어 그 스텝은 있는 것으로 조립했고, Burn 의 wasm wgpu 백엔드는 단일 스레드로 리드백마다 동기화한다(그리고 batch 16 에서 4090 이 Metal 보다 2.3× 빠르다 — borch 와의 거리가 카드 따라 움직이는 유일한 라이브러리). 각각 그 라이브러리가 오늘 브라우저에서 할 수 있는 최선이지, 그 라이브러리의 최적 구현은 아니다.

추론 — ResNet-18 (CIFAR) forward, ms

torch 에서 한 번 내보낸 같은 신경망 — borch.ts 에는 safetensors, ORT 에는 ONNX — 이고, 두 런타임이 시드 입력에서 torch 의 logits 를 1e-3 안에서 재현한 뒤에만 표를 찍는다(실측 ~5e-8). 워밍업 3회 뒤 20회 평균, forward 마다 scope 하나, 리드백 포함. borch 행은 eval forward 를 기록해 되감은 것(compiled(model))이다.

어댑터런타임batch 1batch 16borch / ORT (1× 미만이면 borch 가 앞섬)
apple / metal-3 · 2026-09-22borch.ts f32, fused + captured1.094.120.25× · 0.78×
ONNX Runtime Web 1.29.0, f324.355.30
ONNX Runtime Web, f16 파일 (입출력 f32)3.294.260.33× · 0.97× — 무승부
nvidia / blackwell (RTX 5080, Vulkan, Chrome 151) · 2026-09-22, 0.6.0 게시본borch.ts f32, fused + captured0.561.630.15× · 0.44×
borch.ts int8 static + captured0.520.960.14× · 0.26×
ONNX Runtime Web 1.29.0, f323.753.72
ONNX Runtime Web, f16 파일세션 거부 — 이 카드의 Chrome(Linux, Vulkan)은 ORT 의 디바이스에 f16 을 주지 않는다
ONNX Runtime Web, int8 파일 (QDQ) · WebGPU / wasm 프로바이더38.6 / 4.0109.3 / 55.2자기 f32 보다 10–29× 느림
nvidia / lovelace (RTX 4090, Vulkan, Chrome 153) · 2026-09-22, 0.6.0 게시본borch.ts f32, fused + captured0.581.650.16× · 0.46×
borch.ts int8 static + captured0.560.830.15× · 0.23×
ONNX Runtime Web 1.29.0, f323.703.61
ONNX Runtime Web, f16 파일세션 거부, 5080 과 같다 — Linux Chrome 은 ORT 의 디바이스에 f16 을 주지 않는다
ONNX Runtime Web, int8 파일 (QDQ) · WebGPU / wasm 프로바이더40.9 / 4.6104.6 / 64.3자기 f32 보다 11–29× 느림
nvidia / blackwell, Direct3D 12 경유 (RTX 5050 Laptop) · 2026-09-21borch.ts f32, fused + captured1.69–1.816.50–7.290.25–0.30× · 0.41–0.46×
ONNX Runtime Web 1.29.0, f325.67–7.3415.7–16.0

같은 1,000장 held-out CIFAR-10 의 top-1, 이 시험을 위해 학습한 신경망, 5080: borch f32 92.40 %, borch int8 static 92.50 %, ORT f32 92.40 %, ORT int8 92.50 %. 양자화된 신경망은 같은 신경망이고, 다른 것은 누가 GPU 에서 돌리느냐다. ORT 의 int8 파일은 모든 어댑터에서 자기 f32 보다 WebGPU 에서 느리고(Metal 6×, 5080 11–28×) batch 1 에서는 wasm 프로바이더보다도 느리다 — 양자화된 합성곱이 WebGPU 프로바이더의 것이 아니다.

추론 — ViT-Tiny/16 (224², 1000 클래스) forward, ms

timm 의 vit_tiny_patch16_224 seed 0, borch 쪽은 bimm-ts 모델, 둘 다 torch 의 logits 로 게이트(실측 ~1e-6). 트랜스포머용으로 이 라이브러리에 쓴 것은 없다: 선형층은 합성곱의 GEMM 타일로, 어텐션은 배치 행렬곱과 subgroup softmax 로 돈다.

어댑터borch captured, b1ORT f32, b1borch, b16ORT, b16borch / ORT (1× 미만이면 borch 가 앞섬)
apple / metal-3 · 2026-09-22 (토큰 열 197 → 200 패딩, subgroup 행렬)2.225.4610.6419.770.41× · 0.54×
nvidia / blackwell (RTX 5080, Vulkan, Chrome 151) · 2026-09-22, 0.6.0 게시본 — 이 카드엔 f32 subgroup 행렬이 없어 스칼라 GEMM1.786.555.0014.110.27× · 0.35×
nvidia / lovelace (RTX 4090, Vulkan, Chrome 153) · 2026-09-22, 0.6.0 게시본 — 5080 과 같은 커널 집합, 토큰 197 패딩 없음1.678.124.8811.410.21× · 0.43×
nvidia / blackwell, Direct3D 12 경유 (RTX 5050 Laptop) · 2026-09-213.31–3.3710.0–11.824.0–27.847.5–61.00.29–0.33× · 0.46–0.50×

이 페이지가 말하지 않는 것

재현

이 페이지의 모든 표는 소프트웨어 어댑터를 거부하고 숫자 아래에 기계를 적는 러너가 찍는다.

git clone https://github.com/playidea-lab/borch && cd borch && npm ci && npm run build:ts
npm run compare:ts          # 학습 vs TF.js · 추론 vs ORT Web f32/f16/int8 · ViT-Tiny
npm run compare-peers:ts    # jax-js 와 Burn (Burn crate 는 tests/browser/burn_resnet18 에서 빌드)
npm run capture:ts          # 기록, 튜너, 첫 호출의 비용

숫자마다 뒤에 있는 원장 — run 전에 적은 예측과 그중 틀린 것 — 은 docs/BOOK.md("How fast it is"), docs/INFER.md, docs/INT8.md, docs/GEMM.md, docs/COMPILER.md, docs/FIRST.md 다. 바이트 고정: TF.js 4.22.0, jax-js 0.1.25, Burn 0.21, ONNX Runtime Web 1.29.0 (tests/browser/assets.lock).