TFXを使った機械学習パイプラインの構築(デプロイ編)
機械学習パイプラインの運用で役に立つKubeflow Pipelinesの機能
Kubeflow Pipelinesは、パイプラインのオーケストレーションのみならず、機械学習パイプラインの運用で役に立つさまざまな機能を提供しています。本稿では、その中でもTFXの仕組みを活用したArtifact VisualizationsとMetadata UIについて、具体的なユースケースに沿って紹介します。
- Artifact Visualizationsのユースケース
- パイプラインに新しく取り込まれたデータと前回のデータを可視化し比較する
- Metadata UIのユースケース
- モデルの学習に使われたデータの系統来歴を追跡する
パイプラインに新しく取り込まれたデータと前回のデータを可視化し比較する
Kubeflow Pipelinesは、本連載の第4回で解説した「データ分析」で利用するTFDVや第6回で解説した「モデル検証」で利用するTFMA、TensorBoardといった各種ツールと連携できるArtifact Visualizationsという機能を備えています。ここでは、TFDVを使ったデータの可視化を例に使い方を解説します。
- TFDVによるデータの可視化
まず、パイプラインの実行結果画面を開きます。次に、「statisticsgen」のステップをクリックし、「Visualizations」タブを選択します。
Visualizationsタブの画面下部にある「create visualizations manually」をクリックすると「Visualization Creator」画面が開きます。
「Visualization Creator」画面では、Typeに「CUSTOM」を選択すると、独自のコードを入力できるテキストフィールドが表示されます。このテキストフィールドに次のようなTFDVのコードを記述します。
import os import tensorflow_data_validation as tfdv from tensorflow_data_validation.utils import io_util from tensorflow_metadata.proto.v0 import statistics_pb2 #アップロードされた生成物のMinIO上のパスを入力する previous_result_path = 's3://census-income/pipelines/tfx_census_income/StatisticsGen/statistics/9/Split-train/FeatureStats.pb' #前回のStaticsGenのArtifactを格納したMinIO上のパス current_result_path = 's3://census-income/pipelines/tfx_census_income_2/StatisticsGen/statistics/27/Split-train/FeatureStats.pb' #今回のStatisticsGenのArtifactを格納したMinIO上のパス prev_stats_proto = statistics_pb2.DatasetFeatureStatisticsList() prev_stats_proto.ParseFromString(io_util.read_file_to_string(previous_result_path, binary_mode=True)) curr_stats_proto = statistics_pb2.DatasetFeatureStatisticsList() curr_stats_proto.ParseFromString(io_util.read_file_to_string(current_result_path, binary_mode=True)) tfdv.visualize_statistics(lhs_statistics=prev_stats_proto, rhs_statistics=curr_stats_proto, lhs_name='PREVIOUS', rhs_name='CURRENT' )
上記のコードは、MinIOに書き出されたStatisticsGenが計算した統計値などの出力結果(Artifact)を今回実行したものと前回実行したもので、可視化し比較するコード例となっています。
コードを入力した後に「Generate Visualization」をクリックすると可視化した結果が表示されます。
なお、上述のコード例で指定したコンポーネントの出力結果が格納されているMinIO上のパスは、「Visualizations」の「Outputs」より確認できます。
このようにKubeflow Pipelinesでパイプラインを自動化しつつも、Artifact Visualizations機能で「パイプラインに新しく取り込まれたデータと前回のデータを可視化し比較する」などのユースケースに対応できます。
モデルの学習に使われたデータの系統来歴を追跡する
機械学習パイプラインを運用するなかで「このモデルはどのデータを使って作成されたのか」や「このモデルはどのデータ変換処理を経て作られたのか」などの質問に答えなくてはならないケースがあります。これは特にモデルのレビューや監査において求められることが多いでしょう。この質問に答えるには、使用したデータや出力先などのメタデータを管理しておく必要があります。幸いにもTFXはこのようなメタデータをMLMDで自動的に記録することができます。さらにKubeflow Pipelinesを使うとMetadata Storeで一元管理できることに加え、このメタデータを簡単に参照できるMetadata UIを利用できます。
- Artifacts 画面を表示
まず、Pipelines UIの左ペインの「Artifacts」を選択します。
次に、表示された一覧からメタデータを参照したいArtifactを選択します。
ここでは出力済みのモデル(PushedModel)を選択し、メタデータを参照します。「Name」をクリックすることで、メタデータ確認画面を表示することができます。
このメタデータ確認画面に表示されている「URI」にて、実行したパイプラインによってアップロードされたモデルの格納先を確認することができます。さらに「Lineage Explorer」を選択すると系統来歴を追跡できるLineage Explorer画面が表示されます。
- Lineage Explorer
Lineage Explorerの画面では、自身のArtifactを示す「Target」とそのArtifactを出力したコンポーネントの入力となる「Input Artifact」、後続のコンポーネントが存在する場合は、「Output Artifact」が表示されます。
図2-19の赤枠で囲まれた■の部分をクリックしていくことで、パイプラインのArtifactをたどることができます。
図2-20のように、Artifactをたどることで、どのコンポーネントでどのような処理を経てモデルが作成されたかを追跡できます。
そして、入力データを取り込むコンポーネントのExampleGenまでたどることで、モデルを学習した時のデータセットを確認できます。図2-21は実際にExampleGenまでたどった結果となります。赤枠の部分をクリックすることで、メタデータ確認画面を開くことができます。
ExampleGenのメタデータを参照してみると、次の項目が確認できます。
- データセットが格納されたMinIO上のパス(input_base):s3://census-income/data/
- 入力データセットのパターン(input_config):span-{SPAN}/v{VERSION}/*
- 使用したデータセットのspanの値(span):1
- 使用したデータセットのversionの値(version):1
このようにKubeflow Pipelinesが提供するMetadata UIを利用することにより「モデルの学習に使われたデータの系統来歴を追跡する」といったユースケースに対応できます。
おわりに
今回は、TFXを使って構築した機械学習パイプラインをKubeflow Pipelinesにデプロイし実行する手順とその運用において役に立つ機能を解説しました。Kubeflow Pipelinesを使うことで、パイプラインのオーケストレーションのみならず、運用面でも大きなメリットを得られるかと考えています。次回は、機械学習に関わる全体のワークフローのうち「サービス運用」で実施するモデルのサービングについて解説していきます。
(補足)カスタムイメージの利用とKubeflowへの追加設定
本稿の解説内で個別に設定が必要な箇所を次に記載しています。
カスタムイメージの利用
Kubeflow Pipelines でパイプラインを実行する際、個別にライブラリなどを追加している場合は、予めパッケージングしたコンテナイメージを作成しコンテナレジストリに登録する必要があります。
下記の例で利用するAmazon Elastic Container Registry(ECR)のセットアップや使い方については、AWS公式ドキュメントを参照してください。
- Amazon ECRのリポジトリ作成
はじめにAWSマネージメントコンソールでリポジトリを作成します。
- Dockerfileを作成
次にDockerfileを作成します。個別に追加ライブラリがある場合は、RUNコマンドで記述します。
cat <<EOF > Dockerfile.tfx-kubeflow-pipeline FROM tensorflow/tfx:1.2.1 RUN pip3 install boto3==1.20.5 keras-tuner==1.0.2 EOF
- コンテナイメージをビルドし、AWS ECRにPushします。
aws ecr get-login-password --region us-east-1 | sudo docker login --username AWS --password-stdin <AccountID>.dkr.ecr.us-east-1.amazonaws.com sudo docker build -t tfx-kubeflow-pipeline . -f Dockerfile.tfx-kubeflow-pipeline sudo docker tag tfx-kubeflow-pipeline:latest <AccountID>.dkr.ecr.us-east-1.amazonaws.com/tfx-kubeflow-pipeline:1.0 sudo docker push <AccountID>.dkr.ecr.us-east-1.amazonaws.com/tfx-kubeflow-pipeline:1.0
※<AccountID>は利用する方のAWSアカウントに置き換えてください。
Kubeflow v1.2.0利用時における追加設定
本稿は、Kubeflow v1.2.0を前提に解説していますが、Artifact Visualizationなどの機能でMinIOに接続するには、Pipelines UIのPodに対し接続情報を設定する必要があります。
- Pipeline UIのPodに対する設定
$ kubectl edit deployment ml-pipeline-visualizationserver -n anonymous 追加内容(+の部分を追加する) spec: containers: - image: gcr.io/ml-pipeline/visualization-server:1.0.4 imagePullPolicy: IfNotPresent name: ml-pipeline-visualizationserver + env: + - name: S3_ENDPOINT + value: http://minio-service.kubeflow.svc.cluster.local:9000 + - name: AWS_REGION + value: ap-northeast-1 + - name: AWS_ACCESS_KEY_ID + valueFrom: + secretKeyRef: + key: accesskey + name: mlpipeline-minio-artifact + - name: AWS_SECRET_ACCESS_KEY + valueFrom: + secretKeyRef: + key: secretkey + name: mlpipeline-minio-artifact ports: - containerPort: 8888 protocol: TCP