خدمة نموذج TensorFlow

يوضح لك هذا البرنامج التعليمي كيفية استخدام مكونات 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 صورة اختبار. وهذا يؤكد أن الخادم قام بتحميل النموذج المدرب وتشغيله بنجاح!