Эта страница была переведа с помощью Cloud Translation API.
Switch to English

Метаданные ML

Метаданные машинного обучения (MLMD) - это библиотека для записи и получения метаданных, связанных с рабочими процессами разработчиков машинного обучения и специалистов по данным. MLMD является неотъемлемой частью TensorFlow Extended (TFX) , но разработан таким образом, чтобы его можно было использовать независимо. В рамках более широкой платформы TFX большинство пользователей взаимодействуют с MLMD только при изучении результатов компонентов конвейера, например, в ноутбуках или в TensorBoard.

На графике ниже показаны компоненты, входящие в состав MLMD. Серверная часть хранилища подключаемая и может быть расширена. MLMD предоставляет стандартные реализации для SQLite (который поддерживает работу в памяти и на диске) и MySQL из коробки. MetadataStore предоставляет API-интерфейсы для записи и извлечения метаданных в серверную часть хранилища и из нее. MLMD может зарегистрировать:

  • метаданные об артефактах, созданных с помощью компонентов / этапов конвейеров
  • метаданные о выполнении этих компонентов / шагов
  • метаданные о конвейере и соответствующая информация о происхождении

Эти концепции более подробно объясняются ниже.

Обзор метаданных машинного обучения

Функциональность на основе MLMD

Отслеживание входов и выходов всех компонентов / шагов в рабочем процессе машинного обучения и их происхождения позволяет платформам машинного обучения включать несколько важных функций. Следующий список представляет собой неполный обзор некоторых из основных преимуществ.

  • Список всех артефактов определенного типа. Пример: все модели, которые прошли обучение.
  • Загрузите два артефакта одного типа для сравнения. Пример: сравните результаты двух экспериментов.
  • Покажите DAG всех связанных выполнений и их входных и выходных артефактов контекста. Пример: визуализировать рабочий процесс эксперимента для отладки и обнаружения.
  • Просмотрите все события назад, чтобы увидеть, как был создан артефакт. Примеры: посмотреть, какие данные вошли в модель; обеспечить соблюдение планов хранения данных.
  • Определите все артефакты, которые были созданы с использованием данного артефакта. Примеры: просмотреть все модели, обученные на основе определенного набора данных; отмечать модели, основанные на неверных данных.
  • Определите, выполнялось ли выполнение на тех же входах раньше. Пример: определить, выполнил ли компонент / шаг ту же работу, и предыдущий результат можно просто повторно использовать.
  • Запись и запрос контекста выполнения рабочего процесса. Примеры: отслеживать владельца и список изменений, используемых для выполнения рабочего процесса; сгруппировать родословную по экспериментам; управлять артефактами по проектам.

Серверная часть хранилища метаданных и конфигурация подключения к хранилищу

Перед настройкой хранилища данных вам необходимо настроить импорт.

from ml_metadata import metadata_store
from ml_metadata.proto import metadata_store_pb2

Объект MetadataStore получает конфигурацию подключения, соответствующую используемой серверной части хранилища.

  • Fake Database предоставляет базу данных в памяти (с использованием SQLite) для быстрых экспериментов и локальных запусков. База данных удаляется при уничтожении объекта хранилища.
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)

Хранилище метаданных

Концепции

Хранилище метаданных использует следующую модель данных для записи и извлечения метаданных из серверной части хранилища.

  • ArtifactType описывает тип артефакта и его свойства, которые хранятся в хранилище метаданных. Эти типы могут быть зарегистрированы "на лету" в хранилище метаданных в коде или загружены в хранилище из сериализованного формата. После регистрации типа его определение доступно в течение всего времени существования магазина.
  • Artifact описывает определенные экземпляры типа ArtifactType и его свойства, которые записываются в хранилище метаданных.
  • ExecutionType описывает тип компонента или шага рабочего процесса и его параметры времени выполнения.
  • Execution - это запись запуска компонента или шага в рабочем процессе машинного обучения и параметры времени выполнения. Execution можно рассматривать как экземпляр ExecutionType . Каждый раз, когда разработчик запускает конвейер или шаг машинного обучения, выполнение записывается для каждого шага.
  • Event - это запись отношения между Artifact и Executions . Когда происходит Execution , Event записывает каждый артефакт, который использовался Execution , и каждый Artifact который был создан. Эти записи позволяют отслеживать происхождение на протяжении всего рабочего процесса. Просматривая все События, MLMD знает, какие Выполнения произошли, какие Артефакты были созданы в результате, и может рекурсивно возвращаться от любого Artifact ко всем его исходным входам.
  • ContextType описывает тип концептуальной группы Artifacts и Executions в ContextType и его структурные свойства. Например: проекты, конвейеры, эксперименты, владельцы.
  • Context - это экземпляры ContextType . Он фиксирует общую информацию внутри группы. Например: название проекта, идентификатор фиксации списка изменений, аннотации эксперимента. Он имеет определяемое пользователем уникальное имя в пределах своего ContextType .
  • Attribution - это запись отношения между Артефактами и Контекстами.
  • Association - это запись отношения между исполнениями и контекстами.

Отслеживание рабочих процессов машинного обучения с помощью метаданных машинного обучения

Ниже приведен график, показывающий, как низкоуровневые API-интерфейсы метаданных машинного обучения могут использоваться для отслеживания выполнения обучающей задачи, а также примеры кода. Обратите внимание, что код в этом разделе показывает API-интерфейсы метаданных машинного обучения, которые должны использоваться разработчиками платформы машинного обучения для интеграции своей платформы с метаданными машинного обучения, а не напрямую разработчиками. Кроме того, мы предоставим API-интерфейсы Python более высокого уровня, которые могут использоваться специалистами по обработке данных в среде записных книжек для записи метаданных своих экспериментов.

Пример потока метаданных ML

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)

2) Перед записью выполнения должны быть зарегистрированы ExecutionTypes для всех этапов рабочего процесса машинного обучения.

# Create 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)

3) После регистрации типов мы создаем артефакт DataSet.

# Declare 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])[0]

4) Создав артефакт DataSet, мы можем создать выполнение для запуска трейнера.

# 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])[0]

5) Объявите входное событие и прочтите данные.

# Declare 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

# Submit input event to the Metadata Store
store.put_events([input_event])

6) Теперь, когда ввод прочитан, мы объявляем артефакт вывода.

# Declare 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])[0]

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) Затем артефакты и исполнения могут быть сгруппированы в контекст (например, эксперимент).

# Similarly, 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])[0]

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])

С удаленным сервером grpc

1) Запустите сервер с

bazel run -c opt --define grpc_no_ares=true  //ml_metadata/metadata_store:metadata_store_server

2) Создайте клиентскую заглушку и используйте ее в 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)

3) Используйте MLMD с вызовами RPC

# 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)