Phase 12: Multimodal AI

किसी भी रिज़ॉल्यूशन दृष्टिः पैच-एन'-पैक और NaFlex

वास्तविक चित्र 224x224 वर्ग नहीं हैं। एक रसीद 9:16, एक चार्ट 16:9, एक मेडिकल स्कैन 4096x4096, एक मोबाइल स्क्रीनशॉट 9:19.5. 2024 से पहले VLM उत्तर सब कुछ को एक निश्चित वर्ग में आकार दें संकेत को फेंक दिया जो OCR, दस्तावेज़ समझ और उच्च-रिज़ॉल्यूशन दृश्य पार्सिंग काम करता है। NaViT (Google, 2023) ने दिखाया कि आप ब्लॉक-आयामी मास्किंग के साथ चर-रिज़ॉल्यूशन पैच को एक एकल ट्रांसफार्मर बैच में पैक कर सकते हैं। Qwen2-VL के M-RoPE (2024) ने पूर्ण स्थिति तालिकाओं को पूरी तरह से गिरा दिया। LLaVA-NeXT के AnyRes ने उच्च रिज़ॉल्यूशन छवियों को एक आधार + उप-छवियों में टाइल किया। सिगलिप 2 का NaFlex संस्करण (2025) अब खुले VLM के लिए डिफ़ॉल्ट एन्कोडर है जो प्रत्येक पहलू अनुपात की सेवा करने के लिए एक एकल चेकपॉइंट चाहते हैं। यह पाठ अंत-अंत तक पैच-एन-पैक लागू करता है।

Type: Build

Languages: Python (stdlib, patch packer + block-diagonal mask)

Prerequisites: Phase 12 · 01 (ViT patches), Phase 12 · 05 (LLaVA)

Time: ~120 minutes

सीखने के लक्ष्य

  • चर-रिज़ॉल्यूशन वाली छवियों के एक बैच से पैच को एक अनुक्रम में पैक करें और ब्लॉक-आयामी ध्यान मुखौटा बनाएं।
  • किसी दिए गए कार्य के लिए AnyRes टाइलिंग (LLaVA-NeXT), NaFlex (SigLIP 2) और M-RoPE (Qwen2-VL) के बीच चयन करें।
  • OCR, चार्ट और फोटोग्राफी के लिए टोकन बजट को आकार बदलने के बिना गणना करें।
  • स्क्वायर-साइज के तीन विफलता मोड का नाम देंः स्क्वायर पाठ, क्रॉप सामग्री, पैडिंग पर बर्बाद टोकन।

समस्या

ट्रांसफार्मर एक अनुक्रम की उम्मीद करते हैं. एक बैच एक ही लंबाई के अनुक्रमों का एक ढेर है. यदि आपकी छवियां 224x224 हैं, तो आपको हर बार 196 पैच टोकन मिलते हैं, पैडिंग की आवश्यकता नहीं है, काम किया जाता है। 224 पर ट्रेन, 224 पर infer, कभी भी संकल्प के बारे में सोचें।

दुनिया सहयोग नहीं करती। दस्तावेज पोर्ट्रेट (8.5x11 इंच, 2:3-ish) हैं। चार्ट स्क्रीनशॉट परिदृश्य (16:9). रसीदें ऊंची और पतली (1:3) हैं। 2048x2048 या उससे बड़ी चिकित्सा इमेजिंग जहाज। मोबाइल डिवाइस स्क्रीनशॉट 1170x2532 (0.46:1) हैं।

2024 से पहले तीन विकल्प और प्रत्येक असफल क्यों हैः

  1. स्क्विश ने पाठ और चेहरे को विकृत किया। डाउनस्केल चार्ट लेबल और ओसीआर सामग्री को नष्ट कर देता है। एलएवीए-1.5 तक मानक अभ्यास।
  2. आप अधिकांश छवि को फेंक देते हैं, और फसल स्थान चुनना उसकी अपनी दृष्टि की समस्या है।
  3. सबसे लंबे पक्ष पर पैड। विकृति को ठीक करता है लेकिन चित्र चित्रों के लिए पैडिंग पर 50% से अधिक टोकन बर्बाद करता है। उन सभी पैड टोकन पर चौकोर ध्यान लागत।

2024-2025 का जवाबः ट्रांसफार्मर को छवि के मूल संकल्प पर पैच खाने दें, और यह पता लगाएं कि बिना किसी व्यर्थ गणना के एक क्रम में विषम बैच को कैसे पैक किया जाए।

अवधारणा

NaViT (Dehghani et al., 2023) पेपर था जिसने बड़े पैमाने पर इस काम को दिखाया। विचार यांत्रिक हैः

  1. बैच में प्रत्येक छवि के लिए, चयनित पैच आकार (कहें 14) पर मूल पैच ग्रिड की गणना करें।
  2. प्रत्येक छवि के पैच को अपने स्वयं के चर-लंबाई अनुक्रम में समतल करें।
  3. बैच के लिए सभी चित्रों के पैच को एक लंबी अनुक्रम में जोड़ें।
  4. एक ब्लॉक-आयामी ध्यान मुखौटा बनाने के लिए छवि ए के पैच केवल छवि ए के भीतर उपस्थित हैं।
  5. प्रति पैच स्थिति जानकारी (2D RoPE या अंशिक स्थिति एम्बेडमेंट) ले जाएं।

336x336 (576 टोकन), 224x224 (256 टोकन) और 448x336 (768 टोकन) पर तीन छवियों का एक बैच 1600x1600 ब्लॉक-चक्र मुखौटा के साथ एक 1600 टोकन अनुक्रम बन जाता है। कोई पैडिंग नहीं। कोई बर्बाद गणना नहीं। ट्रांसफार्मर मनमाने ढंग से पहलू अनुपात को संभालता है।

NaViT ने प्रशिक्षण के दौरान आंशिक पैच गिरने का भी परिचय दिया बैच पर 50% पैच यादृच्छिक रूप से गिरते हैं जो प्रशिक्षण को नियमित और गति देता है। सिगलिप 2 ने इसे विरासत में दिया।

किसी भी प्रकार का रेस (LLaVA-NeXT)

एलएवीए-नेक्स्ट का एनीरेस व्यावहारिक विकल्प है। एक उच्च-रिज़ॉल्यूशन छवि और एक फिक्स्ड एन्कोडर (CLIP या SigLIP 336) को देखते हुए, छवि टाइलः

  1. पूर्वनिर्धारित सेट (1x1), (1x2), (2x1), (1x3), (3x1), (2x2), आदि से एक ग्रिड लेआउट चुनें जो छवि के पहलू अनुपात के लिए सबसे अच्छा फिट बैठता है।
  2. पूरी छवि को ग्रिड में टाइल करें; प्रत्येक टाइल 336x336 फसल बन जाती है।
  3. एक लघु चित्र भी बनाएंः पूरी छवि को वैश्विक संदर्भ टोकन के रूप में 336x336 तक आकार दिया गया है।
  4. फ्रीज 336 एन्कोडर के माध्यम से प्रत्येक टाइल को एन्कोड करें। टाइल टोकन + थंबनेल टोकन को जोड़ें।

2x2 ग्रिड पर 672x672 छवि के लिए थंबनेलः 4 * 576 + 576 = 2880 दृश्य टोकन। महंगा लेकिन प्रभावी एलएलएम स्थानीय विवरण और वैश्विक संदर्भ दोनों को देखता है।

AnyRes विकल्प का मार्ग है जब आपका एन्कोडर जमे हुआ है और केवल एक संकल्प का समर्थन करता है। यह बड़ी छवियों के लिए टोकन गिनती को विस्फोट करता है (एक 1344x1344 छवि 4x4 ग्रिड पर 9216 + 576 ≈ 9800 टोकन है, जो 8k एलएलएम संदर्भ के अधिकांश को भरता है) ।

एम-रोपी (Qwen2-VL)

Qwen2-VL ने मल्टीमोडल रोटरी पोजीशन एम्बेडिंग पेश किया। NaViT की अंशीय स्थिति या AnyRes की टाइल-और-थंबनेल के बजाय, प्रत्येक पैच में 3D स्थिति (समय, ऊंचाई, चौड़ाई) होती है। क्वेरी / कुंजी घूर्णन मनमाने ढंग से H, W और समय लंबाई को संभालते हैं।

M-RoPE बिना पुनर्व्यवस्था के मूल गतिशील संकल्प भेजता है। यदि आप किसी भी HxW छवि को फ़ीड करते हैं, तो पैच एम्बेडर H/14 x W/14 टोकन उत्पन्न करता है, प्रत्येक टोकन को अपनी (t=0, r=row, c=col) स्थिति मिलती है, RoPE सही आवृत्तियों के साथ ध्यान को घुमाता है, किया गया है। Qwen2.5-VL और Qwen3-VL इस तरह जारी रखते हैं। InternVL3 का V2PE एक ही विचार है जिसमें प्रति मोडलिटी चर एन्कोडिंग होती है।

AnyRes के विपरीत, M-RoPE मूल संकल्प पर O(H x W / P^2) टोकन है कोई गुणात्मक टाइल ओवरहेड नहीं। NaViT के विपरीत, यह अभी भी प्रति आगे एक छवि की उम्मीद करता है। रिज़ॉल्यूशन पर बैचिंग के लिए अभी भी शीर्ष पर पैच-एन'-पैक की आवश्यकता होती है।

NaFlex (SigLIP 2)

NaFlex सिगलिप 2 चेकपॉइंट का नेटिव-फ्लक्स मोड है। एक एकल मॉडल इन्फेरेंस पर कई अनुक्रम लंबाई (256, 729, 1024 टोकन) की सेवा करता है। आंतरिक रूप से यह प्रशिक्षण के दौरान NaViT शैली के पैच-एन'-पैक और प्रति पैच पूर्ण अंशीय पदों का उपयोग करता है। बिक्री बिंदुः एक चेकपॉइंट, कार्य के आधार पर इन्फेरेंस पर अपने टोकन बजट का चयन करें।

एक अर्थपूर्ण कार्य (वर्गीकरण, पुनर्प्राप्ति) के लिए 256 टोकन। ओसीआर या चार्ट समझ के लिए, 1024 टोकन। कोई पुनर्व्यवस्था नहीं।

पैकिंग मास्क

ब्लॉक-आयामी मुखौटा है जहां अधिकांश कार्यान्वयन ठोकर लगती है। लंबाई के पैक अनुक्रम के लिएN_totalचित्रों को कवर करना i=0..B-1लम्बाई के साथ n_i, मुखौटा Mआकार का (N_total, N_total)1 है अगर दोनों सूचकांक एक ही छवि के ब्लॉक में गिरते हैं, अन्यथा 0. आप इसे एक संचयी लंबाई सूची से बना सकते हैंः

offsets = [0, n_0, n_0+n_1, ..., N_total]
M[i, j] = 1 iff there exists b where offsets[b] <= i < offsets[b+1] and offsets[b] <= j < offsets[b+1]

यह PyTorch में एक पंक्ति है torch.block_diagFlashAttention के चर-लंबाई पथ (cu_seqlens) मास्क को पूरी तरह से छोड़ देता है और संचयी लंबाई के Tensor का उपयोग करके सीधे क्रम में भाग लेता है ~ 10x अधिक तेजी से एक घने मास्क के लिए विशिष्ट बैच के लिए।

टोकन बजट

कार्य के अनुसार अपनी रणनीति चुनें:

  • ओसीआर / दस्तावेजः 1024-4096 टोकन. सिगलिप 2 NaFlex पर 1024, या AnyRes 3x3 + थंबनेल।
  • चार्ट और UI: 729-1024 टोकन 384-448 मूल पर। Qwen2.5VL गतिशील संकल्प अधिकतम पिक्सेल कैप के साथ।
  • प्राकृतिक तस्वीरें: 256-576 टोकन ठीक है. डाउनस्ट्रीम LLM पर्याप्त देखता है. टोकन के लिए भुगतान करें जहां सामग्री घनत्व उच्च है.
  • वीडियोः 64-128 टोकन प्रति फ्रेम स्थानिक pooling के बाद, 2-8 FPS. पाठ 12.17 इस कवर करता है।

2026 उत्पादन नियमः प्रति कार्य अधिकतम पिक्सेल कैप चुनें, उस कैप तक मूल आयाम अनुपात में एन्कोड करें, बैच को पैक करें, और पैडिंग छोड़ दें।min_pixelsऔर max_pixelsठीक इस बटन के लिए.

इसका प्रयोग करें

code/main.pyपूर्णांक पिक्सेल निर्देशांक के साथ छवियों के विषम बैच के लिए पैच-एन'-पैक लागू करता है। यहः

  • (एच, डब्ल्यू) छवि आकारों की सूची लेता है।
  • पैच आकार 14 पर प्रत्येक छवि के पैच अनुक्रम की लंबाई की गणना करता है।
  • कुल लंबाई के एक अनुक्रम में उन्हें पैक sum(n_i). .
  • ब्लॉक-आयामी ध्यान मुखौटा (सघन, स्पष्टता के लिए) बनाता है।
  • पैक की लागत बनाम वर्ग आकार और AnyRes टाइलिंग की तुलना करता है।
  • मिश्रित बैच (रिसीव, चार्ट, स्क्रीनशॉट, फोटो) के लिए एक टोकन बजट तालिका प्रिंट करता है।

यह संख्या जो बाहर गिर जाते हैं 2026 में हर खुला VLM पैच-एन-पैक का उपयोग करने का कारण है।

इसे भेजें

यह सबक हमें फल देता हैoutputs/skill-resolution-budget-planner.md. एक मिश्रित-अवलोकन-अनुपात कार्यभार (ओसीआर, चार्ट, फोटो, वीडियो फ्रेम) और एक कुल टोकन बजट को देखते हुए, यह सही रणनीति (नाफ्लिक्स, एनीरेस, एम-रोपी, या फिक्स्ड-स्क्वायर) चुनता है और प्रति अनुरोध विन्यास जारी करता है। उत्पाद के लिए एक वीएलएम के आकार का उपयोग करते समय इस कौशल का उपयोग करें यह मौन 10x टोकन फटने से बचाता है जो विलंबता बजट को मारता है।

व्यायाम

  1. एक रसीद 600x1500 (1:2.5) है, पैच आकार 14 पर, कितने मूल-रिज़ॉल्यूशन टोकन हैं? 336 तक वर्ग आकार के बाद कितने हैं? जो अभ्यास में अधिक ओसीआर सटीकता खो देता है?
  1. 256, 576, 729, 1024 लंबाई के साथ चार छवियों के बैच के लिए ब्लॉक-आयामी मुखौटा बनाएं ध्यान मैट्रिक्स 2585x2585 है और ठीक है256^2 + 576^2 + 729^2 + 1024^2शून्य से बाहर प्रविष्टियाँ।
  1. पैच 14 पर 1792x896 की छवि के लिए, तुलना करेंः (a) वर्ग-आकार को 336 तक करें और फिर एन्कोड करें, (b) AnyRes 2x1 + थंबनेल, (c) मूल में M-RoPE। कौन सा सबसे कम टोकन का उपयोग करता है? कौन सा सबसे अधिक विवरण संरक्षित करता है?
  1. आंशिक पैच ड्रॉपिंग लागू करेंः पैक किए गए अनुक्रम को देखते हुए, टोकन का 50% समान रूप से यादृच्छिक रूप से ड्रॉप करें, और तदनुसार ब्लॉक-चक्र मुखौटा को अपडेट करें। मुखौटा की स्पायरसिटी परिवर्तन को मापें।
  1. Qwen2-VL पेपर (arXiv:2409.12191) के खंड 3.2 को पढ़ें। दो वाक्य में वर्णन करें कि क्याmin_pixelsऔर max_pixelsनियंत्रण और क्यों दोनों सीमाओं महत्वपूर्ण हैं।

प्रमुख शर्तें

TermWhat people sayWhat it actually means
Patch-n'-pack"NaViT-style packing"Concatenate variable-length patch sequences from different images into one batch dimension
Block-diagonal mask"Packing mask"Attention mask that confines each image's patches to attend only to themselves, not neighbors in the pack
AnyRes"LLaVA-NeXT tiling"Split a high-res image into a grid of fixed-size tiles plus a global thumbnail; encode every tile with a fixed encoder
NaFlex"SigLIP 2 native-flex"Single SigLIP 2 checkpoint that serves 256/729/1024-token budgets at inference without retraining
M-RoPE"Multimodal RoPE"3D rotary position encoding (time, row, column) that handles arbitrary H, W, T without position tables
cu_seqlens"FlashAttention packing"Cumulative-length tensor the FlashAttention varlen path uses instead of a dense block-diagonal mask
min_pixels / max_pixels"Resolution bounds"Qwen2.5-VL per-request knobs capping token count on very small or very large inputs
Visual token budget"How many tokens per image"Rough count of patch tokens emitted per image; sets the LLM's prompt budget and attention cost

आगे पढ़ना

This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.

Browse the complete course catalog or open this lesson on GitHub.