يوضح لك هذا البرنامج التعليمي كيفية استخدام مكونات TensorFlow Serving لتصدير نموذج TensorFlow المُدرب واستخدام Tensorflow_model_server القياسي لخدمته. إذا كنت معتادًا بالفعل على خدمة TensorFlow، وتريد معرفة المزيد حول كيفية عمل الأجزاء الداخلية للخادم، فراجع البرنامج التعليمي المتقدم لـ TensorFlow Serving .
يستخدم هذا البرنامج التعليمي نموذج انحدار Softmax البسيط الذي يصنف الأرقام المكتوبة بخط اليد. إنه مشابه جدًا لتلك المقدمة في البرنامج التعليمي TensorFlow حول تصنيف الصور باستخدام مجموعة بيانات Fashion MNIST .
يتكون رمز هذا البرنامج التعليمي من جزأين:
ملف Python، mnist_saved_model.py ، الذي يقوم بتدريب النموذج وتصديره.
ثنائي ModelServer يمكن تثبيته باستخدام Apt، أو تجميعه من ملف C++ ( main.cc ). يكتشف TensorFlow Serving ModelServer النماذج المصدرة الجديدة ويدير خدمة gRPC لخدمتها.
قبل البدء، قم أولاً بتثبيت Docker .
تدريب وتصدير نموذج TensorFlow
بالنسبة لمرحلة التدريب، يتم إطلاق الرسم البياني TensorFlow في sess
TensorFlow، مع موتر الإدخال (الصورة) كـ x
وموتر الإخراج (درجة Softmax) كـ y
.
ثم نستخدم وحدة SavedModelBuilder الخاصة بـ TensorFlow لتصدير النموذج. يحفظ SavedModelBuilder
"لقطة" من النموذج المُدرب في مساحة تخزين موثوقة بحيث يمكن تحميلها لاحقًا للاستدلال عليها.
للحصول على تفاصيل حول تنسيق SavedModel، يرجى الاطلاع على الوثائق الموجودة على SavedModel README.md .
من mnist_saved_model.py ، ما يلي هو مقتطف كود قصير لتوضيح العملية العامة لحفظ النموذج على القرص.
export_path_base = sys.argv[-1]
export_path = os.path.join(
tf.compat.as_bytes(export_path_base),
tf.compat.as_bytes(str(FLAGS.model_version)))
print('Exporting trained model to', export_path)
builder = tf.saved_model.builder.SavedModelBuilder(export_path)
builder.add_meta_graph_and_variables(
sess, [tf.compat.v1.saved_model.tag_constants.SERVING],
signature_def_map={
'predict_images':
prediction_signature,
tf.compat.v1.saved_model.signature_constants
.DEFAULT_SERVING_SIGNATURE_DEF_KEY:
classification_signature,
},
main_op=tf.compat.v1.tables_initializer(),
strip_default_attrs=True)
builder.save()
يأخذ SavedModelBuilder.__init__
الوسيطة التالية:
-
export_path
هو مسار دليل التصدير.
سيقوم SavedModelBuilder
بإنشاء الدليل إذا لم يكن موجودًا. في المثال، نقوم بربط وسيطة سطر الأوامر و FLAGS.model_version
للحصول على دليل التصدير. يحدد FLAGS.model_version
إصدار النموذج. يجب عليك تحديد قيمة عددية أكبر عند تصدير إصدار أحدث من نفس النموذج. سيتم تصدير كل إصدار إلى دليل فرعي مختلف ضمن المسار المحدد.
يمكنك إضافة رسم بياني تعريفي ومتغيرات إلى المُنشئ باستخدام SavedModelBuilder.add_meta_graph_and_variables()
باستخدام الوسائط التالية:
sess
هي جلسة TensorFlow التي تحتوي على النموذج المدرب الذي تقوم بتصديره.tags
هي مجموعة العلامات التي يتم من خلالها حفظ الرسم البياني التعريفي. في هذه الحالة، نظرًا لأننا نعتزم استخدام الرسم البياني في العرض، فإننا نستخدم علامةserve
من ثوابت علامة SavedModel المحددة مسبقًا. لمزيد من التفاصيل، راجع tag_constants.py ووثائق TensorFlow API ذات الصلة .يحدد
signature_def_map
خريطة المفتاح الذي يوفره المستخدم للتوقيع على Tensorflow::SignatureDef لإضافته إلى الرسم البياني التعريفي. يحدد التوقيع نوع النموذج الذي سيتم تصديره، وموترات الإدخال/الإخراج التي سيتم الارتباط بها عند تشغيل الاستدلال.يحدد مفتاح التوقيع الخاص
serving_default
توقيع التقديم الافتراضي. يتم تعريف مفتاح تعريف التوقيع الافتراضي للخدمة، إلى جانب الثوابت الأخرى المتعلقة بالتوقيعات، كجزء من ثوابت توقيع SavedModel. لمزيد من التفاصيل، راجع التوقيع_constants.py ووثائق TensorFlow API ذات الصلة .علاوة على ذلك، للمساعدة في إنشاء تعريفات التوقيع بسهولة، توفر واجهة SavedModel API أدوات تعريف التوقيع .. على وجه التحديد، في ملف mnist_saved_model.py الأصلي، نستخدم
signature_def_utils.build_signature_def()
لإنشاءpredict_signature
classification_signature
.كمثال لكيفية تعريف
predict_signature
، تأخذ الأداة المساعدة الوسيطات التالية:inputs={'images': tensor_info_x}
يحدد معلومات موتر الإدخال.تحدد
outputs={'scores': tensor_info_y}
معلومات موتر الدرجات.method_name
هي الطريقة المستخدمة للاستدلال. بالنسبة لطلبات التنبؤ، يجب ضبطها علىtensorflow/serving/predict
. للحصول على أسماء الطرق الأخرى، راجع التوقيع_constants.py ووثائق TensorFlow API ذات الصلة .
لاحظ أن tensor_info_x
و tensor_info_y
لهما بنية المخزن المؤقت لبروتوكول tensorflow::TensorInfo
المحدد هنا . لإنشاء معلومات الموتر بسهولة، توفر واجهة برمجة التطبيقات TensorFlow SavedModel أيضًا utils.py ، مع وثائق TensorFlow API ذات الصلة .
لاحظ أيضًا أن images
scores
هي أسماء مستعارة موتر. يمكن أن تكون أي سلاسل فريدة تريدها، وستصبح الأسماء المنطقية للموتر x
و y
التي تشير إليها لربط الموتر عند إرسال طلبات التنبؤ لاحقًا.
على سبيل المثال، إذا كان x
يشير إلى الموتر بالاسم 'long_tensor_name_foo' ويشير y
إلى الموتر بالاسم 'generated_tensor_name_bar'، فسيقوم builder
بتخزين اسم الموتر المنطقي لتعيين الاسم الحقيقي ("صور" -> "long_tensor_name_foo") و('الدرجات ' -> 'generated_tensor_name_bar'). يتيح ذلك للمستخدم الإشارة إلى هذه الموترات بأسمائها المنطقية عند تشغيل الاستدلال.
دعونا تشغيله!
أولاً، إذا لم تكن قد قمت بذلك بعد، فقم باستنساخ هذا المستودع على جهازك المحلي:
git clone https://github.com/tensorflow/serving.git
cd serving
امسح دليل التصدير إذا كان موجودًا بالفعل:
rm -rf /tmp/mnist
الآن دعونا ندرب النموذج:
tools/run_in_docker.sh python tensorflow_serving/example/mnist_saved_model.py \
/tmp/mnist
يجب أن يؤدي هذا إلى إخراج يبدو كالتالي:
Training model...
...
Done training!
Exporting trained model to models/mnist
Done exporting!
الآن دعونا نلقي نظرة على دليل التصدير.
$ ls /tmp/mnist
1
كما ذكرنا أعلاه، سيتم إنشاء دليل فرعي لتصدير كل نسخة من النموذج. FLAGS.model_version
له القيمة الافتراضية 1، وبالتالي يتم إنشاء الدليل الفرعي المقابل 1
.
$ ls /tmp/mnist/1
saved_model.pb variables
يحتوي كل دليل فرعي للإصدار على الملفات التالية:
saved_model.pb
هو Tensorflow::SavedModel المتسلسل. ويتضمن واحدًا أو أكثر من تعريفات الرسم البياني للنموذج، بالإضافة إلى البيانات الوصفية للنموذج مثل التوقيعات.variables
هي ملفات تحتوي على المتغيرات المتسلسلة للرسوم البيانية.
وبذلك، يتم تصدير نموذج TensorFlow الخاص بك وهو جاهز للتحميل!
قم بتحميل النموذج الذي تم تصديره باستخدام TensorFlow ModelServer القياسي
استخدم صورة عرض Docker لتحميل النموذج للعرض بسهولة:
docker run -p 8500:8500 \
--mount type=bind,source=/tmp/mnist,target=/models/mnist \
-e MODEL_NAME=mnist -t tensorflow/serving &
اختبر الخادم
يمكننا استخدام الأداة المساعدة mnist_client المتوفرة لاختبار الخادم. يقوم العميل بتنزيل بيانات اختبار MNIST، ويرسلها كطلبات إلى الخادم، ويحسب معدل خطأ الاستدلال.
tools/run_in_docker.sh python tensorflow_serving/example/mnist_client.py \
--num_tests=1000 --server=127.0.0.1:8500
يجب أن ينتج هذا شيئًا مثل
...
Inference error rate: 11.13%
نتوقع دقة تصل إلى 90% تقريبًا لنموذج Softmax المُدرب ونحصل على معدل خطأ في الاستدلال بنسبة 11% لأول 1000 صورة اختبار. وهذا يؤكد أن الخادم قام بتحميل النموذج المدرب وتشغيله بنجاح!