SavedModels قابل استفاده مجدد

مقدمه

TensorFlow Hub میزبان SavedModels برای TensorFlow 2، در میان دارایی های دیگر است. آنها را می توان دوباره در یک برنامه پایتون با obj = hub.load(url) بارگذاری کرد [ بیشتر بدانید ]. obj برگردانده شده نتیجه tf.saved_model.load() است (به راهنمای SavedModel TensorFlow مراجعه کنید). این شی می‌تواند دارای ویژگی‌های دلخواه باشد که عبارتند از tf.functions، tf.variables (از مقادیر از پیش آموزش‌دیده شده آنها)، منابع دیگر و به‌طور بازگشتی، موارد بیشتری از این قبیل.

این صفحه رابطی را توصیف می کند که باید توسط obj بارگذاری شده به منظور استفاده مجدد در یک برنامه TensorFlow Python پیاده سازی شود. SavedModels مطابق با این رابط، Reusable SavedModels نامیده می شوند.

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

تیم TensorFlow Hub توصیه می‌کند که رابط کاربری SavedModel قابل استفاده مجدد را در تمام SavedModel‌هایی که قرار است به معنای بالا مورد استفاده مجدد قرار گیرند، پیاده‌سازی شود . بسیاری از برنامه های کاربردی از کتابخانه tensorflow_hub ، به ویژه hub.KerasLayer ، برای پیاده سازی آن به SavedModels نیاز دارند.

ارتباط با SignatureDefs

این رابط از نظر توابع tf. و سایر ویژگی‌های TF2 جدا از امضاهای SavedModel است که از TF1 در دسترس بوده و همچنان در TF2 برای استنتاج استفاده می‌شود (مانند استقرار SavedModels در TF Serving یا TF Lite). امضاها برای استنتاج به اندازه کافی رسا نیستند که از تنظیم دقیق پشتیبانی کنند، و tf.function یک API پایتون طبیعی تر و گویاتر برای مدل استفاده مجدد ارائه می دهد.

ارتباط با کتابخانه های مدل سازی

یک SavedModel قابل استفاده مجدد فقط از TensorFlow 2 اولیه استفاده می کند، مستقل از هر کتابخانه مدل سازی خاصی مانند Keras یا Sonnet. این کار استفاده مجدد را در کتابخانه‌های مدل‌سازی بدون وابستگی به کد اصلی مدل‌سازی تسهیل می‌کند.

مقداری انطباق لازم است تا SavedModels قابل استفاده مجدد را بارگیری کنید یا آنها را از هر کتابخانه ساخت مدل ذخیره کنید. برای Keras، hub.KerasLayer بارگیری را فراهم می‌کند، و ذخیره داخلی Keras در قالب SavedModel برای TF2 با هدف ارائه یک مجموعه فوق‌العاده از این رابط طراحی شده است (به RFC از می 2019 مراجعه کنید).

ارتباط با «API های رایج SavedModel» مختص کار

تعریف رابط در این صفحه امکان هر تعداد و نوع ورودی و خروجی را فراهم می کند. APIهای رایج SavedModel برای TF Hub این رابط عمومی را با قراردادهای استفاده برای کارهای خاص اصلاح می‌کنند تا مدل‌ها را به راحتی قابل تعویض کنند.

تعریف رابط

صفات

SavedModel قابل استفاده مجدد یک SavedModel TensorFlow 2 است به طوری که obj = tf.saved_model.load(...) یک شی را برمی گرداند که دارای ویژگی های زیر است.

  • __call__ ___ مورد نیاز. یک تابع tf. که محاسبات مدل را اجرا می کند ("گذر به جلو") با توجه به مشخصات زیر.

  • variables : فهرستی از اشیاء tf.Variable، که همه متغیرهای مورد استفاده در هر فراخوانی احتمالی __call__ را فهرست می کند، از جمله متغیرهای قابل آموزش و غیرقابل آموزش.

    این لیست در صورت خالی بودن قابل حذف است.

  • trainable_variables : لیستی از اشیاء tf.Variable به طوری که v.trainable برای همه عناصر صادق است. این متغیرها باید زیر مجموعه ای از variables باشند. اینها متغیرهایی هستند که باید هنگام تنظیم دقیق شی مورد آموزش قرار گیرند. خالق SavedModel ممکن است برخی از متغیرها را که در ابتدا قابل آموزش بودند حذف کند تا نشان دهد که این متغیرها نباید در طول تنظیم دقیق اصلاح شوند.

    این لیست در صورت خالی بودن، به ویژه اگر SavedModel از تنظیم دقیق پشتیبانی نمی کند، می تواند حذف شود.

  • regularization_losses : لیستی از توابع tf. که هر کدام ورودی صفر می گیرند و یک تانسور شناور اسکالر را برمی گرداند. برای تنظیم دقیق، به کاربر SavedModel توصیه می‌شود که این موارد را به‌عنوان شرایط تنظیم اضافی در ضرر (در ساده‌ترین حالت بدون مقیاس‌گذاری بیشتر) لحاظ کند. به طور معمول، اینها برای نشان دادن تنظیم کننده های وزن استفاده می شوند. (به دلیل کمبود ورودی، این توابع tf. نمی توانند تنظیم کننده های فعالیت را بیان کنند.)

    این لیست را می توان در صورت خالی بودن حذف کرد، به ویژه اگر SavedModel از تنظیم دقیق پشتیبانی نمی کند یا نمی خواهد تنظیم وزن را تجویز کند.

تابع __call__

یک obj Restored SavedModel دارای یک ویژگی obj.__call__ است که یک تابع tf.بازیابی شده است و به obj اجازه فراخوانی به صورت زیر را می دهد.

خلاصه (شبه کد):

outputs = obj(inputs, trainable=..., **kwargs)

استدلال ها

استدلال ها به شرح زیر است.

  • یک آرگومان موقعیتی و مورد نیاز با دسته ای از فعال سازی های ورودی SavedModel وجود دارد. نوع آن یکی از

    • یک تانسور برای یک ورودی واحد،
    • فهرستی از تانسورها برای یک توالی مرتب شده از ورودی های بی نام،
    • دستوری از تانسورها که با مجموعه خاصی از نام های ورودی کلید می خورد.

    (بازبینی‌های آینده این رابط ممکن است لانه‌های عمومی‌تری را امکان‌پذیر کند.) خالق SavedModel یکی از آن‌ها و اشکال تانسور و نوع d را انتخاب می‌کند. در موارد مفید، برخی از ابعاد شکل باید تعریف نشده باشد (به ویژه اندازه دسته).

  • ممکن است یک training آرگومان کلمه کلیدی اختیاری وجود داشته باشد که بولین، True یا False پایتون را بپذیرد. پیش فرض False است. اگر مدل از تنظیم دقیق پشتیبانی می‌کند، و اگر محاسبات آن بین این دو تفاوت داشته باشد (مثلاً در حالت انحرافی و عادی‌سازی دسته‌ای)، این تمایز با این استدلال اجرا می‌شود. در غیر این صورت، این استدلال ممکن است وجود نداشته باشد.

    لازم نیست __call__ آرگومان training با ارزش تنسور را بپذیرد. این بر عهده تماس گیرنده است که در صورت لزوم از tf.cond() برای ارسال بین آنها استفاده کند.

  • خالق SavedModel ممکن است تصمیم بگیرد که kwargs اختیاری بیشتری از نام های خاص را بپذیرد.

    • برای آرگومان های با ارزش تنسور، خالق SavedModel dtypes و شکل های مجاز آنها را تعریف می کند. tf.function یک مقدار پیش فرض پایتون را روی آرگومان می پذیرد که با ورودی tf.TensorSpec ردیابی می شود. چنین آرگومان‌هایی می‌توانند برای سفارشی‌سازی فراپارامترهای عددی درگیر در __call__ (مثلاً نرخ ترک تحصیل) استفاده شوند.

    • برای آرگومان های با ارزش پایتون، خالق SavedModel مقادیر مجاز آنها را تعریف می کند. چنین آرگومان‌هایی می‌توانند به عنوان پرچم‌ها برای انتخاب‌های گسسته در تابع ردیابی استفاده شوند (اما به انفجار ترکیبی ردیابی‌ها توجه کنید).

تابع __call__ بازیابی شده باید ردیابی هایی را برای همه ترکیب های مجاز آرگومان ها ارائه دهد. training چرخاندن بین True و False نباید مجاز بودن استدلال ها را تغییر دهد.

نتیجه

outputs فراخوانی obj می تواند باشد

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

(ویرایش‌های آینده این رابط ممکن است لانه‌های عمومی‌تری را مجاز کند.) نوع بازگشت ممکن است بسته به کوارگ‌های با ارزش پایتون متفاوت باشد. این اجازه می دهد تا پرچم ها خروجی های اضافی تولید کنند. خالق SavedModel dtypes و اشکال خروجی و وابستگی آنها به ورودی ها را تعریف می کند.

تماس گیرندگان نامگذاری شده است

یک SavedModel قابل استفاده مجدد می‌تواند چندین قطعه مدل را به روشی که در بالا توضیح داده شد، با قرار دادن آنها در زیراشیاء نام‌گذاری شده، به عنوان مثال، obj.foo ، obj.bar و غیره ارائه دهد. هر زیر شی یک متد __call__ و ویژگی های پشتیبان در مورد متغیرها و غیره خاص آن قطعه مدل را ارائه می دهد. برای مثال بالا، obj.foo.__call__ ، obj.foo.variables و غیره وجود دارد.

توجه داشته باشید که این رابط رویکرد افزودن یک tf.function خالی به طور مستقیم به عنوان tf.foo را پوشش نمی دهد.

از کاربران SavedModels قابل استفاده مجدد انتظار می رود که فقط یک سطح از تودرتو مدیریت کنند ( obj.bar اما نه obj.bar.baz ). (بازبینی‌های آتی این رابط ممکن است امکان تودرتو عمیق‌تر را فراهم کند و ممکن است از الزامی که شی سطح بالا خود قابل فراخوانی باشد چشم پوشی کند.)

سخنان پایانی

ارتباط با APIهای در حال پردازش

این سند رابطی از یک کلاس پایتون را توصیف می‌کند که از ابتدایی‌هایی مانند tf.function و tf.Variable تشکیل شده است که از طریق سریال‌سازی از طریق tf.saved_model.save() و tf.saved_model.load() از یک سفر رفت و برگشت جان سالم به در می‌برند. با این حال، رابط قبلاً روی شی اصلی وجود داشت که به tf.saved_model.save() ارسال شده بود. انطباق با آن رابط، تبادل قطعات مدل را در بین APIهای سازنده مدل در یک برنامه TensorFlow امکان پذیر می کند.