SOTA OCR with Core ML and dots.ocr
매년 우리 하드웨어는 조금 더 강력해지고, 매개변수당 모델은 조금 더 똑똑해집니다. 2025 년에는 이제까지도 불가능했던设备上에서 경쟁력 있는 모델을 실행하는 것이 더욱 실현 가능해졌습니다. RedNote 에서 개발한 3B 파라미터 OCR 모델인 dots.ocr 는 OmniDocBench 에서 Gemini 2.5 Pro 를 능가하여, OCR 을 truly no compromises on-device use case 로 만들었습니다.设备上에서 모델을 실행하는 것은 개발자에게 확실히 매력적입니다: API 키를 숨기지 않고, 비용이 없으며, 네트워크도 필요하지 않습니다. 그러나 만약 우리가 이러한 모델을设备上에서 실행하고 싶다면, 제한된 컴퓨팅 및 전력 예산에 대해 주의를 기울여야 합니다. Neural Engine 은 2017 년부터 모든 Apple 기기에 탑재된 Apple 의 커스텀 AI 가속기입니다. 이 가속기는 높은 성능을 유지하면서 배터리 전력을 소모합니다. 일부 테스트 결과 Neural Engine 은 CPU 보다 12 배 더 전력 효율적이며, GPU 보다 4 배 더 전력 효율적임을 발견했습니다.
이 모든 것이 매우 매력적으로 들리지만, 불행히도 Neural Engine 은 Apple 의 폐쇄형 소스 ML 프레임워크인 Core ML 을 통해서만 접근할 수 있습니다. 또한 PyTorch 모델을 Core ML 로 변환하는 것만으로도 몇 가지 도전 과제가 존재하며, 사전 변환된 모델이 없거나 sharp edges 에 대한 지식이 없으면 개발자에게는 매우 어려운 일입니다. 다행히 Apple 은 GPU (Neural Engine 가 아닌) 를 대상으로 하는 더 현대적이고 유연한 ML 프레임워크인 MLX 도 제공하며, 이는 Core ML 과 함께 사용될 수 있습니다.
이번 3 부분 시리즈에서 우리는 dots.ocr를设备上에서 실행하기 위해 CoreML와 MLX를 조합하여 변환하는 과정을 reasoning trace로 제공합니다. 이 과정은 많은 다른 모델에도 적용할 수 있으며, 개발자가设备上에서 자신의 모델을 실행하고 싶어하는 경우 필요한 아이디어와 도구를 강조하는 데 도움이 되기를 바랍니다.
따라하기 위해 저장소를 클론하세요. uv와 hf를 설치해야 설정 명령어를 실행할 수 있습니다:
만약 변환된 모델을 바로 사용하고 싶다면, 여기에서 다운로드할 수 있습니다.
PyTorch 를 CoreML 로 변환하는 과정은 두 단계로 이루어집니다:
- PyTorch 실행 그래프를 캡처 (via
torch.jit.trace 또는 더 현대적인 접근 방식인 torch.export).
- 이 변환된 그래프를
.mlpackage로 컴파일하여 coremltools 사용.
우리는 단계 2 에서 몇 가지 조절 가능한 요소가 있지만, 대부분의 제어는 단계 1 에 있습니다. 우리가 coremltools에 제공하는 그래프입니다.
프로그램의 명전 make it work, make it right, make it fast를 따르며, 우리는 먼저 GPU 에서 FLOAT32 와 정적 형식을 사용하여 변환을 작동시키는 데 집중할 것입니다. 이를 작동시킨 후, 정밀도를 낮추고 Neural Engine 으로 이동하려고 시도할 수 있습니다.
Dots.OCR 는 두 가지 핵심 구성 요소로 이루어져 있습니다: NaViT 아키텍처 기반에서 처음부터 훈련된 1.2B 파라미터 비전 인코더와 Qwen2.5-1.5B 백본입니다. 우리는 CoreML를 사용하여 비전 인코더를 실행하고, MLX를 사용하여 LM 백본을 실행할 것입니다.
모델을 변환하기 위해서는 시작 전에 구조와 기능을 이해하는 것이 가장 좋습니다. 원래 비전 모델링 파일을 살펴보면, 비전 인코더는 QwenVL 가족과 유사함을 알 수 있습니다. 많은 비전 인코더와 마찬가지로, dots의 비전 인코더는 patch 기반에서 작동하며, 이 경우 14x14패치입니다. dots비전 인코더는 비디오와 이미지 batches 를 처리할 수 있습니다. 이는 단일 이미지를 한 번에만 처리하여 단순화할 기회를 제공합니다. 이 접근 방식은 on-device 앱에서 자주 사용되며, 우리는 필수 기능을 제공하는 모델을 변환하고 여러 이미지를 처리하고 싶으면 반복합니다.
변환 프로세스를 시작할 때, 최소 기능 모델로 시작하는 것이 가장 좋습니다. 이는 모델이 작동하기 위해 엄격하게 필요한 모든 부수적인 요소들을 제거하는 것을 의미합니다. 우리 경우 dots 는 비전 인코더와 LM 백본 모두에 대해 다양한 attention 구현을 제공합니다. Core ML 은 iOS 18 에서 도입한 scaled_dot_product_attention연산자 중심으로 많은 인프라를 가지고 있습니다. 우리는