Komponent potoku Trainer TFX uczy model TensorFlow.
Trainer i TensorFlow
Trainer w szerokim zakresie wykorzystuje API Python TensorFlow do trenowania modeli.
Składnik
Trener bierze:
- tf Przykłady użyte do szkolenia i ewaluacji.
- Plik modułu dostarczony przez użytkownika, który definiuje logikę trenera.
- Schemat danych utworzony przez składnik potoku SchemaGen i opcjonalnie zmieniony przez dewelopera.
- Definicja Protobuf argumentów pociągu i argumentów eval.
- (Opcjonalnie) wykres transformacji utworzony przez wcześniejszy składnik Transform.
- (Opcjonalnie) wstępnie przeszkolone modele używane w scenariuszach, takich jak ciepły start.
- (Opcjonalnie) hiperparametry, które zostaną przekazane do funkcji modułu użytkownika. Szczegóły integracji z Tunerem można znaleźć tutaj .
Trainer emituje: Co najmniej jeden model do wnioskowania / udostępniania (zwykle w SavedModelFormat) i opcjonalnie inny model do oceny eval (zwykle EvalSavedModel).
Zapewniamy obsługę alternatywnych formatów modeli, takich jak TFLite, za pośrednictwem biblioteki Model Rewriting Library . Zobacz łącze do biblioteki Model Rewriting Library, aby zapoznać się z przykładami konwertowania modeli Estimator i Keras.
Trener oparty na estymatorze
Aby dowiedzieć się więcej o korzystaniu z modelu opartego na estymatorze z TFX i Trainer, zobacz Projektowanie kodu modelowania TensorFlow z tf.Estimator for TFX .
Konfiguracja komponentu Trainer
Typowy kod Python DSL w potoku wygląda następująco:
from tfx.components import Trainer
...
trainer = Trainer(
module_file=module_file,
examples=transform.outputs['transformed_examples'],
schema=infer_schema.outputs['schema'],
base_model=latest_model_resolver.outputs['latest_model'],
transform_graph=transform.outputs['transform_graph'],
train_args=trainer_pb2.TrainArgs(num_steps=10000),
eval_args=trainer_pb2.EvalArgs(num_steps=5000))
Trainer wywołuje moduł szkoleniowy, który jest określony w parametrze module_file
. Typowy moduł szkoleniowy wygląda następująco:
# TFX will call this function
def trainer_fn(trainer_fn_args, schema):
"""Build the estimator using the high level API.
Args:
trainer_fn_args: Holds args used to train the model as name/value pairs.
schema: Holds the schema of the training examples.
Returns:
A dict of the following:
- estimator: The estimator that will be used for training and eval.
- train_spec: Spec for training.
- eval_spec: Spec for eval.
- eval_input_receiver_fn: Input function for eval.
"""
# Number of nodes in the first layer of the DNN
first_dnn_layer_size = 100
num_dnn_layers = 4
dnn_decay_factor = 0.7
train_batch_size = 40
eval_batch_size = 40
tf_transform_output = tft.TFTransformOutput(trainer_fn_args.transform_output)
train_input_fn = lambda: _input_fn( # pylint: disable=g-long-lambda
trainer_fn_args.train_files,
tf_transform_output,
batch_size=train_batch_size)
eval_input_fn = lambda: _input_fn( # pylint: disable=g-long-lambda
trainer_fn_args.eval_files,
tf_transform_output,
batch_size=eval_batch_size)
train_spec = tf.estimator.TrainSpec( # pylint: disable=g-long-lambda
train_input_fn,
max_steps=trainer_fn_args.train_steps)
serving_receiver_fn = lambda: _example_serving_receiver_fn( # pylint: disable=g-long-lambda
tf_transform_output, schema)
exporter = tf.estimator.FinalExporter('chicago-taxi', serving_receiver_fn)
eval_spec = tf.estimator.EvalSpec(
eval_input_fn,
steps=trainer_fn_args.eval_steps,
exporters=[exporter],
name='chicago-taxi-eval')
run_config = tf.estimator.RunConfig(
save_checkpoints_steps=999, keep_checkpoint_max=1)
run_config = run_config.replace(model_dir=trainer_fn_args.serving_model_dir)
warm_start_from = trainer_fn_args.base_model[
0] if trainer_fn_args.base_model else None
estimator = _build_estimator(
# Construct layers sizes with exponetial decay
hidden_units=[
max(2, int(first_dnn_layer_size * dnn_decay_factor**i))
for i in range(num_dnn_layers)
],
config=run_config,
warm_start_from=warm_start_from)
# Create an input receiver for TFMA processing
receiver_fn = lambda: _eval_input_receiver_fn( # pylint: disable=g-long-lambda
tf_transform_output, schema)
return {
'estimator': estimator,
'train_spec': train_spec,
'eval_spec': eval_spec,
'eval_input_receiver_fn': receiver_fn
}
Ogólny trener
Trener generyczny umożliwia programistom używanie dowolnego interfejsu API modelu TensorFlow z komponentem Trainer. Oprócz TensorFlow Estimators programiści mogą korzystać z modeli Keras lub niestandardowych pętli szkoleniowych. Aby uzyskać szczegółowe informacje, zapoznaj się z dokumentem RFC dotyczącym trenera ogólnego .
Konfigurowanie składnika Trainer do korzystania z GenericExecutor
Typowy kod DSL potoku dla generycznego Trainera wyglądałby tak:
from tfx.components import Trainer
from tfx.components.base import executor_spec
from tfx.components.trainer.executor import GenericExecutor
...
trainer = Trainer(
module_file=module_file,
custom_executor_spec=executor_spec.ExecutorClassSpec(GenericExecutor),
examples=transform.outputs['transformed_examples'],
transform_graph=transform.outputs['transform_graph'],
schema=infer_schema.outputs['schema'],
train_args=trainer_pb2.TrainArgs(num_steps=10000),
eval_args=trainer_pb2.EvalArgs(num_steps=5000))
Trainer wywołuje moduł szkoleniowy, który jest określony w parametrze module_file
. Zamiast trainer_fn
, run_fn
jest wymagany w pliku modułu, jeśli GenericExecutor
jest określony w custom_executor_spec
.
Jeśli składnik Transform nie jest używany w potoku, trener pobierze przykłady bezpośrednio z ExampleGen:
trainer = Trainer(
module_file=module_file,
custom_executor_spec=executor_spec.ExecutorClassSpec(GenericExecutor),
examples=example_gen.outputs['examples'],
schema=infer_schema.outputs['schema'],
train_args=trainer_pb2.TrainArgs(num_steps=10000),
eval_args=trainer_pb2.EvalArgs(num_steps=5000))
Oto przykładowy plik modułu z run_fn
.