ภาพรวม
ไปป์ไลน์ TensorFlow Model Analysis (TFMA) มีรายละเอียดดังนี้:
ไปป์ไลน์ประกอบด้วยสี่องค์ประกอบหลัก:
- อ่านอินพุต
- การสกัด
- การประเมิน
- เขียนผลลัพธ์
ส่วนประกอบเหล่านี้ใช้สองประเภทหลัก: tfma.Extracts
และ tfma.evaluators.Evaluation
ประเภท tfma.Extracts
แสดงถึงข้อมูลที่ดึงออกมาระหว่างการประมวลผลไปป์ไลน์ และอาจสอดคล้องกับตัวอย่างอย่างน้อยหนึ่งตัวอย่างสำหรับโมเดล tfma.evaluators.Evaluation
แสดงถึงผลลัพธ์จากการประเมินสารสกัด ณ จุดต่างๆ ระหว่างกระบวนการสกัด เพื่อให้ API ที่ยืดหยุ่นได้ ประเภทเหล่านี้เป็นเพียงคำสั่งที่คีย์ถูกกำหนด (สงวนไว้สำหรับการใช้งาน) โดยการใช้งานที่แตกต่างกัน ประเภทมีการกำหนดดังนี้:
# Extracts represent data extracted during pipeline processing.
# For example, the PredictExtractor stores the data for the
# features, labels, and predictions under the keys "features",
# "labels", and "predictions".
Extracts = Dict[Text, Any]
# Evaluation represents the output from evaluating extracts at
# particular point in the pipeline. The evaluation outputs are
# keyed by their associated output type. For example, the metric / plot
# dictionaries from evaluating metrics and plots will be stored under
# "metrics" and "plots" respectively.
Evaluation = Dict[Text, beam.pvalue.PCollection]
โปรดทราบว่า tfma.Extracts
จะไม่ถูกเขียนออกมาโดยตรง โดยจะต้องผ่านผู้ประเมินเพื่อสร้าง tfma.evaluators.Evaluation
ที่จะถูกเขียนออกมา โปรดทราบว่า tfma.Extracts
เป็น dicts ที่เก็บไว้ใน beam.pvalue.PCollection
(เช่น beam.PTransform
ใช้เป็นอินพุต beam.pvalue.PCollection[tfma.Extracts]
) ในขณะที่ tfma.evaluators.Evaluation
เป็น dict ที่มีค่า คือ beam.pvalue.PCollection
s (เช่น beam.PTransform
ใช้ dict เองเป็นอาร์กิวเมนต์สำหรับอินพุต beam.value.PCollection
) กล่าวอีกนัยหนึ่ง tfma.evaluators.Evaluation
ถูกใช้ในเวลาก่อสร้างไปป์ไลน์ แต่ tfma.Extracts
ถูกใช้ที่รันไทม์ไปป์ไลน์
อ่านอินพุต
สเตจ ReadInputs
ประกอบด้วยการแปลงที่รับอินพุตดิบ (tf.train.Example, CSV, ...) และแปลงเป็นสารสกัด วันนี้สารสกัดจะแสดงเป็นไบต์อินพุตดิบที่จัดเก็บไว้ภายใต้ tfma.INPUT_KEY
อย่างไรก็ตาม สารสกัดสามารถอยู่ในรูปแบบใดก็ได้ที่เข้ากันได้กับไปป์ไลน์การแยก - หมายความว่าจะสร้าง tfma.Extracts
เป็นเอาต์พุต และสารสกัดเหล่านั้นเข้ากันได้กับดาวน์สตรีม เครื่องสกัด ขึ้นอยู่กับตัวแยกที่แตกต่างกันในการจัดทำเอกสารอย่างชัดเจนถึงสิ่งที่ต้องการ
การสกัด
ขั้นตอนการสกัดเป็นรายการ beam.PTransform
ที่รันเป็นชุด ตัวแยกใช้ tfma.Extracts
เป็นอินพุตและส่งคืน tfma.Extracts
เป็นเอาต์พุต ตัวแยกข้อมูลต้นแบบคือ tfma.extractors.PredictExtractor
ซึ่งใช้การแยกอินพุตที่สร้างโดยการแปลงอินพุตการอ่านและเรียกใช้ผ่านแบบจำลองเพื่อสร้างการแยกการคาดการณ์ ตัวแยกแบบกำหนดเองสามารถแทรกได้ทุกจุดหากการแปลงนั้นสอดคล้องกับ tfma.Extracts
in และ tfma.Extracts
out API ตัวแยกถูกกำหนดดังนี้:
# An Extractor is a PTransform that takes Extracts as input and returns
# Extracts as output. A typical example is a PredictExtractor that receives
# an 'input' placeholder for input and adds additional 'predictions' extracts.
Extractor = NamedTuple('Extractor', [
('stage_name', Text),
('ptransform', beam.PTransform)]) # Extracts -> Extracts
ตัวแยกสัญญาณเข้า
tfma.extractors.InputExtractor
ใช้เพื่อแยกคุณลักษณะดิบ ป้ายข้อมูลดิบ และน้ำหนักตัวอย่างแบบดิบจากบันทึก tf.train.Example
สำหรับการใช้ในการแบ่งส่วนเมตริกและการคำนวณ โดยค่าเริ่มต้น ค่าจะถูกเก็บไว้ภายใต้ features
คีย์แยก, labels
และ example_weights
ตามลำดับ ป้ายชื่อรุ่นแบบเอาต์พุตเดี่ยวและน้ำหนักตัวอย่างจะถูกจัดเก็บโดยตรงเป็นค่า np.ndarray
ป้ายชื่อรุ่นที่มีหลายเอาต์พุตและน้ำหนักตัวอย่างจะถูกเก็บไว้เป็น dicts ของค่า np.ndarray
(ระบุด้วยชื่อเอาต์พุต) หากทำการประเมินหลายรุ่น ป้ายกำกับและน้ำหนักตัวอย่างจะถูกฝังเพิ่มเติมภายใน dict อื่น (ระบุด้วยชื่อรุ่น)
เครื่องทำนายผล
tfma.extractors.PredictExtractor
รันการคาดคะเนโมเดลและจัดเก็บไว้ภายใต้การ predictions
ที่สำคัญใน tfma.Extracts
dict การคาดคะเนโมเดลเอาต์พุตเดี่ยวจะถูกจัดเก็บโดยตรงเป็นค่าเอาต์พุตที่คาดการณ์ไว้ การคาดคะเนโมเดลหลายเอาต์พุตจะถูกจัดเก็บเป็น dict ของค่าเอาต์พุต (ระบุด้วยชื่อเอาต์พุต) หากทำการประเมินหลายโมเดล การคาดการณ์จะถูกฝังเพิ่มเติมภายใน dict อื่น (ระบุด้วยชื่อรุ่น) ค่าเอาท์พุตจริงที่ใช้ขึ้นอยู่กับโมเดล (เช่น ค่าเอาต์พุตของตัวประมาณ TF ที่ส่งคืนในรูปแบบของ dict ในขณะที่ keras ส่งคืนค่า np.ndarray
)
SliceKeyExtractor
tfma.extractors.SliceKeyExtractor
ใช้ข้อมูลจำเพาะการแบ่งส่วนเพื่อกำหนดว่าสไลซ์ใดใช้กับอินพุตตัวอย่างแต่ละรายการตามคุณสมบัติที่แยกออกมา และเพิ่มค่าการแบ่งส่วนคอร์สปอนดิ้งให้กับสารสกัดเพื่อใช้ในภายหลังโดยผู้ประเมิน
การประเมิน
การประเมินเป็นกระบวนการของการสกัดและประเมินผล แม้ว่าการดำเนินการประเมินที่ส่วนท้ายของไปป์ไลน์การดึงข้อมูลเป็นเรื่องปกติ แต่ก็มีกรณีการใช้งานที่ต้องมีการประเมินก่อนหน้านี้ในกระบวนการสกัด เนื่องจากผู้ประเมินดังกล่าวมีความเกี่ยวข้องกับตัวแยกซึ่งมีผลลัพธ์ที่ควรได้รับการประเมิน ผู้ประเมินถูกกำหนดดังนี้:
# An evaluator is a PTransform that takes Extracts as input and
# produces an Evaluation as output. A typical example of an evaluator
# is the MetricsAndPlotsEvaluator that takes the 'features', 'labels',
# and 'predictions' extracts from the PredictExtractor and evaluates
# them using post export metrics to produce metrics and plots dictionaries.
Evaluator = NamedTuple('Evaluator', [
('stage_name', Text),
('run_after', Text), # Extractor.stage_name
('ptransform', beam.PTransform)]) # Extracts -> Evaluation
สังเกตว่าผู้ประเมินคือ beam.PTransform
ที่รับ tfma.Extracts
เป็นอินพุต ไม่มีอะไรหยุดการนำไปใช้จากการแปลงเพิ่มเติมในสารสกัดซึ่งเป็นส่วนหนึ่งของกระบวนการประเมินผล ไม่เหมือนกับตัวแยกข้อมูลที่ต้องส่งคืน tfma.Extracts
dict ไม่มีข้อจำกัดเกี่ยวกับประเภทของเอาต์พุตที่ผู้ประเมินสามารถสร้างได้ แม้ว่าผู้ประเมินส่วนใหญ่จะส่งคืน dict ด้วย (เช่น ชื่อและค่าเมตริก)
MetricsAndPlotsEvaluator
tfma.evaluators.MetricsAndPlotsEvaluator
นำ features
labels
และ predictions
เป็นอินพุต เรียกใช้ผ่าน tfma.slicer.FanoutSlices
เพื่อจัดกลุ่มตามส่วน จากนั้นดำเนินการคำนวณและแปลงค่าเมตริก มันสร้างผลลัพธ์ในรูปแบบของพจนานุกรมของหน่วยเมตริกและคีย์และค่าพล็อต (สิ่งเหล่านี้จะถูกแปลงเป็น protos ที่ต่อเนื่องกันในภายหลังสำหรับเอาต์พุตโดย tfma.writers.MetricsAndPlotsWriter
)
เขียนผลลัพธ์
สเตจ WriteResults
เป็นที่ที่เอาต์พุตการประเมินถูกเขียนลงในดิสก์ WriteResults ใช้ตัวเขียนเพื่อเขียนข้อมูลตามคีย์เอาต์พุต ตัวอย่างเช่น tfma.evaluators.Evaluation
อาจมีคีย์สำหรับ metrics
และพ plots
ต สิ่งเหล่านี้จะเชื่อมโยงกับเมตริกและพจนานุกรมแปลงที่เรียกว่า 'เมตริก' และ 'พล็อต' ผู้เขียนระบุวิธีการเขียนแต่ละไฟล์:
# A writer is a PTransform that takes evaluation output as input and
# serializes the associated PCollections of data to a sink.
Writer = NamedTuple('Writer', [
('stage_name', Text),
('ptransform', beam.PTransform)]) # Evaluation -> PDone
MetricsAndPlotsWriter
เราจัดเตรียม tfma.writers.MetricsAndPlotsWriter
ที่แปลงเมทริกและพล็อตพจนานุกรมเป็นโปรโตแบบต่อเนื่องและเขียนลงในดิสก์
หากคุณต้องการใช้รูปแบบการออกหมายเลขอื่น คุณสามารถสร้างตัวเขียนแบบกำหนดเองและใช้สิ่งนั้นแทนได้ เนื่องจาก tfma.evaluators.Evaluation
ที่ส่งไปยังผู้เขียนจะมีผลลัพธ์สำหรับตัวประเมินทั้งหมดรวมกัน การแปลงตัวช่วย tfma.writers.Write
นั้นถูกจัดเตรียมไว้ซึ่งผู้เขียนสามารถใช้ในการใช้งาน ptransform
เพื่อเลือกบีมที่เหมาะสม beam.PCollection
ตาม คีย์เอาต์พุต (ดูตัวอย่างด้านล่าง)
การปรับแต่ง
เมธอด tfma.run_model_analysis
ใช้อาร์กิวเมนต์ extractors
, evaluators
และ writers
เพื่อปรับแต่งตัวแยก, ตัวประเมิน และตัวเขียนที่ใช้โดยไพพ์ไลน์ หากไม่มีการระบุอาร์กิวเมนต์ tfma.default_extractors
, tfma.default_evaluators
และ tfma.default_writers
จะถูกใช้เป็นค่าดีฟอลต์
ตัวแยกแบบกำหนดเอง
ในการสร้างตัวแยกข้อมูลที่กำหนดเอง ให้สร้างประเภท tfma.extractors.Extractor
ที่ล้อม beam.PTransform
โดยใช้ tfma.Extracts
เป็นอินพุตและส่งคืน tfma.Extracts
เป็นเอาต์พุต ตัวอย่างของตัวแยกมีอยู่ tfma.extractors
ผู้ประเมินแบบกำหนดเอง
ในการสร้างตัวประเมินแบบกำหนดเอง ให้สร้างประเภท tfma.evaluators.Evaluator
ที่ล้อม beam.PTransform
โดยใช้ tfma.Extracts
เป็นอินพุตและส่งกลับ tfma.evaluators.Evaluation
เป็นเอาต์พุต ผู้ประเมินขั้นพื้นฐานอาจใช้ tfma.Extracts
ที่เข้ามาและส่งออกเพื่อจัดเก็บไว้ในตาราง นี่คือสิ่งที่ tfma.evaluators.AnalysisTableEvaluator
ทำ ผู้ประเมินที่ซับซ้อนมากขึ้นอาจดำเนินการประมวลผลเพิ่มเติมและรวบรวมข้อมูล ดู tfma.evaluators.MetricsAndPlotsEvaluator
เป็นตัวอย่าง
โปรดทราบว่า tfma.evaluators.MetricsAndPlotsEvaluator
นั้นสามารถปรับแต่งให้รองรับตัววัดแบบกำหนดเองได้ (ดูรายละเอียดเพิ่มเติมที่ ตัววัด )
นักเขียนที่กำหนดเอง
ในการสร้างผู้เขียนแบบกำหนดเอง ให้สร้างประเภท tfma.writers.Writer
ที่ล้อม beam.PTransform
โดยใช้ tfma.evaluators.Evaluation
เป็นอินพุต และส่งคืน beam.pvalue.PDone
เป็นเอาต์พุต ต่อไปนี้คือตัวอย่างพื้นฐานของผู้เขียนสำหรับการเขียน TFRecords ที่มีเมตริก:
tfma.writers.Writer(
stage_name='WriteTFRecord(%s)' % tfma.METRICS_KEY,
ptransform=tfma.writers.Write(
key=tfma.METRICS_KEY,
ptransform=beam.io.WriteToTFRecord(file_path_prefix=output_file))
อินพุตของผู้เขียนขึ้นอยู่กับผลลัพธ์ของผู้ประเมินที่เกี่ยวข้อง สำหรับตัวอย่างข้างต้น เอาต์พุตเป็นโปรโตต่อเนื่องที่สร้างโดย tfma.evaluators.MetricsAndPlotsEvaluator
ผู้เขียนสำหรับ tfma.evaluators.AnalysisTableEvaluator
จะรับผิดชอบในการเขียน beam.pvalue.PCollection
ของ tfma.Extracts
โปรดทราบว่าผู้เขียนเชื่อมโยงกับผลลัพธ์ของตัวประเมินผ่านคีย์เอาต์พุตที่ใช้ (เช่น tfma.METRICS_KEY
, tfma.ANALYSIS_KEY
เป็นต้น)
ตัวอย่างทีละขั้นตอน
ต่อไปนี้คือตัวอย่างของขั้นตอนที่เกี่ยวข้องในไปป์ไลน์การแยกและการประเมินเมื่อใช้ทั้ง tfma.evaluators.MetricsAndPlotsEvaluator
และ tfma.evaluators.AnalysisTableEvaluator
:
run_model_analysis(
...
extractors=[
tfma.extractors.InputExtractor(...),
tfma.extractors.PredictExtractor(...),
tfma.extractors.SliceKeyExtrator(...)
],
evaluators=[
tfma.evaluators.MetricsAndPlotsEvaluator(...),
tfma.evaluators.AnalysisTableEvaluator(...)
])
ReadInputs
# Out
Extracts {
'input': bytes # CSV, Proto, ...
}
ExtractAndEvaluate
# In: ReadInputs Extracts
# Out:
Extracts {
'input': bytes # CSV, Proto, ...
'features': tensor_like # Raw features
'labels': tensor_like # Labels
'example_weights': tensor_like # Example weights
}
# In: InputExtractor Extracts
# Out:
Extracts {
'input': bytes # CSV, Proto, ...
'features': tensor_like # Raw features
'labels': tensor_like # Labels
'example_weights': tensor_like # Example weights
'predictions': tensor_like # Predictions
}
# In: PredictExtractor Extracts
# Out:
Extracts {
'features': tensor_like # Raw features
'labels': tensor_like # Labels
'example_weights': tensor_like # Example weights
'predictions': tensor_like # Predictions
'slice_key': Tuple[bytes...] # Slice
}
-
tfma.evaluators.MetricsAndPlotsEvaluator
(run_after:SLICE_KEY_EXTRACTOR_STAGE_NAME
)
# In: SliceKeyExtractor Extracts
# Out:
Evaluation {
'metrics': PCollection[Tuple[slicer.SliceKeyType, Dict[Text, Any]]] # Tuples of (slice key, dictionary from metric key to metric values)
'plots': PCollection[Tuple[slicer.SliceKeyType, Dict[Text, Any]]] # Tuples of (slice key, dictionary from plot key to plot values)
}
-
tfma.evaluators.AnalysisTableEvaluator
(run_after:LAST_EXTRACTOR_STAGE_NAME
)
# In: SliceKeyExtractor Extracts
# Out:
Evaluation {
'analysis': PCollection[Extracts] # Final Extracts
}
WriteResults
# In:
Evaluation {
'metrics': PCollection[Tuple[slicer.SliceKeyType, Dict[Text, Any]]] # Tuples of (slice key, dictionary from metric key to metric values)
'plots': PCollection[Tuple[slicer.SliceKeyType, Dict[Text, Any]]] # Tuples of (slice key, dictionary from plot key to plot values)
'analysis': PCollection[Extracts] # Final Extracts
}
# Out: metrics, plots, and analysis files