TL;DR : reduza o código clichê para criar, treinar e servir modelos de classificação do TensorFlow com os pipelines de classificação do TensorFlow; Use estratégias distribuídas adequadas para aplicativos de classificação em grande escala, de acordo com o caso de uso e os recursos.
Introdução
O pipeline de classificação do TensorFlow consiste em uma série de processos de processamento de dados, construção de modelos, treinamento e serviços que permitem construir, treinar e servir modelos de classificação baseados em redes neurais escaláveis a partir de logs de dados com o mínimo de esforço. O pipeline é mais eficiente quando o sistema é dimensionado. Em geral, se seu modelo demorar 10 minutos ou mais para ser executado em uma única máquina, considere usar essa estrutura de pipeline para distribuir a carga e acelerar o processamento.
O pipeline de classificação do TensorFlow tem sido executado de forma constante e estável em experimentos e produções de grande escala com big data (terabytes+) e grandes modelos (100M+ de FLOPs) em sistemas distribuídos (1K+ CPU e 100+ GPU e TPUs). Depois que um modelo do TensorFlow é comprovado com model.fit em uma pequena parte dos dados, o pipeline é recomendado para verificação de hiperparâmetros, treinamento contínuo e outras situações de grande escala.
Pipeline de classificação
No TensorFlow, um pipeline típico para criar, treinar e servir um modelo de classificação inclui as seguintes etapas típicas.
- Defina a estrutura do modelo:
- Criar entradas;
- Criar camadas de pré-processamento;
- Criar arquitetura de rede neural;
- Modelo de trem:
- Gere conjuntos de dados de treinamento e validação a partir de logs de dados;
- Prepare o modelo com os hiperparâmetros adequados:
- Otimizador;
- Perdas de classificação;
- Métricas de Classificação;
- Configure estratégias distribuídas para treinar em vários dispositivos.
- Configure retornos de chamada para várias escriturações.
- Modelo de exportação para atendimento;
- Modelo de serviço:
- Determinar o formato dos dados na entrega;
- Escolha e carregue o modelo treinado;
- Processo com modelo carregado.
Um dos principais objetivos do pipeline do TensorFlow Ranking é reduzir o código padrão nas etapas, como carregamento e pré-processamento do conjunto de dados, compatibilidade de dados de lista e função de pontuação pontual e exportação de modelo. O outro objetivo importante é impor o design consistente de muitos processos inerentemente correlacionados, por exemplo, as entradas do modelo devem ser compatíveis com os conjuntos de dados de treinamento e o formato de dados no serviço.
Guia de uso
Com todo o design acima, o lançamento de um modelo de classificação TF se enquadra nas etapas a seguir, conforme mostrado na Figura 1.

Exemplo usando uma rede neural distribuída
Neste exemplo, você aproveitará o tfr.keras.model.FeatureSpecInputCreator , tfr.keras.pipeline.SimpleDatasetBuilder e tfr.keras.pipeline.SimplePipeline que recebem feature_spec s para definir consistentemente os recursos de entrada nas entradas do modelo e servidor de conjunto de dados. A versão do notebook com um passo a passo pode ser encontrada no tutorial de classificação distribuída .
Primeiro defina feature_spec s para recursos de contexto e de exemplo.
context_feature_spec = {}
example_feature_spec = {
'custom_features_{}'.format(i + 1):
tf.io.FixedLenFeature(shape=(1,), dtype=tf.float32, default_value=0.0)
for i in range(10)
}
label_spec = ('utility', tf.io.FixedLenFeature(
shape=(1,), dtype=tf.float32, default_value=-1))
Siga os passos ilustrados na Figura 1:
Defina input_creator de feature_spec s.
input_creator = tfr.keras.model.FeatureSpecInputCreator(
context_feature_spec, example_feature_spec)
Em seguida, defina transformações de recursos de pré-processamento para o mesmo conjunto de recursos de entrada.
def log1p(tensor):
return tf.math.log1p(tensor * tf.sign(tensor)) * tf.sign(tensor)
preprocessor = {
'custom_features_{}'.format(i + 1): log1p
for i in range(10)
}
Defina o pontuador com o modelo DNN de feedforward integrado.
dnn_scorer = tfr.keras.model.DNNScorer(
hidden_layer_dims=[1024, 512, 256],
output_units=1,
activation=tf.nn.relu,
use_batch_norm=True,
batch_norm_moment=0.99,
dropout=0.4)
Faça o model_builder com input_creator , preprocessor e scorer .
model_builder = tfr.keras.model.ModelBuilder(
input_creator=input_creator,
preprocessor=preprocessor,
scorer=dnn_scorer,
mask_feature_name='__list_mask__',
name='web30k_dnn_model')
Agora defina os hiperparâmetros para dataset_builder .
dataset_hparams = tfr.keras.pipeline.DatasetHparams(
train_input_pattern='/path/to/MSLR-WEB30K-ELWC/train-*',
valid_input_pattern='/path/to/MSLR-WEB30K-ELWC/vali-*',
train_batch_size=128,
valid_batch_size=128,
list_size=200,
dataset_reader=tf.data.RecordIODataset,
convert_labels_to_binary=False)
Faça o dataset_builder .
tfr.keras.pipeline.SimpleDatasetBuilder(
context_feature_spec=context_feature_spec,
example_feature_spec=example_feature_spec,
mask_feature_name='__list_mask__',
label_spec=label_spec,
hparams=dataset_hparams)
Defina também os hiperparâmetros para o pipeline.
pipeline_hparams = tfr.keras.pipeline.PipelineHparams(
model_dir='/tmp/web30k_dnn_model',
num_epochs=100,
num_train_steps=100000,
num_valid_steps=100,
loss='softmax_loss',
loss_reduction=tf.losses.Reduction.AUTO,
optimizer='adam',
learning_rate=0.0001,
steps_per_execution=100,
export_best_model=True,
strategy='MirroredStrategy',
tpu=None)
Faça o ranking_pipeline e treine.
ranking_pipeline = tfr.keras.pipeline.SimplePipeline(
model_builder=model_builder,
dataset_builder=dataset_builder,
hparams=pipeline_hparams,
)
ranking_pipeline.train_and_validate()
Design do pipeline de classificação do TensorFlow
O pipeline de classificação do TensorFlow ajuda a economizar tempo de engenharia com código clichê e, ao mesmo tempo, permite flexibilidade de personalização por meio de substituição e subclassificação. Para conseguir isso, o pipeline apresenta as classes personalizáveis tfr.keras.model.AbstractModelBuilder , tfr.keras.pipeline.AbstractDatasetBuilder e tfr.keras.pipeline.AbstractPipeline para configurar o pipeline TensorFlow Ranking.

ModelBuilder
O código clichê relacionado à construção do modelo Keras é integrado ao AbstractModelBuilder , que é passado para o AbstractPipeline e chamado dentro do pipeline para construir o modelo no escopo da estratégia. Isso é mostrado na Figura 1. Os métodos de classe são definidos na classe base abstrata.
class AbstractModelBuilder:
def __init__(self, mask_feature_name, name):
@abstractmethod
def create_inputs(self):
// To create tf.keras.Input. Abstract method, to be overridden.
...
@abstractmethod
def preprocess(self, context_inputs, example_inputs, mask):
// To preprocess input features. Abstract method, to be overridden.
...
@abstractmethod
def score(self, context_features, example_features, mask):
// To score based on preprocessed features. Abstract method, to be overridden.
...
def build(self):
context_inputs, example_inputs, mask = self.create_inputs()
context_features, example_features = self.preprocess(
context_inputs, example_inputs, mask)
logits = self.score(context_features, example_features, mask)
return tf.keras.Model(inputs=..., outputs=logits, name=self._name)
Você pode subclassificar diretamente o AbstractModelBuilder e sobrescrever com os métodos concretos para personalização, como
class MyModelBuilder(AbstractModelBuilder):
def create_inputs(self, ...):
...
Ao mesmo tempo, você deve usar ModelBuilder com recursos de entrada, transformações de pré-processamento e funções de pontuação especificadas como entradas de função input_creator , preprocessor e scorer na classe init em vez de subclassing.
class ModelBuilder(AbstractModelBuilder):
def __init__(self, input_creator, preprocessor, scorer, mask_feature_name, name):
...
Para reduzir os padrões de criação dessas entradas, as classes de função tfr.keras.model.InputCreator para input_creator , tfr.keras.model.Preprocessor para preprocessor e tfr.keras.model.Scorer para scorer são fornecidas, juntamente com subclasses concretas tfr.keras.model.FeatureSpecInputCreator , tfr.keras.model.TypeSpecInputCreator , tfr.keras.model.PreprocessorWithSpec , tfr.keras.model.UnivariateScorer , tfr.keras.model.DNNScorer e tfr.keras.model.GAMScorer . Eles devem cobrir a maioria dos casos de uso comuns.
Observe que essas classes de função são classes Keras, portanto, não há necessidade de serialização. A subclassificação é a maneira recomendada para personalizá-los.
DatasetBuilder
A classe DatasetBuilder coleta o clichê relacionado ao conjunto de dados. Os dados são passados para o Pipeline e chamados para servir os conjuntos de dados de treinamento e validação e para definir as assinaturas de serviço para modelos salvos. Conforme mostrado na Figura 1, os métodos DatasetBuilder são definidos na classe base tfr.keras.pipeline.AbstractDatasetBuilder ,
class AbstractDatasetBuilder:
@abstractmethod
def build_train_dataset(self, *arg, **kwargs):
// To return the training dataset.
...
@abstractmethod
def build_valid_dataset(self, *arg, **kwargs):
// To return the validation dataset.
...
@abstractmethod
def build_signatures(self, *arg, **kwargs):
// To build the signatures to export saved model.
...
Em uma classe DatasetBuilder concreta, você deve implementar build_train_datasets , build_valid_datasets e build_signatures .
Uma classe concreta que cria conjuntos de dados de feature_spec s também é fornecida:
class BaseDatasetBuilder(AbstractDatasetBuilder):
def __init__(self, context_feature_spec, example_feature_spec,
training_only_example_spec,
mask_feature_name, hparams,
training_only_context_spec=None):
// Specify label and weight specs in training_only_example_spec.
...
def _features_and_labels(self, features):
// To split the labels and weights from input features.
...
def _build_dataset(self, ...):
return tfr.data.build_ranking_dataset(
context_feature_spec+training_only_context_spec,
example_feature_spec+training_only_example_spec, mask_feature_name, ...)
def build_train_dataset(self):
return self._build_dataset(...)
def build_valid_dataset(self):
return self._build_dataset(...)
def build_signatures(self, model):
return saved_model.Signatures(model, context_feature_spec,
example_feature_spec, mask_feature_name)()
Os hparams usados no DatasetBuilder são especificados na classe de tfr.keras.pipeline.DatasetHparams .
Pipeline
O Ranking Pipeline é baseado na classe tfr.keras.pipeline.AbstractPipeline :
class AbstractPipeline:
@abstractmethod
def build_loss(self):
// Returns a tf.keras.losses.Loss or a dict of Loss. To be overridden.
...
@abstractmethod
def build_metrics(self):
// Returns a list of evaluation metrics. To be overridden.
...
@abstractmethod
def build_weighted_metrics(self):
// Returns a list of weighted metrics. To be overridden.
...
@abstractmethod
def train_and_validate(self, *arg, **kwargs):
// Main function to run the training pipeline. To be overridden.
...
Uma classe de pipeline concreta que treina o modelo com diferentes tf.distribute.strategy s compatíveis com model.fit também é fornecida:
class ModelFitPipeline(AbstractPipeline):
def __init__(self, model_builder, dataset_builder, hparams):
...
def build_callbacks(self):
// Builds callbacks used in model.fit. Override for customized usage.
...
def export_saved_model(self, model, export_to, checkpoint=None):
if checkpoint:
model.load_weights(checkpoint)
model.save(export_to, signatures=dataset_builder.build_signatures(model))
def train_and_validate(self, verbose=0):
with self._strategy.scope():
model = model_builder.build()
model.compile(
optimizer,
loss=self.build_loss(),
metrics=self.build_metrics(),
loss_weights=self.hparams.loss_weights,
weighted_metrics=self.build_weighted_metrics())
train_dataset, valid_dataset = (
dataset_builder.build_train_dataset(),
dataset_builder.build_valid_dataset())
model.fit(
x=train_dataset,
validation_data=valid_dataset,
callbacks=self.build_callbacks(),
verbose=verbose)
self.export_saved_model(model, export_to=model_output_dir)
Os hparams usados no tfr.keras.pipeline.ModelFitPipeline são especificados na classe de tfr.keras.pipeline.PipelineHparams . Essa classe ModelFitPipeline é suficiente para a maioria dos casos de uso do TF Ranking. Os clientes podem facilmente subclassificá-lo para fins específicos.
Suporte de Estratégia Distribuída
Consulte o treinamento distribuído para obter uma introdução detalhada das estratégias distribuídas com suporte do TensorFlow. Atualmente, o pipeline do TensorFlow Ranking é compatível tf.distribute.MirroredStrategy (padrão), tf.distribute.TPUStrategy , tf.distribute.MultiWorkerMirroredStrategy e tf.distribute.ParameterServerStrategy . A estratégia espelhada é compatível com a maioria dos sistemas de máquina única. Defina a strategy como None para nenhuma estratégia distribuída.
Em geral, MirroredStrategy funciona para modelos relativamente pequenos na maioria dos dispositivos com opções de CPU e GPU. MultiWorkerMirroredStrategy funciona para grandes modelos que não cabem em um trabalhador. ParameterServerStrategy faz treinamento assíncrono e requer vários trabalhadores disponíveis. TPUStrategy é ideal para grandes modelos e big data quando TPUs estão disponíveis, no entanto, é menos flexível em termos de formas de tensor que pode manipular.
Perguntas frequentes
O conjunto mínimo de componentes para usar o
RankingPipeline
Veja o código de exemplo acima.E se eu tiver meu próprio
modelKeras
Para ser treinado com estratégiastf.distribute, omodelprecisa ser construído com todas as variáveis treináveis definidas em strategy.scope(). Então envolva seu modelo noModelBuildercomo,
class MyModelBuilder(AbstractModelBuilder):
def __init__(self, model, context_feature_names, example_feature_names,
mask_feature_name, name):
super().__init__(mask_feature_name, name)
self._model = model
self._context_feature_names = context_feature_names
self._example_feature_names = example_feature_names
def create_inputs(self):
inputs = self._model.input
context_inputs = {inputs[name] for name in self._context_feature_names}
example_inputs = {inputs[name] for name in self._example_feature_names}
mask = inputs[self._mask_feature_name]
return context_inputs, example_inputs, mask
def preprocess(self, context_inputs, example_inputs, mask):
return context_inputs, example_inputs, mask
def score(self, context_features, example_features, mask):
inputs = dict(
list(context_features.items()) + list(example_features.items()) +
[(self._mask_feature_name, mask)])
return self._model(inputs)
model_builder = MyModelBuilder(model, context_feature_names, example_feature_names,
mask_feature_name, "my_model")
Em seguida, alimente este model_builder ao pipeline para treinamento adicional.
,TL;DR : reduza o código clichê para criar, treinar e servir modelos de classificação do TensorFlow com os pipelines de classificação do TensorFlow; Use estratégias distribuídas adequadas para aplicativos de classificação em grande escala, de acordo com o caso de uso e os recursos.
Introdução
O pipeline de classificação do TensorFlow consiste em uma série de processos de processamento de dados, construção de modelos, treinamento e serviços que permitem construir, treinar e servir modelos de classificação baseados em redes neurais escaláveis a partir de logs de dados com o mínimo de esforço. O pipeline é mais eficiente quando o sistema é dimensionado. Em geral, se seu modelo demorar 10 minutos ou mais para ser executado em uma única máquina, considere usar essa estrutura de pipeline para distribuir a carga e acelerar o processamento.
O pipeline de classificação do TensorFlow tem sido executado de forma constante e estável em experimentos e produções de grande escala com big data (terabytes+) e grandes modelos (100M+ de FLOPs) em sistemas distribuídos (1K+ CPU e 100+ GPU e TPUs). Depois que um modelo do TensorFlow é comprovado com model.fit em uma pequena parte dos dados, o pipeline é recomendado para verificação de hiperparâmetros, treinamento contínuo e outras situações de grande escala.
Pipeline de classificação
No TensorFlow, um pipeline típico para criar, treinar e servir um modelo de classificação inclui as seguintes etapas típicas.
- Defina a estrutura do modelo:
- Criar entradas;
- Criar camadas de pré-processamento;
- Criar arquitetura de rede neural;
- Modelo de trem:
- Gere conjuntos de dados de treinamento e validação a partir de logs de dados;
- Prepare o modelo com os hiperparâmetros adequados:
- Otimizador;
- Perdas de classificação;
- Métricas de Classificação;
- Configure estratégias distribuídas para treinar em vários dispositivos.
- Configure retornos de chamada para várias escriturações.
- Modelo de exportação para atendimento;
- Modelo de serviço:
- Determinar o formato dos dados na entrega;
- Escolha e carregue o modelo treinado;
- Processo com modelo carregado.
Um dos principais objetivos do pipeline do TensorFlow Ranking é reduzir o código padrão nas etapas, como carregamento e pré-processamento do conjunto de dados, compatibilidade de dados de lista e função de pontuação pontual e exportação de modelo. O outro objetivo importante é impor o design consistente de muitos processos inerentemente correlacionados, por exemplo, as entradas do modelo devem ser compatíveis com os conjuntos de dados de treinamento e o formato de dados no serviço.
Guia de uso
Com todo o design acima, o lançamento de um modelo de classificação TF se enquadra nas etapas a seguir, conforme mostrado na Figura 1.

Exemplo usando uma rede neural distribuída
Neste exemplo, você aproveitará o tfr.keras.model.FeatureSpecInputCreator , tfr.keras.pipeline.SimpleDatasetBuilder e tfr.keras.pipeline.SimplePipeline que recebem feature_spec s para definir consistentemente os recursos de entrada nas entradas do modelo e servidor de conjunto de dados. A versão do notebook com um passo a passo pode ser encontrada no tutorial de classificação distribuída .
Primeiro defina feature_spec s para recursos de contexto e de exemplo.
context_feature_spec = {}
example_feature_spec = {
'custom_features_{}'.format(i + 1):
tf.io.FixedLenFeature(shape=(1,), dtype=tf.float32, default_value=0.0)
for i in range(10)
}
label_spec = ('utility', tf.io.FixedLenFeature(
shape=(1,), dtype=tf.float32, default_value=-1))
Siga os passos ilustrados na Figura 1:
Defina input_creator de feature_spec s.
input_creator = tfr.keras.model.FeatureSpecInputCreator(
context_feature_spec, example_feature_spec)
Em seguida, defina transformações de recursos de pré-processamento para o mesmo conjunto de recursos de entrada.
def log1p(tensor):
return tf.math.log1p(tensor * tf.sign(tensor)) * tf.sign(tensor)
preprocessor = {
'custom_features_{}'.format(i + 1): log1p
for i in range(10)
}
Defina o pontuador com o modelo DNN de feedforward integrado.
dnn_scorer = tfr.keras.model.DNNScorer(
hidden_layer_dims=[1024, 512, 256],
output_units=1,
activation=tf.nn.relu,
use_batch_norm=True,
batch_norm_moment=0.99,
dropout=0.4)
Faça o model_builder com input_creator , preprocessor e scorer .
model_builder = tfr.keras.model.ModelBuilder(
input_creator=input_creator,
preprocessor=preprocessor,
scorer=dnn_scorer,
mask_feature_name='__list_mask__',
name='web30k_dnn_model')
Agora defina os hiperparâmetros para dataset_builder .
dataset_hparams = tfr.keras.pipeline.DatasetHparams(
train_input_pattern='/path/to/MSLR-WEB30K-ELWC/train-*',
valid_input_pattern='/path/to/MSLR-WEB30K-ELWC/vali-*',
train_batch_size=128,
valid_batch_size=128,
list_size=200,
dataset_reader=tf.data.RecordIODataset,
convert_labels_to_binary=False)
Faça o dataset_builder .
tfr.keras.pipeline.SimpleDatasetBuilder(
context_feature_spec=context_feature_spec,
example_feature_spec=example_feature_spec,
mask_feature_name='__list_mask__',
label_spec=label_spec,
hparams=dataset_hparams)
Defina também os hiperparâmetros para o pipeline.
pipeline_hparams = tfr.keras.pipeline.PipelineHparams(
model_dir='/tmp/web30k_dnn_model',
num_epochs=100,
num_train_steps=100000,
num_valid_steps=100,
loss='softmax_loss',
loss_reduction=tf.losses.Reduction.AUTO,
optimizer='adam',
learning_rate=0.0001,
steps_per_execution=100,
export_best_model=True,
strategy='MirroredStrategy',
tpu=None)
Faça o ranking_pipeline e treine.
ranking_pipeline = tfr.keras.pipeline.SimplePipeline(
model_builder=model_builder,
dataset_builder=dataset_builder,
hparams=pipeline_hparams,
)
ranking_pipeline.train_and_validate()
Design do pipeline de classificação do TensorFlow
O pipeline de classificação do TensorFlow ajuda a economizar tempo de engenharia com código clichê e, ao mesmo tempo, permite flexibilidade de personalização por meio de substituição e subclassificação. Para conseguir isso, o pipeline apresenta as classes personalizáveis tfr.keras.model.AbstractModelBuilder , tfr.keras.pipeline.AbstractDatasetBuilder e tfr.keras.pipeline.AbstractPipeline para configurar o pipeline TensorFlow Ranking.

ModelBuilder
O código clichê relacionado à construção do modelo Keras é integrado ao AbstractModelBuilder , que é passado para o AbstractPipeline e chamado dentro do pipeline para construir o modelo no escopo da estratégia. Isso é mostrado na Figura 1. Os métodos de classe são definidos na classe base abstrata.
class AbstractModelBuilder:
def __init__(self, mask_feature_name, name):
@abstractmethod
def create_inputs(self):
// To create tf.keras.Input. Abstract method, to be overridden.
...
@abstractmethod
def preprocess(self, context_inputs, example_inputs, mask):
// To preprocess input features. Abstract method, to be overridden.
...
@abstractmethod
def score(self, context_features, example_features, mask):
// To score based on preprocessed features. Abstract method, to be overridden.
...
def build(self):
context_inputs, example_inputs, mask = self.create_inputs()
context_features, example_features = self.preprocess(
context_inputs, example_inputs, mask)
logits = self.score(context_features, example_features, mask)
return tf.keras.Model(inputs=..., outputs=logits, name=self._name)
Você pode subclassificar diretamente o AbstractModelBuilder e sobrescrever com os métodos concretos para personalização, como
class MyModelBuilder(AbstractModelBuilder):
def create_inputs(self, ...):
...
Ao mesmo tempo, você deve usar ModelBuilder com recursos de entrada, transformações de pré-processamento e funções de pontuação especificadas como entradas de função input_creator , preprocessor e scorer na classe init em vez de subclassing.
class ModelBuilder(AbstractModelBuilder):
def __init__(self, input_creator, preprocessor, scorer, mask_feature_name, name):
...
Para reduzir os padrões de criação dessas entradas, as classes de função tfr.keras.model.InputCreator para input_creator , tfr.keras.model.Preprocessor para preprocessor e tfr.keras.model.Scorer para scorer são fornecidas, juntamente com subclasses concretas tfr.keras.model.FeatureSpecInputCreator , tfr.keras.model.TypeSpecInputCreator , tfr.keras.model.PreprocessorWithSpec , tfr.keras.model.UnivariateScorer , tfr.keras.model.DNNScorer e tfr.keras.model.GAMScorer . Eles devem cobrir a maioria dos casos de uso comuns.
Observe que essas classes de função são classes Keras, portanto, não há necessidade de serialização. A subclassificação é a maneira recomendada para personalizá-los.
DatasetBuilder
A classe DatasetBuilder coleta o clichê relacionado ao conjunto de dados. Os dados são passados para o Pipeline e chamados para servir os conjuntos de dados de treinamento e validação e para definir as assinaturas de serviço para modelos salvos. Conforme mostrado na Figura 1, os métodos DatasetBuilder são definidos na classe base tfr.keras.pipeline.AbstractDatasetBuilder ,
class AbstractDatasetBuilder:
@abstractmethod
def build_train_dataset(self, *arg, **kwargs):
// To return the training dataset.
...
@abstractmethod
def build_valid_dataset(self, *arg, **kwargs):
// To return the validation dataset.
...
@abstractmethod
def build_signatures(self, *arg, **kwargs):
// To build the signatures to export saved model.
...
Em uma classe DatasetBuilder concreta, você deve implementar build_train_datasets , build_valid_datasets e build_signatures .
Uma classe concreta que cria conjuntos de dados de feature_spec s também é fornecida:
class BaseDatasetBuilder(AbstractDatasetBuilder):
def __init__(self, context_feature_spec, example_feature_spec,
training_only_example_spec,
mask_feature_name, hparams,
training_only_context_spec=None):
// Specify label and weight specs in training_only_example_spec.
...
def _features_and_labels(self, features):
// To split the labels and weights from input features.
...
def _build_dataset(self, ...):
return tfr.data.build_ranking_dataset(
context_feature_spec+training_only_context_spec,
example_feature_spec+training_only_example_spec, mask_feature_name, ...)
def build_train_dataset(self):
return self._build_dataset(...)
def build_valid_dataset(self):
return self._build_dataset(...)
def build_signatures(self, model):
return saved_model.Signatures(model, context_feature_spec,
example_feature_spec, mask_feature_name)()
Os hparams usados no DatasetBuilder são especificados na classe de tfr.keras.pipeline.DatasetHparams .
Pipeline
O Ranking Pipeline é baseado na classe tfr.keras.pipeline.AbstractPipeline :
class AbstractPipeline:
@abstractmethod
def build_loss(self):
// Returns a tf.keras.losses.Loss or a dict of Loss. To be overridden.
...
@abstractmethod
def build_metrics(self):
// Returns a list of evaluation metrics. To be overridden.
...
@abstractmethod
def build_weighted_metrics(self):
// Returns a list of weighted metrics. To be overridden.
...
@abstractmethod
def train_and_validate(self, *arg, **kwargs):
// Main function to run the training pipeline. To be overridden.
...
Uma classe de pipeline concreta que treina o modelo com diferentes tf.distribute.strategy s compatíveis com model.fit também é fornecida:
class ModelFitPipeline(AbstractPipeline):
def __init__(self, model_builder, dataset_builder, hparams):
...
def build_callbacks(self):
// Builds callbacks used in model.fit. Override for customized usage.
...
def export_saved_model(self, model, export_to, checkpoint=None):
if checkpoint:
model.load_weights(checkpoint)
model.save(export_to, signatures=dataset_builder.build_signatures(model))
def train_and_validate(self, verbose=0):
with self._strategy.scope():
model = model_builder.build()
model.compile(
optimizer,
loss=self.build_loss(),
metrics=self.build_metrics(),
loss_weights=self.hparams.loss_weights,
weighted_metrics=self.build_weighted_metrics())
train_dataset, valid_dataset = (
dataset_builder.build_train_dataset(),
dataset_builder.build_valid_dataset())
model.fit(
x=train_dataset,
validation_data=valid_dataset,
callbacks=self.build_callbacks(),
verbose=verbose)
self.export_saved_model(model, export_to=model_output_dir)
Os hparams usados no tfr.keras.pipeline.ModelFitPipeline são especificados na classe de tfr.keras.pipeline.PipelineHparams . Essa classe ModelFitPipeline é suficiente para a maioria dos casos de uso do TF Ranking. Os clientes podem facilmente subclassificá-lo para fins específicos.
Suporte de Estratégia Distribuída
Consulte o treinamento distribuído para obter uma introdução detalhada das estratégias distribuídas com suporte do TensorFlow. Atualmente, o pipeline do TensorFlow Ranking é compatível tf.distribute.MirroredStrategy (padrão), tf.distribute.TPUStrategy , tf.distribute.MultiWorkerMirroredStrategy e tf.distribute.ParameterServerStrategy . A estratégia espelhada é compatível com a maioria dos sistemas de máquina única. Defina a strategy como None para nenhuma estratégia distribuída.
Em geral, MirroredStrategy funciona para modelos relativamente pequenos na maioria dos dispositivos com opções de CPU e GPU. MultiWorkerMirroredStrategy funciona para grandes modelos que não cabem em um trabalhador. ParameterServerStrategy faz treinamento assíncrono e requer vários trabalhadores disponíveis. TPUStrategy é ideal para grandes modelos e big data quando TPUs estão disponíveis, no entanto, é menos flexível em termos de formas de tensor que pode manipular.
Perguntas frequentes
O conjunto mínimo de componentes para usar o
RankingPipeline
Veja o código de exemplo acima.E se eu tiver meu próprio
modelKeras
Para ser treinado com estratégiastf.distribute, omodelprecisa ser construído com todas as variáveis treináveis definidas em strategy.scope(). Então envolva seu modelo noModelBuildercomo,
class MyModelBuilder(AbstractModelBuilder):
def __init__(self, model, context_feature_names, example_feature_names,
mask_feature_name, name):
super().__init__(mask_feature_name, name)
self._model = model
self._context_feature_names = context_feature_names
self._example_feature_names = example_feature_names
def create_inputs(self):
inputs = self._model.input
context_inputs = {inputs[name] for name in self._context_feature_names}
example_inputs = {inputs[name] for name in self._example_feature_names}
mask = inputs[self._mask_feature_name]
return context_inputs, example_inputs, mask
def preprocess(self, context_inputs, example_inputs, mask):
return context_inputs, example_inputs, mask
def score(self, context_features, example_features, mask):
inputs = dict(
list(context_features.items()) + list(example_features.items()) +
[(self._mask_feature_name, mask)])
return self._model(inputs)
model_builder = MyModelBuilder(model, context_feature_names, example_feature_names,
mask_feature_name, "my_model")
Em seguida, alimente este model_builder ao pipeline para treinamento adicional.