TFXを使った機械学習パイプラインの構築(実装編その3)

2022年2月25日(金)
張替 清音(はりがえ きよなり)
連載の6回目となる今回は、前回に引き続きTFXを使ってKubeflow上で動かす機械学習パイプラインを構築していきます。
  • その他のモデル分析ツール

TFMA以外のTensorFlowエコシステムで利用できるモデル分析ツールについて、簡単に紹介します。

  • Fairness Indicator

Fairness Indicatorは、TFXのアドオンとして利用できるモデル分析ツールです。機能としてはTFMAとオーバーラップする部分が多いですが、有用な機能の一つとして、カットオフ値を変えながら、特徴量でスライスした指標を確認できる点が挙げられます。

次のようにEvaluatorの結果をFairness Indicatorに与えることで、対話的にモデル分析ができます。カットオフ値を変更しながら指標を確認するためには、Evaluatorの設定にカットオフ値を定義する必要があります。

fairness_eval_config = tfma.EvalConfig(
    model_specs = [tfma.ModelSpec(
        label_key='income_xf',
        preprocessing_function_names=['transform_features']
    )],
    slicing_specs = slices,
    metrics_specs = [
        tfma.MetricsSpec(metrics=[
            tfma.MetricConfig(class_name='ExampleCount'),   #サンプル数
            tfma.MetricConfig(class_name='Precision'),
            tfma.MetricConfig(class_name='Recall'),
            tfma.MetricConfig(class_name='F1Score'),
            tfma.MetricConfig(class_name='AUC'),
            tfma.MetricConfig(class_name='FalsePositives'),
            tfma.MetricConfig(class_name='TruePositives'),
            tfma.MetricConfig(class_name='FalseNegatives'),
            tfma.MetricConfig(class_name='TrueNegatives'),
            tfma.MetricConfig(class_name='FairnessIndicators',
                             config='{"thresholds": [0.25, 0.5, 0.75]}')
        ])
    ]
)

カットオフ値を定義したEvaluatorの設定を使用してFairness Indicatorによる分析をするためのEvaluatorを実行します。

fairness_evaluator = tfx.components.Evaluator(
    examples = example_gen.outputs['examples'],
    model = trainer.outputs['model'],
    eval_config = fairness_eval_config)
context.run(fairness_evaluator)
図2-7:Fairness Indicator用のEvaluator実行結果

図2-7:Fairness Indicator用のEvaluator実行結果

Evaluatorの実行結果をもとに、Fairness Indicatorを実行します。

fairness_eval_result = fairness_evaluator.outputs['evaluation'].get()[0].uri
fairness_tfma_result = tfma.load_eval_result(fairness_eval_result)

tfma.addons.fairness.view.widget_view.render_fairness_indicator(fairness_tfma_result)

実行すると次のような画面が表示されます。この画面でカットオフ値の選択やスライスする特徴量の選択ができます。

図2-8:Fairness Indicator

図2-8:Fairness Indicator

  • What-If Tool

What-If Toolは、モデルの動作をより詳細に調べることができるツールです。このツールの有用な機能の一つとして、ある特徴量のデータを変更させると予測結果がどのように変わるのかという検証を、GUI操作で可視化しながら行える点が挙げられます。

What-If Toolを使用するためには、TFMAと同様にJupyter notebookの拡張機能をインストールして有効化する必要があります。

# ノートブック拡張機能をインストール
!jupyter nbextension install --py --symlink witwidget --user
!jupyter nbextension enable --py witwidget

from witwidget.notebook.visualization import WitConfigBuilder
from witwidget.notebook.visualization import WitWidget

「データ分割」のステップで出力した評価用データセットと、前回「チューニング」のステップで作成した学習済みモデルを読み込みます。データセットはサンプリングして1000個のデータだけを使用するようにします。サンプル数が多いとモデルの理解が難しくなってしまうためです。

example_gen_train_uri = os.path.join(example_gen.outputs['examples'].get()[0].uri, 'Split-eval')
example_gen_train_tf_filenames = [os.path.join(example_gen_train_uri, name)
                      for name in os.listdir(example_gen_train_uri)]
wit_eval_data = tf.data.TFRecordDataset(example_gen_train_tf_filenames, compression_type="GZIP")
wit_eval_samples = [tf.train.Example.FromString(d.numpy()) for d in wit_eval_data.take(1000)]

model_dir = os.path.join(trainer.outputs['model'].get()[0].uri, 'Format-Serving')
wit_model = tf.saved_model.load(export_dir=model_dir)

次にモデルの予測関数を作成します。

def predict(examples):
    test_examples = tf.constant([example.SerializeToString() for example in examples])
    preds = wit_model.signatures['serving_default'](examples=test_examples)
    return preds['outputs'].numpy()

What-If Toolの設定を作成し、設定をもとにノードブックで可視化をします。

config_builder = WitConfigBuilder(wit_eval_samples).set_custom_predict_fn(predict)
WitWidget(config_builder)
図2-9:What-If Tool

図2-9:What-If Tool

  • Evaluatorによるモデルの検証の自動化

ここまでノートブック上でモデル検証を行ってきましたが、自動化された機械学習パイプラインでは、これらの検証を自動的に実行し、モデルの性能指標が要件を満たすことが確認できたら本番環境へデプロイするといった制御を行うことが重要です。Evaluatorでは、祝福(blessing)という概念を使って、予め定義した性能指標の閾値に基づいて、要件を満たしていることがわかった場合にそのモデルは祝福されて次のステップに進むという制御ができます。

次の例では、Evaluatorの設定にAUCが0.7以上で祝福し次のステップに進むという定義をしています。

blessing_eval_config = tfma.EvalConfig(
    model_specs = [tfma.ModelSpec(
        label_key='income_xf'
    )],
    slicing_specs = [tfma.SlicingSpec()],
    metrics_specs = [
        tfma.MetricsSpec(metrics=[
            tfma.MetricConfig(class_name='AUC',
                              threshold=tfma.MetricThreshold(
                                  value_threshold=tfma.GenericValueThreshold(lower_bound={'value': 0.70})
                              ))
        ])
    ]
)

AUCの閾値を定義したEvaluatorの設定を使用して、Evaluatorコンポーネントを実行します。

blessing_evaluator = tfx.components.Evaluator(
    examples = transform.outputs['transformed_examples'],
    model = trainer.outputs['model'],
    eval_config = blessing_eval_config)
context.run(blessing_evaluator)
図2-10:モデル検証の自動化をするEvaluatorの実行結果

図2-10:モデル検証の自動化をするEvaluatorの実行結果

結果は次のようにして確認できます。

blessing_result = blessing_evaluator.outputs['evaluation'].get()[0].uri
tfma.load_validation_result(blessing_result)

閾値以上の指標を満たし、祝福されると次のような結果を返却します。

図2-11:Evaluatorにより祝福された結果

図2-11:Evaluatorにより祝福された結果

学習済みモデルの出力

PusherというTFXコンポーネントを使って、学習済みモデルの出力を機械学習パイプラインに組み込む方法について解説します。

  • Pusherとは
    Pusherは学習済みモデルを保存する場所にアップロード(プッシュ)するTFXコンポーネントです。Evaluatorがそのモデルを祝福したかどうかをチェックし、祝福されていればPusherは指定された場所にモデルをアップロードします。

Pusherは主に次の入力を必要とします。

  • 「モデル検証」のステップで検証済みのモデル
  • Evaluatorコンポーネントの出力
  • モデルを保存する場所(アップロード先のファイルパス)

まずはモデルを保存する場所を定義します。今回はMinIOにアップロードするようにします。

param_push_destination = {"filesystem": {"base_directory": "%s/serving_model" % bucket_name_s3_prefix}}

Pusherコンポーネントを実行します。

pusher = tfx.components.Pusher(
    model=trainer.outputs['model'],
    model_blessing=evaluator.outputs['blessing'],
    push_destination=param_push_destination)
context.run(pusher)
図2-12:Pusherの実行結果

図2-12:Pusherの実行結果

モデルが指定された場所に正常にアップロードされると、モデルはデプロイ可能な状態になります。

おわりに

今回は「モデル作成」の最後のステップとなる「モデル検証」と「学習済みモデル」の出力についてTFXコンポーネントの解説と実装を行いました。次回はここまで実装したモデル開発のパイプラインをKubeflow上で実行するための手順の解説や、その運用において活用できるKubeflow Pipelinesの機能とTFXコンポーネントの機能について解説します。

著者
張替 清音(はりがえ きよなり)
NTTデータ先端技術株式会社

ソフトウェアソリューション事業本部 AIソリューション事業部 ビッグデータ基盤担当

2017年入社。HadoopやSparkといったOSSのビッグデータ基盤の導入支援や技術開発を経て、現在はサイバーセキュリティ対策のためのデータ分析基盤の構築や、 OSSをベースとしたクラウドネイティブなデータ分析・活用基盤に関する技術検証やソリューション開発に従事。

連載バックナンバー

AI・人工知能技術解説
第9回

機械学習モデルの継続的な改善に向けて

2022/6/13
連載の最終回となる今回は、機械学習モデルの開発と運用におけるパイプライン全体を協調動作させモデルを継続的に改善する仕組みについて解説します。
AI・人工知能技術解説
第8回

KFServingで機械学習モデルをサービング

2022/4/27
連載の8回目となる今回は、学習済みモデルのデプロイの手順とその運用で利用するKubeflowの機能やコンポーネントについて解説します。
AI・人工知能技術解説
第7回

TFXを使った機械学習パイプラインの構築(デプロイ編)

2022/3/30
連載の7回目となる今回は、実装編で構築した機械学習パイプラインをKubeflow Pipelinesにデプロイし実行します。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています