요약: mlx-lm에 네이티브 nemotron_h_puzzle 지원을 추가한 후 (PR #1535), 64GB M2 Max에서 4비트 대 5비트 전문가 양자화(둘 다 6비트 밀집 레이어, BF16 출력 헤드, 그룹 크기 64 사용)를 비교했습니다. 결과 (동일한 프롬프트, 작업당 5개 시드, temp 1.0 / top_p 0.95):
| 4-bit experts | 5-bit experts |
|---|
| Dense paths | 6-bit | 6-bit |
| Output head | BF16 | BF16 |
| Checkpoint | 42.03 GiB | 49.88 GiB |
| Peak MLX memory | 49.68 GB | 58.12 GB |
| Average generation | 14.27 tok/s | 10.53 tok/s |
| Local task checks | 24/30 | 21/30 |
| Long-context retrieval | 4/5 | 0/5 |
저는 5비트가 성능이 더 낮은 이유는 5비트 체크포인트가 64GB 한계에 정확히 도달하기 때문에, KV + 작업 집합(working set)이 증가하면서 메모리 압박으로 인해 문제가 생기는 것 같습니다. 만약 96/128GB를 가지고 계시다면, 5비트가 다르게 작동할 수 있습니다. 테스트해 보신 분들의 수치를 공유해주시면 좋겠습니다.
실행에 필요한 과정: mlx-lm의 기존 Nemotron-H 코드는 블록별 설정 지원(blockwise config support), 텐서 재매핑(tensor remapping), 그리고 NVIDIA의 FP32 norm/router 동작을 일치시키는 것이 필요했습니다. 짜증 나는 버그: 첫 번째 레이어 SSM 출력이 동일한 입력에도 불구하고 코사인 유사도 0.8832로 NVIDIA의 참조값과 불일치했습니다. 근본 원인: NVIDIA는 BF16으로 softplus(dt + dt_bias)를 계산하고 나중에 FP32로 승격시키지만, mlx-lm의 공유 SSM 경로는 그 전에 승격시킵니다. 이 경계값을 일치시키자 코사인 유사도가 0.999998까지 향상되었습니다. BF16 출력 헤드는 필수입니다: 4비트로 131k 어휘(vocab)의 lm_head를 양자화했더니 반복적인 쓰레기만 생성했습니다. BF16으로 복원하니 문제가 해결되었고 (약 2.1 GiB 비용 발생).
제출자: /u/These_Meaning_3883 to r/LocalLLaMA [link] [comments]