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

مقدمه

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

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

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

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

ارتباط با SignatureDefs

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

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

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

برای بارگذاری Reusable 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.function که محاسبات مدل ("انتقال رو به جلو") را با توجه به مشخصات زیر پیاده‌سازی می‌کند.

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

    در صورت خالی بودن، می‌توان این لیست را حذف کرد.

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

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

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

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

تابع __call__

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

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

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

استدلال‌ها

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

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

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

    (ممکن است در نسخه‌های بعدی این رابط، امکان ایجاد تودرتوهای عمومی‌تر فراهم شود.) سازنده‌ی SavedModel یکی از این موارد و شکل‌ها و dtypeهای تانسور را انتخاب می‌کند. در صورت لزوم، برخی از ابعاد شکل باید تعریف نشده باشند (به‌ویژه اندازه‌ی دسته).

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

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

  • سازنده‌ی SavedModel می‌تواند kwargs اختیاری بیشتری با نام‌های خاص را بپذیرد.

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

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

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

نتیجه

outputs حاصل از فراخوانی obj می‌توانند به صورت زیر باشند:

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

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

مقادیر قابل فراخوانی نامگذاری شده

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

توجه داشته باشید که این رابط، رویکرد اضافه کردن یک تابع tf.function ساده را مستقیماً به عنوان tf.foo پوشش نمی‌دهد .

از کاربران Reusable 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 واحد فراهم می‌کند.