양자화된 NanoDet을 Qualcomm의 두 장치에 적용했습니다. 한쪽은 로드조차 거부했고, 다른 쪽은 324개 레이어 전체를 NPU에서 1.39ms 만에 구동했습니다. 모델과 양자화는 동일합니다. 차이점은 양자화기가 처리할 수 없는 float 형태의 끝부분(tail)과 해당 장치가 이를 허용하는지 여부였습니다.
NanoDet을 w8a8로 양자화했습니다. 캘리브레이션에는 COCO val2017 실사 이미지 23장(원래 24장을 예정했으나, 다운로드 실패로 완벽한 숫자는 아닙니다)을 사용했습니다. 동일한 그래프를 두 장치에 적용해 보았습니다: Dragonwing RB3 Gen 2 (QCS6490)와 Galaxy S25.
| 장치 | 경로 | 결과 |
|---|
| RB3 Gen 2 | TFLite, float | 90.0 ms — 352개 레이어: CPU 169, GPU 123, NPU 60. 전체의 85%가 CPU 시간만 차지함 |
| RB3 Gen 2 | TFLite, w8a8 | 6.47 ms (중앙값 7.61 ms) — 439개 레이어 모두 NPU. float 경로 대비 약 14배 개선 |
| RB3 Gen 2 | Precompiled QNN, w8a8 | 거부됨 — 그래프에 양자화할 수 없는 float 끝부분 텐서가 존재함 (GFL 헤드 이후의 분포 적분 및 박스 좌표 디코드 연산). 이 장치는 I/O 단위별 양자화를 요구함 |
| Galaxy S25 | Precompiled QNN, w8a8 | 1.39 ms (중앙값 1.40 ms) — 324개 레이어 모두 NPU |
| Galaxy S25 | Precompiled QNN, float | 1.47 ms — 이 역시 전체 레이어가 NPU에서 작동함 |
(정확도에 따라 레이어 수가 다른 것은 양자화 그래프가 추가적인 양자화 연산을 포함하기 때문입니다. 정확도를 넘나드는 비교는 레이어 수 자체가 아니라 레이턴시로 해야 합니다.)
이전 실험에서 YOLOv11-N은 RB3에서 순조롭게 양자화되었습니다 — 341개 레이어 모두 NPU, 5.03 ms를 기록했습니다. 이는 해당 익스포트가 원본 컨볼루션 출력이었기 때문입니다. NanoDet의 익스포트는 디코드 연산을 그래프 내에 포함하고 있습니다. GFL 헤드의 분포 적분과 박스 좌표 디코딩이 컨볼루션 이후 float 형태로 작동합니다. 양자화기는 이 끝부분을 변환할 수 없어, RB3의 QNN 경로는 I/O가 완전히 양자화되지 않은 그래프를 받아들이지 못했습니다. 동일한 양자화 그래프, 동일한 장치 계열 — 한 모델의 끝부분은 깔끔하지만, 다른 모델은 그렇지 않습니다.
S25는 동일한 그래프를 1.39ms로 구동합니다. 그 QNN 경로가 이를 수용하기 때문입니다. 그리고 S25의 float 경로는 1.47ms입니다 — 플래그십 장치에서는 양자화가 거의 아무런 이득을 주지 못했습니다. float 경로 자체가 원래 전체 레이어가 NPU였기 때문입니다. 반면 RB3은 양자화를 통해 90ms에서 6.47ms로 큰 차이를 보였습니다. 이는 float 경로가 거의 CPU에 의존했기 때문입니다.
RB3의 거부 문제를 해결하는 방법 두 가지를 검토 중입니다. 첫째, TFLite를 통해 양자화 모델을 컴파일하는 방식(컨볼루션은 NPU, 끝부분은 CPU)이거나, 둘째, 익스포트를 분할하는 방식(백본과 헤드를 순수 컨볼루션으로 QNN에 넣고, 디코딩은 호스트 측에서 처리). 두 방법 모두 같은 결론을 내립니다. 디코드의 끝부분은 그래프 내부가 아니라 호스트 측에 있어야 합니다.
양자화는 모델 자체의 속성이 아니라, 그래프와 장치의 I/O 계약(contract)의 속성입니다. '양자화됨'이라는 모델이라도, 장치가 수용할 수 없는 float 연산을 끝부분에 가지고 있다면 해당 장치에서는 작동하지 않습니다. 양자화 벤치마크를 보고할 때는 경로와 장치를 명시해야 합니다. 단순히 'w8a8'만으로는 구동 여부조차 알 수 없습니다.
이전의 27배 성능 이야기가 나온 배경입니다. 그쪽에서는 런타임 경로가 속도를 결정했습니다. 여기서는 런타임 경로가 '작동할지 안 할지'를 결정합니다. 둘 다 결정적인 증거는 제목의 숫자가 아니라 레이어별 프로파일링이었습니다.
모델 자체는 AI Hub의 external recipe로 공개되어 있습니다 — https://huggingface.co/anguoyang/nanodet —w8a8은 대응하는 정확도에 맞춰, RB3의 QNN 거부 건은 레시피 실측 리포트에 기록해 두었으니, 다음에 오시는 분들은 벽이 아니라 이정표로 삼으실 수 있을 것입니다.