משרת דגם TensorFlow

מדריך זה מראה לך כיצד להשתמש ברכיבי 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 ותיעוד קשור TensorFlow API .

שימו לב של 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 הוא ה-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 תמונות הבדיקה הראשונות. זה מאשר שהשרת טוען ומפעיל את המודל המאומן בהצלחה!