สถาปัตยกรรมการวิเคราะห์แบบจำลองเทนเซอร์โฟลว์

ภาพรวม

ไปป์ไลน์ TensorFlow Model Analysis (TFMA) มีรายละเอียดดังนี้:

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
}
# 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)
}
# 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