מדריך זה מראה לך כיצד להשתמש ברכיבי TensorFlow Serving כדי לייצא מודל TensorFlow מאומן ולהשתמש ב-tensorflow_model_server הסטנדרטי כדי לשרת אותו. אם אתה כבר מכיר את TensorFlow Serving, ואתה רוצה לדעת יותר על אופן הפעולה הפנימי של השרת, עיין במדריך המתקדם של TensorFlow Serving .
מדריך זה משתמש במודל Softmax Regression פשוט המסווג ספרות בכתב יד. זה דומה מאוד לזה שהוצג במדריך TensorFlow על סיווג תמונות באמצעות מערך הנתונים של Fashion MNIST .
הקוד של הדרכה זו מורכב משני חלקים:
קובץ Python, mnist_saved_model.py , שמאמן ומייצא את המודל.
ModelServer בינארי שניתן להתקין באמצעות Apt, או להידור מקובץ C++ ( main.cc ). TensorFlow Serving ModelServer מגלה דגמים מיוצאים חדשים ומפעיל שירות gRPC להגשתם.
לפני שמתחילים, התקן תחילה את Docker .
אימון וייצוא מודל TensorFlow
לשלב האימון, גרף TensorFlow מושק ב-TensorFlow session sess
, כאשר טנסור הקלט (תמונה) הוא 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 ובתיעוד הקשור לממשק API של TensorFlow .signature_def_map
מציין את המפה של מפתח שסופק על ידי המשתמש עבור חתימה ל-tensorflow::SignatureDef להוספה למטא גרף. החתימה מציינת איזה סוג של מודל מיוצא, ואת טנסורי הקלט/פלט שיש לאגד אליהם בעת הפעלת הסקה.מפתח החתימה המיוחד
serving_default
מציין את חתימת ההגשה המוגדרת כברירת מחדל. מפתח ברירת המחדל של הגדרת החתימה, יחד עם קבועים אחרים הקשורים לחתימות, מוגדרים כחלק מקבועי החתימה של SavedModel. לפרטים נוספים, ראה signature_constants.py ותיעוד הקשור לממשק API של TensorFlow .יתר על כן, כדי לסייע בבניית הגדרות חתימה בקלות, ה-API של SavedModel מספק שימוש ב-signature def utils .. באופן ספציפי, בקובץ mnist_saved_model.py המקורי, אנו משתמשים ב-
signature_def_utils.build_signature_def()
כדי לבנותpredict_signature
ו-classification_signature
.כדוגמה לאופן שבו מוגדרת
predict_signature
, ה- util לוקח את הארגומנטים הבאים:inputs={'images': tensor_info_x}
מציין את מידע הטנסור הקלט.outputs={'scores': tensor_info_y}
מציין את פרטי הטנסור של הציונים.method_name
היא השיטה המשמשת להסקת ההסקה. עבור בקשות חיזוי, יש להגדיר אותו ל-tensorflow/serving/predict
. לשמות שיטות אחרים, ראה signature_constants.py ותיעוד קשור לממשק API של TensorFlow .
שימו לב של tensor_info_x
ו- tensor_info_y
יש את המבנה של tensorflow::TensorInfo
מאגר פרוטוקול המוגדר כאן . כדי לבנות בקלות מידע על tensor, TensorFlow SavedModel API מספק גם utils.py , עם תיעוד קשור TensorFlow API .
כמו כן, שים לב images
scores
הם שמות כינויים של טנסור. הם יכולים להיות כל מחרוזת ייחודית שתרצה, והם יהפכו לשמות ההגיוניים של טנסור x
ו- y
שאליהם אתה מתייחס לקשירת טנזור בעת שליחת בקשות חיזוי מאוחר יותר.
לדוגמה, אם x
מתייחס לטנסור עם השם 'long_tensor_name_foo' ו- y
מתייחס לטנסור עם השם 'generated_tensor_name_bar', builder
יאחסן את השם הלוגי של הטנסור למיפוי שם אמיתי ('תמונות' -> 'long_tensor_name_foo') ו-('ציונים ' -> 'סרגל השם_נוצר_tensor'). זה מאפשר למשתמש להתייחס לטנזורים אלה עם השמות ההגיוניים שלהם בעת הפעלת מסקנות.
בוא נריץ את זה!
ראשית, אם עדיין לא עשית זאת, שכפל את המאגר הזה למחשב המקומי שלך:
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
הוא זרימת הטנסור המסודרת::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 תמונות הבדיקה הראשונות. זה מאשר שהשרת טוען ומריץ את המודל המאומן בהצלחה!