คอมโพเนนต์ไปป์ไลน์ ExampleGen TFX

จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ

คอมโพเนนต์ 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