ML Metadata(MLMD)는 ML 개발자 및 데이터 과학자 워크플로와 관련된 메타데이터를 기록하고 검색하기 위한 라이브러리입니다. MLMD는 TensorFlow Extended(TFX)의 필수 부분이지만 독립적으로 사용할 수 있도록 설계되었습니다.
프로덕션 ML 파이프라인의 모든 실행의 결과로, 다양한 파이프라인 구성 요소, 실행(예: 학습 실행) 및 결과 아티팩트(예: 학습된 모델)에 대한 정보를 포함하는 메타데이터가 생성됩니다. 예기치 않은 파이프라인 동작이나 오류가 발생하는 경우 이 메타데이터를 활용하여 파이프라인 구성 요소의 계보를 분석하고 문제를 디버그할 수 있습니다. 이 메타데이터를 소프트웨어 개발을 기록하는 것으로 생각하면 이해가 쉽습니다.
MLMD는 ML 파이프라인의 상호 연결된 모든 부분을 개별적으로 분석하지 않고도 쉽게 이해하고 분석할 수 있게 해주며 ML 파이프라인에 관한 다음과 같은 물음에 답하는 데 도움을 줄 수 있습니다.
- 모델이 학습한 데이터세트는 무엇입니까?
- 모델 훈련에 사용된 하이퍼 파라미터는 무엇입니까?
- 모델을 생성한 파이프라인 실행은 무엇입니까?
- 이 모델로 이어진 훈련 실행은 무엇입니까?
- 이 모델을 만든 TensorFlow 버전은 무엇입니까?
- 실패한 모델은 언제 푸시되었습니까?
메타데이터 저장소
MLMD는 메타데이터 저장소라는 데이터베이스에 다음 유형의 메타데이터를 등록합니다.
- ML 파이프라인의 구성 요소/단계를 통해 생성된 아티팩트에 대한 메타데이터
- 이러한 구성 요소/단계의 실행에 대한 메타데이터
- 파이프라인 및 관련 계보 정보에 대한 메타데이터
메타데이터 저장소는 저장소 백엔드에서 메타데이터를 기록하고 검색하는 API를 제공합니다. 스토리지 백엔드는 플러그 가능하고 확장할 수 있습니다. MLMD는 SQLite(인메모리 및 디스크 지원) 및 MySQL에 대한 참조 구현을 즉시 제공합니다.
이 그래픽은 MLMD의 일부인 다양한 구성 요소에 대한 높은 수준의 개요를 보여줍니다.
메타데이터 스토리지 백엔드 및 저장소 연결 구성
MetadataStore
객체는 사용된 스토리지 백엔드에 해당하는 연결 구성을 수신합니다.
- Fake Database는 빠른 실험과 로컬 실행을 위해 인메모리 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(quickstart, connect-overview)과 함께 MySQL 인스턴스를 사용하면, 해당하는 경우 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 플랫폼에서 몇 가지 중요한 기능을 사용할 수 있습니다. 다음 목록은 몇 가지 주요 이점에 대한 포괄적인 개요를 제공합니다.
- 특정 유형의 모든 아티팩트를 나열합니다. 예: 훈련된 모든 모델
- 비교를 위해 같은 유형의 두 아티팩트를 로드합니다. 예: 두 실험의 결과를 비교합니다.
- 모든 관련 실행의 DAG와 컨텍스트의 입력 및 출력 아티팩트를 표시합니다. 예: 디버깅 및 발견을 위한 실험의 워크플로를 시각화합니다.
- 모든 이벤트를 다시 반복하여 아티팩트가 어떻게 만들어졌는지 확인합니다. 예: 모델에 들어간 데이터를 확인하고, 데이터 보존 계획을 시행합니다.
- 주어진 아티팩트를 사용하여 만들어진 모든 아티팩트를 식별합니다. 예: 특정 데이터세트에서 훈련된 모든 모델을 확인하고, 잘못된 데이터를 기반으로 한 모델을 표시합니다.
- 이전에 같은 입력에서 실행이 수행되었는지 확인합니다. 예: 구성 요소/단계가 이미 같은 작업을 완료했고 이전 출력을 다시 사용할 수 있는지 확인합니다.
- 워크플로 실행의 컨텍스트를 기록하고 쿼리합니다. 예: 워크플로 실행에 사용되는 소유자 및 변경 목록을 추적하고, 실험별로 계보를 그룹화하며, 프로젝트별로 아티팩트를 관리합니다.
MLMD API 및 메타데이터 저장소를 사용하여 계보 정보를 검색하는 방법을 보여주는 예제는 MLMD 튜토리얼을 참조하세요.
ML 워크플로에 ML 메타데이터 통합하기
MLMD를 시스템에 통합하는 데 관심이 있는 플랫폼 개발자인 경우, 아래 예제 워크플로를 사용하여 저수준 MLMD API로 학습 작업의 실행을 추적해 보세요. 노트북 환경에서 더 높은 수준의 Python API를 사용하여 실험 메타데이터를 기록할 수도 있습니다.
- 아티팩트 유형을 등록합니다.
# 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()
- 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])
- DataSet ArtifactType의 아티팩트를 만듭니다.
# 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)
- Trainer 실행의 실행을 만듭니다.
# 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])
- 입력 이벤트를 정의하고 데이터를 읽습니다.
# 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])
- 출력 아티팩트를 선언합니다.
# 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])
- 출력 이벤트를 기록합니다.
# 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])
- 실행을 완료된 것으로 표시합니다.
trainer_run.id = run_id
trainer_run.properties["state"].string_value = "COMPLETED"
store.put_executions([trainer_run])
- 특성 및 어설션 아티팩트를 사용하여 하나의 컨텍스트 아래에 아티팩트와 실행을 그룹화합니다.
# 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)
원격 gRPC 서버와 함께 MLMD 사용하기
아래와 같이 원격 gRPC 서버에서 MLMD를 사용할 수 있습니다.
- 서버 시작
bazel run -c opt --define grpc_no_ares=true //ml_metadata/metadata_store:metadata_store_server
기본적으로, 서버는 매 요청시 가짜 인메모리 db를 사용하며 호출 간에 메타데이터를 유지하지 않습니다. SQLite 파일 또는 MySQL 인스턴스를 사용하도록 MLMD MetadataStoreServerConfig
로 구성할 수도 있습니다. 구성은 텍스트 protobuf 파일에 저장하고 -metadata_store_server_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가 있습니다. 자세한 내용은 MLMD API 문서를 참조하세요.
또한 MLMD 튜토리얼에서 MLMD를 사용하여 파이프라인 구성 요소의 계보를 추적하는 방법을 알아보세요.