OCR de pointe en local avec dots.ocr et Core ML : le défi de l’optimisation sur Apple Silicon
En 2025, les appareils mobiles sont plus puissants que jamais, permettant d’exécuter des modèles d’intelligence artificielle de pointe directement sur le dispositif. Le modèle OCR dots.ocr, développé par RedNote et composé de 3 milliards de paramètres, dépasse même Gemini 2.5 Pro sur le benchmark OmniDocBench, rendant l’OCR hors ligne une solution viable sans compromis. Exécuter des modèles localement offre de nombreux avantages : pas de clés d’API à gérer, aucun coût, et aucune dépendance au réseau. Toutefois, cette approche exige une attention particulière aux contraintes de puissance de calcul et de consommation énergétique. Apple a introduit depuis 2017 le Neural Engine, son accélérateur dédié à l’IA, conçu pour offrir des performances élevées tout en minimisant la consommation. Des tests ont montré qu’il est jusqu’à 12 fois plus efficace en énergie que le CPU et 4 fois plus que le GPU. Malheureusement, l’accès à ce matériel est limité à Core ML, le framework propriétaire d’Apple. La conversion d’un modèle PyTorch vers Core ML peut s’avérer complexe, surtout sans modèle préconverti ou une connaissance approfondie des pièges techniques. Heureusement, Apple propose également MLX, un framework plus moderne ciblant le GPU, qui peut être combiné à Core ML pour des architectures hybrides. Dans cette série en trois parties, les auteurs détaillent la conversion de dots.ocr pour fonctionner sur appareil Apple, en combinant Core ML pour le modèle vision (vision encoder) et MLX pour le modèle linguistique (LM backbone). Le processus est applicable à de nombreux autres modèles. Le vision encoder de dots.ocr, basé sur NaViT, contient 1,2 milliard de paramètres et traite les images par patches de 14×14. Pour simplifier, l’équipe a décidé de ne traiter qu’une seule image à la fois, ce qui est courant dans les applications mobiles. Avant toute conversion, ils ont simplifié le modèle en supprimant les implémentations d’attention non essentielles, en se concentrant uniquement sur scaled_dot_product_attention (sdpa), compatible avec Core ML. Une alerte liée à l’attention à fenêtre glissante a été ignorée, car non nécessaire. La conversion commence par une enveloppe (harness) utilisant torch.jit.trace pour capturer le graphe d’exécution. La première erreur rencontrée concernait un type incompatible dans une opération matmul : un tensor int32 était utilisé avec un fp32. Le problème provenait de torch.arange, dont le type n’est pas respecté par coremltools. Une simple conversion explicite en fp32 après arange a résolu le problème. Une autre erreur, liée à repeat_interleave, a été causée par un appel à grid_thw utilisé pour le masquage dans flash_attention_2. Comme le modèle ne traite qu’une image, ce masquage est inutile. Il a été remplacé par un masque constant. Ensuite, un problème de inplace_fill dynamique a été résolu en remplaçant le masque booléen par un masque flottant de zéros, car le Neural Engine ne supporte pas les tensors booléens. Enfin, une erreur de reshape dans mps.reshape a été identifiée via un avertissement de trace : une boucle dynamique sur grid_thw était interdite par les compilateurs ML. Comme seule une image est traitée, la boucle a été supprimée et remplacée par un traitement statique. Le modèle converti fonctionne désormais avec une erreur maximale de 0,006 et une erreur moyenne de 1,1e-5, proche de la précision PyTorch. Cependant, sa taille dépasse 5 Go — trop lourd pour un déploiement mobile. Le temps de calcul pour une passe avant atteint plus d’une seconde sur le GPU, ce qui nécessite des optimisations. Dans la deuxième partie, les auteurs aborderont l’intégration entre Core ML et MLX pour exécuter le modèle complet sur l’appareil. La troisième partie se concentrera sur les optimisations clés pour exécuter le modèle sur le Neural Engine : quantification, gestion des formes dynamiques, et réduction de la taille. Cette série illustre les défis et solutions pratiques pour déployer des modèles SOTA sur appareils Apple, offrant un guide concret pour les développeurs souhaitant exploiter l’intelligence artificielle locale.
