수치적 동등성

백엔드끼리는 결코 bit 단위로 일치하지 않는다; 스웜은 측정된 허용오차를 일급 계약으로 다룬다.

CUDA, ROCm, Adreno, CPU는 같은 연산을 서로 다른 리덕션 순서, FMA 융합, accumulator, 초월함수 근사로 계산합니다 — 그래서 결과는 op당 ~1e-6…1e-3씩 다르고, 설계상 절대 bit-identical하지 않습니다. 어떤 하드웨어든 오는 대로 이뤄지는 스웜은 bit 일치를 요구할 수 없으므로, Kvasir는 대신 동등성을 측정합니다.

백엔드 쌍 (실제 122B, layer-0 전문가)max|Δ|cosine
CUDA(GB10 Blackwell) vs ROCm(MI250)3.5e-101.0000000000
ROCm(MI250) vs numpy(x86)7.9e-70.99996
폰 ARM CPU vs numpy(x86)1.4e-60.99992
CUDA(GB10 Blackwell) vs Grace ARM CPU2.6e-50.99975

전체 백엔드 매트릭스가 닫혔다: 두 GPU 백엔드(CUDA·ROCm)는 커널 소스를 공유해 사실상 비트-동일(cosine 1.0000000000)하고, GPU↔CPU 쌍은 ~0.9997로 동등하다. CUDA 워커와 ROCm 워커는 교체 가능하고, GPU 워커와 CPU 워커는 수치 동등하다.

왜 다른가

부동소수점 덧셈은 결합법칙이 없다

  • matmul 리덕션 순서 — tensor core, MFMA 타일, OpenCL workgroup, SIMD 레인이 각기 다른 순서로 누적합니다.
  • 누적 정밀도 — F16/BF16 저장에 F32 vs F16 accumulator, 발산 크기의 최대 지렛대입니다.
  • 초월함수 근사 — exp(softmax), silu(swiglu), rsqrt(norm)가 백엔드마다 다른 다항/테이블 변형을 씁니다.
계약

허용오차, 능력치, 단일 권위

  • 검증은 허용오차입니다 — "top-1 일치율 ≥ 99.x%, KL ≤ ε" — bit 일치가 아닙니다.
  • 백엔드와 누적 정밀도는 노드 능력치로 광고되고, F32 누적 노드가 출력 민감 랭크에 우선됩니다.
  • 허용오차를 벗어난 노드는 민감 랭크에 부적합으로 표시될 뿐 통째로 거부되지 않습니다.
  • 이산 결정(라우팅·샘플링)은 단일 권위에 고정돼 연속 오차가 이산 발산이 될 수 없습니다.