피드로 돌아가기
Dev.toBackend
원문 읽기
numpy-ts 1.2.0이 Philox 4x32 알고리즘 재구현과 float16 소프트웨어 구현으로 NumPy와 비트 단위 호환성 달성
numpy-ts 1.2.0: Achieving NumPy Parity in TypeScript with float16 Support and Bit-for-Bit RNG Matching
AI 요약
Context
TypeScript/JavaScript로 NumPy 코드를 포팅할 때 난수 생성 수열이 Python과 일치하지 않고, float16 연산이 지원되지 않아 과학 계산의 재현성 보장이 불가능했다. 이전 numpy-ts 버전들은 근사 알고리즘이나 다른 PRNG를 사용해 NumPy와의 수열 차이가 초반부터 발생했다.
Technical Solution
- Philox 4x32 카운터 기반 PRNG를 NumPy 스펙과 정확히 구현: 10 라운드 Philox 치환 함수와 32비트 카운터/키 상태를 Uint32Array로 관리해 비트 단위 일치성 확보
- uint32을 float64로 변환할 때 NumPy의 비트 시프트 및 나눗셈 규칙 적용: (a >>> 5) * 67108864.0 + (b >>> 6) / 9007199254740992.0 구조로 동일한 변환 수행
- float16 소프트웨어 시뮬레이션 구현: subnormal 수(영에 가까운 값)를 포함한 IEEE 754 half-precision 저장소 형식을 JavaScript에서 재현하고 float32와의 변환 제공
- RNG 상태 직렬화/복원 기능 추가: counter, key, ctr 전체 상태를 저장하고 복원하는 구조로 시드 저장만의 불완전성 해결
- 모든 런타임(Node.js, Deno, Bun, 브라우저)을 지원하는 단일 엔트리 포인트: 이전의 런타임별 분리된 진입점 제거
Impact
- RNG 구현의 성능이 6배 향상 (배열 할당 제거, TypedArray 전용 사용, Math.imul 활용)
Key Takeaway
과학 계산에서 재현성은 비트 단위 정확성이 필수이므로, 근사 알고리즘 대신 레퍼런스 구현을 정확히 복제하는 것이 핵심이다. 특히 cross-runtime 환경에서는 런타임 차이를 추상화하면서 저수준 비트 연산의 일관성을 보장해야 한다.
실천 포인트
Python NumPy 기반의 머신러닝 모델을 TypeScript로 포팅하는 개발팀에서 numpy-ts의 Philox 4x32 구현을 사용하면 동일한 시드에 대해 NumPy와 정확히 같은 난수 수열을 생성할 수 있어 크로스 플랫폼 재현성을 확보할 수 있다.