1

現在、TFX パイプラインのトレーナー コンポーネントを、同じパイプラインの前回の実行からウォーム スタートしようとしています。使用例は次のとおりです。

  1. パイプラインを 1 回実行し、モデルを生成します。
  2. 新しいデータが入ってきたら、既存のモデルを新しいデータでトレーニングします。

コンポーネントがこの目的のために設計されていることは認識しているResolverNodeので、以下でそれをどのように使用するかを確認できます。

# detect the previously trained model
latest_model_resolver = ResolverNode(
  instance_name='latest_model_resolver',
  resolver_class=latest_artifacts_resolver.LatestArtifactsResolver,
  latest_model=Channel(type=Model))
context.run(latest_model_resolver)

# set prior model as base_model
train_file = 'tfx_modules/recommender_train.py'
trainer = Trainer(
    module_file=os.path.abspath(train_file),
    custom_executor_spec=executor_spec.ExecutorClassSpec(GenericExecutor),
    transformed_examples=transform.outputs['transformed_examples'],
    transform_graph=transform.outputs['transform_graph'],
    schema=schema_gen.outputs['schema'],
    train_args=trainer_pb2.TrainArgs(num_steps=10000),
    eval_args=trainer_pb2.EvalArgs(num_steps=5000),
    base_model=latest_model_resolver.outputs['latest_model'])

上記のコンポーネントは正常に実行さResolverNodeれ、以前のパイプライン実行から最新のモデルを検出できます。エラーはスローされませんが、 を実行するcontext.run(trainer)と、モデルの損失は基本的に最初に開始した場所から始まります。モデルの最初の実行後、トレーニング ロスは ~0.1 で終了しますが、2 回目の実行 (想定されるウォーム スタートを使用) では、~18.2 に戻ります。

これにより、すべての重みが再初期化されたと思われますが、これは発生すべきではないと思います。以下は、関連するモデル構築関数です。

def build_keras_model():
    """build keras model"""
    embedding_max_values = load(open(os.path.abspath('tfx-example/user_artifacts/embedding_max_dict.pkl'), 'rb'))
    embedding_dimensions = dict([(key, 20) for key in embedding_max_values.keys()])
    embedding_pairs = [recommender.EmbeddingPair(embedding_name=feature,
                                                 embedding_dimension=embedding_dimensions[feature],
                                                 embedding_max_val=embedding_max_values[feature])
                       for feature in recommender_constants.univalent_features]

    numeric_inputs = []
    for num_feature in recommender_constants.numeric_features:
        numeric_inputs.append(keras.Input(shape=(1,), name=num_feature))

    input_layers = numeric_inputs + [elem for pair in embedding_pairs for elem in pair.input_layers]
    pre_concat_layers = numeric_inputs + [elem for pair in embedding_pairs for elem in pair.embedding_layers]

    concat = keras.layers.Concatenate()(pre_concat_layers) if len(pre_concat_layers) > 1 else pre_concat_layers[0]
    layer_1 = keras.layers.Dense(64, activation='relu', name='layer1')(concat)
    output = keras.layers.Dense(1, kernel_initializer='lecun_uniform', name='out')(layer_1)
    model = keras.models.Model(input_layers, outputs=output)
    model.compile(optimizer='adam', loss='mean_squared_error')
    return model

def run_fn(fn_args: TrainerFnArgs):
    """function for the Trainer component"""
    tf_transform_output = tft.TFTransformOutput(fn_args.transform_output)

    train_dataset = _input_fn(fn_args.train_files, fn_args.data_accessor,
                              tf_transform_output, 40)
    eval_dataset = _input_fn(fn_args.eval_files, fn_args.data_accessor,
                             tf_transform_output, 40)

    model = build_keras_model()
    tensorboard_callback = tf.keras.callbacks.TensorBoard(
        log_dir=fn_args.model_run_dir, update_freq='epoch', histogram_freq=1,
        write_images=True)
    model.fit(train_dataset, steps_per_epoch=fn_args.train_steps, validation_data=eval_dataset,
              validation_steps=fn_args.eval_steps, callbacks=[tensorboard_callback],
              epochs=5)

    signatures = {
        'serving_default':
            _get_serve_tf_examples_fn(model, tf_transform_output).get_concrete_function(tf.TensorSpec(
                    shape=[None],
                    dtype=tf.string,
                    name='examples')
            )
    }
    model.save(fn_args.serving_model_dir, save_format='tf', signatures=signatures)

問題を調査するために、私は熟読しました:

TFX からのウォーム スタートの例 https://github.com/tensorflow/tfx/blob/master/tfx/examples/chicago_taxi_pipeline/taxi_pipeline_warmstart.py

ただし、このガイドEstimatorでは Keras コンポーネントの代わりに コンポーネントを使用します。そのコンポーネントにはwarm_start_from、Keras に相当するものを見つけることができなかった初期化パラメーターがあります。

私は疑う:

  1. ウォーム スタート機能はコンポーネントでのみ使用でき、Keras コンポーネントに設定されEstimatorていても有効になりません。base_model

  2. 以前のモデルを正常にロードした後でも、重みを再初期化するようにモデルに何らかの方法で指示しています。その場合、それがどこで起こっているかについてのポインタが欲しいです。

どんな援助も素晴らしいでしょう!どうもありがとう。

4

1 に答える 1

1

Keras モデルでは、最初にベース モデル パスを使用してモデルをロードする必要があります。その後、新しいモデルを構築する代わりに、そこからトレーニングを続けることができます。

Trainer コンポーネントは正しいように見えますが、run_fn代わりに次のことを行います。

def run_fn(fn_args: FnArgs):
  model = tf.keras.models.load_model(fn_args.base_model)
  model.fit(train_dataset, steps_per_epoch=fn_args.train_steps, validation_data=eval_dataset,
              validation_steps=fn_args.eval_steps, callbacks=[tensorboard_callback],
              epochs=5)
于 2021-10-08T01:07:52.797 に答える