ส่วนประกอบไปป์ไลน์ TFX ของ InfraValidator

InfraValidator เป็นส่วนประกอบ TFX ที่ใช้เป็นเลเยอร์การเตือนล่วงหน้าก่อนที่จะพุชโมเดลเข้าสู่การใช้งานจริง ชื่อเครื่องมือตรวจสอบ "อินฟรา" มาจากข้อเท็จจริงที่ว่ากำลังตรวจสอบโมเดลในโมเดลจริงที่ให้บริการ "โครงสร้างพื้นฐาน" หาก Evaluator ต้องการรับประกันประสิทธิภาพของโมเดล InfraValidator ก็รับประกันว่าโมเดลจะมีกลไกที่ดี และป้องกันไม่ให้โมเดลที่ไม่ดีถูกผลักออกไป

มันทำงานอย่างไร?

InfraValidator รับโมเดล เปิดตัวเซิร์ฟเวอร์โมเดลแบบแซนด์บ็อกซ์พร้อมกับโมเดล และดูว่าสามารถโหลดได้สำเร็จและสามารถเลือกสอบถามได้หรือไม่ ผลลัพธ์การตรวจสอบความถูกต้องของอินฟาเรดจะถูกสร้างขึ้นในเอาท์พุต blessing ในลักษณะเดียวกับที่ ผู้ประเมิน ทำ

InfraValidator มุ่งเน้นไปที่ความเข้ากันได้ระหว่างไบนารีเซิร์ฟเวอร์โมเดล (เช่น TensorFlow Serving ) และโมเดลที่จะปรับใช้ แม้จะมีชื่อเครื่องมือตรวจสอบ "อินฟรา" แต่ก็เป็น ความรับผิดชอบของผู้ใช้ ในการกำหนดค่าสภาพแวดล้อมอย่างถูกต้อง และเครื่องมือตรวจสอบอินฟาเรดจะโต้ตอบกับเซิร์ฟเวอร์โมเดลในสภาพแวดล้อมที่ผู้ใช้กำหนดค่าเท่านั้นเพื่อดูว่าทำงานได้ดีหรือไม่ การกำหนดค่าสภาพแวดล้อมนี้อย่างถูกต้องจะช่วยให้มั่นใจได้ว่าการตรวจสอบอินฟาเรดที่ผ่านหรือล้มเหลวจะเป็นตัวบ่งชี้ว่าโมเดลจะสามารถใช้งานได้ในสภาพแวดล้อมการให้บริการการผลิตหรือไม่ นี่หมายถึงบางส่วนแต่ไม่จำกัดเพียงสิ่งต่อไปนี้:

  1. InfraValidator ใช้ไบนารีเซิร์ฟเวอร์รุ่นเดียวกันกับที่จะใช้ในการผลิต นี่คือระดับขั้นต่ำที่สภาพแวดล้อมการตรวจสอบความถูกต้องของอินฟราเรดจะต้องมาบรรจบกัน
  2. InfraValidator ใช้ทรัพยากรเดียวกัน (เช่น ปริมาณการจัดสรรและประเภทของ CPU หน่วยความจำ และตัวเร่งความเร็ว) เช่นเดียวกับที่จะใช้ในการผลิต
  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 มันกำหนด:

  • เซิร์ฟเวอร์รุ่น ใด ที่จะรัน
  • จะเรียกใช้ ที่ไหน

สำหรับประเภทเซิร์ฟเวอร์โมเดล (เรียกว่า การให้บริการไบนารี่) ที่เรารองรับ

ปัจจุบันรองรับแพลตฟอร์มการให้บริการต่อไปนี้:

  • Local Docker (ควรติดตั้ง Docker ไว้ล่วงหน้า)
  • Kubernetes (การสนับสนุนแบบจำกัดสำหรับ KubeflowDagRunner เท่านั้น)

ตัวเลือกสำหรับการให้บริการไบนารีและแพลตฟอร์มการให้บริการทำได้โดยการระบุหนึ่ง oneof บล็อกของ ServingSpec ตัวอย่างเช่น หากต้องการใช้ไบนารี TensorFlow Serving ที่ทำงานบนคลัสเตอร์ 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 Pipelines เซิร์ฟเวอร์โมเดลจะเปิดตัวในคลัสเตอร์ Kubernetes เดียวกันและเนมสเปซที่ Kubeflow ใช้
  • InfraValidator มุ่งเน้นไปที่การปรับใช้กับ TensorFlow Serving เป็นหลัก และแม้ว่าจะยังมีประโยชน์อยู่ แต่ก็มีความแม่นยำน้อยกว่าสำหรับการปรับใช้กับ TensorFlow Lite และ TensorFlow.js หรือเฟรมเวิร์กการอนุมานอื่นๆ
  • มีการสนับสนุนที่จำกัดในโหมด LOAD_AND_QUERY สำหรับลายเซ็นวิธี การทำนาย (ซึ่งเป็นวิธีการเดียวที่สามารถส่งออกได้ใน TensorFlow 2) InfraValidator ต้องการลายเซ็น Predict เพื่อใช้ 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'))
    })
    
    • ตรวจสอบโค้ดตัวอย่าง Penguin เพื่อดูว่าลายเซ็นนี้โต้ตอบกับส่วนประกอบอื่นๆ ใน TFX อย่างไร