이종 백엔드 간 수치적 동등성
CUDA, ROCm, Adreno, CPU는 결코 bit 단위로 일치하지 않는다. 그럼에도 스웜이 하나의 일관된 모델을 내는 것은 운이 아니라 설계된 성질이다.
정확(exact) vs 동등(equivalent) — 서로 다른 두 성질
- 같은 백엔드 안 — 정확(3.6e-12): 전문가를 노드로 분할 후 combine하는 것은 같은 가중합의 재그룹핑이며, 차이는 부동소수점 누적 순서뿐. oracle로 검증됨.
- 다른 백엔드 사이 — 동등(1e-3…1e-6): 같은 연산도 하드웨어가 다르면 op당 상대오차 ~1e-3–1e-6을 지니며, 절대 0이 아니다. 스웜은 바로 이 영역에 산다.
"정확"은 한 기기 안에서 분해가 보장하는 것. "동등"은 이종 하드웨어가 주는 것. 스웜의 임무는 동등성이 발산으로 누적되지 않게 하는 것이다.
이론이 아니다 — 하드웨어에서 측정됨
동일한 Qwen3.5-122B layer-0 전문가 FFN을 linkcpp-expert-worker가 MI250(ROCm), 폰의 ARM CPU(SM-S938N), x86 numpy 레퍼런스로 계산 — 같은 입력, 같은 가중치, 다른 명령어셋과 리덕션 순서:

| 백엔드 쌍 | max|Δ| | cosine |
|---|---|---|
| ROCm(GPU) vs numpy(x86) | 7.9e-7 | 0.99996 |
| 폰 ARM CPU vs numpy(x86) | 1.4e-6 | 0.99992 |
| ROCm GPU vs 폰 ARM CPU | 1.5e-6 | 0.99990 |
세 개의 명령어셋, 하나의 계산 — 모든 쌍이 동등(cosine ≈ 0.9999)하고 어느 쌍도 bit-identical 아님(Δ ≈ 1e-6). 잔차가 작은 것은 라우터 권위가 입력과 전문가 선택을 고정했기 때문이다.
이후 실제 NVIDIA GB10 Grace Blackwell 하드웨어 실행이 마지막 백엔드에서 매트릭스를 닫았다: CUDA ↔ ROCm은 cosine 1.0000000000(max abs 3.5e-10, 두 GPU 백엔드가 커널 소스를 공유하므로 사실상 비트-동일), CUDA ↔ Grace ARM CPU는 cosine 0.99975 — 위에서 본 GPU↔CPU와 같은 패턴이다.
부동소수점 덧셈은 결합법칙이 없다
- matmul 리덕션 순서 — tensor core, MFMA 타일, OpenCL workgroup, SIMD 레인이 각기 다른 순서·타일링으로 누적.
- FMA 융합 —
a*b+c를 1회 반올림(FMA) 또는 2회로, 백엔드마다 다르게 융합. - 누적 정밀도 — F16/BF16 저장 + F32 vs F16 accumulator(발산 크기의 최대 지렛대).
- 초월함수 근사 — exp(softmax)·silu/sigmoid(swiglu)·rsqrt(norm)의 다항/테이블 근사 차이.
- dequant + matmul 경로 — dequant 후 matmul vs 융합 양자화 커널의 중간 반올림 차이.
- 비결정 커널 — atomic/split-K 리덕션은 같은 기기에서도 실행마다 달라질 수 있음.
버그가 아니다. 각 가속기의 빠른 경로가 치르는 대가다.
결정은 하나의 권위에, 누적은 충분한 정밀도로
라우터 권위 — 핵심 불변식. 네트워크 안의 유일한 이산 결정은 MoE 라우팅(256중 top-8)이다. 각 백엔드가 라우터를 재실행하면 경계 토큰에서 서로 다른 전문가를 골라 진짜 발산이 생긴다. Kvasir는 라우터를 백본에서 한 번 실행하고 워커에는 선택된 전문가 id만 보낸다 → 이종 스웜은 각 전문가 출력의 *크기*만 다를 뿐, *어떤 전문가가 도는지*는 절대 갈리지 않는다. 파국적 이산 발산을 유계 연속 오차로 바꾸는, 이종 전문가 샤딩의 정합성 규칙이다.
- 이산 argmax: 디코딩은 로짓에 대한 argmax다. 1e-3의 흔들림은 두 후보가 그만큼 근접할 때만 토큰을 바꾼다 — 대부분의 위치에서 마진이 훨씬 커서 토큰은 동일하게 나오고, 드물게 갈리는 곳은 다른 seed와 구분 불가능할 만큼 애매한 위치뿐이다.
- combine은 덧셈: 부분 결과는 확률 가중 합으로 결합된다. 독립적인 ~1e-4 오차는 비간섭적으로 더해져 k배가 아닌 √k로 자라고, 큰 값의 상쇄(cancellation)가 없어 잔차가 well-conditioned로 유지된다.
발산 모드와 방어
| 발산 모드 | 메커니즘 | 규칙 |
|---|---|---|
| 라우팅 불일치 | 경계 토큰의 top-8을 백엔드마다 다르게 선택 | 라우터 권위 — 백본 1회 결정, id dispatch |
| 궤적 분기 | 토큰별 로짓 흔들림이 결국 토큰을 뒤집고, 이후 시퀀스가 새 seed처럼 갈림 | 디코드/샘플링을 한 노드에 고정 |
| 깊이 누적 | 49층 × 각 ~1e-4 → 종단 로짓 최대 1e-2 | 경계·combine에서 F32 누적 |
| 자기-비결정 | atomic/split-K가 실행마다 다름 | combine은 결정 커널, 검증은 허용오차로 |
| 정밀도 불일치 | 한 노드는 F16 누적, 다른 노드는 F32 | 누적 정밀도를 capability로 광고, 출력 랭크는 F32 노드 우선 |
측정 프로토콜
- op당 델타 — 같은 입력에서 A vs B의 matmul·swiglu·softmax·norm 상대오차.
- 레이어 경계 드리프트 — 한 층 통과 후 residual 델타를 적층해 깊이 누적이 √L인지 L인지 확인.
- 종단 로짓 발산 — 전체 forward의 L∞·L2·KL divergence.
- 결정 일치율 — top-1 토큰 일치율 + top-8 라우팅 일치율(라우터 권위의 필요성 검증).
- 생성 안정성 — greedy N토큰에서 A와 B가 처음 갈리는 인덱스.
- 태스크 레벨 — perplexity·eval 점수 델타: 사용자가 실제로 체감하는 유일한 지표.
합격 기준은 허용오차다 — "top-1 일치율 ≥ 99.x%, KL ≤ ε". 허용오차를 벗어난 노드는 민감 랭크에만 부적합으로 표시될 뿐, 통째로 거부되지 않는다.
bit 일치는 불가능하고, 불필요하다
동종 클러스터는 bit-정확을 가정할 수 있지만 스웜은 못 한다 — 전제가 *어떤 하드웨어든 오는 대로*이기 때문이다. 그래서 Kvasir는 수치 동등성을 프로토콜 호환성과 똑같은 일급·측정되는 계약으로 다룬다: 백엔드와 누적 정밀도를 노드 capability로 광고하고, 라우터 권위를 불변식으로 강제하며, 모든 검증을 bit-일치가 아닌 허용오차로 한다. 측정된 수치 동등성 + 단일 권위의 이산 결정 — 이것이 지구상 모든 GPU에서 한 모델을 동시에 돌릴 수 있게 하는 것, 곧 스웜이다.