Phase 12: Multimodal AI

چشم انداز هر رزولوشن: پچ-ن-پاک و NaFlex

تصاویر واقعی 224x224 مربع نیستند. يه رساله 9:16، يه نمودار 16:9, يک اسکن پزشکي ممکنه 4096x4096 باشه، يه عکس اسکرين تلفن همراه 9:19.5 باشه پاسخ VLM قبل از 2024 همه چیز را به یک مربع ثابت تغییر دهید سیگنال را که باعث می شود OCR، درک اسناد و تجزیه و تحلیل صحنه با وضوح بالا کار کند، رد کرد. NaViT (گوگل، 2023) نشان داد که می توانید پیچ های با وضوح متغیر را با ماسک بلوک دیآگونال به یک دسته ترانسفورماتور واحد بسته بندی کنید. M-RoPE (2024) Qwen2-VL جداول موقعیت مطلق را کاملاً از بین برد. AnyRes LLaVA-NeXT تصاویر با وضوح بالا را به یک پایه + زیر تصویر قرار داد. نسخه NaFlex SigLIP 2 (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 tiling (LLaVA-NeXT) ، NaFlex (SigLIP 2) و M-RoPE (Qwen2-VL) انتخاب کنید.
  • بودجه های توکن را برای OCR، نمودارها و عکاسی بدون تغییر اندازه محاسبه کنید.
  • سه حالت شکست در اندازه گیری مربع را نام ببرید: متن خرد شده، محتوای برش شده، توکن های تلف شده در پر کردن.

مشکل

ترانسفورماتورها انتظار دنباله ای دارند. یک دسته یک دسته دنباله ای است که طول آن یکسان است. اگر تصاویر شما 224x224 باشد، هر بار 196 تکه تکه تکه دریافت می کنید، پوشیدن لازم نیست، کار انجام شده است. قطار در 224، نتیجه گیری در 224، هرگز به رزولوشن فکر نکنید.

جهان همکاری نمی کند. اسناد تصویر (8.5x11 اینچ، 2:3-ش) هستند. تصاویر صفحه نمایش نمودار منظره ای هستند (16:9). رسید ها بلند و نازک (1:3). سفینهای تصویربرداری پزشکی در 2048x2048 یا بزرگتر. تصاویر صفحه نمایش دستگاه های تلفن همراه 1170x2532 (0.46:1).

سه گزینه قبل از سال 2024 و چرا هر کدام شکست می خورند:

  1. اندازه را به یک مربع ثابت (224x224 یا 336x336) تغییر دهید. اسکوش متن و چهره را تحریف می کند. مقیاس پایین برچسب های نمودار و محتوای OCR را نابود می کند. تمرین استاندارد تا LLaVA-1.5.
  2. شما بیشتر تصاویر را از بین می برید و انتخاب محل محصول مشکل بینایی خودش است.
  3. پاد به طولانی ترین طرف. تحریف را اصلاح می کند اما 50٪ از توکن ها را در پرتو برای تصاویر پورتر تلف می کند. هزینه توجه مربع در تمام این توکن های پاد.

پاسخ 2024-2025: اجازه دهید ترانسفورماتور پشه ها را در رزولوشن بومی تصویر بخورید و بفهمید که چگونه یک دسته متغیر را در یک ردیف بدون تلف کردن محاسبات بسته بندی کنید.

مفهوم

NaViT (Dehghani et al., 2023) مقاله ای بود که این کار را در مقیاس نشان داد. ایده مکانیکی است:

  1. برای هر تصویر در دسته، شبکه ی پلاک بومی آن را در اندازه پلاک انتخاب شده محاسبه کنید (بگو 14).
  2. هر عکس رو به دنباله ی خود با طول متغیر صاف کنید.
  3. تمام تکه های تصویر را به یک ردیف طولانی برای دسته بندی متصل کنید.
  4. یک ماسک توجه به شکل بلوک بسازید تا پیچ های تصویر A فقط در داخل تصویر A حضور داشته باشند.
  5. اطلاعات موقعیت در هر پیچ (2D RoPE یا ورودی موقعیت کسری) را حمل کنید.

یک دسته از سه تصویر در 336x336 (576 توکن) ، 224x224 (256 توکن) و 448x336 (768 توکن) به یک سری 1600 توکن با یک ماسک بلوک-دیاجونال 1600x1600 تبدیل می شود. هیچ پوشاندن. هیچ محاسباتی تلف نشده است. ترانسفورماتور نسبت های جنبه های تعسفی را اداره می کند.

NaViT همچنین کاهش بخش های پیچ را در طول تمرین معرفی کرد کاهش 50٪ از پیچ ها به طور تصادفی در سراسر دسته که هم تنظیم و هم سرعت آموزش را افزایش می دهد. SigLIP 2 این را به ارث برده است.

AnyRes (LLaVA-NeXT)

AnyRes LLaVA-NeXT جایگزین عملی است. با توجه به یک تصویر با وضوح بالا و یک کدگر ثابت (CLIP یا SigLIP در 336) ، تصویر را تایل کنید:

  1. یک طرح شبکه را از مجموعه ای از قبل تعریف شده انتخاب کنید (1x1) ، (1x2), (2x1), (1x3), (3x1), (2x2), و غیره که بهترین تناسب با نسبت ابعاد تصویر را متناسب کند.
  2. تمام تصویر را به شبکه بنویسید؛ هر یک از این کاشی ها به محصول 336x336 تبدیل می شود.
  3. همچنین یک تصویر کوچک تولید کنید: کل تصویر به اندازه 336x336 به عنوان یک توکن زمینه جهانی تغییر داده شده است.
  4. هر کاشی را از طریق کدگر ۳۳۶ یخ زده رمزگذاری کنید. توکن های کاشی + توکن های تمنیل را ترکیب کنید.

برای یک تصویر 672x672 در شبکه 2x2 به علاوه تمبنیل: 4 * 576 + 576 = 2880 توکن بصری. گران قیمت اما موثر LLM هر دو جزئیات محلی و زمینه جهانی را می بیند.

AnyRes مسیر انتخاب زمانی است که کدگر شما منجمد شده است و تنها یک رزولوشن را پشتیبانی می کند. این تعداد توکن ها را برای تصاویر بزرگ منفجر می کند (تصاویر 1344x1344 در شبکه 4x4 9216 + 576 ≈ 9800 توکن است، که بیشتر زمینه LLM 8k را پر می کند).

M-RoPE (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 ادامه می دهند. V2PE InternVL3 همان ایده با کدگذاری متغیر در هر حالت است.

بر خلاف AnyRes، M-RoPE O(H x W / P^2) توکن ها در رزولوشن بومی است بدون هزینه بالای تخفیف ضرب. بر خلاف NaViT، هنوز هم انتظار یک تصویر واحد در هر پیشروی است. برای دسته بندی در سراسر رزولوشن هنوز هم نیاز به پیچ-n'-پاک در بالای آن است.

NaFlex (SigLIP 2)

NaFlex حالت فلیکس بومی نقطه بازرسی SigLIP 2 است. یک مدل واحد طول های متعدد ردیف (256, 729, 1024 توکن) را در نتیجه گیری انجام می دهد. در داخل از پچ-ن'-پک سبک 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مسیر طول متغیر 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 توکن در هر فریم پس از جمع بندی فضایی، 2-8 FPS. درس 12.17 این را پوشش می دهد.

قانون تولید 2026: یک کیپ حداکثر پیکسل در هر کار را انتخاب کنید، در نسبت جنبه های بومی تا آن کیپ کدگذاری کنید، دسته را بسته بندی کنید و پر کردن را رد کنید. Qwen2.5-VL نشان می دهد min_pixelsوmax_pixelsبرای همین دستبند

ازش استفاده کن

code/main.pyاستفاده از پیچ-ن'-پاک برای یک دسته متفاوت از تصاویر با نقاط هماهنگی پیکسل های کامل:

  • یک لیست از اندازه های تصویر (H، W) را می گیرد.
  • طول دنباله ی پیچ هر تصویر را در اندازه پیچ 14 محاسبه می کند.
  • آنها را به یک سلسله با طول کل بسته بندی می کندsum(n_i). .
  • ماسک توجه بلاک دیآگونال (بنده، برای شفافیت) را ایجاد می کند.
  • هزینه بسته بندی را با اندازه مربع و کاشی AnyRes مقایسه می کند.
  • یک جدول بودجه توکن برای یک دسته مخلوط (حساب، نمودار، عکس صفحه نمایش، عکس) چاپ می شود.

شماره هاي که از دست مياد دليل اينه که هر 2026 VLM بازي شده از بسته هاي پيچ استفاده ميکنه

-باده

این درس به ما کمک می کندoutputs/skill-resolution-budget-planner.md. با توجه به یک حجم کار با نسبت جنبه های مخلوط (OCR، نمودارها، عکس ها، فریم های ویدیویی) و بودجه ای با توکن کل، استراتژی مناسب را انتخاب می کند (NaFlex، AnyRes، M-RoPE یا مربع ثابت) و یک پیکربندی در هر درخواست را منتشر می کند. از این مهارت استفاده کنید وقتی که یک VLM را برای یک محصول اندازه گیری می کنید این مانع از انفجار خاموش 10x توکن می شود که بودجه تاخیر را از بین می برد.

تمرینات

  1. یک رسید 600×1500 (1:2.5) در اندازه پیچ 14، چند توکن با وضوح بومی است؟ بعد از مربع سازی به 336، چند توکن؟ کدام یک از آنها دقت OCR بیشتری را در عمل از دست می دهد؟
  1. ماسک بلوک دیآگونال را برای یک دسته از چهار تصویر با طول 256, 576, 729, 1024 بسازید.256^2 + 576^2 + 729^2 + 1024^2ورودی غیر صفر
  1. برای یک تصویر 1792x896 در پیچ 14، مقایسه کنید: (a) مربع اندازه را به 336 کدگذاری کنید، (b) AnyRes 2x1 + تمنیل، (ج) M-RoPE در بومی. کدام یک از توکن ها را کمتر استفاده می کند؟ کدام یک بیشتر جزئیات را حفظ می کند؟
  1. پیاده سازی کاهش بخش های پیچ: با توجه به یک دنباله بسته شده، 50٪ از توکن ها به طور تصادفی به صورت یکسانی رها شوند و ماسک بلوک-دیآگنال به طور متناسب به روز شوند. تغییر کمیابیت ماسک را اندازه گیری کنید.
  1. بخش 3.2 مقاله Qwen2-VL را بخوانید (arXiv:2409.12191).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.