MLメタデータ(MLMD)は、ML開発者およびデータサイエンティストのワークフローに関連するメタデータを記録および取得するためのライブラリです。 MLMDはTensorFlowExtended(TFX)の不可欠な部分ですが、独立して使用できるように設計されています。
本番MLパイプラインを実行するたびに、さまざまなパイプラインコンポーネント、それらの実行(トレーニング実行など)、および結果のアーティファクト(トレーニング済みモデルなど)に関する情報を含むメタデータが生成されます。予期しないパイプラインの動作やエラーが発生した場合、このメタデータを利用して、パイプラインコンポーネントの系統を分析し、問題をデバッグできます。このメタデータは、ソフトウェア開発にログインするのと同じものと考えてください。
MLMDは、MLパイプラインの相互接続されたすべての部分を個別に分析するのではなく、理解して分析するのに役立ち、次のようなMLパイプラインに関する質問に答えるのに役立ちます。
- モデルはどのデータセットでトレーニングしましたか?
- モデルのトレーニングに使用されたハイパーパラメータは何でしたか?
- どのパイプラインの実行がモデルを作成しましたか?
- どのトレーニングランがこのモデルにつながりましたか?
- このモデルを作成したTensorFlowのバージョンはどれですか?
- 故障したモデルはいつプッシュされましたか?
メタデータストア
MLMDは、次のタイプのメタデータをメタデータストアと呼ばれるデータベースに登録します。
- MLパイプラインのコンポーネント/ステップを通じて生成されたアーティファクトに関するメタデータ
- これらのコンポーネント/ステップの実行に関するメタデータ
- パイプラインおよび関連する系統情報に関するメタデータ
メタデータストアは、ストレージバックエンドとの間でメタデータを記録および取得するためのAPIを提供します。ストレージバックエンドはプラグイン可能であり、拡張することができます。 MLMDは、SQLite(インメモリとディスクをサポート)とMySQLのリファレンス実装をすぐに提供します。
この図は、MLMDの一部であるさまざまなコンポーネントの概要を示しています。
メタデータストレージバックエンドとストア接続構成
MetadataStore
オブジェクトは、使用されるストレージバックエンドに対応する接続構成を受け取ります。
- 偽のデータベースは、高速な実験とローカル実行のためのメモリ内DB(SQLiteを使用)を提供します。ストアオブジェクトが破棄されると、データベースは削除されます。
import ml_metadata as mlmd
from ml_metadata.metadata_store import metadata_store
from ml_metadata.proto import metadata_store_pb2
connection_config = metadata_store_pb2.ConnectionConfig()
connection_config.fake_database.SetInParent() # Sets an empty fake database proto.
store = metadata_store.MetadataStore(connection_config)
- SQLiteはディスクからファイルを読み書きします。
connection_config = metadata_store_pb2.ConnectionConfig()
connection_config.sqlite.filename_uri = '...'
connection_config.sqlite.connection_mode = 3 # READWRITE_OPENCREATE
store = metadata_store.MetadataStore(connection_config)
- MySQLはMySQLサーバーに接続します。
connection_config = metadata_store_pb2.ConnectionConfig()
connection_config.mysql.host = '...'
connection_config.mysql.port = '...'
connection_config.mysql.database = '...'
connection_config.mysql.user = '...'
connection_config.mysql.password = '...'
store = metadata_store.MetadataStore(connection_config)
同様に、Google CloudSQLでMySQLインスタンスを使用する場合( quickstart 、 connect-overview )、該当する場合はSSLオプションを使用することもできます。
connection_config.mysql.ssl_options.key = '...'
connection_config.mysql.ssl_options.cert = '...'
connection_config.mysql.ssl_options.ca = '...'
connection_config.mysql.ssl_options.capath = '...'
connection_config.mysql.ssl_options.cipher = '...'
connection_config.mysql.ssl_options.verify_server_cert = '...'
store = metadata_store.MetadataStore(connection_config)
データ・モデル
メタデータストアは、次のデータモデルを使用して、ストレージバックエンドからメタデータを記録および取得します。
-
ArtifactType
は、メタデータストアに格納されているアーティファクトのタイプとそのプロパティを記述します。これらのタイプをオンザフライでメタデータストアにコードで登録することも、シリアル化された形式からストアにロードすることもできます。タイプを登録すると、その定義はストアの存続期間を通じて利用可能になります。 -
Artifact
は、ArtifactType
の特定のインスタンスと、メタデータストアに書き込まれるそのプロパティを記述します。 -
ExecutionType
は、ワークフロー内のコンポーネントまたはステップのタイプ、およびそのランタイムパラメーターを記述します。 -
Execution
は、MLワークフローのコンポーネント実行またはステップとランタイムパラメーターの記録です。実行は、ExecutionType
のインスタンスと考えることができます。 MLパイプラインまたはステップを実行すると、実行が記録されます。 -
Event
は、アーティファクトと実行の間の関係の記録です。実行が発生すると、イベントは、実行によって使用されたすべてのアーティファクトと、生成されたすべてのアーティファクトを記録します。これらのレコードにより、ワークフロー全体で系統の追跡が可能になります。 MLMDは、すべてのイベントを確認することで、発生した実行と、その結果として作成されたアーティファクトを認識します。その後、MLMDは、任意のアーティファクトからそのすべてのアップストリーム入力に再帰的に戻ることができます。 -
ContextType
は、ワークフロー内のアーティファクトと実行の概念的なグループのタイプ、およびその構造プロパティを記述します。例:プロジェクト、パイプラインの実行、実験、所有者など。 -
Context
は、ContextType
のインスタンスです。グループ内の共有情報をキャプチャします。例:プロジェクト名、チェンジリストコミットID、実験アノテーションなどContextType
内にユーザー定義の一意の名前があります。 -
Attribution
は、アーティファクトとコンテキストの間の関係の記録です。 -
Association
は、実行とコンテキストの間の関係の記録です。
MLMD機能
MLワークフローのすべてのコンポーネント/ステップの入力と出力、およびそれらの系統を追跡することで、MLプラットフォームでいくつかの重要な機能を有効にできます。次のリストは、主な利点のいくつかの非網羅的な概要を示しています。
- 特定のタイプのすべてのアーティファクトを一覧表示します。例:トレーニングされたすべてのモデル。
- 比較のために、同じタイプの2つのアーティファクトをロードします。例:2つの実験の結果を比較します。
- 関連するすべての実行のDAGと、コンテキストの入力および出力アーティファクトを表示します。例:デバッグと発見のための実験のワークフローを視覚化します。
- すべてのイベントを繰り返して、アーティファクトがどのように作成されたかを確認します。例:どのデータがモデルに入ったかを確認します。データ保持計画を実施します。
- 特定のアーティファクトを使用して作成されたすべてのアーティファクトを識別します。例:特定のデータセットからトレーニングされたすべてのモデルを参照してください。不良データに基づいてモデルにマークを付けます。
- 以前に同じ入力で実行が実行されたかどうかを判別します。例:コンポーネント/ステップがすでに同じ作業を完了していて、前の出力を再利用できるかどうかを判断します。
- ワークフロー実行のコンテキストを記録および照会します。例:ワークフローの実行に使用された所有者と変更リストを追跡します。実験によって系統をグループ化します。プロジェクトごとにアーティファクトを管理します。
- プロパティおよび1ホップ近隣ノードの宣言型ノードフィルタリング機能。例:あるタイプのアーティファクトをパイプラインコンテキストで探します。指定されたプロパティの値が範囲内にある型付きアーティファクトを返します。同じ入力を持つコンテキストで以前の実行を検索します。
MLMD APIとメタデータストアを使用して系統情報を取得する方法を示す例については、 MLMDチュートリアルを参照してください。
MLメタデータをMLワークフローに統合する
MLMDをシステムに統合することに関心のあるプラットフォーム開発者の場合は、以下のワークフロー例を使用して、低レベルのMLMDAPIを使用してトレーニングタスクの実行を追跡します。ノートブック環境で高レベルのPythonAPIを使用して、実験のメタデータを記録することもできます。
1)アーティファクトタイプを登録する
# Create ArtifactTypes, e.g., Data and Model
data_type = metadata_store_pb2.ArtifactType()
data_type.name = "DataSet"
data_type.properties["day"] = metadata_store_pb2.INT
data_type.properties["split"] = metadata_store_pb2.STRING
data_type_id = store.put_artifact_type(data_type)
model_type = metadata_store_pb2.ArtifactType()
model_type.name = "SavedModel"
model_type.properties["version"] = metadata_store_pb2.INT
model_type.properties["name"] = metadata_store_pb2.STRING
model_type_id = store.put_artifact_type(model_type)
# Query all registered Artifact types.
artifact_types = store.get_artifact_types()
2)MLワークフローのすべてのステップの実行タイプを登録します
# Create an ExecutionType, e.g., Trainer
trainer_type = metadata_store_pb2.ExecutionType()
trainer_type.name = "Trainer"
trainer_type.properties["state"] = metadata_store_pb2.STRING
trainer_type_id = store.put_execution_type(trainer_type)
# Query a registered Execution type with the returned id
[registered_type] = store.get_execution_types_by_id([trainer_type_id])
3)DataSetArtifactTypeのアーティファクトを作成します
# Create an input artifact of type DataSet
data_artifact = metadata_store_pb2.Artifact()
data_artifact.uri = 'path/to/data'
data_artifact.properties["day"].int_value = 1
data_artifact.properties["split"].string_value = 'train'
data_artifact.type_id = data_type_id
[data_artifact_id] = store.put_artifacts([data_artifact])
# Query all registered Artifacts
artifacts = store.get_artifacts()
# Plus, there are many ways to query the same Artifact
[stored_data_artifact] = store.get_artifacts_by_id([data_artifact_id])
artifacts_with_uri = store.get_artifacts_by_uri(data_artifact.uri)
artifacts_with_conditions = store.get_artifacts(
list_options=mlmd.ListOptions(
filter_query='uri LIKE "%/data" AND properties.day.int_value > 0'))
4)トレーナー実行の実行を作成します
# Register the Execution of a Trainer run
trainer_run = metadata_store_pb2.Execution()
trainer_run.type_id = trainer_type_id
trainer_run.properties["state"].string_value = "RUNNING"
[run_id] = store.put_executions([trainer_run])
# Query all registered Execution
executions = store.get_executions_by_id([run_id])
# Similarly, the same execution can be queried with conditions.
executions_with_conditions = store.get_executions(
list_options = mlmd.ListOptions(
filter_query='type = "Trainer" AND properties.state.string_value IS NOT NULL'))
5)入力イベントを定義し、データを読み取ります
# Define the input event
input_event = metadata_store_pb2.Event()
input_event.artifact_id = data_artifact_id
input_event.execution_id = run_id
input_event.type = metadata_store_pb2.Event.DECLARED_INPUT
# Record the input event in the metadata store
store.put_events([input_event])
6)出力アーティファクトを宣言します
# Declare the output artifact of type SavedModel
model_artifact = metadata_store_pb2.Artifact()
model_artifact.uri = 'path/to/model/file'
model_artifact.properties["version"].int_value = 1
model_artifact.properties["name"].string_value = 'MNIST-v1'
model_artifact.type_id = model_type_id
[model_artifact_id] = store.put_artifacts([model_artifact])
7)出力イベントを記録します
# Declare the output event
output_event = metadata_store_pb2.Event()
output_event.artifact_id = model_artifact_id
output_event.execution_id = run_id
output_event.type = metadata_store_pb2.Event.DECLARED_OUTPUT
# Submit output event to the Metadata Store
store.put_events([output_event])
8)実行を完了としてマークします
trainer_run.id = run_id
trainer_run.properties["state"].string_value = "COMPLETED"
store.put_executions([trainer_run])
9)アトリビューションとアサーションアーティファクトを使用して、コンテキストの下でアーティファクトと実行をグループ化します
# Create a ContextType, e.g., Experiment with a note property
experiment_type = metadata_store_pb2.ContextType()
experiment_type.name = "Experiment"
experiment_type.properties["note"] = metadata_store_pb2.STRING
experiment_type_id = store.put_context_type(experiment_type)
# Group the model and the trainer run to an experiment.
my_experiment = metadata_store_pb2.Context()
my_experiment.type_id = experiment_type_id
# Give the experiment a name
my_experiment.name = "exp1"
my_experiment.properties["note"].string_value = "My first experiment."
[experiment_id] = store.put_contexts([my_experiment])
attribution = metadata_store_pb2.Attribution()
attribution.artifact_id = model_artifact_id
attribution.context_id = experiment_id
association = metadata_store_pb2.Association()
association.execution_id = run_id
association.context_id = experiment_id
store.put_attributions_and_associations([attribution], [association])
# Query the Artifacts and Executions that are linked to the Context.
experiment_artifacts = store.get_artifacts_by_context(experiment_id)
experiment_executions = store.get_executions_by_context(experiment_id)
# You can also use neighborhood queries to fetch these artifacts and executions
# with conditions.
experiment_artifacts_with_conditions = store.get_artifacts(
list_options = mlmd.ListOptions(
filter_query=('contexts_a.type = "Experiment" AND contexts_a.name = "exp1"')))
experiment_executions_with_conditions = store.get_executions(
list_options = mlmd.ListOptions(
filter_query=('contexts_a.id = {}'.format(experiment_id))))
リモートgRPCサーバーでMLMDを使用する
以下に示すように、リモートgRPCサーバーでMLMDを使用できます。
- サーバーを起動します
bazel run -c opt --define grpc_no_ares=true //ml_metadata/metadata_store:metadata_store_server
デフォルトでは、サーバーはリクエストごとに偽のメモリ内データベースを使用し、呼び出し間でメタデータを保持しません。また、MLMD MetadataStoreServerConfig
を使用して、SQLiteファイルまたはMySQLインスタンスを使用するように構成することもできます。構成はテキストprotobufファイルに保存し、 --metadata_store_server_config_file=path_to_the_config_file
を使用してバイナリに渡すことができます。
テキストprotobuf形式のMetadataStoreServerConfig
ファイルの例:
connection_config {
sqlite {
filename_uri: '/tmp/test_db'
connection_mode: READWRITE_OPENCREATE
}
}
- クライアントスタブを作成し、Pythonで使用します
from grpc import insecure_channel
from ml_metadata.proto import metadata_store_pb2
from ml_metadata.proto import metadata_store_service_pb2
from ml_metadata.proto import metadata_store_service_pb2_grpc
channel = insecure_channel('localhost:8080')
stub = metadata_store_service_pb2_grpc.MetadataStoreServiceStub(channel)
- RPC呼び出しでMLMDを使用する
# Create ArtifactTypes, e.g., Data and Model
data_type = metadata_store_pb2.ArtifactType()
data_type.name = "DataSet"
data_type.properties["day"] = metadata_store_pb2.INT
data_type.properties["split"] = metadata_store_pb2.STRING
request = metadata_store_service_pb2.PutArtifactTypeRequest()
request.all_fields_match = True
request.artifact_type.CopyFrom(data_type)
stub.PutArtifactType(request)
model_type = metadata_store_pb2.ArtifactType()
model_type.name = "SavedModel"
model_type.properties["version"] = metadata_store_pb2.INT
model_type.properties["name"] = metadata_store_pb2.STRING
request.artifact_type.CopyFrom(model_type)
stub.PutArtifactType(request)
資力
MLMDライブラリには、MLパイプラインで簡単に使用できる高レベルのAPIがあります。詳細については、 MLMDAPIのドキュメントを参照してください。
プロパティおよび1ホップ近隣ノードでMLMD宣言型ノードフィルタリング機能を使用する方法については、 MLMD宣言型ノードフィルタリングを確認してください。
また、 MLMDチュートリアルをチェックして、MLMDを使用してパイプラインコンポーネントの系統をトレースする方法を学習してください。
MLMDは、リリース間でのスキーマとデータの移行を処理するためのユーティリティを提供します。詳細については、MLMDガイドを参照してください。