คอมโพเนนต์ ExampleGen TFX Pipeline นำเข้าข้อมูลไปยังไปป์ไลน์ TFX มันใช้ไฟล์/บริการภายนอกเพื่อสร้างตัวอย่างซึ่งจะถูกอ่านโดยส่วนประกอบ TFX อื่นๆ นอกจากนี้ยังจัดเตรียมพาร์ติชันที่สอดคล้องกันและกำหนดค่าได้ และสับเปลี่ยนชุดข้อมูลสำหรับแนวทางปฏิบัติที่ดีที่สุดของ ML
- การบริโภค: ข้อมูลจากแหล่งข้อมูลภายนอก เช่น CSV,
TFRecord
, Avro, Parquet และ BigQuery - การปล่อย: ระเบียน
tf.Example
, ระเบียนtf.SequenceExample
หรือรูปแบบโปรโต ขึ้นอยู่กับรูปแบบเพย์โหลด
ExampleGen และส่วนประกอบอื่นๆ
ExampleGen ให้ข้อมูลแก่ส่วนประกอบที่ใช้ ไลบรารี TensorFlow Data Validation เช่น SchemaGen , StatisticsGen และ Example Validator นอกจากนี้ยังให้ข้อมูลกับ Transform ซึ่งใช้ประโยชน์จาก ไลบรารี TensorFlow Transform และท้ายที่สุดเพื่อปรับใช้เป้าหมายในระหว่างการอนุมาน
แหล่งข้อมูลและรูปแบบ
ปัจจุบันการติดตั้งมาตรฐานของ TFX มีส่วนประกอบ ExampleGen เต็มรูปแบบสำหรับแหล่งข้อมูลและรูปแบบเหล่านี้:
นอกจากนี้ยังมีตัวดำเนินการแบบกำหนดเองซึ่งช่วยให้สามารถพัฒนาส่วนประกอบ ExampleGen สำหรับแหล่งข้อมูลและรูปแบบเหล่านี้ได้:
ดูตัวอย่างการใช้งานในซอร์สโค้ดและ การสนทนานี้ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีใช้และพัฒนาตัวดำเนินการที่กำหนดเอง
นอกจากนี้ แหล่งข้อมูลและรูปแบบเหล่านี้ยังพร้อมใช้งานเป็นตัวอย่าง ส่วนประกอบที่กำหนดเอง :
การนำเข้ารูปแบบข้อมูลที่รองรับโดย Apache Beam
Apache Beam รองรับการนำเข้าข้อมูลจาก แหล่งข้อมูลและรูปแบบ ที่หลากหลาย ( ดูด้านล่าง ) ความสามารถเหล่านี้สามารถใช้เพื่อสร้างส่วนประกอบ ExampleGen ที่กำหนดเองสำหรับ TFX ซึ่งแสดงให้เห็นโดยส่วนประกอบ ExampleGen ที่มีอยู่ ( ดูด้านล่าง )
วิธีใช้ส่วนประกอบ ExampleGen
สำหรับแหล่งข้อมูลที่รองรับ (ปัจจุบันคือไฟล์ CSV, ไฟล์ TFRecord ที่มี tf.Example
, tf.SequenceExample
และรูปแบบโปรโต และผลลัพธ์ของการสืบค้น BigQuery) คอมโพเนนต์ไปป์ไลน์ ExampleGen สามารถใช้ได้โดยตรงในการปรับใช้และต้องการการปรับแต่งเพียงเล็กน้อย ตัวอย่างเช่น:
example_gen = CsvExampleGen(input_base='data_root')
หรือเช่นด้านล่างสำหรับการนำเข้า TFRecord ภายนอกด้วย tf.Example
โดยตรง:
example_gen = ImportExampleGen(input_base=path_to_tfrecord_dir)
สแปน เวอร์ชัน และสปลิต
Span คือกลุ่มตัวอย่างการฝึกอบรม หากข้อมูลของคุณยังคงอยู่ในระบบไฟล์ Span แต่ละรายการอาจถูกจัดเก็บไว้ในไดเร็กทอรีแยกต่างหาก ความหมายของ Span ไม่ได้ถูกฮาร์ดโค้ดลงใน TFX; Span อาจสอดคล้องกับวันที่ของข้อมูล ชั่วโมงของข้อมูล หรือการจัดกลุ่มอื่นๆ ที่มีความหมายต่องานของคุณ
แต่ละช่วงสามารถเก็บข้อมูลได้หลายเวอร์ชัน ตัวอย่างเช่น หากคุณลบตัวอย่างบางส่วนออกจาก Span เพื่อล้างข้อมูลคุณภาพต่ำ การทำเช่นนี้อาจส่งผลให้ Span เวอร์ชันใหม่ ตามค่าเริ่มต้น ส่วนประกอบ TFX จะทำงานบนเวอร์ชันล่าสุดภายในช่วง
แต่ละเวอร์ชันภายใน Span สามารถแบ่งย่อยออกเป็นหลาย Split เพิ่มเติมได้ กรณีใช้งานทั่วไปสำหรับการแยก Span คือการแบ่งออกเป็นข้อมูลการฝึกและการประเมิน
แยกอินพุต/เอาต์พุตที่กำหนดเอง
ในการปรับแต่งอัตราส่วนการแยก Train/eval ที่ ExampleGen จะส่งออก ให้ตั้งค่า output_config
สำหรับส่วนประกอบ ExampleGen ตัวอย่างเช่น:
# Input has a single split 'input_dir/*'.
# Output 2 splits: train:eval=3:1.
output = proto.Output(
split_config=example_gen_pb2.SplitConfig(splits=[
proto.SplitConfig.Split(name='train', hash_buckets=3),
proto.SplitConfig.Split(name='eval', hash_buckets=1)
]))
example_gen = CsvExampleGen(input_base=input_dir, output_config=output)
สังเกตว่า hash_buckets
ถูกตั้งค่าในตัวอย่างนี้อย่างไร
สำหรับแหล่งอินพุตที่ถูกแยกออกแล้ว ให้ตั้งค่า input_config
สำหรับองค์ประกอบ ExampleGen:
# Input train split is 'input_dir/train/*', eval split is 'input_dir/eval/*'.
# Output splits are generated one-to-one mapping from input splits.
input = proto.Input(splits=[
example_gen_pb2.Input.Split(name='train', pattern='train/*'),
example_gen_pb2.Input.Split(name='eval', pattern='eval/*')
])
example_gen = CsvExampleGen(input_base=input_dir, input_config=input)
สำหรับไฟล์ตัวอย่าง gen (เช่น CsvExampleGen และ ImportExampleGen) pattern
คือรูปแบบไฟล์สัมพันธ์ glob ที่แมปกับไฟล์อินพุตที่มีไดเร็กทอรีรูทที่กำหนดโดยพาธฐานอินพุต สำหรับ gen ตัวอย่างที่อิงจากการสืบค้น (เช่น BigQueryExampleGen, PrestoExampleGen) pattern
คือแบบสอบถาม SQL
โดยค่าเริ่มต้น dir ฐานอินพุตทั้งหมดจะถือเป็นการแยกอินพุตเดี่ยว และการแยกเอาต์พุตของ train และ eval จะถูกสร้างขึ้นด้วยอัตราส่วน 2:1
โปรดดู proto/example_gen.proto สำหรับการกำหนดค่าการแยกอินพุตและเอาต์พุตของ ExampleGen และอ้างอิงถึง คู่มือส่วนประกอบดาวน์สตรี มสำหรับการใช้ดาวน์สตรีมแยกแบบกำหนดเอง
วิธีการแยก
เมื่อใช้วิธีการแยก hash_buckets
แทนที่จะใช้ทั้งเร็กคอร์ด เราสามารถใช้คุณลักษณะสำหรับการแบ่งพาร์ติชันตัวอย่างได้ หากมีฟีเจอร์นั้น ExampleGen จะใช้ลายนิ้วมือของฟีเจอร์นั้นเป็นคีย์พาร์ติชั่น
คุณลักษณะนี้สามารถใช้เพื่อรักษาเสถียรภาพของการแยกที่เสถียรโดยคุณสมบัติบางอย่างของตัวอย่าง: ตัวอย่างเช่น ผู้ใช้จะถูกใส่ในการแบ่งเดียวกันเสมอ ถ้า "user_id" ถูกเลือกเป็นชื่อคุณลักษณะของพาร์ติชัน
การตีความความหมายของ "คุณลักษณะ" และวิธีจับคู่ "คุณลักษณะ" กับชื่อที่ระบุนั้นขึ้นอยู่กับการใช้งาน ExampleGen และประเภทของตัวอย่าง
สำหรับการใช้งาน ExampleGen สำเร็จรูป:
- หากสร้าง tf.Example แสดงว่า "คุณลักษณะ" หมายถึงรายการใน tf.Example.features.feature
- หากสร้าง tf.SequenceExample แสดงว่า "คุณลักษณะ" หมายถึงรายการใน tf.SequenceExample.context.feature
- รองรับเฉพาะฟีเจอร์ int64 และไบต์เท่านั้น
ในกรณีต่อไปนี้ ExampleGen แสดงข้อผิดพลาดรันไทม์:
- ไม่มีชื่อคุณสมบัติที่ระบุในตัวอย่าง
- คุณลักษณะว่าง:
tf.train.Feature()
- ประเภทคุณลักษณะที่ไม่รองรับ เช่น คุณลักษณะแบบลอย
ในการเอาท์พุตการแยก train/eval ตามคุณลักษณะในตัวอย่าง ให้ตั้งค่า output_config
สำหรับส่วนประกอบ ExampleGen ตัวอย่างเช่น:
# Input has a single split 'input_dir/*'.
# Output 2 splits based on 'user_id' features: train:eval=3:1.
output = proto.Output(
split_config=proto.SplitConfig(splits=[
proto.SplitConfig.Split(name='train', hash_buckets=3),
proto.SplitConfig.Split(name='eval', hash_buckets=1)
],
partition_feature_name='user_id'))
example_gen = CsvExampleGen(input_base=input_dir, output_config=output)
สังเกตว่า partition_feature_name
ถูกตั้งค่าในตัวอย่างนี้อย่างไร
สแปน
สามารถดึงสแปนได้โดยใช้ข้อมูลจำเพาะ '{SPAN}' ใน รูปแบบอินพุต glob :
- ข้อมูลจำเพาะนี้ตรงกับตัวเลขและจับคู่ข้อมูลลงในหมายเลข SPAN ที่เกี่ยวข้อง ตัวอย่างเช่น 'data_{SPAN}-*.tfrecord' จะรวบรวมไฟล์เช่น 'data_12-a.tfrecord', 'date_12-b.tfrecord'
- หรือระบุข้อมูลจำเพาะนี้ด้วยความกว้างของจำนวนเต็มเมื่อจับคู่ ตัวอย่างเช่น 'data_{SPAN:2}.file' จะจับคู่กับไฟล์เช่น 'data_02.file' และ 'data_27.file' (เป็นอินพุตสำหรับ Span-2 และ Span-27 ตามลำดับ) แต่จะไม่จับคู่กับ 'data_1 ไฟล์' หรือ 'data_123.file'
- เมื่อไม่มีข้อมูลจำเพาะ SPAN จะถือว่าเป็นช่วง '0' เสมอ
- หากระบุ SPAN ไปป์ไลน์จะประมวลผลช่วงล่าสุด และจัดเก็บหมายเลขช่วงในข้อมูลเมตา
ตัวอย่างเช่น สมมติว่ามีข้อมูลเข้า:
- '/tmp/span-1/train/data'
- '/tmp/span-1/eval/data'
- '/tmp/span-2/train/data'
- '/tmp/span-2/eval/data'
และการกำหนดค่าอินพุตจะแสดงดังนี้:
splits {
name: 'train'
pattern: 'span-{SPAN}/train/*'
}
splits {
name: 'eval'
pattern: 'span-{SPAN}/eval/*'
}
เมื่อเรียกใช้ไปป์ไลน์ มันจะประมวลผล:
- '/tmp/span-2/train/data' เป็นการแยกรถไฟ
- '/tmp/span-2/eval/data' เป็น eval split
โดยมีหมายเลขช่วงเป็น '2' หากภายหลังใน '/tmp/span-3/...' พร้อมแล้ว เพียงทริกเกอร์ไปป์ไลน์อีกครั้งและจะรับช่วง '3' สำหรับการประมวลผล ด้านล่างแสดงตัวอย่างโค้ดสำหรับการใช้ span spec:
input = proto.Input(splits=[
proto.Input.Split(name='train',
pattern='span-{SPAN}/train/*'),
proto.Input.Split(name='eval',
pattern='span-{SPAN}/eval/*')
])
example_gen = CsvExampleGen(input_base='/tmp', input_config=input)
การดึงช่วงบางช่วงสามารถทำได้ด้วย RangeConfig ซึ่งมีรายละเอียดด้านล่าง
วันที่
หากแหล่งข้อมูลของคุณถูกจัดระเบียบบนระบบไฟล์ตามวันที่ TFX จะสนับสนุนการแมปวันที่โดยตรงกับตัวเลข มีข้อกำหนดสามประการในการแสดงการจับคู่จากวันที่จนถึงช่วง: {YYYY}, {MM} และ {DD}:
- ข้อมูลจำเพาะทั้งสามควรปรากฏอยู่ใน รูปแบบอินพุต glob ทั้งหมด หากมีการระบุไว้:
- สามารถระบุข้อมูลจำเพาะ {SPAN} หรือข้อมูลจำเพาะชุดวันที่นี้โดยเฉพาะได้
- วันที่ในปฏิทินที่มีปีจาก YYYY เดือนจาก MM และวันของเดือนจาก DD จะถูกคำนวณ จากนั้นจำนวนช่วงจะถูกคำนวณเป็นจำนวนวันตั้งแต่ยุค unix (เช่น 1970-01-01) ตัวอย่างเช่น 'log-{YYYY}{MM}{DD}.data' จะจับคู่กับไฟล์ 'log-19700101.data' และใช้เป็นอินพุตสำหรับ Span-0 และ 'log-20170101.data' เป็นอินพุตสำหรับ สแปน-17167.
- หากมีการระบุชุดข้อกำหนดวันที่นี้ ไปป์ไลน์จะประมวลผลวันที่ล่าสุด และจัดเก็บหมายเลขช่วงที่สอดคล้องกันในข้อมูลเมตา
ตัวอย่างเช่น สมมติว่ามีการป้อนข้อมูลที่จัดตามวันที่ในปฏิทิน:
- '/tmp/1970-01-02/รถไฟ/ข้อมูล'
- '/tmp/1970-01-02/eval/data'
- '/tmp/1970-01-03/train/data'
- '/tmp/1970-01-03/eval/data'
และการกำหนดค่าอินพุตจะแสดงดังนี้:
splits {
name: 'train'
pattern: '{YYYY}-{MM}-{DD}/train/*'
}
splits {
name: 'eval'
pattern: '{YYYY}-{MM}-{DD}/eval/*'
}
เมื่อเรียกใช้ไปป์ไลน์ มันจะประมวลผล:
- '/tmp/1970-01-03/train/data' เป็นการแยกรถไฟ
- '/tmp/1970-01-03/eval/data' เป็น eval split
โดยมีหมายเลขช่วงเป็น '2' หากภายหลังใน '/tmp/1970-01-04/...' พร้อมแล้ว เพียงทริกเกอร์ไปป์ไลน์อีกครั้งและจะรับช่วง '3' สำหรับการประมวลผล ด้านล่างแสดงตัวอย่างโค้ดสำหรับการใช้ข้อมูลจำเพาะวันที่:
input = proto.Input(splits=[
proto.Input.Split(name='train',
pattern='{YYYY}-{MM}-{DD}/train/*'),
proto.Input.Split(name='eval',
pattern='{YYYY}-{MM}-{DD}/eval/*')
])
example_gen = CsvExampleGen(input_base='/tmp', input_config=input)
เวอร์ชั่น
สามารถดึงข้อมูลเวอร์ชันได้โดยใช้ข้อมูลจำเพาะ '{VERSION}' ใน รูปแบบอินพุต glob :
- ข้อมูลจำเพาะนี้จับคู่ตัวเลขและจับคู่ข้อมูลกับหมายเลข VERSION ที่เกี่ยวข้องภายใต้ SPAN โปรดทราบว่าข้อมูลจำเพาะเวอร์ชันสามารถใช้ร่วมกับข้อกำหนดช่วงหรือวันที่ได้
- คุณยังสามารถระบุข้อมูลจำเพาะนี้ด้วยความกว้างในลักษณะเดียวกับข้อมูลจำเพาะของ SPAN เช่น 'span-{SPAN}/version-{VERSION:4}/data-*'
- เมื่อไม่มีข้อมูลจำเพาะของเวอร์ชัน เวอร์ชันจะถูกตั้งค่าเป็นไม่มี
- หากระบุทั้ง SPAN และ VERSION ไปป์ไลน์จะประมวลผลเวอร์ชันล่าสุดสำหรับช่วงล่าสุด และเก็บหมายเลขเวอร์ชันไว้ในข้อมูลเมตา
- หากระบุ VERSION แต่ไม่ใช่ SPAN (หรือข้อมูลจำเพาะวันที่) ข้อผิดพลาดจะถูกส่งออกไป
ตัวอย่างเช่น สมมติว่ามีข้อมูลเข้า:
- '/tmp/span-1/ver-1/train/data'
- '/tmp/span-1/ver-1/eval/data'
- '/tmp/span-2/ver-1/train/data'
- '/tmp/span-2/ver-1/eval/data'
- '/tmp/span-2/ver-2/train/data'
- '/tmp/span-2/ver-2/eval/data'
และการกำหนดค่าอินพุตจะแสดงดังนี้:
splits {
name: 'train'
pattern: 'span-{SPAN}/ver-{VERSION}/train/*'
}
splits {
name: 'eval'
pattern: 'span-{SPAN}/ver-{VERSION}/eval/*'
}
เมื่อเรียกใช้ไปป์ไลน์ มันจะประมวลผล:
- '/tmp/span-2/ver-2/train/data' เป็นการแยกรถไฟ
- '/tmp/span-2/ver-2/eval/data' เป็น eval split
โดยมีหมายเลขช่วงเป็น '2' และหมายเลขรุ่นเป็น '2' หากภายหลังใน '/tmp/span-2/ver-3/...' พร้อมแล้ว ให้ทริกเกอร์ไปป์ไลน์อีกครั้งและจะรับช่วง '2' และเวอร์ชัน '3' สำหรับการประมวลผล ด้านล่างแสดงตัวอย่างโค้ดสำหรับการใช้ข้อมูลจำเพาะเวอร์ชัน:
input = proto.Input(splits=[
proto.Input.Split(name='train',
pattern='span-{SPAN}/ver-{VERSION}/train/*'),
proto.Input.Split(name='eval',
pattern='span-{SPAN}/ver-{VERSION}/eval/*')
])
example_gen = CsvExampleGen(input_base='/tmp', input_config=input)
การกำหนดค่าช่วง
TFX รองรับการดึงและประมวลผลช่วงเฉพาะใน ExampleGen แบบอิงไฟล์โดยใช้การกำหนดค่าช่วง ซึ่งเป็นการกำหนดค่านามธรรมที่ใช้อธิบายช่วงสำหรับเอนทิตี TFX ต่างๆ หากต้องการดึงข้อมูลช่วงเฉพาะ ให้ตั้งค่า range_config
สำหรับส่วนประกอบ ExampleGen แบบอิงไฟล์ ตัวอย่างเช่น สมมติว่ามีข้อมูลเข้า:
- '/tmp/span-01/train/data'
- '/tmp/span-01/eval/data'
- '/tmp/span-02/train/data'
- '/tmp/span-02/eval/data'
ในการดึงและประมวลผลข้อมูลโดยเฉพาะด้วยช่วง '1' เราระบุการกำหนดค่าช่วงนอกเหนือจากการกำหนดค่าอินพุต โปรดทราบว่า ExampleGen รองรับเฉพาะช่วงคงที่ช่วงเดียว (เพื่อระบุการประมวลผลของแต่ละช่วงเฉพาะ) ดังนั้น สำหรับ StaticRange start_span_number ต้องเท่ากับ end_span_number การใช้ช่วงที่ระบุและข้อมูลความกว้างของช่วง (หากมี) สำหรับการเว้นช่องว่าง ExampleGen จะแทนที่ข้อมูลจำเพาะ SPAN ในรูปแบบการแยกที่ให้ไว้ด้วยหมายเลขช่วงที่ต้องการ ตัวอย่างการใช้งานแสดงไว้ด้านล่าง:
# In cases where files have zero-padding, the width modifier in SPAN spec is
# required so TFX can correctly substitute spec with zero-padded span number.
input = proto.Input(splits=[
proto.Input.Split(name='train',
pattern='span-{SPAN:2}/train/*'),
proto.Input.Split(name='eval',
pattern='span-{SPAN:2}/eval/*')
])
# Specify the span number to be processed here using StaticRange.
range = proto.RangeConfig(
static_range=proto.StaticRange(
start_span_number=1, end_span_number=1)
)
# After substitution, the train and eval split patterns will be
# 'input_dir/span-01/train/*' and 'input_dir/span-01/eval/*', respectively.
example_gen = CsvExampleGen(input_base=input_dir, input_config=input,
range_config=range)
นอกจากนี้ยังสามารถใช้การกำหนดค่าช่วงเพื่อประมวลผลวันที่ที่ระบุได้ หากใช้ข้อมูลจำเพาะวันที่แทนข้อมูลจำเพาะของ SPAN ตัวอย่างเช่น สมมติว่ามีการป้อนข้อมูลที่จัดตามวันที่ในปฏิทิน:
- '/tmp/1970-01-02/รถไฟ/ข้อมูล'
- '/tmp/1970-01-02/eval/data'
- '/tmp/1970-01-03/train/data'
- '/tmp/1970-01-03/eval/data'
ในการดึงและประมวลผลข้อมูลโดยเฉพาะในวันที่ 2 มกราคม 1970 เราทำดังต่อไปนี้:
from tfx.components.example_gen import utils
input = proto.Input(splits=[
proto.Input.Split(name='train',
pattern='{YYYY}-{MM}-{DD}/train/*'),
proto.Input.Split(name='eval',
pattern='{YYYY}-{MM}-{DD}/eval/*')
])
# Specify date to be converted to span number to be processed using StaticRange.
span = utils.date_to_span_number(1970, 1, 2)
range = proto.RangeConfig(
static_range=range_config_pb2.StaticRange(
start_span_number=span, end_span_number=span)
)
# After substitution, the train and eval split patterns will be
# 'input_dir/1970-01-02/train/*' and 'input_dir/1970-01-02/eval/*',
# respectively.
example_gen = CsvExampleGen(input_base=input_dir, input_config=input,
range_config=range)
ตัวอย่างที่กำหนดเองGen
หากส่วนประกอบ ExampleGen ที่มีอยู่ในปัจจุบันไม่ตรงกับความต้องการของคุณ คุณสามารถสร้าง ExampleGen ที่กำหนดเองได้ ซึ่งจะทำให้คุณสามารถอ่านจากแหล่งข้อมูลต่างๆ หรือในรูปแบบข้อมูลที่แตกต่างกันได้
ตัวอย่างตามไฟล์การปรับแต่ง Gen (ทดลอง)
ขั้นแรก ขยาย BaseExampleGenExecutor ด้วย Beam PTransform แบบกำหนดเอง ซึ่งให้การแปลงจากการแยกอินพุต Train/eval ไปเป็นตัวอย่าง TF ตัวอย่างเช่น ตัวดำเนินการ CsvExampleGen ให้การแปลงจากอินพุต CSV แยกเป็นตัวอย่าง TF
จากนั้น สร้างส่วนประกอบด้วยตัวดำเนินการด้านบน เช่นเดียวกับที่ทำใน CsvExampleGen component อีกวิธีหนึ่งคือส่งตัวดำเนินการที่กำหนดเองไปยังองค์ประกอบ ExampleGen มาตรฐานดังที่แสดงด้านล่าง
from tfx.components.base import executor_spec
from tfx.components.example_gen.csv_example_gen import executor
example_gen = FileBasedExampleGen(
input_base=os.path.join(base_dir, 'data/simple'),
custom_executor_spec=executor_spec.ExecutorClassSpec(executor.Executor))
ตอนนี้ เรายังสนับสนุนการอ่านไฟล์ Avro และ Parquet โดยใช้ วิธี นี้
รูปแบบข้อมูลเพิ่มเติม
Apache Beam รองรับการอ่าน รูปแบบข้อมูลเพิ่มเติม จำนวนมาก ผ่านการแปลงบีม I/O คุณสามารถสร้างส่วนประกอบ ExampleGen แบบกำหนดเองได้โดยการใช้ประโยชน์จาก Beam I/O Transforms โดยใช้รูปแบบที่คล้ายกับ ตัวอย่าง Avro
return (pipeline
| 'ReadFromAvro' >> beam.io.ReadFromAvro(avro_pattern)
| 'ToTFExample' >> beam.Map(utils.dict_to_example))
ในขณะที่เขียนรูปแบบและแหล่งข้อมูลที่รองรับในปัจจุบันสำหรับ Beam Python SDK ได้แก่ :
- อเมซอน S3
- Apache Avro
- Apache Hadoop
- Apache Kafka
- Apache Parquet
- Google Cloud BigQuery
- Google Cloud BigTable
- Google Cloud Datastore
- Google Cloud Pub/Sub
- Google Cloud Storage (GCS)
- MongoDB
ตรวจสอบ เอกสาร Beam สำหรับรายการล่าสุด
การปรับแต่งตัวอย่างตามคำค้นหา การปรับแต่ง Gen (ทดลอง)
ขั้นแรก ขยาย BaseExampleGenExecutor ด้วย Beam PTransform แบบกำหนดเอง ซึ่งอ่านจากแหล่งข้อมูลภายนอก จากนั้น สร้างส่วนประกอบอย่างง่ายโดยขยาย QueryBasedExampleGen
ซึ่งอาจหรือไม่ต้องการการกำหนดค่าการเชื่อมต่อเพิ่มเติม ตัวอย่างเช่น โปรแกรมดำเนินการ BigQuery อ่านโดยใช้ตัวเชื่อมต่อ beam.io เริ่มต้น ซึ่งสรุปรายละเอียดการกำหนดค่าการเชื่อมต่อ Presto executor ต้องการ Beam PTransform แบบกำหนดเองและการ กำหนดค่าการเชื่อมต่อแบบกำหนดเอง protobuf เป็นอินพุต
หากจำเป็นต้องมีการกำหนดค่าการเชื่อมต่อสำหรับส่วนประกอบ ExampleGen ที่กำหนดเอง ให้สร้าง protobuf ใหม่และส่งต่อผ่าน custom_config ซึ่งขณะนี้เป็นพารามิเตอร์การดำเนินการทางเลือก ด้านล่างนี้คือตัวอย่างวิธีการใช้ส่วนประกอบที่กำหนดค่าไว้
from tfx.examples.custom_components.presto_example_gen.proto import presto_config_pb2
from tfx.examples.custom_components.presto_example_gen.presto_component.component import PrestoExampleGen
presto_config = presto_config_pb2.PrestoConnConfig(host='localhost', port=8080)
example_gen = PrestoExampleGen(presto_config, query='SELECT * FROM chicago_taxi_trips')
ส่วนประกอบดาวน์สตรีม ExampleGen
รองรับการกำหนดค่าแยกแบบกำหนดเองสำหรับส่วนประกอบดาวน์สตรีม
สถิติGen
พฤติกรรมเริ่มต้นคือการสร้างสถิติสำหรับการแยกทั้งหมด
หากต้องการยกเว้นการแยกใดๆ ให้ตั้งค่า exclude_splits
สำหรับ StatisticsGen ตัวอย่างเช่น:
# Exclude the 'eval' split.
statistics_gen = StatisticsGen(
examples=example_gen.outputs['examples'],
exclude_splits=['eval'])
สคีมาGen
พฤติกรรมเริ่มต้นคือการสร้างสคีมาตามการแยกทั้งหมด
หากต้องการยกเว้นการแยกใดๆ ให้ตั้งค่า exclude_splits
สำหรับองค์ประกอบ SchemaGen ตัวอย่างเช่น:
# Exclude the 'eval' split.
schema_gen = SchemaGen(
statistics=statistics_gen.outputs['statistics'],
exclude_splits=['eval'])
ตัวอย่างValidator
พฤติกรรมเริ่มต้นคือการตรวจสอบสถิติของการแยกทั้งหมดในตัวอย่างอินพุตกับสคีมา
หากต้องการยกเว้นการแยกใดๆ ให้ตั้งค่า exclude_splits
สำหรับองค์ประกอบ ExampleValidator ตัวอย่างเช่น:
# Exclude the 'eval' split.
example_validator = ExampleValidator(
statistics=statistics_gen.outputs['statistics'],
schema=schema_gen.outputs['schema'],
exclude_splits=['eval'])
แปลง
พฤติกรรมเริ่มต้นคือการวิเคราะห์และสร้างข้อมูลเมตาจากการแยก 'ฝึก' และแปลงการแยกทั้งหมด
ในการระบุการแยกวิเคราะห์และการแยกการแปลง ให้ตั้งค่า splits_config
สำหรับองค์ประกอบการแปลง ตัวอย่างเช่น:
# Analyze the 'train' split and transform all splits.
transform = Transform(
examples=example_gen.outputs['examples'],
schema=schema_gen.outputs['schema'],
module_file=_taxi_module_file,
splits_config=proto.SplitsConfig(analyze=['train'],
transform=['train', 'eval']))
เทรนเนอร์และจูนเนอร์
พฤติกรรมเริ่มต้นคือการฝึกบนการแยก 'การฝึก' และประเมินผลในการแบ่ง 'eval'
ในการระบุการแยกรถไฟและประเมินการแยก ให้ตั้งค่า train_args
และ eval_args
สำหรับองค์ประกอบ Trainer ตัวอย่างเช่น:
# Train on the 'train' split and evaluate on the 'eval' split.
Trainer = Trainer(
module_file=_taxi_module_file,
examples=transform.outputs['transformed_examples'],
schema=schema_gen.outputs['schema'],
transform_graph=transform.outputs['transform_graph'],
train_args=proto.TrainArgs(splits=['train'], num_steps=10000),
eval_args=proto.EvalArgs(splits=['eval'], num_steps=5000))
ผู้ประเมิน
พฤติกรรมเริ่มต้นคือการจัดเตรียมเมตริกที่คำนวณจากการแบ่ง 'eval'
ในการคำนวณสถิติการประเมินบนการแบ่งแบบกำหนดเอง ให้ตั้งค่า example_splits
สำหรับองค์ประกอบ Evaluator ตัวอย่างเช่น:
# Compute metrics on the 'eval1' split and the 'eval2' split.
evaluator = Evaluator(
examples=example_gen.outputs['examples'],
model=trainer.outputs['model'],
example_splits=['eval1', 'eval2'])
รายละเอียดเพิ่มเติมมีอยู่ในการ อ้างอิง CsvExampleGen API การ ใช้งาน FileBasedExampleGen API และ การอ้างอิง ImportExampleGen API