Orange Pi AIPro(Ascend 310B)에서 MiniCPM-V 4.6을 구동하기 위한 커스텀 C++ 추론 엔진 제작
Wrote a custom C++ engine for MiniCPM-V 4.6 on Orange Pi AIPro (Ascend 310B) to bypass framework overhead
핵심 요약
Orange Pi AIPro의 NPU 성능을 극대화하기 위해 프레임워크 오버헤드를 제거한 커스텀 C++ 추론 엔진을 개발함.
- 커스텀 추론 엔진 — 표준 프레임워크 오버헤드를 제거하고 C++로 직접 구현하여 NPU 성능을 최적화함.
- 성능 최적화 — AscendC 커널을 활용해 토큰 생성 속도를 2.88 tps에서 5.90 tps로 2배 이상 향상함.
- 메모리 대역폭 — 현재 FP16 가중치 읽기 속도가 병목 현상을 일으키고 있어 향후 INT4/INT8 양자화로 개선 예정.
- 오픈 소스 공개 — 커스텀 연산, 빌드 스크립트, Gradio 웹 UI를 포함한 프로젝트를 GitHub에 공개함.
여러분, 지난 몇 주 동안 작업해 온 프로젝트를 공유하고 싶습니다. Orange Pi AIPro(Ascend 310B NPU가 탑재된 약 149달러짜리 보드, 20 TOPS INT8 / 10 TFLOPS FP16 성능)에서 MiniCPM-V 4.6을 완전히 구동하기 위한 C++ 추론 엔진을 처음부터 직접 구축했습니다.
커스텀 연산, 빌드 스크립트, Gradio 웹 UI를 확인하고 싶으시다면 GitHub 저장소 github.com/lvyufeng/minicpm-v-4.6-orangepi를 참고하세요.
이 특정 하드웨어에 로컬 LLM이나 VLM을 배포해 본 적이 있다면, 표준 프레임워크 스택을 다루는 것이 얼마나 골치 아픈 일인지 아실 겁니다. 특히 엣지 환경에서 괜찮은 성능을 뽑아내고 싶다면 더욱 그렇습니다. 이를 해결하기 위해 무거운 프레임워크를 건너뛰고 로우 레벨로 접근했습니다. 텍스트 생성과 SigLIP 비전 타워 모두 단일 C++ 서브프로세스 내에서 NPU 위에서 네이티브로 실행됩니다. 핫 패스(hot path)에는 torch_npu 의존성이 전혀 없습니다. 파이썬은 CPU 측 토큰화와 이미지 전처리를 위한 콜드 패스(cold path)에서만 사용됩니다.
초기 기본 aclnnMm 베이스라인은 M=1일 때(벡터-행렬 곱셈) NPU의 큐브 유닛을 제대로 활용하지 못해 토큰 디코딩 단계에서 성능이 매우 저조했습니다. 약 2.88 tokens/s(단계당 약 350ms 소요)의 성능이 나왔습니다.
커스텀 AscendC 커널로 핵심 경로를 다시 작성한 후, 이제 FP16에서 5.90 tokens/s를 기록하고 있습니다(단계당 지연 시간을 170ms로 단축). 2배의 속도 향상이 어떻게 이루어졌는지에 대한 실제 분석 결과는 다음과 같습니다:
| Stage | Tokens/s | Per-step (ms) | Saved |
|---|---|---|---|
Stock aclnnMm baseline | 2.88 | 350 ms | — |
| + Custom Cube Matmul ($M=1$) | 4.37 | 229 ms |

