پرش به محتوای اصلی
پرش به محتوای مقاله

Cross-Origin Storage چگونه از بارگذاری مجدد مدل‌های هوش مصنوعی جلوگیری می‌کند؟

·۲ تیر ۱۴۰۵۱۲ دقیقه مطالعه
آزمایش API ذخیره‌سازی Cross-Origin پیشنهادی در Transformers.js
آزمایش API ذخیره‌سازی Cross-Origin پیشنهادی در Transformers.js
اشتراک‌گذاری
واقعاً چه چیز جدید است؟

جایگزینی URL با هش‌های رمزنگاری‌شده برای شناسایی منابع در سطح مرورگر؛ این اولین باری است که مرورگر اجازه می‌دهد فایل‌های حجیم (مانند مدل‌های AI) بین منابع مختلف به اشتراک گذاشته شوند بدون اینکه امنیت ایزولاسیون شبکه به طور کامل قربانی شود.

اگر امروز از چندین وب‌سایت مختلف که از مدل‌های هوش مصنوعی استفاده می‌کنند بازدید کنید، مرورگر شما یک مدل واحد را تا ده بار دانلود می‌کند. گوگل قصد دارد این ناکارآمدی را با معرفی رابط برنامه‌نویسی کاربردی Cross-Origin Storage (COS API) حل کند تا مرورگر بتواند فایل‌های حجیم را از طریق هش‌های رمزنگاری‌شده شناسایی کرده و بین سایت‌های مختلف به اشتراک بگذارد.

این تغییر، نحوه برخورد مرورگر با حجم عظیم مدل‌های محلی را دگرگون می‌کند. به‌جای اینکه مرورگر هر وب‌سایت را یک محیط ایزوله یا «سیلو» ببیند، اکنون تشخیص می‌دهد که یک فایل مدل در سایت A دقیقاً همان فایل در سایت B است، فارغ از اینکه از کجا میزبانی شده‌اند.

همان‌طور که در تحلیل قبلی ما درباره‌ی نحوه پردازش متون در بلوک‌های ترنسفورمر اشاره کردیم، گلوگاه هوش مصنوعی در وب از «محاسبات» به «توزیع داده» تغییر کرده است. اپلیکیشن‌های مدرن وب اغلب برای اجرای استنتاج (Inference) — که شبیه لحظه آشپزی واقعی است، نه دوره آموزش آشپز — مستقیماً در مرورگر، به کتابخانه‌هایی مثل Transformers.js تکیه می‌کنند. طبق مستندات، این اپلیکیشن‌ها مدل‌ها را از Hugging Face Hub می‌گیرند، اما به دلیل پروتکل‌های امنیتی، مرورگر محیط‌های ذخیره (Cache) را بر اساس منبع (Origin) جدا می‌کند تا از حملات زمان‌بندی جلوگیری کند.

تصور کنید دو سایت مختلف هر دو از مدل Xenova/whisper-tiny.en برای بازشناسی گفتار استفاده کنند. حتی اگر فایل‌ها دقیقاً یکسان باشند، مرورگر ۱۷۷ مگابایت داده را دوبار دانلود می‌کند، چون «کلید ایزولاسیون شبکه» (که ترکیبی از سایت سطح‌بالا و سایت فریم فعلی است) بین این دو منبع متفاوت است.

آزمایش API ذخیره‌سازی Cross-Origin پیشنهادی در Transformers.js

زمینه: مشکل ایزولاسیون حافظه پنهان

برای درک ضرورت COS، باید به نحوه مدیریت منابع در مرورگرهای فعلی نگاه کرد. به طور پیش‌فرض، منابع مدل‌های AI از Hugging Face Hub و CDN مربوط به Hugging Face سرو می‌شوند. برای مثال، درخواست یک فایل پیکربندی مانند https://huggingface.co/Xenova/distilbert-base-uncased-finetuned-sst-2-english/resolve/main/config.json به یک URL نهایی در CDN هدایت می‌شود. این URL نهایی حاوی یک etag و هش خاص است تا نسخه‌بندی را تضمین کند؛ نمونه‌ای مثل https://huggingface.co/api/resolve-cache/models/Xenova/distilbert-base-uncased-finetuned-sst-2-english/0b6928efcb76139cae2c6881d49cda67fe119f42/config.json.

در همین حال، منابع زمان اجرای WebAssembly (Wasm) از CDN مربوط به jsDelivr سرو می‌شوند. یک مثال رایج، فایل ort-wasm-simd-threaded.asyncify.wasm است که در زمان نگارش این متن، از آدرس https://cdn.jsdelivr.net/npm/[email protected]/dist/ort-wasm-simd-threaded.asyncify.wasm ارائه می‌شود.

بر اساس استانداردهای امنیتی فعلی، حافظه‌های پنهان برای جلوگیری از حملات زمان‌بندی (Timing Attacks)، بر اساس منبع (Origin) جدا شده‌اند. اگر یک وب‌سایت بتواند تشخیص دهد که منبعی از حافظه پنهان سرو شده است (یعنی در گذشته به آن دسترسی داشته)، می‌تواند به طور بالقوه تاریخچه مرورگر کاربر را افشا کند.

در کروم، این مورد با استفاده از Network Isolation Key اجرا می‌شود. این کلید شامل سایت سطح‌بالا (top-level site) و سایت فریم فعلی (current-frame site) است. این سازوکار یک مرز سخت‌گیرانه برای هر درخواست ایجاد می‌کند. به عنوان مثال، دو اپلیکیشن را در نظر بگیرید که در منابع متفاوت میزبانی شده‌اند:

  • منبع A: https://googlechrome.github.io
  • منبع B: https://rawcdn.rawgit.net

اگر هر دو اپلیکیشن یک فایل زمان‌بندی یکسان را از CDN جی‌اس‌دیلیور (jsDelivr) درخواست کنند، کلیدهای حافظه آن‌ها متفاوت خواهد بود. برای منبع A، کلید ریشه در googlechrome.github.io دارد و برای منبع B، ریشه در rawcdn.rawgit.net است. نتیجه این است که حتی با وجود یکسانی کامل URLها، عدم تطبیق در کلیدهای ایزولاسیون شبکه باعث Cache Miss می‌شود و منجر به دانلود مجدد و ذخیره‌سازی تکراری در دیسک می‌گردد.

جزئیات: سازوکار ذخیره‌سازی مبتنی بر هش

API جدید COS یک رابط به نام navigator.crossOriginStorage معرفی می‌کند. برخلاف Cache API استاندارد که به URLها متکی است و هر تغییر کوچک در آدرس باعث ایجاد یک ورودی جدید می‌شود، COS فایل‌ها را با یک هش رمزنگاری‌شده (مانند SHA-256) شناسایی می‌کند. این یعنی یک منبع بدون توجه به منبع فراخوان یا URL مورد استفاده برای دریافت آن، به عنوان یک فایل یکسان شناخته می‌شود.

آزمایش API ذخیره‌سازی Cross-Origin پیشنهادی در Transformers.js

وقتی یک اپلیکیشن وب فایلی را درخواست می‌کند، فرآیند طی این منطق پیش می‌رود:

  • ارائه هش: اپلیکیشن هش فایل مورد نیاز را ارائه می‌دهد (مثلاً { algorithm: 'SHA-256', value: '8f434346...' }).
  • بررسی ذخیره: مرورگر چک می‌کند آیا هرگونه فایلی با این هش دقیق در ذخیره بین-منبعی (cross-origin store) وجود دارد یا خیر.
  • یافتن در حافظه (Cache Hit): اگر تطبیق داده شود، مرورگر بلافاصله از طریق requestFileHandle(hash) یک FileSystemFileHandle ارائه می‌دهد. این کار به اپلیکیشن اجازه می‌دهد دانلود شبکه را کاملاً نادیده بگیرد.
  • بازیابی Blob: اپلیکیشن سپس handle.getFile() را فراخوانی می‌کند تا فایل را به صورت Blob دریافت کند. فایل خروجی از Blob ارث‌بری می‌کند و مستقیماً در اپلیکیشن قابل استفاده است.
  • عدم تطبیق (Cache Miss): اگر تطبیقی یافت نشود، اپلیکیشن فایل را از شبکه (با استفاده از fetch) دانلود کرده و آن را برای استفاده‌های آتی سایر اپلیکیشن‌ها در COS ذخیره می‌کند. این کار با دستور requestFileHandle(hash, { create: true, origins: '*' }) انجام می‌شود.

آزمایش API ذخیره‌سازی بین‌منبعی پیشنهادی در Transformers.js

این API را عمداً بر اساس ساختار FileSystemDirectoryHandle.getFileHandle() که در API مربوط به سیستم فایل خصوصی منبع (OPFS) استفاده می‌شود، طراحی کرده‌اند. پارامتر hash در COS دقیقاً همان نقش منطقی پارامتر name را در OPFS دارد: شناسایی یکتا از یک منبع. به همین ترتیب، پرچم options.create نیز رفتاری یکسان دارد؛ اگر غایب یا false باشد، دسترسی فقط خواندنی است و اگر true باشد، اپلیکیشن قصد نوشتن یک منبع جدید را دارد.

جزئیات: حل مشکل زمان‌بندی Wasm

این مشکل فراتر از خودِ مدل‌های AI است. در مورد Transformers.js، اپلیکیشن‌ها به یک زمان‌بندی مشترک WebAssembly (Wasm) از کتابخانه ONNX Runtime وابسته هستند.

برای مثال، فایل ort-wasm-simd-threaded.asyncify.wasm با حجم ۴,۷۳۳ کیلوبایت برای تقریباً هر تسک مبتنی بر ترنسفورمر ضروری است. در حال حاضر، اگر کاربر از یک اپلیکیشن تحلیل احساسات به یک اپلیکیشن تبدیل گفتار به متن در یک منبع (Origin) متفاوت برود، مرورگر این فایل ۴.۷ مگابایتی را هر بار دوباره دانلود می‌کند. حتی اگر اپلیکیشن صرفاً یک «مثال ساده» (toy example) باشد، این تکرار به سرعت انباشته شده و حجم زیادی را اشغال می‌کند. این موضوع یادآور چالش‌های بهینه‌سازی در مدل‌های صوتی است؛ برای مثال، برخی روش‌ها مانند فشرده‌سازی وصله‌ای در مدل‌های TTS سعی دارند با کاهش حجم داده‌های پردازشی، گلوگاه‌های حافظه را برطرف کنند.

این اتفاق حتی زمانی رخ می‌دهد که دو اپلیکیشن از مدل‌های AI کاملاً متفاوتی استفاده کنند. برای مثال:

  • حالت الف (بازشناسی گفتار): استفاده از مدل Xenova/whisper-tiny.en که انتخابی مناسب برای تسک‌های رایج ASR انگلیسی است و مدل پیش‌فرض در Transformers.js محسوب می‌شود.
  • حالت ب (تحلیل احساسات): استفاده از مدل Xenova/distilbert-base-uncased-finetuned-sst-2-english که مدل پیش‌فرض برای این تسک خاص است.

چون هر دو اپلیکیشن به همان زمان‌بندی ۴,۷۳۳ کیلوبایتی Wasm وابسته هستند، این فایل برای هر منبعی که کاربر بازدید می‌کند، به طور تکراری کش و در هارد دیسک ذخیره می‌شود. این امر باعث مصرف قابل توجه فضای دیسک و هدررفت پهنای باند برای منابعی می‌شود که کاربر پیش از این به صورت محلی دریافت کرده است.

Chrome DevTools Network panel showing the download of the Wasm runtime resource.

جزئیات: کنترل‌های دقیق دسترسی

گوگل برای جلوگیری از عمومی شدن داده‌های اختصاصی و تجاری، یک سیستم سلسله‌مراتبی برای مدیریت دید (Visibility) طراحی کرده است. توسعه‌دهندگان می‌توانند از طریق گزینه origins تعریف کنند چه کسانی به فایل ذخیره شده دسترسی دارند:

  • سراسری (Global): با مقدار origins: '*'. در این حالت، هر منبعی که هش فایل را بداند، به آن دسترسی دارد. این گزینه برای وزن‌های مدل Whisper (۱۷۷ مگابایت) یا زمان‌بندی Wasm (۴.۷ مگابایت) انتخاب درست است، زیرا هر اپلیکیشن در وب از داشتن یک کپی مشترک سود می‌برد.
  • محدود (Restricted): دسترسی فقط به لیست مشخصی از منابع محدود می‌شود، مثلاً origins: ['https://write.example.com', 'https://calculate.example.com']. این حالت برای منابع اختصاصی، مانند مدل AI تصحیح متون سفارشی یک شرکت که در مجموعه ابزارهای اداری تجاری‌اش استفاده می‌شود، در نظر گرفته شده است.
  • هم‌سایت (Same-Site): اگر پارامتر origins کاملاً حذف شود، فایل فقط بین منابع هم‌سایت (زیردامنه‌های یک سازمان) به اشتراک گذاشته می‌شود و قصد عبور از مرزهای سازمانی را ندارد.

یک قانون حیاتی در این سیستم این است که سطح دسترسی را می‌توان «ارتقا» داد اما هرگز نمی‌توان «تنزل» (Downgrade) کرد. اگر فایلی از قبل به صورت سراسری در دسترس باشد، هرگونه تلاش بعدی برای ذخیره آن با یک لیست محدود، به صورت بی‌صدا نادیده گرفته می‌شود. این کار مانع از آن می‌شود که مهاجمان یک منبع عمومی را مجدداً ذخیره کنند تا دسترسی به آن را برای دیگران محدود نمایند.

در مقابل، یک فایل محدود می‌تواند پذیرنده تر شود. هر سایتی (نه فقط ذخیره‌کننده اولیه) می‌تواند برای همان هش (چون هش‌ها عمومی هستند) متد requestFileHandle() را با create: true و مقدار origins گسترده‌تری فراخوانی کند. برای ارتقای موفقیت‌آمیز یک منبع، سایت درخواست‌کننده باید کل فایل را از طریق هندل بازگردانده شده بنویسد. این مکانیسم مانع از آن می‌شود که سایت‌ها از مسیر ارتقا به عنوان یک کانال جانبی (Side-channel) برای بررسی وجود یا عدم وجود یک فایل در COS استفاده کنند.

جزئیات: حفاظ‌های حریم خصوصی و یکپارچگی

به دلیل بررسی هش در هنگام فرآیند نوشتن، COS API یکپارچگی داده‌ها را به طور خودکار تضمین می‌کند. اگر بایت‌های دانلود شده با هش اعلام‌شده تطابق نداشته باشند، عملیات نوشتن با خطا مواجه می‌شود. این ویژگی نیاز اپلیکیشن‌ها به محاسبه دستی هش‌ها پس از دانلود شبکه را حذف کرده و تضمینی را فراهم می‌کند که فارغ از اینکه منبع دانلود CDN رسمی Hugging Face باشد یا یک آینه (Mirror) تصادفی، داده صحیح است.

برای کاهش نشت‌های حریم خصوصی — مانند حالتی که یک مهاجم با بررسی وجود یک موتور بازی خاص در COS، تاریخچه کاربر را ردیابی کند — گوگل دو مکانیسم مکمل به کار گرفته است:
۱. آموزش توسعه‌دهندگان: تشویق برنامه‌نویسان به عدم استفاده از origins: '*' برای منابع اختصاصی.
۲. گیتینگ دسترسی (Availability Gating): برای فایل‌های اعلام شده به صورت سراسری، مرورگر ممکن است تایید وجود فایل را در صورتی که در تعداد کافی از منابع متمایز دیده نشده باشد، متوقف کند. اگر فایلی فقط در یک یا دو سایت ظاهر شود، همچنان می‌تواند به عنوان یک شناسه بین-سایتی عمل کند؛ بنابراین، مرورگر ممکن است خطایی بازگرداند که گویی فایل اصلاً وجود ندارد، فارغ از اینکه چه چیزی روی دیسک است.

اپلیکیشن‌ها باید طوری طراحی شوند که این خطاها را مدیریت کرده و همیشه به شبکه (Network Fallback) بازگردند، زیرا دریافت خطا به معنای قطعی «عدم ذخیره» فایل نیست. تیم کروم همچنان در حال تکمیل این اقدامات برای جلوگیری از نشت اطلاعات مربوط به منابع غیرمعمول است.

ادغام با Transformers.js

کتابخانه Transformers.js در حال حاضر در حال آزمایش این API است. از طریق Pull Request شماره ۱۵۴۹، توسعه‌دهندگان می‌توانند با تنظیم env.experimental_useCrossOriginStorage = true پیش از راه‌اندازی یک Pipeline، به این بک‌اند آزمایشی بپیوندند.

در صورت فعال‌سازی، کتابخانه مراحل زیر را طی می‌کند:

  • شناسایی هش SHA-256 برای هر فایل مدل ردیابی شده توسط Xet (فایل‌های حجیم وزن‌های ONNX).
  • دریافت فایل اشاره‌گر (pointer) خام Xet و استخراج فیلد oid sha256.
  • استفاده از این هش به عنوان کلید در navigator.crossOriginStorage.

این روند تضمین می‌کند که مدل ۱۷۷ مگابایتی Whisper، وزن‌های DistilBERT و زمان‌بندی ۴.۷ مگابایتی Wasm تنها یک بار در کل پروفایل کاربر از شبکه عبور کنند، فارغ از اینکه چند منبع (Origin) مختلف آن‌ها را درخواست کنند. این کار یک فرآیند دانلود کند و تکراری را به یک Cache Hit تقریباً فوری تبدیل می‌کند.

آزمایش API ذخیره‌سازی Cross-Origin پیشنهادی در Transformers.js

در حالی که این API هنوز به صورت بومی در هیچ مرورگری پیاده‌سازی نشده است، گوگل یک افزونه Cross-Origin Storage ارائه داده که یک Polyfill برای navigator.crossOriginStorage تزریق می‌کند. این افزونه به توسعه‌دهندگان اجازه می‌دهد جریان کامل (End-to-end) را همین امروز تست کنند. کاربران می‌توانند پنجره پاپ‌آپ افزونه را باز کرده و در تب «View by Resource» مشاهده کنند که منابع مشترک — مانند فایل decoder_model_merged.onnx با هش 950978b1dbcbf250335358c1236053ba19a7f7849b33dc777f4421b72b7626fa — چگونه بین منابع متفاوتی مثل https://googlechrome.github.io و https://rawcdn.rawgit.net به اشتراک گذاشته شده‌اند.

تحلیل: تغییر به سمت لایه مشترک AI در وب

این پیشنهاد سیگنالی از حرکت به سمت مدل «زمان‌بندی مشترک» (Shared Runtime) برای وب است. سال‌هاست وب بر اساس اصل ایزولاسیون کامل برای امنیت عمل می‌کند. اما مدل‌های AI برای اینکه این پارادایم پایدار بماند، بیش از حد حجیم هستند.

با جداسازی منبع از Origin و گره زدن آن به یک هش، گوگل در واقع پیشنهاد یک مدیریت بسته (Package Manager) جهانی در سطح مرورگر برای وزن‌های AI را می‌دهد. این کار هزینه‌های پهنای باند را برای ارائه‌دهندگان CDN کاهش داده و «زمان تا اولین استنتاج» (Time-to-first-inference) را برای کاربران به شدت پایین می‌آورد. اثر ثانویه این است که مرورگر بیشتر شبیه به یک سیستم‌عامل می‌شود که کتابخانه‌ای محلی از وزن‌ها را مدیریت می‌کند و چندین اپلیکیشن می‌توانند به طور هم‌زمان از آن استفاده کنند. کتابخانه‌های دیگر مانند WebLLM و wllama نیز در حال آزمایش COS برای دستیابی به همین بهره‌وری‌ها هستند. در این مسیر، بهبود کیفیت داده‌های ورودی به مدل‌ها نیز حیاتی است؛ برای مثال، ترکیب داده‌های ردیت و ویکی‌پدیا راهکاری برای حذف توهمات در مدل‌های زبانی است که کیفیت استنتاج را در لایه‌های بالاتر افزایش می‌دهد.

گام بعدی شما: توسعه‌دهندگان می‌توانند با نصب افزونه Cross-Origin Storage از Chrome Web Store و فعال کردن پرچم مربوطه در پروژه‌های Transformers.js، این قابلیت را تست کنند. پذیرش این قابلیت بدون ریسک است؛ اگر افزونه نصب نشده باشد، کد به طور خودکار به Cache API استاندارد وب باز می‌گردد.

اما داستان سخت‌افزاری این تحول حتی شگفت‌انگیزتر است — به تحلیل ما درباره‌ی تراشه‌های Blackwell مراجعه کنید.

چرا این موضوع مهم است؟

این API با حذف دانلودهای تکراری، «زمان تا نخستین استنتاج» را برای کاربران به شدت کاهش می‌دهد و هزینه پهنای باند CDNها را می‌کاهند. این تغییر بر اساس اعتبار مهندسی گوگل در بهینه‌سازی مرورگر، گامی حیاتی برای تبدیل وب به یک پلتفرم عملیاتی برای مدل‌های محلی است.

تأثیر برای ایران

برنامه‌نویسان ایرانی که اپلیکیشن‌های AI مبتنی بر مرورگر توسعه می‌دهند، می‌توانند با استفاده از این API زمان لود مدل‌ها را برای کاربرانی با اینترنت محدود به‌طور چشم‌گیری کاهش دهند.

·نگاه ما
تحریریه دات‌هوش

این ابتکار گوگل نشان‌دهنده تغییر پارادایم در وب از «ایزولاسیون مطلق» به «اشتراک‌گذاری هوشمند منابع» است. با جداسازی منبع از هویت فایل ( aracith with hashes)، مرورگر در واقع به یک مدیر بسته (Package Manager) سطح سیستم تبدیل می‌شود که لایه‌ای از وزن‌های AI را به صورت سراسری مدیریت می‌کند. این حرکت، سد ورود برای اپلیکیشن‌های AI وب را می‌شکند و آن‌ها را از نظر تجربه کاربری به اپلیکیشن‌های Native نزدیک می‌کند.

منابع

این گزارش با خط‌لولهٔ خودکار دات‌هوش از منابع معتبر جهانی تدوین و زیر نظر تحریریه منتشر شده است. روش کار ما

گفتگو

پنج‌شنبه‌های هوش‌محور

بسته‌ی هفتگی دات‌هوش

۵ خبر، ۲ ابزار، ۱ پرامپت در هر شماره. به‌زودی راه‌اندازی می‌شود — هر پنج‌شنبه صبح.

خبر کلیدی
ابزار کاربردی
پرامپت حرفه‌ای
تحلیل پژوهش
به‌زودی
زاویه‌ی ایرانی
به‌زودی
تمرین این هفته
به‌زودی

راهنماهای دات‌هوش

راهنماهای کاربردیِ دات‌هوش برای کار با هوش مصنوعی — از همین‌جا شروع کنید:

دات‌هوش

راهنمای فارسی هوش مصنوعی — با نگاه به ایران

اخبار روزانه، معرفی ابزارها و مدل‌ها، و آموزشِ کار با هوش مصنوعی؛ همیشه با این پرسش که از ایران چه چیزی کار می‌کند و چه چیزی نه.