بسیاری از تصاویری که در برنامههای کاربردی تحلیل میشوند — مانند فاکتورها، رسیدهای بانکی، نمودارهای عریض و اسکرینشاتهای موبایل — نسبتهای ابعادی نامتقارن دارند. رویکرد مرسوم تا قبل از سال 2024 تغییر اندازهی اجباری تمام تصاویر به مربعهای ثابت 224x224 یا 336x336 بود؛ روشی که متون ریز را مخدوش میکرد، جزئیات اسناد را از بین میبرد و در فرایندهایی مثل OCR یا درک اسناد افت دقت چشمگیری رقم میزد.
در سالهای اخیر، مدلهای بینایی-زبانی (VLM) با تکنیکهایی مانند Patch-n'-Pack در NaViT، روش M-RoPE در Qwen2-VL و قابلیت NaFlex در SigLIP 2 به سمت پذیرش تصاویر با وضوح طبیعی و نسبت ابعاد آزاد رفتهاند. با کنار گذاشتن پدینگهای بیهوده و کاشیکاریهای هزینهبر، این امکان فراهم شده است که دستههای ناهمگن از تصاویر مستقیماً با یک ماسک قطری-بلوکی (Block-diagonal mask) بستهبندی و پردازش شوند.
در این درس پیادهسازی گامبهگام بستهبندی توکنهای پچ در یک توالی واحد، ساخت ماسک قطری-بلوکی و تنظیم بهینهی سقف توکنها برای سناریوهای مختلف بررسی میشود تا بتوانید با کمترین بار محاسباتی و بدون انفجار طول پرامپت، تصاویر با هر نسبت ابعادی را به مدلهای چندحالته بسپارید.
تصاویر واقعی مربعهای 224x224 نیستند. یک رسید نسبت 1:3 دارد، یک نمودار 16:9 است، اسکن پزشکی شاید 4096x4096 باشد و اسکرینشات موبایل 9:19.5 است. پاسخ مدلهای بینایی-زبانی (VLM) قبل از سال 2024 — تغییر اندازه همهی تصاویر به یک مربع ثابت — سیگنالی را که لازمهی کارکرد OCR، درک سند (Document Understanding) و تحلیل صحنههای وضوحبالا است کاملاً دور میریخت. معماری NaViT (گوگل، 2023) نشان داد که میتوان پچهایی با وضوح متغیر را با استفاده از ماسک قطری-بلوکی (block-diagonal masking) درون یک دسته (batch) واحد ترنسفورمر بستهبندی کرد. روش M-RoPE در Qwen2-VL (2024) جدولهای موقعیت مکانی مطلق را بهکلی کنار گذاشت. راهکار AnyRes در LLaVA-NeXT تصاویر با وضوح بالا را به یک تصویر پایه بهعلاوهی زیرتصویرها کاشیکاری کرد. نسخهی NaFlex در SigLIP 2 (2025) اکنون انکودر پیشفرض برای VLMهای متنبازی است که میخواهند با یک چکپوینت واحد به هر نسبت ابعادی (Aspect ratio) پاسخ دهند. در این درس، تکنیک patch-n'-pack را از صفر تا صد پیادهسازی میکنیم.
اهداف یادگیری
- بستهبندی پچهای دستهای از تصاویر با وضوح متغیر در یک توالی واحد و ساخت ماسک اتنشن قطری-بلوکی.
- انتخاب درست میان کاشیکاری AnyRes (در LLaVA-NeXT)، NaFlex (در SigLIP 2) و M-RoPE (در Qwen2-VL) برای وظیفهای مشخص.
- محاسبهی سقف توکنها برای OCR، نمودارها و عکاسی بدون تغییر اندازه (resize).
- نام بردن از سه حالت شکست (Failure modes) تغییر اندازه به مربع: متن لهشده، محتوای برشخورده، و توکنهای تلفشده برای پدینگ (Padding).
صورت مسئله
ترنسفورمرها انتظار یک توالی را دارند. یک دسته در واقع مجموعهای از توالیها با طول یکسان است. اگر تصاویر شما 224x224 باشند، هر بار 196 توکن پچ میگیرید، پدینگ لازم نیست و کار تمام است. روی 224 آموزش دهید، روی 224 استنتاج کنید و دیگر هرگز به وضوح تصویر فکر نکنید.
اما دنیای واقعی همراهی نمیکند. اسناد عمودیاند (8.5x11 اینچ، حدوداً 2:3). اسکرینشات نمودارها افقی است (16:9). رسیدها باریک و بلندند (1:3). تصاویر پزشکی با وضوح 2048x2048 یا بزرگتر عرضه میشوند. اسکرینشاتهای موبایل ابعاد 1170x2532 (0.46:1) دارند.
سه گزینه تا پیش از سال 2024 و علت ناکارآمدی هرکدام:
- تغییر اندازه به یک مربع ثابت (224x224 یا 336x336). فشردگی، متنها و چهرهها را دفرمه میکند. کاهش مقیاس (downscale) برچسبهای نمودار و محتوای OCR را از بین میبرد؛ این رویه تا پیش از LLaVA-1.5 استاندارد بود.
- برش زدن به یک نسبت ابعاد ثابت. در این حالت بیشتر تصویر را دور میریزید و انتخاب محل برش نیز خود یک مسئلهی بینایی ماشین مجزاست.
- پدینگ کردن تصویر تا اندازهی ضلع بزرگتر. این کار اعوجاج را حل میکند، اما در تصاویر عمودی بیش از 50% از توکنها پای پدینگ هدر میروند؛ آن هم با هزینهی محاسباتی درجهدوم اتنشن روی تکتک این توکنهای پدینگ.
پاسخ سالهای 2024 و 2025: بگذارید ترنسفورمر پچها را در وضوح طبیعی تصویر دریافت کند، و راهی پیدا کنید تا یک دستهی ناهمگن را بدون هدررفت محاسبات درون یک توالی ببندید.
مفهوم
روش NaViT و تکنیک patch-n'-pack
مقاله NaViT (دهقانی و همکاران، 2023) نشان داد که این ایده در مقیاس بزرگ جواب میدهد. سازوکار این روش سرراست است:
- برای هر تصویر در دسته، شبکهی پچهای آن را در وضوح طبیعی با اندازهی پچ انتخابی (مثلاً 14) محاسبه کنید.
- پچهای هر تصویر را به توالی اختصاصی آن با طول متغیر تبدیل (flatten) کنید.
- پچهای تمام تصاویر را به هم متصل (concatenate) کرده و برای کل دسته یک توالی بلند بسازید.
- یک ماسک اتنشن قطری-بلوکی بسازید تا پچهای تصویر A فقط به درون خود تصویر A اتنشن داشته باشند.
- اطلاعات موقعیت مکانی هر پچ را منتقل کنید (RoPE دوبعدی یا امبدینگهای موقعیت کسری).
یک دسته شامل سه تصویر با ابعاد 336x336 (576 توکن)، 224x224 (256 توکن) و 448x336 (768 توکن) به یک توالی 1600 توکنی با یک ماسک قطری-بلوکی 1600x1600 تبدیل میشود. بدون پدینگ، بدون هدررفت محاسبات؛ ترنسفورمر از پس هر نسبت ابعادی برمیآید.
معماری NaViT قابلیت حذف تصادفی بخشی از پچها (fractional patch dropping) در زمان آموزش را نیز معرفی کرد — حذف تصادفی 50% از پچها در سراسر دسته — که هم نقش منظمسازی (regularization) دارد و هم آموزش را سرعت میدهد. مدل SigLIP 2 نیز این ویژگی را به ارث برده است.
کاشیکاری AnyRes (در LLaVA-NeXT)
تکنیک AnyRes در LLaVA-NeXT رویکردی عملگرایانهتر است. در مواجهه با یک تصویر با وضوح بالا و یک انکودر ثابت (CLIP یا SigLIP در وضوح 336)، تصویر را کاشیکاری (tile) کنید:
- چیدمان شبکهای را از میان مجموعهای ازپیشتعریفشده — (1x1)، (1x2)، (2x1)، (1x3)، (3x1)، (2x2) و غیره — انتخاب کنید که بهترین تطابق را با نسبت ابعاد تصویر دارد.
- کل تصویر را روی این شبکه کاشیکاری کنید؛ هر کاشی به یک برش 336x336 تبدیل میشود.
- یک تصویر بندانگشتی (thumbnail) هم بسازید: کل تصویر که به ابعاد 336x336 تغییر اندازه داده شده تا نقش توکن بستر سراسری (global-context token) را بازی کند.
- هر کاشی را از انکودر فریزشدهی 336 عبور دهید. سپس توکنهای کاشیها را با توکنهای تصویر بندانگشتی الحاق کنید.
برای یک تصویر 672x672 با شبکهی 2x2 بهاضافهی بندانگشتی: 4 * 576 + 576 = 2880 توکن بصری تولید میشود. گران اما موثر است — مدل زبانی بزرگ (LLM) هم جزئیات محلی را میبیند و هم بستر کلی را درک میکند.
وقتی انکودر شما فریز شده و فقط از یک وضوح پشتیبانی میکند، AnyRes گزینهی منتخب است. البته این روش برای تصاویر بزرگ با انفجار تعداد توکن روبهرو میشود (یک تصویر 1344x1344 با شبکهی 4x4 حدوداً 9216 + 576 ≈ 9800 توکن مصرف میکند که قبل از رسیدن هرگونه متنی، ظرفیت زمینهی 8k یک LLM را سرریز میکند).
روش M-RoPE (در Qwen2-VL)
مدل Qwen2-VL امبدینگ موقعیت چرخشی چندحالته (M-RoPE) را معرفی کرد. بهجای موقعیتهای کسری NaViT یا رویکرد کاشی و بندانگشتی AnyRes، هر پچ یک موقعیت سهبعدی (زمانی، ارتفاع، عرض) همراه دارد. چرخشهای پرسوجو/کلید (query/key) هر مقداری از H و W و طول زمانی را پوشش میدهند.
روش M-RoPE وضوح پویای طبیعی را بدون نیاز به آموزش مجدد فراهم میکند. در زمان استنتاج، هر تصویری با ابعاد HxW را به مدل میدهید، لایهی پچ امبدینگ H/14 x W/14 توکن تولید میکند، به هر توکن موقعیت (t=0, r=row, c=col) اختصاص مییابد، RoPE اتنشن را با فرکانسهای مناسب میچرخاند و کار تمام است. این مسیر در Qwen2.5-VL و Qwen3-VL هم ادامه یافته است. روش V2PE در InternVL3 نیز همین ایده را با انکودینگ متغیر بهازای هر مدالیته دنبال میکند.
برخلاف AnyRes، مدل M-RoPE دقیقاً توکن در وضوح طبیعی مصرف میکند — بدون سربار چندبرابری کاشیها. با این حال برعکس NaViT، در هر مرحلهی رفت (forward) همچنان یک تصویر را انتظار دارد؛ بنابراین دستهبندی روی وضوحهای مختلف همچنان به پیادهسازی patch-n'-pack در لایهی بالاتر نیاز دارد.
قابلیت NaFlex (در SigLIP 2)
حالت NaFlex در واقع مد بومیِ انعطافپذیر چکپوینت SigLIP 2 است. یک مدل واحد در زمان استنتاج به طول توالیهای متعددی (256، 729، 1024 توکن) پاسخ میدهد. در لایهی داخلی، در زمان آموزش از patch-n'-pack به سبک NaViT و موقعیتهای کسری مطلق برای هر پچ استفاده میکند. برگ برندهی آن: یک چکپوینت واحد دارید و سقف توکن خود را در زمان استنتاج بر اساس وظیفه تعیین میکنید.
برای کارهای معنایی (طبقهبندی، بازیابی)، 256 توکن. برای OCR یا درک نمودار، 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_diag یا با یک عملیات gather صریح در یک خط کد انجام میشود. مسیر طول متغیر (varlen) در FlashAttention که با cu_seqlens کار میکند، این ماسک را کاملاً نادیده میگیرد و با استفادهی مستقیم از تنسور طول تجمعی، اتنشن را درون توالیها اعمال میکند — این روش برای دستههای معمول حدود 10 برابر سریعتر از یک ماسک چگال است.
سقف توکنها
استراتژیتان را بر اساس نوع وظیفه انتخاب کنید:
- پردازش سند / OCR: بین 1024 تا 4096 توکن. استفاده از SigLIP 2 NaFlex روی 1024 توکن، یا AnyRes با شبکهی 3x3 بهاضافهی بندانگشتی.
- نمودارها و رابط کاربری (UI): بین 729 تا 1024 توکن در وضوح طبیعی 384-448. استفاده از وضوح پویای Qwen2.5-VL بههمراه تعیین سقف حداکثر پیکسل.
- عکسهای طبیعی: بین 256 تا 576 توکن کاملاً جواب میدهد. LLM پاییندست اطلاعات کافی را میبیند. هزینهی توکنها را جایی بپردازید که تراکم محتوا بالا باشد.
- ویدیو: 64 تا 128 توکن بهازای هر فریم پس از تجمیع مکانی (spatial pooling)، با نرخ 2 تا 8 فریم بر ثانیه. این موضوع را در درس 12.17 پوشش میدهیم.
قانون محیطهای پروداکشن در سال 2026: سقف حداکثر پیکسل را متناسب با وظیفه تعیین کنید، تصویر را با نسبت ابعاد طبیعی تا آن سقف انکود کنید، دسته را ببندید و پدینگ را کنار بگذارید. مدل Qwen2.5-VL پارامترهای min_pixels و max_pixels را دقیقاً برای کنترل همین بخش در اختیارتان میگذارد.
استفاده از ابزارهای واقعی
فایل code/main.py روش patch-n'-pack را برای دستهای ناهمگن از تصاویر با مختصات پیکسلی عدد صحیح پیادهسازی میکند. این کد:
- فهرستی از ابعاد تصاویر را بهصورت (H, W) دریافت میکند.
- طول توالی پچهای هر تصویر را با اندازهی پچ 14 محاسبه میکند.
- آنها را در یک توالی واحد به طول کل
sum(n_i)بستهبندی میکند. - ماسک اتنشن قطری-بلوکی را (برای وضوح بیشتر، بهصورت چگال) میسازد.
- هزینهی بستهبندی را با تغییر اندازه به مربع و کاشیکاری AnyRes مقایسه میکند.
- جدول سقف توکن را برای یک دستهی ترکیبی (رسید، نمودار، اسکرینشات، عکس) چاپ میکند.
آن را اجرا کنید. اعدادی که در خروجی میبینید دلیل محکمی هستند بر اینکه چرا تمام VLMهای متنباز سال 2026 از patch-n'-pack استفاده میکنند.
خروجی نهایی
این درس سند outputs/skill-resolution-budget-planner.md را تولید میکند. این ابزار با گرفتن ورودیهایی با نسبت ابعاد متغیر (OCR، نمودارها، عکسها، فریمهای ویدیویی) و یک سقف کلی توکن، استراتژی مناسب (NaFlex، AnyRes، M-RoPE یا مربع ثابت) را انتخاب میکند و برای هر درخواست یک پیکربندی تحویل میدهد. هنگام برآورد ظرفیت یک VLM برای یک محصول از این مهارت استفاده کنید؛ این کار جلوی انفجار 10 برابری و ناگهانی توکنها را که سقف تاخیر (Latency budget) را میبلعد، میگیرد.
تمرینها
-
یک رسید ابعاد 600x1500 (نسبت 1:2.5) دارد. با اندازهی پچ 14، چه تعداد توکن در وضوح طبیعی تولید میشود؟ پس از تغییر اندازه به مربع 336 چطور؟ در عمل، کدام حالت دقت OCR بیشتری را هدر میدهد؟
-
ماسک قطری-بلوکی را برای دستهای از چهار تصویر با طولهای 256، 576، 729 و 1024 بسازید. مطمئن شوید که ماتریس اتنشن دارای ابعاد 2585x2585 است و دقیقاً
256^2 + 576^2 + 729^2 + 1024^2درایهی غیرصفر دارد. -
برای یک تصویر 1792x896 با پچ 14، این سه حالت را مقایسه کنید: (الف) تغییر اندازه به مربع 336 و سپس انکود، (ب) روش AnyRes با شبکهی 2x1 بهاضافهی بندانگشتی، (ج) روش M-RoPE در وضوح طبیعی. کدام حالت کمترین توکن را مصرف میکند؟ کدامیک جزئیات بیشتری را حفظ میکند؟
-
سازوکار حذف تصادفی بخشی از پچها را پیادهسازی کنید: بهطوری که در یک توالی بستهبندیشده، 50% از توکنها بهطور یکنواخت و تصادفی حذف شوند و ماسک قطری-بلوکی هم متناسب با آن بهروزرسانی شود. تغییر میزان تنکسازی (Sparsity) ماسک را اندازه بگیرید.
-
بخش 3.2 مقالهی Qwen2-VL (شناسه arXiv:2409.12191) را بخوانید. در دو جمله توضیح دهید که
min_pixelsوmax_pixelsچه متغیری را کنترل میکنند و چرا تعیین هر دو کران اهمیت دارد.
اصطلاحات کلیدی
| اصطلاح | در گفتار روزمره | مفهوم فنی و دقیق |
|---|---|---|
| Patch-n'-pack | «بستهبندی به سبک NaViT» | الحاق توالیهای پچ با طول متغیر از تصاویر گوناگون درون یک بُعد دستهی واحد |
| Block-diagonal mask | «ماسک بستهبندی» | ماسک اتنشنی که پچهای هر تصویر را محدود میکند تا فقط به خودشان نگاه کنند، نه به همسایههای موجود در بسته |
| AnyRes | «کاشیکاری LLaVA-NeXT» | تقسیم تصویر وضوحبالا به شبکهای از کاشیهای اندازهثابت بههمراه یک بندانگشتی سراسری؛ و سپس انکود هر کاشی با یک انکودر ثابت |
| NaFlex | «حالت انعطافپذیر طبیعی SigLIP 2» | چکپوینت واحد SigLIP 2 که در زمان استنتاج، سقفهای 256/729/1024 توکنی را بدون آموزش مجدد پوشش میدهد |
| M-RoPE | «انکودینگ RoPE چندحالته» | انکودینگ موقعیت چرخشی سهبعدی (زمان، سطر، ستون) که بدون نیاز به جدولهای موقعیت، ابعاد دلخواه H و W و T را پوشش میدهد |
| cu_seqlens | «بستهبندی در FlashAttention» | تنسور طول تجمعی که مسیر varlen در FlashAttention بهجای ماسک قطری-بلوکی چگال به کار میبرد |
| min_pixels / max_pixels | «کرانهای وضوح تصویر» | تنظیمات هر درخواست در Qwen2.5-VL برای مهار تعداد توکنها در ورودیهای بسیار کوچک یا بسیار بزرگ |
| Visual token budget | «سقف توکن تصویر» | برآورد تعداد توکنهای پچ تولیدشده بهازای هر تصویر؛ تعیینکنندهی بودجهی پرامپت و هزینهی اتنشن مدل زبانی |
برای مطالعهی بیشتر
- Dehghani et al. — Patch n' Pack: NaViT (arXiv:2307.06304)
- Wang et al. — Qwen2-VL (arXiv:2409.12191)
- Laurençon et al. — What matters when building vision-language models? (Idefics2, arXiv:2405.02246)
- Tschannen et al. — SigLIP 2 (arXiv:2502.14786)
- Qwen Team — Qwen2.5-VL Technical Report (arXiv:2502.13923)
