SignatureDefs ב- SavedModel לשרת TensorFlow

מַטָרָה

מסמך זה מספק דוגמאות לשימוש המיועד ב-SignatureDefs ב-SavedModel הממפה את ממשקי ה-API של TensorFlow Serving.

סקירה כללית

SignatureDef מגדיר את החתימה של חישוב הנתמך בגרף TensorFlow. SignatureDefs שואף לספק תמיכה גנרית לזיהוי כניסות ופלטים של פונקציה וניתן לציין אותם בעת בניית SavedModel .

רקע כללי

TF-Exporter ו- SessionBundle השתמשו בחתימות הדומות בקונספציה אך דרשו מהמשתמשים להבחין בין חתימות בעלות שם לבין חתימות ברירת מחדל על מנת שיאוחזרו בצורה נכונה בעת טעינה. למי שהשתמש בעבר ב-TF-Exporter/SessionBundle, Signatures ב-TF-Exporter יוחלפו ב- SignatureDefs ב-SavedModel.

SignatureDef Structure

SignatureDef דורש מפרט של:

  • inputs כמפה של מחרוזת ל-TensorInfo.
  • outputs כמפה של מחרוזת ל- TensorInfo.
  • method_name (המתאים לשם שיטה נתמך בכלי/מערכת הטעינה).

שימו לב ש- TensorInfo עצמו דורש מפרט של שם, dtype וצורת טנסור. בעוד שמידע טנסור כבר קיים בגרף, כדאי להגדיר במפורש את TensorInfo כחלק מה-SignatureDef, מכיוון שכלים יכולים לבצע אימות חתימה וכו' מבלי לקרוא את הגדרת הגרף.

כדי להקל על השימוש החוזר והשיתוף בין כלים ומערכות, קבועים נפוצים הקשורים ל-SignatureDefs שייתמכו ב- TensorFlow Serving מוגדרים כקבועים. באופן ספציפי:

בנוסף, SavedModel מספק עזר שיעזור לבנות הגדרת חתימה.

מבנים לדוגמה

TensorFlow Serving מספק ממשקי API ברמה גבוהה לביצוע מסקנות. כדי לאפשר ממשקי API אלה, המודלים חייבים לכלול SignatureDefs אחד או יותר המגדירים את צמתי TensorFlow המדויקים לשימוש עבור קלט ופלט. ראה להלן דוגמאות של SignatureDefs הספציפיות שבהן תומך TensorFlow Serving עבור כל API.

שימו לב שהשרת TensorFlow תלויה במפתחות של כל TensorInfo (בכניסות וביציאות של ה-SignatureDef), כמו גם בשם method_name של ה-SignatureDef. התוכן בפועל של TensorInfo הוא ספציפי לגרף שלך.

סיווג SignatureDef

Classification SignatureDefs תומכת בקריאות מובנות לממשק API לסיווג של TensorFlow Serving. אלה קובעים שחייב להיות טנסור inputs , ושיש שני טנסור פלט אופציונלי: classes scores , שלפחות אחד מהם חייב להיות נוכח.

signature_def: {
  key  : "my_classification_signature"
  value: {
    inputs: {
      key  : "inputs"
      value: {
        name: "tf_example:0"
        dtype: DT_STRING
        tensor_shape: ...
      }
    }
    outputs: {
      key  : "classes"
      value: {
        name: "index_to_string:0"
        dtype: DT_STRING
        tensor_shape: ...
      }
    }
    outputs: {
      key  : "scores"
      value: {
        name: "TopKV2:0"
        dtype: DT_FLOAT
        tensor_shape: ...
      }
    }
    method_name: "tensorflow/serving/classify"
  }
}

חיזוי SignatureDef

Predict SignatureDefs תמיכה בקריאות ל-Predict API של TensorFlow Serving. חתימות אלה מאפשרות לך לתמוך בצורה גמישה שרירותית בטנסורי קלט ופלט רבים. עבור הדוגמה למטה, החתימה my_prediction_signature כוללת קלט לוגי יחיד images Tensor הממופות לטנסור בפועל בתרשים x:0 שלך.

Predict SignatureDefs מאפשרים ניידות בין דגמים. זה אומר שאתה יכול להחליף מודלים שמורים שונים, אולי עם שמות טנסור שונים (למשל במקום x:0 , אולי יש לך דגם חלופי חדש עם Tensor z:0 ), בעוד שהלקוחות שלך יכולים להישאר מקוונים ברציפות לשאול את הישן והחדש גרסאות של דגם זה ללא שינויים בצד הלקוח.

Predict SignatureDefs גם מאפשרים לך להוסיף Tensors אופציונליים נוספים לפלט, שתוכל לבצע שאילתה מפורשת. נניח שבנוסף למפתח הפלט שלמטה של scores , רצית גם להביא שכבת מאגר לניפוי באגים או למטרות אחרות. במקרה כזה, פשוט תוסיף Tensor נוסף עם מפתח כמו pool וערך מתאים.

signature_def: {
  key  : "my_prediction_signature"
  value: {
    inputs: {
      key  : "images"
      value: {
        name: "x:0"
        dtype: ...
        tensor_shape: ...
      }
    }
    outputs: {
      key  : "scores"
      value: {
        name: "y:0"
        dtype: ...
        tensor_shape: ...
      }
    }
    method_name: "tensorflow/serving/predict"
  }
}

חתימת רגרסיהDef

Regression SignatureDefs תומכים בקריאות מובנות ל-Regression API של TensorFlow Serving. אלה קובעים שחייב להיות בדיוק אחד inputs טנסור, ואחד outputs טנסור.

signature_def: {
  key  : "my_regression_signature"
  value: {
    inputs: {
      key  : "inputs"
      value: {
        name: "x_input_examples_tensor_0"
        dtype: ...
        tensor_shape: ...
      }
    }
    outputs: {
      key  : "outputs"
      value: {
        name: "y_outputs_0"
        dtype: DT_FLOAT
        tensor_shape: ...
      }
    }
    method_name: "tensorflow/serving/regress"
  }
}