یک SavedModel را صادر کنید

در این صفحه جزئیات صادرات (ذخیره) یک مدل از یک برنامه TensorFlow به فرمت SavedModel TensorFlow 2 توضیح داده شده است. این فرمت روش توصیه شده برای به اشتراک گذاری مدل های از پیش آموزش دیده و قطعات مدل در TensorFlow Hub است. این فرمت قدیمی تر TF1 Hub را جایگزین می کند و با مجموعه جدیدی از API ها عرضه می شود. می‌توانید اطلاعات بیشتری درباره صادرات مدل‌های قالب TF1 Hub در صادر کردن قالب TF1 Hub بیابید. می‌توانید جزئیات مربوط به نحوه فشرده‌سازی SavedModel را برای اشتراک‌گذاری آن در TensorFlow Hub در اینجا بیابید.

برخی از جعبه ابزارهای ساخت مدل از قبل ابزارهایی را برای انجام این کار ارائه می دهند (به عنوان مثال، برای TensorFlow Model Garden به زیر مراجعه کنید).

بررسی اجمالی

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

پس انداز از Keras

شروع با TensorFlow 2، tf.keras.Model.save() و tf.keras.models.save_model() به طور پیش فرض به فرمت SavedModel (نه HDF5). SavedModel های به دست آمده که می توانند با hub.load() , hub.KerasLayer و آداپتورهای مشابه برای دیگر API های سطح بالا به محض در دسترس شدن استفاده شوند.

برای به اشتراک گذاشتن یک مدل کامل Keras، کافی است آن را با include_optimizer=False ذخیره کنید.

برای به اشتراک گذاشتن یک قطعه از یک مدل Keras، آن قطعه را به خودی خود یک مدل کنید و سپس آن را ذخیره کنید. شما می توانید کد را از همان ابتدا تنظیم کنید ....

piece_to_share = tf.keras.Model(...)
full_model = tf.keras.Sequential([piece_to_share, ...])
full_model.fit(...)
piece_to_share.save(...)

... یا قطعه را برش دهید تا بعد از واقعیت به اشتراک بگذارید (اگر با لایه بندی مدل کامل شما مطابقت دارد):

full_model = tf.keras.Model(...)
sharing_input = full_model.get_layer(...).get_output_at(0)
sharing_output = full_model.get_layer(...).get_output_at(0)
piece_to_share = tf.keras.Model(sharing_input, sharing_output)
piece_to_share.save(..., include_optimizer=False)

مدل‌های TensorFlow در GitHub از رویکرد اول برای BERT استفاده می‌کنند (به nlp/tools/export_tfhub_lib.py مراجعه کنید، به تقسیم بین core_model برای صادرات و pretrainer برای بازیابی نقطه بازرسی توجه کنید) و رویکرد دوم برای ResNet (به legacy/image_classification/t مراجعه کنید. پی ).

صرفه جویی از TensorFlow سطح پایین

این نیاز به آشنایی خوب با راهنمای SavedModel TensorFlow دارد.

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

class MyMulModel(tf.train.Checkpoint):
  def __init__(self, v_init):
    super().__init__()
    self.v = tf.Variable(v_init)
    self.variables = [self.v]
    self.trainable_variables = [self.v]
    self.regularization_losses = [
        tf.function(input_signature=[])(lambda: 0.001 * self.v**2),
    ]

  @tf.function(input_signature=[tf.TensorSpec(shape=None, dtype=tf.float32)])
  def __call__(self, inputs):
    return tf.multiply(inputs, self.v)

tf.saved_model.save(MyMulModel(2.0), "/tmp/my_mul")

layer = hub.KerasLayer("/tmp/my_mul")
print(layer([10., 20.]))  # [20., 40.]
layer.trainable = True
print(layer.trainable_weights)  # [2.]
print(layer.losses)  # 0.004

توصیه هایی برای سازندگان SavedModel

هنگام ایجاد SavedModel برای اشتراک گذاری در TensorFlow Hub، از قبل فکر کنید که آیا و چگونه مصرف کنندگان آن باید آن را تنظیم کنند و راهنمایی هایی را در مستندات ارائه دهند.

صرفه جویی در یک مدل Keras باید تمام مکانیزم های تنظیم دقیق را انجام دهد (صرفه جویی در کاهش وزن، اعلام متغیرهای قابل تمرین، ردیابی __call__ برای هر دو training=True و training=False و غیره)

رابط مدلی را انتخاب کنید که به خوبی با جریان گرادیان بازی کند، به عنوان مثال، logits خروجی به جای احتمالات softmax یا پیش‌بینی‌های top-k.

اگر مدل از روش‌های انصرافی، نرمال‌سازی دسته‌ای یا تکنیک‌های آموزشی مشابهی استفاده می‌کند که شامل فراپارامترها می‌شود، آن‌ها را روی مقادیری تنظیم کنید که در بسیاری از مشکلات هدف مورد انتظار و اندازه‌های دسته‌ای منطقی هستند. (از زمان نگارش این مقاله، صرفه جویی در Keras به مصرف کنندگان اجازه نمی دهد آنها را تنظیم کنند.)

تنظیم‌کننده‌های وزن در لایه‌های جداگانه ذخیره می‌شوند (با ضرایب قدرت منظم‌سازی آنها)، اما تنظیم وزن از داخل بهینه‌ساز (مانند tf.keras.optimizers.Ftrl.l1_regularization_strength=...) از بین می‌رود. بر این اساس به مصرف کنندگان SavedModel خود توصیه کنید.

باغ مدل تنسورفلو

مخزن TensorFlow Model Garden شامل نمونه‌های زیادی از ایجاد مدل‌های ذخیره شده TF2 قابل استفاده مجدد برای آپلود در tfhub.dev است.

درخواست های انجمن

تیم TensorFlow Hub تنها بخش کوچکی از دارایی‌های موجود در tfhub.devمی‌کند. ما برای تولید مدل‌ها عمدتاً به محققان Google و Deepmind، مؤسسات تحقیقاتی شرکتی و دانشگاهی و علاقه‌مندان به ML متکی هستیم. در نتیجه، نمی‌توانیم تضمین کنیم که می‌توانیم درخواست‌های جامعه برای دارایی‌های خاص را برآورده کنیم، و نمی‌توانیم تخمین زمانی برای در دسترس بودن دارایی جدید ارائه کنیم.

نقطه عطف درخواست‌های مدل انجمن در زیر شامل درخواست‌هایی از انجمن برای دارایی‌های خاص است -- اگر شما یا شخصی که می‌شناسید علاقه‌مند به تولید دارایی و اشتراک‌گذاری آن درtfhub.dev، از ارسال استقبال می کنیم!