คำถามเกี่ยวกับ TFX? เข้าร่วมกับเราที่ Google I / O!
หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

ส่วนประกอบท่อส่ง TFX ของ ExampleGen

ส่วนประกอบ ExampleGen TFX Pipeline นำเข้าข้อมูลไปยังท่อ TFX ใช้ไฟล์ / บริการภายนอกเพื่อสร้างตัวอย่างซึ่งจะถูกอ่านโดยคอมโพเนนต์ TFX อื่น ๆ นอกจากนี้ยังมีพาร์ติชันที่สอดคล้องและกำหนดค่าได้และสลับชุดข้อมูลสำหรับแนวทางปฏิบัติที่ดีที่สุดของ ML

  • การบริโภค: ข้อมูลจากแหล่งข้อมูลภายนอกเช่น CSV, TFRecord , Avro, Parquet และ BigQuery
  • tf.Example : tf.Example records, tf.SequenceExample records หรือรูปแบบโปรโตขึ้นอยู่กับรูปแบบ payload

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 โดยตรงในการปรับใช้และต้องการการปรับแต่งเพียงเล็กน้อย ตัวอย่างเช่น:

from tfx.utils.dsl_utils import csv_input
from tfx.components.example_gen.csv_example_gen.component import CsvExampleGen

examples = csv_input(os.path.join(base_dir, 'data/simple'))
example_gen = CsvExampleGen(input=examples)

หรือชอบด้านล่างสำหรับการนำเข้า TFRecord ภายนอกด้วย tf.Example โดยตรง:

from tfx.components.example_gen.import_example_gen.component import ImportExampleGen

example_gen = ImportExampleGen(input_base=path_to_tfrecord_dir)

Span เวอร์ชันและ Split

Span คือการจัดกลุ่มตัวอย่างการฝึกอบรม หากข้อมูลของคุณยังคงอยู่ในระบบไฟล์แต่ละ Span อาจถูกเก็บไว้ในไดเร็กทอรีแยกต่างหาก ความหมายของ Span ไม่ได้ถูกเข้ารหัสลงใน TFX Span อาจสอดคล้องกับวันข้อมูลหนึ่งชั่วโมงของข้อมูลหรือการจัดกลุ่มอื่น ๆ ที่มีความหมายต่องานของคุณ

แต่ละช่วงสามารถเก็บข้อมูลได้หลายเวอร์ชัน เพื่อให้เป็นตัวอย่างหากคุณลบตัวอย่างบางส่วนออกจาก Span เพื่อล้างข้อมูลที่มีคุณภาพต่ำอาจทำให้เกิดเวอร์ชันใหม่ของ Span นั้น โดยค่าเริ่มต้นส่วนประกอบ TFX จะทำงานบนเวอร์ชันล่าสุดภายใน Span

แต่ละเวอร์ชันภายใน Span สามารถแบ่งย่อยออกเป็นหลาย Splits ได้อีก กรณีการใช้งานที่พบบ่อยที่สุดสำหรับการแบ่ง Span คือการแบ่งออกเป็นข้อมูลการฝึกอบรมและการประเมิน

ช่วงและแยก

แยกอินพุต / เอาต์พุตที่กำหนดเอง

ในการปรับแต่งอัตราส่วนการแยก train / eval ซึ่ง ExampleGen จะส่งออกให้ตั้งค่า output_config สำหรับส่วนประกอบ ExampleGen ตัวอย่างเช่น:

from  tfx.proto import example_gen_pb2

# Input has a single split 'input_dir/*'.
# Output 2 splits: train:eval=3:1.
output = example_gen_pb2.Output(
             split_config=example_gen_pb2.SplitConfig(splits=[
                 example_gen_pb2.SplitConfig.Split(name='train', hash_buckets=3),
                 example_gen_pb2.SplitConfig.Split(name='eval', hash_buckets=1)
             ]))
examples = csv_input(input_dir)
example_gen = CsvExampleGen(input=examples, output_config=output)

สังเกตว่า hash_buckets ถูกตั้งค่าอย่างไรในตัวอย่างนี้

สำหรับแหล่งอินพุตที่ถูกแบ่งไปแล้วให้ตั้งค่า input_config สำหรับคอมโพเนนต์ ExampleGen:

from  tfx.proto import example_gen_pb2

# 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 = example_gen_pb2.Input(splits=[
                example_gen_pb2.Input.Split(name='train', pattern='train/*'),
                example_gen_pb2.Input.Split(name='eval', pattern='eval/*')
            ])
examples = csv_input(input_dir)
example_gen = CsvExampleGen(input=examples, input_config=input)

สำหรับไฟล์ตาม gen ตัวอย่าง (เช่น CsvExampleGen และ ImportExampleGen) pattern คือรูปแบบไฟล์สัมพัทธ์ของ glob ที่แมปกับไฟล์อินพุตที่มีไดเร็กทอรีรูทที่กำหนดโดยพา ธ ฐานอินพุต สำหรับ gen ตัวอย่างที่ใช้แบบสอบถาม (เช่น BigQueryExampleGen, PrestoExampleGen) pattern คือแบบสอบถาม SQL

ตามค่าเริ่มต้น dir ฐานอินพุตทั้งหมดจะถือว่าเป็นการแยกอินพุตเดี่ยวและการแยกการฝึกและการประเมินเอาต์พุตจะถูกสร้างขึ้นด้วยอัตราส่วน 2: 1

โปรดดูที่ proto / example_gen.proto สำหรับการกำหนดค่าการแยกอินพุตและเอาต์พุตของ ExampleGen และดู คู่มือส่วนประกอบดาวน์สตรีม สำหรับการใช้ดาวน์สตรีมแยกแบบกำหนดเอง

วิธีการแยก

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

คุณลักษณะนี้สามารถใช้เพื่อรักษาคุณสมบัติการแยกที่มีความเสถียร wrt คุณสมบัติบางอย่างของตัวอย่างเช่นผู้ใช้จะถูกใส่ไว้ในการแยกเดียวกันเสมอหากเลือก "user_id" เป็นชื่อคุณลักษณะของพาร์ติชัน

การตีความว่า "คุณลักษณะ" หมายถึงอะไรและการจับคู่ "คุณลักษณะ" กับชื่อที่ระบุนั้นขึ้นอยู่กับการใช้งาน ExampleGen และประเภทของตัวอย่าง

สำหรับการใช้งาน ExampleGen สำเร็จรูป:

  • หากสร้าง tf.Example ดังนั้น "feature" จะหมายถึงรายการใน tf.Example.features.feature
  • หากสร้าง tf.SequenceExample ดังนั้น "feature" จะหมายถึงรายการใน tf.SequenceExample.context.feature
  • รองรับฟีเจอร์ int64 และ bytes เท่านั้น

ในกรณีต่อไปนี้ ExampleGen แสดงข้อผิดพลาดรันไทม์:

  • ชื่อคุณลักษณะที่ระบุไม่มีอยู่ในตัวอย่าง
  • คุณลักษณะที่ว่างเปล่า: tf.train.Feature()
  • ประเภทคุณสมบัติที่ไม่รองรับเช่นคุณสมบัติลอย

ในการส่งออกการแยก train / eval ตามคุณลักษณะในตัวอย่างให้ตั้งค่า output_config สำหรับองค์ประกอบ ExampleGen ตัวอย่างเช่น:

from  tfx.proto import example_gen_pb2

# Input has a single split 'input_dir/*'.
# Output 2 splits based on 'user_id' features: train:eval=3:1.
output = example_gen_pb2.Output(
             split_config=example_gen_pb2.SplitConfig(splits=[
                 example_gen_pb2.SplitConfig.Split(name='train', hash_buckets=3),
                 example_gen_pb2.SplitConfig.Split(name='eval', hash_buckets=1)
             ],
             partition_feature_name='user_id'))
examples = csv_input(input_dir)
example_gen = CsvExampleGen(input=examples, output_config=output)

สังเกตว่า partition_feature_name ถูกตั้งค่าอย่างไรในตัวอย่างนี้

ช่วง

สามารถดึงข้อมูล Span ได้โดยใช้ข้อมูลจำเพาะ "{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 ขาดหายไปจะถือว่า Span เป็น '0' เสมอ
  • หากระบุ SPAN ไปป์ไลน์จะประมวลผลช่วงล่าสุดและเก็บหมายเลขช่วงไว้ในข้อมูลเมตา

ตัวอย่างเช่นสมมติว่ามีข้อมูลอินพุต:

  • '/ tmp / span-1 / รถไฟ / ข้อมูล'
  • '/ tmp / span-1 / eval / data'
  • '/ tmp / span-2 / รถไฟ / ข้อมูล'
  • '/ tmp / span-2 / eval / ข้อมูล'

และการกำหนดค่าอินพุตจะแสดงดังต่อไปนี้:

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 แยก

ด้วยหมายเลขช่วงเป็น '2' หากในภายหลังใน '/ tmp / span-3 / ... ' พร้อมให้ทริกเกอร์ไปป์ไลน์อีกครั้งและจะรับช่วง '3' สำหรับการประมวลผล ด้านล่างแสดงตัวอย่างโค้ดสำหรับการใช้สเปคสแปน:

from  tfx.proto import example_gen_pb2

input = example_gen_pb2.Input(splits=[
                example_gen_pb2.Input.Split(name='train',
                                            pattern='span-{SPAN}/train/*'),
                example_gen_pb2.Input.Split(name='eval',
                                            pattern='span-{SPAN}/eval/*')
            ])
examples = csv_input('/tmp')
example_gen = CsvExampleGen(input=examples, input_config=input)

การดึงข้อมูลช่วงหนึ่งสามารถทำได้ด้วย RangeConfig ซึ่งมีรายละเอียดด้านล่าง

วันที่

หากแหล่งข้อมูลของคุณได้รับการจัดระเบียบในระบบไฟล์ตามวันที่ TFX จะรองรับการแมปวันที่โดยตรงเพื่อขยายตัวเลข มีข้อกำหนดสามประการที่แสดงถึงการทำแผนที่ตั้งแต่วันที่จนถึงช่วงเวลา: {YYYY}, {MM} และ {DD}:

  • ข้อกำหนดทั้งสามควรมีอยู่พร้อมกันใน รูปแบบลูกโลกอินพุต หากมีการระบุไว้:
  • สามารถระบุข้อกำหนดเฉพาะของ {SPAN} หรือชุดวันที่นี้ได้
  • วันที่ในปฏิทินที่มีปีตั้งแต่ YYYY เดือนจาก MM และวันของเดือนจาก DD จะคำนวณจากนั้นจำนวนช่วงจะคำนวณเป็นจำนวนวันนับตั้งแต่ยุคยูนิกซ์ (เช่น 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 / รถไฟ / ข้อมูล'
  • '/ 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

ด้วยหมายเลขช่วงเป็น '2' หากในภายหลังใน '/ tmp / 1970-01-04 / ... ' พร้อมเพียงแค่ทริกเกอร์ไปป์ไลน์อีกครั้งและจะรับช่วง '3' สำหรับการประมวลผล ด้านล่างแสดงตัวอย่างรหัสสำหรับการใช้ข้อมูลวันที่:

from  tfx.proto import example_gen_pb2

input = example_gen_pb2.Input(splits=[
                example_gen_pb2.Input.Split(name='train',
                                            pattern='{YYYY}-{MM}-{DD}/train/*'),
                example_gen_pb2.Input.Split(name='eval',
                                            pattern='{YYYY}-{MM}-{DD}/eval/*')
            ])
examples = csv_input('/tmp')
example_gen = CsvExampleGen(input=examples, input_config=input)

เวอร์ชัน

สามารถเรียกดูเวอร์ชันได้โดยใช้ข้อมูลจำเพาะ "{VERSION}" ใน รูปแบบลูกโลกอินพุต :

  • ข้อมูลจำเพาะนี้จะจับคู่ตัวเลขและจับคู่ข้อมูลกับหมายเลข VERSION ที่เกี่ยวข้องภายใต้ SPAN โปรดทราบว่าข้อมูลจำเพาะเวอร์ชันสามารถใช้ร่วมกับ Span หรือ Date spec ได้
  • ข้อมูลจำเพาะนี้ยังสามารถระบุเป็นทางเลือกด้วยความกว้างในลักษณะเดียวกับข้อมูลจำเพาะ SPAN เช่น "span- {SPAN} / version- {VERSION: 4} / data- *"
  • เมื่อข้อมูลจำเพาะของ VERSION หายไปเวอร์ชันจะถูกตั้งค่าเป็นไม่มี
  • หากระบุทั้ง SPAN และ VERSION ไปป์ไลน์จะประมวลผลเวอร์ชันล่าสุดสำหรับช่วงล่าสุดและจัดเก็บหมายเลขเวอร์ชันไว้ในข้อมูลเมตา
  • หากระบุ VERSION แต่ไม่ใช่ SPAN (หรือข้อมูลจำเพาะวันที่) ข้อผิดพลาดจะเกิดขึ้น

ตัวอย่างเช่นสมมติว่ามีข้อมูลอินพุต:

  • '/ tmp / span-1 / ver-1 / รถไฟ / ข้อมูล'
  • '/ tmp / span-1 / ver-1 / eval / data'
  • '/ tmp / span-2 / ver-1 / รถไฟ / ข้อมูล'
  • '/ tmp / span-2 / ver-1 / eval / data'
  • '/ tmp / span-2 / ver-2 / รถไฟ / ข้อมูล'
  • '/ 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

ด้วยหมายเลขช่วงเป็น '2' และหมายเลขเวอร์ชันเป็น '2' หากในภายหลังใน '/ tmp / span-2 / ver-3 / ... ' พร้อมให้ทริกเกอร์ไปป์ไลน์อีกครั้งและจะรับช่วง '2' และเวอร์ชัน '3' สำหรับการประมวลผล ด้านล่างแสดงตัวอย่างรหัสสำหรับการใช้ข้อมูลจำเพาะเวอร์ชัน:

from  tfx.proto import example_gen_pb2

input = example_gen_pb2.Input(splits=[
                example_gen_pb2.Input.Split(name='train',
                                            pattern='span-{SPAN}/ver-{VERSION}/train/*'),
                example_gen_pb2.Input.Split(name='eval',
                                            pattern='span-{SPAN}/ver-{VERSION}/eval/*')
            ])
examples = csv_input('/tmp')
example_gen = CsvExampleGen(input=examples, input_config=input)

การกำหนดค่าช่วง

TFX สนับสนุนการดึงข้อมูลและการประมวลผลช่วงเฉพาะใน ExampleGen ที่ใช้ไฟล์โดยใช้การกำหนดค่าช่วงซึ่งเป็นการกำหนดค่านามธรรมที่ใช้เพื่ออธิบายช่วงสำหรับเอนทิตี TFX ที่แตกต่างกัน ในการดึงข้อมูลช่วงเฉพาะให้ตั้งค่า range_config สำหรับคอมโพเนนต์ ExampleGen ที่อิงไฟล์ ตัวอย่างเช่นสมมติว่ามีข้อมูลอินพุต:

  • '/ tmp / span-01 / รถไฟ / ข้อมูล'
  • '/ tmp / span-01 / eval / ข้อมูล'
  • '/ tmp / span-02 / รถไฟ / ข้อมูล'
  • '/ tmp / span-02 / eval / ข้อมูล'

ในการดึงข้อมูลและประมวลผลข้อมูลด้วยช่วง '1' โดยเฉพาะเราระบุการกำหนดค่าช่วงเพิ่มเติมจากการกำหนดค่าอินพุต โปรดทราบว่า ExampleGen รองรับเฉพาะช่วงคงที่ช่วงเดียว (เพื่อระบุการประมวลผลของแต่ละช่วงเวลาที่เฉพาะเจาะจง) ดังนั้นสำหรับ StaticRange start_span_number ต้องเท่ากับ end_span_number การใช้ข้อมูลช่วงที่ให้มาและข้อมูลความกว้างของช่วง (หากมีให้) สำหรับการเว้นช่องว่างที่เป็นศูนย์ ExampleGen จะแทนที่ข้อมูลจำเพาะ SPAN ในรูปแบบการแบ่งที่มีให้ด้วยหมายเลขช่วงที่ต้องการ ตัวอย่างการใช้งานแสดงไว้ด้านล่าง:

from  tfx.proto import example_gen_pb2
from  tfx.proto import range_config_pb2

# 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 = example_gen_pb2.Input(splits=[
                example_gen_pb2.Input.Split(name='train',
                                            pattern='span-{SPAN:2}/train/*'),
                example_gen_pb2.Input.Split(name='eval',
                                            pattern='span-{SPAN:2}/eval/*')
            ])
# Specify the span number to be processed here using StaticRange.
range = range_config_pb2.RangeConfig(
                static_range=range_config_pb2.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.
examples = csv_input(input_dir)
example_gen = CsvExampleGen(input=examples, input_config=input,
                            range_config=range)

นอกจากนี้ยังสามารถใช้การกำหนดค่าช่วงเพื่อประมวลผลวันที่ที่ระบุได้หากใช้ข้อมูลจำเพาะวันที่แทนข้อมูลจำเพาะ SPAN ตัวอย่างเช่นสมมติว่ามีข้อมูลอินพุตที่จัดเรียงตามวันที่ในปฏิทิน:

  • '/ tmp / 1970-01-02 / รถไฟ / ข้อมูล'
  • '/ tmp / 1970-01-02 / eval / data'
  • '/ tmp / 1970-01-03 / รถไฟ / ข้อมูล'
  • '/ tmp / 1970-01-03 / eval / data'

ในการดึงข้อมูลและประมวลผลข้อมูลโดยเฉพาะในวันที่ 2 มกราคม 1970 เราดำเนินการดังต่อไปนี้:

from  tfx.components.example_gen import utils
from  tfx.proto import example_gen_pb2
from  tfx.proto import range_config_pb2

input = example_gen_pb2.Input(splits=[
                example_gen_pb2.Input.Split(name='train',
                                            pattern='{YYYY}-{MM}-{DD}/train/*'),
                example_gen_pb2.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 = range_config_pb2.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.
examples = csv_input(input_dir)
example_gen = CsvExampleGen(input=examples, input_config=input,
                            range_config=range)

Custom ExampleGen

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

ตัวอย่างตามไฟล์

ขั้นแรกขยาย BaseExampleGenExecutor ด้วย Beam PTransform ที่กำหนดเองซึ่งให้การแปลงจากการแยกอินพุตรถไฟ / การประเมินไปเป็นตัวอย่าง TF ตัวอย่างเช่นตัว ดำเนินการ CsvExampleGen จัดเตรียมการแปลงจากตัวอย่างการแยก CSV อินพุตเป็น TF

จากนั้นสร้างคอมโพเนนต์ที่มีตัวดำเนินการด้านบนดังที่ทำใน คอมโพเนนต์ CsvExampleGen หรืออีกวิธีหนึ่งคือส่งผ่านตัวดำเนินการที่กำหนดเองไปยังส่วนประกอบ ExampleGen มาตรฐานดังที่แสดงด้านล่าง

from tfx.components.base import executor_spec
from tfx.components.example_gen.component import FileBasedExampleGen
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 รองรับการอ่าน รูปแบบข้อมูลเพิ่มเติม จำนวนมาก ผ่าน Beam I / O Transforms คุณสามารถสร้างคอมโพเนนต์ ExampleGen ที่กำหนดเองได้โดยใช้ประโยชน์จาก Beam I / O Transforms โดยใช้รูปแบบที่คล้ายกับ ตัวอย่าง Avro

  return (pipeline
          | 'ReadFromAvro' >> beam.io.ReadFromAvro(avro_pattern)
          | 'ToTFExample' >> beam.Map(utils.dict_to_example))

จากการเขียนรูปแบบและแหล่งข้อมูลที่รองรับในปัจจุบันสำหรับ Beam Python SDK ได้แก่ :

  • Amazon S3
  • Apache Avro
  • Apache Hadoop
  • อาปาเช่คาฟคา
  • อาปาเช่ปาร์เก้
  • Google Cloud BigQuery
  • Google Cloud BigTable
  • Google Cloud Datastore
  • Google Cloud Pub / Sub
  • Google Cloud Storage (GCS)
  • MongoDB

ตรวจสอบ เอกสาร Beam สำหรับรายการล่าสุด

Query-based ExampleGen

ขั้นแรกขยาย BaseExampleGenExecutor ด้วย Beam PTransform แบบกำหนดเองซึ่งอ่านจากแหล่งข้อมูลภายนอก จากนั้นสร้างส่วนประกอบง่ายๆโดยขยาย QueryBasedExampleGen

อาจต้องมีการกำหนดค่าการเชื่อมต่อเพิ่มเติมหรือไม่ ตัวอย่างเช่นตัว ดำเนินการ BigQuery อ่านโดยใช้ตัวเชื่อมต่อ beam.io เริ่มต้นซึ่งจะสรุปรายละเอียดการกำหนดค่าการเชื่อมต่อ ตัว ดำเนินการ Presto ต้องการ 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 Downstream Components

การกำหนดค่าการแยกแบบกำหนดเองได้รับการสนับสนุนสำหรับคอมโพเนนต์ดาวน์สตรีม

สถิติ

พฤติกรรมเริ่มต้นคือการสร้างสถิติสำหรับการแยกทั้งหมด

หากต้องการยกเว้นการแยกใด ๆ ให้ตั้งค่า exclude_splits สำหรับคอมโพเนนต์ StatisticsGen ตัวอย่างเช่น:

from tfx import components

...

# Exclude the 'eval' split.
statistics_gen = components.StatisticsGen(
             examples=example_gen.outputs['examples'],
             exclude_splits=['eval'])

SchemaGen

พฤติกรรมเริ่มต้นคือการสร้างสคีมาตามการแยกทั้งหมด

หากต้องการยกเว้นการแยกใด ๆ ให้ตั้งค่า exclude_splits สำหรับคอมโพเนนต์ SchemaGen ตัวอย่างเช่น:

from tfx import components

...

# Exclude the 'eval' split.
schema_gen = components.SchemaGen(
             statistics=statistics_gen.outputs['statistics'],
             exclude_splits=['eval'])

ExampleValidator

พฤติกรรมเริ่มต้นคือการตรวจสอบความถูกต้องของสถิติของการแยกทั้งหมดบนตัวอย่างอินพุตกับสคีมา

หากต้องการยกเว้นการแยกใด ๆ ให้ตั้งค่า exclude_splits สำหรับคอมโพเนนต์ ExampleValidator ตัวอย่างเช่น:

from tfx import components

...

# Exclude the 'eval' split.
example_validator = components.ExampleValidator(
             statistics=statistics_gen.outputs['statistics'],
             schema=schema_gen.outputs['schema'],
             exclude_splits=['eval'])

แปลง

พฤติกรรมเริ่มต้นคือการวิเคราะห์และสร้างข้อมูลเมตาจากการแยก 'รถไฟ' และแปลงการแยกทั้งหมด

ในการระบุการแยกวิเคราะห์และการแยกการแปลงให้ตั้งค่า splits_config สำหรับคอมโพเนนต์การแปลง ตัวอย่างเช่น:

from tfx import components
from  tfx.proto import transform_pb2

...

# Analyze the 'train' split and transform all splits.
transform = components.Transform(
      examples=example_gen.outputs['examples'],
      schema=schema_gen.outputs['schema'],
      module_file=_taxi_module_file,
      splits_config=transform_pb2.SplitsConfig(analyze=['train'],
                                               transform=['train', 'eval']))

เทรนเนอร์และจูนเนอร์

พฤติกรรมเริ่มต้นคือการฝึกในการแยก 'รถไฟ' และประเมินในส่วน 'ประเมิน'

หากต้องการระบุการแยกรถไฟและประเมินการแยกให้ตั้งค่า train_args และ eval_args สำหรับองค์ประกอบ Trainer ตัวอย่างเช่น:

from tfx import components
from  tfx.proto import trainer_pb2

...

# Train on the 'train' split and evaluate on the 'eval' split.
Trainer = components.Trainer(
      module_file=_taxi_module_file,
      examples=transform.outputs['transformed_examples'],
      schema=schema_gen.outputs['schema'],
      transform_graph=transform.outputs['transform_graph'],
      train_args=trainer_pb2.TrainArgs(splits=['train'], num_steps=10000),
      eval_args=trainer_pb2.EvalArgs(splits=['eval'], num_steps=5000))

ผู้ประเมิน

พฤติกรรมเริ่มต้นคือให้เมตริกที่คำนวณจากการแยก "eval"

ในการคำนวณสถิติการประเมินสำหรับการแยกแบบกำหนดเองให้ตั้งค่า example_splits สำหรับองค์ประกอบ Evaluator ตัวอย่างเช่น:

from tfx import components
from  tfx.proto import evaluator_pb2

...

# Compute metrics on the 'eval1' split and the 'eval2' split.
Trainer = components.Evaluator(
      examples=example_gen.outputs['examples'],
      model=trainer.outputs['model'],
      example_splits=['eval1', 'eval2'])