GPU 수준 비결정성 재현을 위한 Hawkeye
초록
**
Hawkeye는 NVIDIA Tensor Core에서 수행되는 FP16·BF16·FP8 행렬 곱셈의 비결정적 동작을 정밀히 분석하고, 동일한 연산을 CPU에서 비트‑단위로 재현할 수 있게 하는 프레임워크이다. 라운딩 방향, 서브노멀 처리, 누적 순서 등을 테스트해 각 아키텍처(Ampere, Hopper, Lovelace)의 내부 파이프라인을 모델링하고, 이를 기반으로 CPU 시뮬레이터가 GPU와 완전히 동일한 결과를 산출한다.
**
상세 분석
**
Hawkeye의 핵심은 “비결정성 원인”을 세부적으로 분리하고, 각각을 실험적으로 규명하는 일련의 마이크로벤치마크이다. 첫 번째 테스트는 누적 단계에서의 연산 순서를 밝히기 위해 16×16 타일을 고정된 패턴으로 배치하고, 결과값이 변하는 지점을 추적한다. 이를 통해 Tensor Core가 내부적으로 여러 부분합을 병렬적으로 계산한 뒤 특정 순서로 합치는 방식을 밝혀냈다. 두 번째 테스트는 각 부분합이 어떤 내부 정밀도(예: 32‑bit 정밀도 혹은 48‑bit 중간 포맷)로 유지되는지를 확인한다. 실험 결과, Ampere와 Hopper는 FP16 입력에 대해 32‑bit 누산기를 사용하지만, BF16·FP8에서는 48‑bit 중간 포맷을 활용해 오버플로를 방지한다는 점을 발견했다. 세 번째 테스트는 라운딩 모드를 식별한다. IEEE‑754 표준의 “nearest‑even” 라운딩이 기본이지만, Tensor Core는 일부 단계에서 “toward‑zero” 혹은 “away‑from‑zero” 라운딩을 적용한다는 사실을 정량화하였다. 네 번째 테스트는 정규화 단계의 시점을 파악한다. 연산 중간값이 서브노멀 영역에 도달하면 즉시 정규화하여 다시 FP16/FP8 포맷으로 변환하는데, 이는 하드웨어가 서브노멀을 직접 지원하지 않기 때문이며, 이 과정이 결과에 미치는 영향을 정확히 모델링했다. 마지막으로 서브노멀 처리 테스트는 매우 작은 입력값이 누산 과정에서 소실되는지를 조사한다. Hopper와 Lovelace는 서브노멀을 0으로 강제 변환하지만, Ampere는 최소한의 비트 손실만 허용한다는 차이를 발견했다. 이러한 테스트 결과를 종합해 Hawkeye는 각 아키텍처·데이터 타입별로 “연산 파이프라인 모델”을 생성한다. 모델은 PTX 수준의 MMA 명령을 CPU의 SIMD/AVX2/AVX‑512 명령으로 매핑하고, 내부 정밀도와 라운딩을 동일하게 재현한다. 구현은 오픈소스 시뮬레이터(gpu‑simulator)로 제공되며, 4096×4096 대규모 행렬에 대해 100 % 비트‑일치 결과를 보였다. 이 접근법은 기존의 비결정성을 억제하기 위해 전체 Tensor Core를 비활성화하거나, 중간 결과를 저장해 라운딩을 강제하는 방법보다 훨씬 낮은 오버헤드(실행 시간 1.2× 정도)로 검증 가능성을 제공한다. 또한, 검증자는 GPU 실행 로그와 사용된 GPU 모델만 알면 동일한 CPU 재현을 수행할 수 있어, 클라우드 기반 ML‑as‑a‑Service 환경에서 신뢰성을 확보하는 데 실질적인 도구가 된다.
**
댓글 및 학술 토론
Loading comments...
의견 남기기