Questa pagina è stata tradotta dall'API Cloud Translation.
Switch to English

Il componente della pipeline di esempio Gen TFX

Il componente della pipeline TFX di esempio Gen inserisce i dati nelle tubazioni TFX. Consuma file / servizi esterni per generare esempi che verranno letti da altri componenti TFX. Fornisce inoltre una partizione coerente e configurabile e mescola il set di dati per le migliori pratiche ML.

  • Consumi: dati da fonti di dati esterne come CSV, TFRecord e BigQuery
  • Emette: tf.Example record

ExampleGen e altri componenti

ExampleGen fornisce dati ai componenti che utilizzano la libreria di convalida dei dati TensorFlow , come SchemaGen , StatisticsGen e Example Validator . Fornisce inoltre dati a Transform , che utilizza la libreria Transform di TensorFlow e, in ultima analisi, ai target di distribuzione durante l'inferenza.

Come utilizzare un componente ExampleGen

Per le origini dati supportate (attualmente, file CSV, file TFRecord con formato dati di esempio TF e risultati delle query BigQuery) il componente della pipeline ExampleGen è in genere molto facile da distribuire e richiede poca personalizzazione. Il codice tipico è simile al seguente:

 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)
 

o come di seguito per importare direttamente esempi di tf esterni:

 from tfx.utils.dsl_utils import tfrecord_input
from tfx.components.example_gen.import_example_gen.component import ImportExampleGen

examples = tfrecord_input(path_to_tfrecord_dir)
example_gen = ImportExampleGen(input=examples)
 

Span, Version e Split

Un intervallo è un raggruppamento di esempi di addestramento. Se i tuoi dati sono persistenti su un filesystem, ogni intervallo può essere archiviato in una directory separata. La semantica di uno Span non è hardcoded in TFX; uno Span può corrispondere a un giorno di dati, a un'ora di dati o a qualsiasi altro raggruppamento significativo per la propria attività.

Ogni intervallo può contenere più versioni di dati. Per fare un esempio, se si rimuovono alcuni esempi da un intervallo per ripulire i dati di scarsa qualità, ciò potrebbe comportare una nuova versione di tale intervallo. Per impostazione predefinita, i componenti TFX funzionano sull'ultima versione in uno span.

Ogni versione all'interno di uno span può essere ulteriormente suddivisa in più split. Il caso d'uso più comune per suddividere uno Span è quello di dividerlo in dati di addestramento e valutazione.

Span e Split

Divisione input / output personalizzata

Per personalizzare il rapporto split treno / eval che verrà generato da ExampleGen, impostare output_config per il componente ExampleGen. Per esempio:

 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)
 

Notare come hash_buckets stati impostati hash_buckets in questo esempio.

Per una sorgente di input che è già stata suddivisa, impostare input_config per il componente 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)
 

Per esempio gen basato su file (ad es. CsvExampleGen ed ImportExampleGen), il pattern è un modello di file relativo globale che mappa i file di input con la directory principale fornita dal percorso della base di input. Per esempio gen basato su query (ad esempio BigQueryExampleGen, PrestoExampleGen), il pattern è una query SQL.

Per impostazione predefinita, l'intera directory di base di input viene trattata come una singola suddivisione di input e la divisione di output del treno e di eval viene generata con un rapporto 2: 1.

Per i dettagli, consultare proto / example_gen.proto .

Metodo di scissione

Quando si utilizza il metodo di suddivisione hash_buckets , anziché l'intero record, è possibile utilizzare una funzione per partizionare gli esempi. Se è presente una funzione, ExampleGen utilizzerà un'impronta digitale di tale funzione come chiave di partizione.

Questa funzione può essere utilizzata per mantenere una suddivisione stabile rispetto ad alcune proprietà di esempi: ad esempio, un utente verrà sempre inserito nella stessa suddivisione se "user_id" fosse selezionato come nome della funzione di partizione.

L'interpretazione di cosa significhi una "caratteristica" e come abbinare una "caratteristica" al nome specificato dipende dall'implementazione di ExampleGen e dal tipo di esempi.

Per implementazioni preconfigurate di esempio:

  • Se genera tf.Example, una "caratteristica" indica una voce in tf.Example.features.feature.
  • Se genera tf.SequenceExample, una "caratteristica" indica una voce in tf.SequenceExample.context.feature.
  • Sono supportate solo le funzionalità int64 e byte.

Nei seguenti casi, ExampleGen genera errori di runtime:

Per generare la suddivisione train / eval in base a una funzione negli esempi, impostare output_config per il componente ExampleGen. Per esempio:

 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)
 

Notare come è stato impostato partition_feature_name in questo esempio.

campata

Lo span può essere recuperato usando la specifica '{SPAN}' nel pattern glob input :

  • Questa specifica corrisponde a cifre e mappa i dati nei relativi numeri SPAN. Ad esempio, "data_ {SPAN} - *. Tfrecord" raccoglierà file come "data_12-a.tfrecord", "date_12-b.tfrecord".
  • Quando manca la specifica SPAN, si presume che sia sempre Span '0'.
  • Se viene specificato SPAN, la pipeline elaborerà l'intervallo più recente e memorizzerà il numero di intervallo in metadati

Ad esempio, supponiamo che ci siano dati di input:

  • '/ Tmp / span-01 / treno / dati'
  • '/ tmp / span-01 / eval / dati'
  • '/ Tmp / span-02 / treno / dati'
  • '/ tmp / span-02 / eval / dati'

e la configurazione di input è mostrata come di seguito:

 splits {
  name: 'train'
  pattern: 'span-{SPAN}/train/*'
}
splits {
  name: 'eval'
  pattern: 'span-{SPAN}/eval/*'
}
 

quando si attiva la pipeline, elaborerà:

  • '/ tmp / span-02 / train / data' come divisione del treno
  • '/ tmp / span-02 / eval / data' come suddivisione eval

con il numero di span come '02'. Se in seguito '/ tmp / span-03 / ...' sono pronti, è sufficiente attivare nuovamente la pipeline e raccoglierà l'intervallo '03' per l'elaborazione. Di seguito mostra l'esempio di codice per l'utilizzo delle specifiche di span:

 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)
 

Versione

Esempio personalizzato Gen

Se i componenti EsempioGen attualmente disponibili non soddisfano le tue esigenze, crea un Esempio Gen personalizzato, che includerà un nuovo esecutore esteso da BaseExampleGenExecutor.

Esempio basato su file

Innanzitutto, estendi BaseExampleGenExecutor con una PTransform Beam personalizzata, che fornisce la conversione dalla suddivisione dell'input treno / valutazione in esempi TF. Ad esempio, l' esecutore CsvExampleGen fornisce la conversione da un CSV di input suddiviso in esempi TF.

Quindi, crea un componente con il suddetto esecutore, come fatto nel componente CsvExampleGen . In alternativa, passa un esecutore personalizzato nel componente EsempioGen standard come mostrato di seguito.

 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
from tfx.utils.dsl_utils import external_input

examples = external_input(os.path.join(base_dir, 'data/simple'))
example_gen = FileBasedExampleGen(
    input=examples,
    custom_executor_spec=executor_spec.ExecutorClassSpec(executor.Executor))
 

Ora supportiamo anche la lettura dei file Avro e Parquet usando questo metodo .

Esempio basato su query

Innanzitutto, estendi BaseExampleGenExecutor con un PTransform personalizzato Beam, che legge dall'origine dati esterna. Quindi, creare un componente semplice estendendo QueryBasedExampleGen.

Ciò può richiedere o meno configurazioni di connessione aggiuntive. Ad esempio, l' esecutore di BigQuery legge usando un connettore beam.io predefinito, che estrae i dettagli di configurazione della connessione. L' esecutore Presto richiede una Beam PTransform personalizzata e un protobuf di configurazione della connessione personalizzata come input.

Se è necessaria una configurazione della connessione per un componente EsempioGen personalizzato, creare un nuovo protobuf e passarlo attraverso custom_config, che ora è un parametro di esecuzione facoltativo. Di seguito è riportato un esempio di come utilizzare un componente configurato.

 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')