רכיב צינור ה- InfraValidator TFX

InfraValidator הוא רכיב TFX המשמש כשכבת אזהרה מוקדמת לפני דחיפת דגם לייצור. השם "מאמת אינפרא" בא מהעובדה שהוא מאמת את המודל במודל בפועל המשרת את "תשתית". אם המעריך הוא להבטיח את הביצועים של המודל, InfraValidator היא להבטיח את המודל הוא מכאני קנס ומונע מודלים רעים מדחיפתה.

איך זה עובד?

InfraValidator לוקח את המודל, משיק שרת מודל עם ארגז חול עם הדגם, ובודק אם ניתן לטעון אותו בהצלחה ולבצע שאילתה אופציונלית. תוצאת אימות אינפרא תופק על blessing פלט באותו אופן כפי למעריכים עושים.

InfraValidator מתמקד התאימות בין בינארי שרת מודל (למשל TensorFlow הגשה ) והמודל לפרוס. למרות המאמת "אינפרא" שם, זוהי אחריותו של המשתמש להגדיר את הסביבה בצורה נכונה, ו מאמת אינפרא רק אינטראקציה עם שרת המודל בסביבה מוגדרת למשתמש לראות אם זה עובד מצוין. קביעת תצורה נכונה של סביבה זו תבטיח שאימות אינפרא עובר או נכשל יעיד אם המודל יהיה ניתן לשרת בסביבת ההגשה של הייצור. זה מרמז על חלק מהדברים הבאים, אך לא רק:

  1. InfraValidator משתמש באותו דגם שרת בינארי שישמש בייצור. זוהי הרמה המינימלית שאליה חייבת להתכנס סביבת אימות האינפרא.
  2. InfraValidator משתמש באותם משאבים (כגון כמות הקצאה וסוג מעבד, זיכרון ומאיצים) שישמשו בייצור.
  3. InfraValidator משתמש באותה דגם תצורת שרת כפי שתשמש בייצור.

בהתאם למצב, המשתמשים יכולים לבחור באיזו מידה InfraValidator צריך להיות זהה לסביבת הייצור. מבחינה טכנית, ניתן לאמת מודל אינפרא בסביבת Docker מקומית ולאחר מכן להגיש אותו בסביבה שונה לחלוטין (למשל אשכול Kubernetes) ללא בעיה. עם זאת, InfraValidator לא יבדוק את הפער הזה.

מצב הפעלה

בהתאם לתצורה, אימות אינפרא נעשה באחד מהמצבים הבאים:

  • LOAD_ONLY מצב: בדיקה האם המודל נטען בהצלחה בתשתית המשרתים או לא. אוֹ
  • LOAD_AND_QUERY מצב: LOAD_ONLY במצב בתוספת שליחת כמה בקשות מדגם כדי לבדוק אם המודל הוא מסוגל לשרת מסקנות. ל-InfraValidator לא אכפת שהתחזית הייתה נכונה או לא. חשוב רק אם הבקשה הצליחה או לא.

איך אני משתמש בו?

בדרך כלל InfraValidator מוגדר ליד רכיב Evaluator, והפלט שלו מוזן ל-Pusher. אם InfraValidator נכשל, המודל לא יידחף.

evaluator = Evaluator(
    model=trainer.outputs['model'],
    examples=example_gen.outputs['examples'],
    baseline_model=model_resolver.outputs['model'],
    eval_config=tfx.proto.EvalConfig(...)
)

infra_validator = InfraValidator(
    model=trainer.outputs['model'],
    serving_spec=tfx.proto.ServingSpec(...)
)

pusher = Pusher(
    model=trainer.outputs['model'],
    model_blessing=evaluator.outputs['blessing'],
    infra_blessing=infra_validator.outputs['blessing'],
    push_destination=tfx.proto.PushDestination(...)
)

הגדרת רכיב InfraValidator.

ישנם שלושה סוגים של פרוטו להגדרת InfraValidator.

ServingSpec

ServingSpec הוא בתצורה החיונית ביותר עבור InfraValidator. זה מגדיר:

  • סוג מה שרת מודל ריצה
  • היכן להפעיל אותו

עבור סוגי שרתי מודל (הנקראים Serving Binary) אנו תומכים

פלטפורמות ההגשה הבאות נתמכות כעת:

  • Docker מקומי (יש להתקין את Docker מראש)
  • Kubernetes (תמיכה מוגבלת עבור KubeflowDagRunner בלבד)

הבחירה להגשת בינארי ומשרת פלטפורמה מבוצעת על ידי ציון oneof בלוק של ServingSpec . לדוגמה להשתמש TensorFlow הגשת ריצת בינאריים על אשכול Kubernetes, tensorflow_serving ו kubernetes שדה צריך להיות מוגדר.

infra_validator=InfraValidator(
    model=trainer.outputs['model'],
    serving_spec=tfx.proto.ServingSpec(
        tensorflow_serving=tfx.proto.TensorFlowServing(
            tags=['latest']
        ),
        kubernetes=tfx.proto.KubernetesConfig()
    )
)

כדי להגדיר נוסף ServingSpec , בבקשה לבדוק את הגדרת Protobuf .

ValidationSpec

תצורה אופציונלית להתאמת קריטריוני אימות האינפרא או זרימת העבודה.

infra_validator=InfraValidator(
    model=trainer.outputs['model'],
    serving_spec=tfx.proto.ServingSpec(...),
    validation_spec=tfx.proto.ValidationSpec(
        # How much time to wait for model to load before automatically making
        # validation fail.
        max_loading_time_seconds=60,
        # How many times to retry if infra validation fails.
        num_tries=3
    )
)

לכל שדות ValidationSpec יש ערך ברירת מחדל קול. בדוק ביתר פירוט מן ההגדרה Protobuf .

RequestSpec

תצורה אופציונלית כדי לציין כיצד לבנות בקשות מדגם בעת הפעלת אימות אינפרא ב LOAD_AND_QUERY מצב. על מנת להשתמש LOAD_AND_QUERY מצב, בו נדרש לפרט הוא request_spec מאפייני ביצוע וכן examples ערוץ קלט בהגדרת הרכיב.

infra_validator = InfraValidator(
    model=trainer.outputs['model'],
    # This is the source for the data that will be used to build a request.
    examples=example_gen.outputs['examples'],
    serving_spec=tfx.proto.ServingSpec(
        # Depending on what kind of model server you're using, RequestSpec
        # should specify the compatible one.
        tensorflow_serving=tfx.proto.TensorFlowServing(tags=['latest']),
        local_docker=tfx.proto.LocalDockerConfig(),
    ),
    request_spec=tfx.proto.RequestSpec(
        # InfraValidator will look at how "classification" signature is defined
        # in the model, and automatically convert some samples from `examples`
        # artifact to prediction RPC requests.
        tensorflow_serving=tfx.proto.TensorFlowServingRequestSpec(
            signature_names=['classification']
        ),
        num_examples=10  # How many requests to make.
    )
)

הפקת SavedModel עם חימום

(מגרסה 0.30.0)

מאז מאמת מודל InfraValidator עם בקשות אמיתיות, זה יכול בקלות לעשות שימוש חוזר בקשות אימות אלה בקשות חימום של SavedModel. InfraValidator מספק אופציה ( RequestSpec.make_warmup ) לייצא SavedModel עם חימום.

infra_validator = InfraValidator(
    ...,
    request_spec=tfx.proto.RequestSpec(..., make_warmup=True)
)

ואז פלט InfraBlessing חפץ יכיל SavedModel עם חימום, וניתן דחף גם על ידי Pusher , בדיוק כמו Model חפץ.

מגבלות

InfraValidator הנוכחי לא הושלם עדיין, ויש לו כמה מגבלות.

  • רק TensorFlow SavedModel בפורמט מודל ניתן תוקף.
  • בעת הפעלת TFX על Kubernetes, הצינור צריך להיות מוצא להורג על ידי KubeflowDagRunner בתוך צינורות Kubeflow. שרת הדגם יושק באותו אשכול Kubernetes ובמרחב השמות שבו משתמשת Kubeflow.
  • InfraValidator הינה בעיקר באמצעות פריסות כדי TensorFlow הגשה , ובעוד עדיין שימושי זה פחות מדויק עבור פריסות כדי TensorFlow לייט ו TensorFlow.js , או במסגרות אחרות היקש.
  • יש תמיכה מוגבלת על LOAD_AND_QUERY מצב עבור לחזות חתימת השיטה (המהווה את שיטת יציא רק TensorFlow 2). InfraValidator מחייב חתימה לחזות לצרוך בהמשכים tf.Example כקלט רק.

    @tf.function
    def parse_and_run(serialized_example):
      features = tf.io.parse_example(serialized_example, FEATURES)
      return model(features)
    
    model.save('path/to/save', signatures={
      # This exports "Predict" method signature under name "serving_default".
      'serving_default': parse_and_run.get_concrete_function(
          tf.TensorSpec(shape=[None], dtype=tf.string, name='examples'))
    })
    
    • נסו להשתמש בדוגמא פינגווין דוגמת קוד כדי לראות איך החתימה הזאת מקיימת אינטראקציה עם רכיבים אחרים TFX.