InfraValidator เป็นส่วนประกอบ TFX ที่ใช้เป็นเลเยอร์การเตือนล่วงหน้าก่อนที่จะพุชโมเดลเข้าสู่การใช้งานจริง ชื่อเครื่องมือตรวจสอบ "อินฟรา" มาจากข้อเท็จจริงที่ว่ากำลังตรวจสอบโมเดลในโมเดลจริงที่ให้บริการ "โครงสร้างพื้นฐาน" หาก Evaluator ต้องการรับประกันประสิทธิภาพของโมเดล InfraValidator ก็รับประกันว่าโมเดลจะมีกลไกที่ดี และป้องกันไม่ให้โมเดลที่ไม่ดีถูกผลักออกไป
มันทำงานอย่างไร?
InfraValidator รับโมเดล เปิดตัวเซิร์ฟเวอร์โมเดลแบบแซนด์บ็อกซ์พร้อมกับโมเดล และดูว่าสามารถโหลดได้สำเร็จและสามารถเลือกสอบถามได้หรือไม่ ผลลัพธ์การตรวจสอบความถูกต้องของอินฟาเรดจะถูกสร้างขึ้นในเอาท์พุต blessing
ในลักษณะเดียวกับที่ ผู้ประเมิน ทำ
InfraValidator มุ่งเน้นไปที่ความเข้ากันได้ระหว่างไบนารีเซิร์ฟเวอร์โมเดล (เช่น TensorFlow Serving ) และโมเดลที่จะปรับใช้ แม้จะมีชื่อเครื่องมือตรวจสอบ "อินฟรา" แต่ก็เป็น ความรับผิดชอบของผู้ใช้ ในการกำหนดค่าสภาพแวดล้อมอย่างถูกต้อง และเครื่องมือตรวจสอบอินฟาเรดจะโต้ตอบกับเซิร์ฟเวอร์โมเดลในสภาพแวดล้อมที่ผู้ใช้กำหนดค่าเท่านั้นเพื่อดูว่าทำงานได้ดีหรือไม่ การกำหนดค่าสภาพแวดล้อมนี้อย่างถูกต้องจะช่วยให้มั่นใจได้ว่าการตรวจสอบอินฟาเรดที่ผ่านหรือล้มเหลวจะเป็นตัวบ่งชี้ว่าโมเดลจะสามารถใช้งานได้ในสภาพแวดล้อมการให้บริการการผลิตหรือไม่ นี่หมายถึงบางส่วนแต่ไม่จำกัดเพียงสิ่งต่อไปนี้:
- InfraValidator ใช้ไบนารีเซิร์ฟเวอร์รุ่นเดียวกันกับที่จะใช้ในการผลิต นี่คือระดับขั้นต่ำที่สภาพแวดล้อมการตรวจสอบความถูกต้องของอินฟราเรดจะต้องมาบรรจบกัน
- InfraValidator ใช้ทรัพยากรเดียวกัน (เช่น ปริมาณการจัดสรรและประเภทของ CPU หน่วยความจำ และตัวเร่งความเร็ว) เช่นเดียวกับที่จะใช้ในการผลิต
- 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 อย่างไร