Cheatsheets — vue longue
retour à la listeToutes les pages concaténées sur un seul document, pour un Ctrl-F direct.
DeepSeek-OCR
page dédiée →Trait distinctif : un modèle OCR qui traite la vision comme un problème de compression, pas de perception. 97 % de précision avec 10× moins de tokens que les pipelines classiques.
Architecture DeepEncoder
Trois étages avec un goulot explicite entre le traitement local et global.
# Flux conceptuel
DeepEncoder = KnowledgeHead(Compressor(PerceptionHead(Image)))
| Étage | Rôle | Coût attention |
|---|---|---|
| Perception Head | Attention par fenêtres 8×8 (détails locaux) | O(N·M²), M=64 |
| Conv2D 16× | kernel=4, stride=4 : 4096 → 256 tokens | - |
| Knowledge Head | Attention globale (structure document) | O(256²) au lieu de O(4096²) |
Résultat : ~250× de réduction du coût d'attention globale.
Modes de résolution
Le budget de tokens est un paramètre de design de premier ordre.
Modes natifs (vue unique)
| Mode | Résolution | Tokens | Cas d'usage |
|---|---|---|---|
| Tiny | 512×512 | 64 | Tickets, formulaires simples |
| Small | 640×640 | 100 | Documents standards |
| Base | 1024×1024 | 256 | Documents denses |
| Large | 1280×1280 | 400 | Layouts complexes |
Modes dynamiques (tuiles + vue globale)
# Gundam : n tuiles à 640 (100 tokens/tuile) + 1 global à 1024 (256 tokens)
tokens_total = n * 100 + 256 # n ∈ [2,9]
# Gundam-Master : n tuiles à 1024 (256 tokens/tuile) + 1 global à 1280 (400 tokens)
tokens_total = n * 256 + 400
Tokens valides après padding (documents non carrés)
# Exemple page A4 (2480×3508, ratio ≈ 0.707)
N_valid = floor(N_actual * (min(w,h) / max(w,h)))
# Base mode : floor(256 * 0.707) = 181 tokens valides
# Large mode : floor(400 * 0.707) = 282 tokens valides
Métriques de performance
Comparaison avec les pipelines classiques.
| Système | Tokens/page | Précision OCR | Throughput (1×A100-40G) |
|---|---|---|---|
| DeepSeek-OCR (Small) | ~100 | ~97 % | 200k pages/jour |
| DeepSeek-OCR (Base) | ~256 | ~97 % | 200k pages/jour |
| GOT-OCR2.0 | 256 | - | - |
| MinerU 2.0 | ~6000 | - | - |
| Qwen-VL | 4000-6000 | - | - |
Compromis compression/précision
- 9-10× compression : ~97 % précision
- 20× compression : ~60 % précision
DeepSeek-OCR vs Qwen-VL
Objectifs différents, architectures différentes.
| Aspect | Qwen-VL | DeepSeek-OCR |
|---|---|---|
| Philosophie | Comprendre tout | Compresser intelligemment |
| Tokens/image | 4k-16k | 64-400 |
| Compression | Aucune (encodeur unique) | Goulot 16× explicite |
| Meilleur pour | Raisonnement multimodal, vidéo | Archives documents, OCR |
| Usage contexte LLM | Lourd | Léger |
Quand choisir quoi
- Qwen-VL : compréhension multimodale générale, UI, vidéo longue (1M tokens)
- DeepSeek-OCR : extraction de texte à partir de documents, compression pour LLM
Entraînement et fonction de perte
Le décodeur est un petit MoE autorégressif.
# Teacher forcing : à chaque pas t, on donne les vrais tokens précédents
L = -Σ(t=1..T) log p_θ(y_t | y_<t, T_vision)
# Gradient pour logit z_tk
∂L/∂z_tk = p_tk - 1[k == y_t]
# Token correct : (probabilité - 1) → pousse vers le haut si p < 1
# Tokens incorrects : probabilité → pousse vers le bas
Le gradient remonte à travers :
- Projection de sortie
- Couches du décodeur (self-attention + MLP)
- Cross-attention vers les tokens vision
- Tous les poids de DeepEncoder
Rôle de CLIP dans DeepEncoder
On réutilise uniquement l'encodeur image de CLIP (ViT), pas l'encodeur texte ni la perte contrastive.
# Flux après compression
[256 tokens compressés]
↓ Adaptateur linéaire (→ d_clip)
↓ + Embeddings positionnels 2D
↓ ViT CLIP (attention globale)
↓ Adaptateur linéaire (→ d_decoder)
[256 tokens vision pour décodeur]
Initialisation forte, architecture éprouvée, fine-tuné par cross-entropie OCR.
Vision-as-compression pour LLM
Utiliser des tokens visuels pour compresser l'information textuelle.
Workflow
- Renderer : Convertir texte/PDF long → images 2D (préserve layout)
- DeepEncoder : Compresser en K tokens vision (100-800 par page)
- LLM : Cross-attend aux tokens compressés au lieu du texte complet
Quand ça gagne
- PDFs longs avec tableaux, colonnes multiples
- 100-800 tokens vision au lieu de 2000-10000 tokens texte
- Préserve la structure 2D que le texte linéaire perd
Compression hiérarchique pour texte pur (direction future)
# Architecture proposée
1. Attention complète sur fenêtre glissante (W = 4-8k tokens)
2. Conv1D stride-2 sur tokens anciens (KV seulement, pas Q)
3. Keep-gate apprise : préserver tokens importants (entités, nombres)
4. Goulot latent : petit ensemble de latents cross-attend au passé lointain
5. Tokens globaux : quelques-uns par couche pour chemins longue portée
# Entraînement
- Distillation depuis teacher full-attention (perte KL)
- Supervision de gate depuis attention maps du teacher
- Perte de reconstruction sur tokens anciens masqués
Comparaison avec d'autres pipelines
Pour une page 1024×1024.
| Approche | Tokens | Avantages | Inconvénients |
|---|---|---|---|
| Two-stage (détecteur → reconnaisseur) | 5k-50k | - | Pipeline complexe, difficile à déployer |
| Multi-crop low-res (InternVL) | ~9800 | - | Explosion de tokens, vue globale faible |
| Qwen-VL (NaViT + MRoPE) | 4k-6k | Excellent pour multimodal général | Coût activation élevé, gros contexte LLM |
| DeepSeek-OCR | 256 | Budget prévisible, rapide, faible mémoire | Compression lourde peut manquer micro-détails |
Implications pratiques
Quand utiliser DeepSeek-OCR
- Archives documentaires à grande échelle
- Pipelines avec budget de tokens strict
- Besoin de throughput prévisible (200k pages/jour sur 1 GPU)
Pattern architectural réutilisable
- Traitement local (détails fins)
- Compression agressive (goulot explicite)
- Raisonnement global (sur tokens compressés)
Ce pattern s'applique au-delà de l'OCR : tout domaine nécessitant un résumé efficace d'informations spatiales denses.
Systèmes hybrides futurs
Input Router
├─ Documents denses → DeepEncoder path (compression-first)
├─ Images/vidéo générales → Qwen-VL path (perception-first)
└─ Texte pur → Hierarchical text compression
Architecture détaillée de DeepEncoder
Le flux complet pour une image 1024×1024 :
Étape 1 : Patch embedding
# 1024×1024 divisé en patches 16×16
patches = (1024/16)² = 4096 patches
X₀ ∈ ℝ^(4096 × 768) # projection linéaire
Étape 2 : Perception Head (window attention)
- Fenêtres locales de 8×8 patches (64 tokens chacune)
- Coût : O(4096 × 64) au lieu de O(4096²)
- Capture les détails locaux : traits de caractères, géométrie des fontes
Étape 3 : Compresseur convolutif 16×
Conv2D(kernel=4, stride=4)
# 64×64 grid → 16×16 grid
# 4096 tokens → 256 tokens
# Agrégation par région 4×4
Y[c,i,j] = Σ W[c,d,u,v] · X[d, 4i+u, 4j+v] + b[c]
Fusionne les tokens caractères en tokens régions (mots, lignes).
Étape 4 : Knowledge Head (attention globale)
- Attention sur 256 tokens seulement
- Coût : O(256²) vs O(4096²) → économie de ~256×
- Apprend la structure documentaire : colonnes, tables, hiérarchies
Étape 5 : Projection finale
T_vision ∈ ℝ^(256 × d_decoder)
Entraînement détaillé
Fonction de perte (cross-entropy autorégressif)
L = -Σ(t=1 to T) log p_θ(y_t | y_<t, T_vision)
Teacher forcing : on donne toujours les vrais tokens précédents (y_{<t}), jamais les prédictions du modèle.
Gradient du softmax
∂L/∂z_tk = p_tk - 1[k = y_t]
# Token correct : pousse vers 1
# Tokens incorrects : pousse vers 0
Le gradient remonte à travers :
- Projection de sortie
- Décodeur MoE (self-attention + MLP)
- Cross-attention vers tokens vision
- Tout DeepEncoder (y compris la conv 16×)
Rôle de CLIP : seul l'encodeur image ViT est réutilisé (pas le contrastif), comme backbone global préentraîné pour le Knowledge Head. Fine-tuné end-to-end avec la perte OCR.
Tokens valides après padding
Pour documents non carrés (ex: A4 2480×3508, ratio R ≈ 0.707) :
N_valid = ⌊N_actual × (min(w,h) / max(w,h))⌋
# Exemples A4
Base (256 tokens) → ⌊256 × 0.707⌋ = 181 valides
Large (400 tokens) → ⌊400 × 0.707⌋ = 282 valides
Comparaison pipelines documentaires
| Approche | Tokens (1024×1024) | Avantages | Limites |
|---|---|---|---|
| Détecteur + reconnaisseur | 5k-50k | - | Pipeline complexe, déploiement lourd |
| Multi-crop 384×384 (InternVL) | ~9.8k | - | Explosion tokens, vue globale faible |
| Qwen-VL (NaViT + MRoPE) | 4k-6k | Excellente compréhension multimodale | Coût activation élevé |
| DeepSeek-OCR | 256 | Budget prévisible, rapide | Compression agressive perd micro-détails |
Vision-as-compression pour LLM
Utiliser les tokens visuels pour compresser du texte long :
# Workflow
renderer(long_text) → image_2D
DeepEncoder(image) → 100-800 vision tokens
LLM.cross_attend(vision_tokens) # au lieu de 2k-10k text tokens
Quand utiliser :
- PDFs longs avec tables, multi-colonnes
- Préserver la structure 2D perdue en linéaire
- Économiser 5-10× sur le contexte LLM
Compression hiérarchique pour texte pur
Pattern transposable au texte :
# Architecture proposée
attention_locale(fenêtre W=4-8k tokens)
conv1d_stride2(tokens anciens, KV seulement)
keep_gate(préserver entités, nombres importants)
latent_bottleneck(quelques latents cross-attendent le passé lointain)
Entraînement :
- Distillation depuis teacher full-attention (KL loss)
- Supervision gate depuis attention maps du teacher
- Perte reconstruction sur tokens masqués
Objectif : 40-70% du coût attention pour QA long document.
Systèmes hybrides
Router vers spécialistes :
if dense_document:
path = DeepEncoder # compression-first
elif image_or_video:
path = Qwen_VL # perception-first
else:
path = hierarchical_text_compression
Questions ouvertes
- Fallback haute résolution : rajouter des tokens pour régions ambiguës ?
- Budget appris : réseau de politique choisit K par page selon entropie ?
- Fusion multimodale : mixer optimalement tokens vision compressés et texte ?
- Zero-shot compression : appliquer à audio, code, données structurées ?
See also
Vision Encoders
page dédiée →Le vrai défi des vision encoders pour LLM n'est pas la perception mais la compression : un document de 50 pages à 4000 tokens/page sature un contexte de 256k avant toute analyse.
Le problème de budget de tokens
Les encoders classiques (CLIP, SigLIP) produisent des représentations coûteuses :
| Résolution | Tokens (classique) | Budget consommé (50 pages) |
|---|---|---|
| 1024×1024 | 4,096 | 204,800 |
| 1280×1280 | 6,400 | 320,000 |
Une image devient un texte de plusieurs milliers de mots. Pour les tâches long-contexte (analyse de documents, archives, vidéos), cette inefficience bloque des classes entières d'applications.
Architecture à deux étages
La clé : comprimer avant l'attention globale, pas après.
# Ordre conventionnel (inefficace)
patches = patchify(image) # 4096 tokens
features = global_attention(patches) # O(4096²) mémoire
compressed = project(features) # 256 tokens
# Ordre optimisé (DeepSeek-OCR)
patches = patchify(image) # 4096 tokens
local = window_attention(patches) # O(4096 × window²)
compressed = conv_4x4_stride4(local) # 256 tokens (16× compression)
features = global_attention(compressed) # O(256²) — 256× moins de mémoire
La compression spatiale (stride convolution) réduit la grille de 64×64 à 16×16 avant que l'attention quadratique ne s'applique.
Modes de fonctionnement explicites
Traiter les tokens comme un budget de première classe :
| Mode | Tokens/page | Résolution | Précision OCR | Cas d'usage |
|---|---|---|---|---|
| Tiny | 64 | 512×512 | ~85% | Screening haute-volume |
| Small | 100 | 640×640 | ~92% | Documents standards |
| Base | 256 | 1024×1024 | ~97% | Articles techniques |
| Large | 400 | 1280×1280 | ~98.5% | Détails fins |
Pour les grandes pages, stratégie « Gundam » : n_tiles × 100 + 256 (vue globale).
Entraînement bout-en-bout
Le CLIP-style transformer sert de backbone mais sans contrastive learning.
# Gradient depuis la reconstruction de texte
loss = cross_entropy(decoder_output, ground_truth_text)
loss.backward() # Flow : text loss → cross-attention → vision encoder
# Le goulot de compression force la sélection de features
# Seules les features prédictives du texte survivent
Le bottleneck de 16× agit comme un filtre d'information : l'encoder apprend à garder ce qui prédit les caractères, écarter le reste (texture, style).
Résultats empiriques
- Fox benchmark : 97% de précision OCR à 9-10× compression
- Throughput : 200,000 pages/jour sur A100
- Mémoire : 256× moins pour l'attention globale (256² vs 4096²)
Compression vs perception
Le choix n'est pas binaire mais dépend de la tâche :
| Approche | Tokens/image | Quand l'utiliser |
|---|---|---|
| Compressée (DeepSeek-OCR) | 64-400 | Documents longs, OCR, archivage, génération de données |
| Généraliste (Qwen2.5-VL) | 1024-4096 | Raisonnement visuel complexe, diagrammes, agents |
| Haute fidélité (Qwen3-VL) | 4096-16384 | Vidéos longues, spatial reasoning, détails géométriques |
La compression sacrifie la richesse du raisonnement visuel au profit de l'efficience contextuelle.
Placement de la compression
Principe de design : identifier où réduire la dimensionnalité.
# Anti-pattern : opérations quadratiques sur haute résolution
expensive = global_attention(high_res_tokens) # Puis compresser
# Pattern optimal : comprimer avant scaling quadratique
compressed = spatial_downsample(high_res_tokens)
cheap = global_attention(compressed)
La position du compresseur dans le pipeline détermine les caractéristiques d'efficience du système.
Questions ouvertes
Limite de compression : Le régime 20× montre ~60% de précision. Où se situe l'effondrement sémantique ?
Préservation géométrique : Les RoPE multi-résolution (Qwen3-VL) maintiennent les relations spatiales. La compression agressive casse-t-elle les priors géométriques pour les tables/diagrammes ?
Budgeting adaptatif : Allouer plus de tokens aux régions denses (équations, tableaux) et moins au texte courant ?
Frontière de Pareto : Quelle est la surface d'échange compression/taille/précision ?
Compress before global attention
Le placement de la compression dans le pipeline change radicalement l'efficacité mémoire.
Architecture DeepEncoder :
- Perception head : window attention locale (64×64 patches → 4,096 tokens, pas de réduction)
- Compression : convolution 4×4 stride 4 (4,096 → 256 tokens, 16× reduction)
- Knowledge head : CLIP ViT avec global self-attention sur les 256 tokens compressés
Gain mémoire : O(256²) vs O(4,096²) = 256× moins de mémoire pour l'attention globale.
# Principe architectural
local_features = window_attention(patches) # 4096 tokens
compressed = conv_4x4_stride4(local_features) # 256 tokens (16×)
global_features = global_attention(compressed) # attention quadratique ici
Le point critique : compresser avant les opérations quadratiques, pas après.
Modes de résolution comme paramètres budgétaires
Token budget explicite au lieu de propriété émergente.
| Mode | Tokens/page | Résolution | OCR Precision | Use case |
|---|---|---|---|---|
| Tiny | 64 | 512×512 | ~85% | High-volume screening |
| Small | 100 | 640×640 | ~92% | Standard documents |
| Base | 256 | 1024×1024 | ~97% | Technical papers |
| Large | 400 | 1280×1280 | ~98.5% | Fine detail preservation |
Tiling "Gundam" pour documents larges : n × 100 + 256 tokens (n tuiles locales + 1 vue globale).
Le budget devient prévisible et schedulable.
Entraînement end-to-end sur reconstruction de texte
Pas de contrastive learning CLIP, malgré l'architecture CLIP.
- Loss : cross-entropy du décodeur sur les tokens de texte ground-truth
- Gradient : ∂L/∂logits = p(predicted) − 𝟙_ground_truth remonte jusqu'au vision encoder
- Effet du bottleneck : la compression 16× force l'encoder à ne garder que les features pertinentes pour reconstruire le texte (caractères, mise en page), pas la texture
Training insight : le ratio de compression agit comme information bottleneck, sélectionnant automatiquement les features OCR-relevant.
Résultats empiriques DeepSeek-OCR
- 97% OCR precision à 9-10× compression (Fox benchmark)
- SOTA accuracy/token sur OmniDocBench
- Throughput : ~200,000 pages/jour sur 1× A100
Dégradation : à 20× compression, précision ~60% (encore utile pour certaines tâches).
Trade-off : compression vs perception breadth
Compression-focused (DeepSeek-OCR) :
- Document processing à grande échelle
- Data generation
- Archival applications
- Token efficiency prime
Generalist VLM (Qwen2.5-VL, Qwen3-VL) :
- Visual reasoning complexe
- Long-form video understanding
- Diagram parsing fin
- Préservent plus de tokens pour reasoning riche
Le choix dépend du contexte d'usage, pas d'une supériorité absolue.
Questions ouvertes
- Compression limits : à quel ratio la semantic collapse survient-elle ?
- Geometric preservation : l'aggressive compression sacrifie-t-elle les priors spatiaux (tables, diagrammes) ?
- Adaptive budgeting : allouer plus de tokens aux régions denses (formules, tables) ?
- Cross-modal compression : le principe s'étend-il à video, audio, 3D point clouds ?
- Architecture search : frontière de Pareto compression/qualité/coût ?
See also
numpy pour la manipulation de patches et grilles spatiales
pytorch pour implémenter les architectures de compression
langchain pour intégrer les encoders dans des pipelines multimodaux
keras-tensorflow pour les stratégies de training bout-en-bout