ذخیره و بارگذاری مدل ها

TensorFlow.js عملکردی را برای ذخیره و بارگذاری مدل هایی که با Layers API ایجاد شده اند یا از مدل های TensorFlow موجود تبدیل شده اند، ارائه می دهد. اینها ممکن است مدل هایی باشند که خودتان آموزش داده اید یا آنهایی که توسط دیگران آموزش دیده اند. یکی از مزایای کلیدی استفاده از Layers api این است که مدل های ایجاد شده با آن قابل سریال هستند و این چیزی است که در این آموزش بررسی خواهیم کرد.

این آموزش بر روی ذخیره و بارگذاری مدل های TensorFlow.js (قابل شناسایی با فایل های JSON) تمرکز دارد. ما همچنین می توانیم مدل های TensorFlow Python را وارد کنیم. بارگذاری این مدل ها در دو آموزش زیر پوشش داده شده است:

یک tf.Model را ذخیره کنید

tf.Model و tf.Sequential هر دو یک تابع model.save ارائه می دهند که به شما امکان می دهد توپولوژی و وزن یک مدل را ذخیره کنید.

  • توپولوژی: این فایلی است که معماری یک مدل را توصیف می کند (یعنی از چه عملیاتی استفاده می کند). این شامل ارجاعاتی به وزن مدل ها است که در خارج ذخیره می شوند.

  • وزن ها: فایل های باینری هستند که وزن های یک مدل معین را در قالبی کارآمد ذخیره می کنند. آنها به طور کلی در همان پوشه توپولوژی ذخیره می شوند.

بیایید نگاهی بیندازیم که کد ذخیره یک مدل چگونه است

const saveResult = await model.save('localstorage://my-model-1');

چند نکته قابل توجه:

  • متد save یک آرگومان رشته ای URL مانند می گیرد که با یک طرح شروع می شود. این نوع مقصدی را که می‌خواهیم یک مدل را در آن ذخیره کنیم، توصیف می‌کند. در مثال بالا، طرح localstorage://
  • این طرح توسط یک مسیر دنبال می شود. در مثال بالا مسیر my-model-1 است.
  • روش save ناهمزمان است.
  • مقدار بازگشتی model.save یک شی JSON است که اطلاعاتی مانند اندازه بایت توپولوژی و وزن مدل را حمل می کند.
  • محیطی که برای ذخیره مدل استفاده می شود تأثیری ندارد که کدام محیط ها می توانند مدل را بارگذاری کنند. ذخیره یک مدل در node.js مانع از بارگذاری آن در مرورگر نمی شود.

در زیر به بررسی طرح های مختلف موجود می پردازیم.

فضای ذخیره‌سازی محلی (فقط مرورگر)

طرح: localstorage://

await model.save('localstorage://my-model');

این یک مدل را تحت نام my-model در حافظه محلی مرورگر ذخیره می کند. این بین تازه‌سازی‌ها ادامه پیدا می‌کند، اگرچه در صورت ایجاد نگرانی، فضای ذخیره‌سازی محلی می‌تواند توسط کاربران یا خود مرورگر پاک شود. هر مرورگر همچنین محدودیت خاص خود را در مورد اینکه چه مقدار داده را می توان در حافظه محلی برای یک دامنه معین ذخیره کرد تعیین می کند.

IndexedDB (فقط مرورگر)

طرح: indexeddb://

await model.save('indexeddb://my-model');

این یک مدل را در حافظه IndexedDB مرورگر ذخیره می کند. مانند ذخیره‌سازی محلی که بین تازه‌سازی‌ها باقی می‌ماند، همچنین تمایل دارد محدودیت‌های بزرگ‌تری در اندازه اشیاء ذخیره‌شده داشته باشد.

دانلود فایل (فقط مرورگر)

طرح: downloads://

await model.save('downloads://my-model');

این باعث می شود مرورگر فایل های مدل را در دستگاه کاربر دانلود کند. دو فایل تولید خواهد شد:

  1. یک فایل JSON متنی با نام [my-model].json ، که توپولوژی و ارجاع به فایل وزن شرح داده شده در زیر را حمل می کند.
  2. یک فایل باینری حاوی مقادیر وزن با نام [my-model].weights.bin .

می‌توانید نام [my-model] را تغییر دهید تا فایل‌هایی با نام دیگری دریافت کنید.

از آنجایی که فایل .json با استفاده از یک مسیر نسبی به .bin اشاره می کند، دو فایل باید در یک پوشه باشند.

درخواست HTTP(S).

طرح: http:// یا https://

await model.save('http://model-server.domain/upload')

این یک درخواست وب برای ذخیره یک مدل در یک سرور راه دور ایجاد می کند. شما باید آن سرور راه دور را کنترل کنید تا بتوانید اطمینان حاصل کنید که قادر به رسیدگی به درخواست است.

مدل از طریق یک درخواست POST به سرور HTTP مشخص شده ارسال می شود. بدنه POST در قالب multipart/form-data است و از دو فایل تشکیل شده است

  1. یک فایل JSON متنی با نام model.json که توپولوژی و ارجاع به فایل وزنی که در زیر توضیح داده شده است را حمل می کند.
  2. یک فایل باینری حاوی مقادیر وزن به نام model.weights.bin .

توجه داشته باشید که نام دو فایل همیشه دقیقاً همانطور که در بالا مشخص شده است خواهد بود (نام در تابع تعبیه شده است). این api doc حاوی یک قطعه کد پایتون است که نشان می‌دهد چگونه می‌توان از چارچوب وب flask برای رسیدگی به درخواست منشأ گرفته از save استفاده کرد.

اغلب باید آرگومان های بیشتری ارسال کنید یا سرصفحه های درخواستی را به سرور HTTP خود ارسال کنید (مثلاً برای احراز هویت یا اگر می خواهید پوشه ای را مشخص کنید که مدل باید در آن ذخیره شود). می‌توانید با جایگزین کردن آرگومان رشته URL در tf.io.browserHTTPRequest ، کنترل دقیقی بر روی این جنبه‌های درخواست‌ها از save به دست آورید. این API انعطاف پذیری بیشتری را در کنترل درخواست های HTTP فراهم می کند.

به عنوان مثال:

await model.save(tf.io.browserHTTPRequest(
    'http://model-server.domain/upload',
    {method: 'PUT', headers: {'header_key_1': 'header_value_1'} }));

سیستم فایل بومی (فقط Node.js)

طرح: file://

await model.save('file:///path/to/my-model');

هنگام اجرا در Node.js ما همچنین به سیستم فایل دسترسی مستقیم داریم و می توانیم مدل ها را در آنجا ذخیره کنیم. دستور بالا دو فایل را در path مشخص شده بعد از scheme ذخیره می کند.

  1. یک فایل JSON متنی با نام [model].json که توپولوژی و ارجاع به فایل وزنی که در زیر توضیح داده شده است را حمل می کند.
  2. یک فایل باینری حاوی مقادیر وزن به نام [model].weights.bin .

توجه داشته باشید که نام دو فایل همیشه دقیقاً همانطور که در بالا مشخص شده است خواهد بود (نام در تابع تعبیه شده است).

در حال بارگذاری tf.Model

با توجه به مدلی که با استفاده از یکی از روش های بالا ذخیره شده است، می توانیم آن را با استفاده از tf.loadLayersModel API بارگذاری کنیم.

بیایید نگاهی بیندازیم که کد بارگذاری یک مدل چگونه است

const model = await tf.loadLayersModel('localstorage://my-model-1');

چند نکته قابل توجه:

  • مانند model.save() ، تابع loadLayersModel یک آرگومان رشته URL مانند می گیرد که با یک طرح شروع می شود. این نوع مقصدی را که می‌خواهیم مدلی را از آن بارگیری کنیم، توصیف می‌کند.
  • این طرح توسط یک مسیر دنبال می شود. در مثال بالا مسیر my-model-1 است.
  • رشته url مانند را می توان با یک شی که با رابط IOHandler مطابقت دارد جایگزین کرد.
  • تابع tf.loadLayersModel() ناهمزمان است.
  • مقدار بازگشتی tf.loadLayersModel tf.Model است

در زیر به بررسی طرح های مختلف موجود می پردازیم.

فضای ذخیره‌سازی محلی (فقط مرورگر)

طرح: localstorage://

const model = await tf.loadLayersModel('localstorage://my-model');

این یک مدل به نام my-model را از حافظه محلی مرورگر بارگیری می کند.

IndexedDB (فقط مرورگر)

طرح: indexeddb://

const model = await tf.loadLayersModel('indexeddb://my-model');

این یک مدل را از حافظه IndexedDB مرورگر بارگیری می کند.

HTTP(S)

طرح: http:// یا https://

const model = await tf.loadLayersModel('http://model-server.domain/download/model.json');

این یک مدل را از یک نقطه پایانی http بارگیری می کند. پس از بارگیری فایل json ، تابع درخواست هایی برای فایل های .bin مربوطه که فایل json به آنها ارجاع می دهد، می دهد.

سیستم فایل بومی (فقط Node.js)

طرح: file://

const model = await tf.loadLayersModel('file://path/to/my-model/model.json');

هنگام اجرا در Node.js ما همچنین به سیستم فایل دسترسی مستقیم داریم و می توانیم مدل ها را از آنجا بارگیری کنیم. توجه داشته باشید که در فراخوانی تابع بالا به خود فایل model.json اشاره می کنیم (در حالی که هنگام ذخیره یک پوشه را مشخص می کنیم). فایل(های) .bin مربوطه باید در همان پوشه فایل json باشد.

بارگیری مدل ها با IOHandlers

اگر طرح‌های بالا برای نیازهای شما کافی نیستند، می‌توانید رفتار بارگذاری سفارشی را با یک IOHandler پیاده‌سازی کنید. یکی از IOHandler که TensorFlow.js ارائه می کند tf.io.browserFiles است که به کاربران مرورگر اجازه می دهد فایل های مدل را در مرورگر آپلود کنند. برای اطلاعات بیشتر به مستندات مراجعه کنید.

ذخیره و بارگیری مدل ها با IOHhandler های سفارشی

اگر طرح‌های بالا برای نیازهای بارگیری یا ذخیره‌سازی شما کافی نیستند، می‌توانید رفتار سریال‌سازی سفارشی را با پیاده‌سازی یک IOHandler پیاده‌سازی کنید.

IOHandler یک شی با روش save و load است.

تابع save یک پارامتر را می گیرد که با رابط ModelArtifacts مطابقت دارد و باید قولی را برگرداند که به یک شی SaveResult حل شود.

تابع load هیچ پارامتری دریافت نمی کند و باید قولی را برگرداند که به یک شی ModelArtifacts حل شود. این همان شیئی است که برای save ارسال می شود.

برای مثالی از نحوه پیاده سازی IOHandler به BrowserHTTPRequest مراجعه کنید.