피드로 돌아가기
Hugging Face BlogAI/ML
원문 읽기
RedNote가 dots.ocr 모델을 PyTorch에서 Core ML로 변환하여 Apple Neural Engine에서 온디바이스 OCR 실행 구현
SOTA OCR with Core ML and dots.ocr
AI 요약
Context
Apple Neural Engine은 2017년 이후 모든 Apple 기기에 탑재되어 있으며 CPU 대비 12배, GPU 대비 4배 전력 효율을 제공하지만, Core ML 프레임워크를 통해서만 접근 가능하다. PyTorch에서 Core ML로의 모델 변환은 그래프 호환성, 데이터 타입 불일치, 동적 제어 흐름 등 여러 문제로 인해 개발자에게 복잡한 작업이다.
Technical Solution
- PyTorch 그래프를 Core ML로 변환하는 2단계 프로세스 도입: torch.export로 실행 그래프 캡처 → coremltools로 .mlpackage 컴파일
- 모델 구조 단순화를 통한 변환 용이성 확보: dots.ocr의 여러 attention 구현을 scaled_dot_product_attention 기반 SDPA로 통일
- 단일 이미지 처리로 제한하여 동적 제어 흐름 제거: 비디오/배치 처리 기능 제거 후 단순 h, w 쌍 처리로 변경
- 초기 변환을 FLOAT32, CPU_AND_GPU, 정적 형태로 수행: 이후 정밀도 감소 및 Neural Engine 이동 계획
- 데이터 타입 불일치 해결: int32 텐서와 fp32 텐서 간 matmul 연산에서 타입 캐스팅 적용
Impact
초기 FLOAT32 변환 모델 크기 5GB 이상으로 온디바이스 배포 불가능, 단일 forward pass 실행 시간 1초 이상 소요.
Key Takeaway
온디바이스 ML 모델 변환 시 '동작 → 최적화' 순서로 진행하면서 단순한 구성(단일 이미지, 표준 연산자)부터 시작해야 한다는 것이 중요하다. 이는 점진적으로 정밀도 감소와 하드웨어 가속기 통합을 추가할 수 있는 기반을 제공한다.
실천 포인트
온디바이스 ML 모델 배포를 계획하는 엔지니어는 PyTorch에서 Core ML 변환 시 먼저 모델 아키텍처를 분석하여 필수 기능만 남기고, 표준 연산자(SDPA, Linear 등)로 통일한 뒤, FLOAT32와 정적 입력 형태로 CPU_AND_GPU 상에서 동작을 검증한 후, 이를 바탕으로 양자화 및 Neural Engine 최적화를 진행하면 변환 과정의 디버깅 난제를 체계적으로 해결할 수 있다.