Присоединяйтесь к сообществу SIG TFX-Addons и помогите сделать TFX еще лучше! Присоединяйтесь к SIG TFX-Addons

Метаданные ML

ML Metadata (MLMD) представляет собой библиотеку для записи и извлечения метаданных , связанных с ML разработчиков и ученых данных рабочих процессов. MLMD является неотъемлемой частью TensorFlow Extended (TFX) , но устроен так , что он может быть использован самостоятельно.

Каждый запуск производственного конвейера машинного обучения генерирует метаданные, содержащие информацию о различных компонентах конвейера, их выполнении (например, запусках обучения) и результирующих артефактах (например, обученных моделях). В случае неожиданного поведения конвейера или ошибок эти метаданные могут быть использованы для анализа происхождения компонентов конвейера и проблем отладки. Эти метаданные можно рассматривать как эквивалент ведения журнала при разработке программного обеспечения.

MLMD помогает вам понять и проанализировать все взаимосвязанные части вашего конвейера машинного обучения вместо того, чтобы анализировать их изолированно, и может помочь вам ответить на вопросы о своем конвейере машинного обучения, такие как:

  • На каком наборе данных обучалась модель?
  • Какие гиперпараметры использовались для обучения модели?
  • Какой участок трубопровода создал модель?
  • Какой тренировочный прогон привел к этой модели?
  • Какая версия TensorFlow создала эту модель?
  • Когда была выдвинута неудавшаяся модель?

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

MLMD регистрирует следующие типы метаданных в базе данных под названием Metadata магазин.

  1. Метаданные об артефактах, сгенерированных с помощью компонентов / шагов ваших конвейеров машинного обучения.
  2. Метаданные о выполнении этих компонентов / шагов
  3. Метаданные о трубопроводах и соответствующая информация о происхождении

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

На этом рисунке показан общий обзор различных компонентов, которые являются частью MLMD.

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

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

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

  • База данные Поддельные обеспечивает в памяти 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)

Кроме того , при использовании экземпляра MySQL с Google CloudSQL ( QuickStart , Connect-обзор ), можно также использовать опцию 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 . Выполнения записываются, когда вы запускаете конвейер или шаг машинного обучения.
  • Event представляет собой запись о взаимосвязи между артефактами и казнями. Когда происходит выполнение, события записывают каждый артефакт, который использовался при выполнении, и каждый артефакт, который был создан. Эти записи позволяют отслеживать происхождение на протяжении всего рабочего процесса. Просматривая все события, MLMD знает, какие казни произошли и какие артефакты были созданы в результате. Затем MLMD может рекурсивно вернуться от любого артефакта ко всем его входным данным в восходящем направлении.
  • ContextType описывает тип концептуальной группы артефактов и казней в рабочем процессе, и его структурных свойств. Например: проекты, конвейеры, эксперименты, владельцы и т. Д.
  • Context является экземпляром ContextType . Он фиксирует общую информацию внутри группы. Например: название проекта, список изменений совершить идентификатор, эксперимент аннотаций и т.д. Она имеет определенного пользователь уникальное имя в пределах своей ContextType .
  • Attribution являются отчетом о взаимосвязи между артефактами и контекстами.
  • Association является отчетом о взаимосвязи между казнями и контекстами.

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

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

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

Смотрите учебник MLMD для примера , который показывает вам , как использовать API MLMD и хранилище метаданных для получения информации ростка.

Интегрируйте метаданные машинного обучения в свои рабочие процессы машинного обучения

Если вы разработчик платформы, заинтересованный в интеграции MLMD в вашу систему, используйте приведенный ниже пример рабочего процесса, чтобы использовать низкоуровневые API-интерфейсы MLMD для отслеживания выполнения обучающей задачи. Вы также можете использовать высокоуровневые 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)

# Query all registered Artifact types.
artifact_types = store.get_artifact_types()

2) Зарегистрируйте типы выполнения для всех этапов рабочего процесса машинного обучения.

# 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) Создайте артефакт 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)

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

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)

Используйте MLMD с удаленным сервером gRPC

Вы можете использовать MLMD с удаленными серверами gRPC, как показано ниже:

  • Запустить сервер
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 .

Пример MetadataStoreServerConfig файл в текстовом формате Protobuf:

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)
  • Используйте 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)

Ресурсы

Библиотека MLMD имеет высокоуровневый API, который вы можете легко использовать со своими конвейерами ML. Смотрите API документацию MLMD для получения более подробной информации.

Кроме того, проверить учебник MLMD , чтобы узнать , как использовать MLMD , чтобы проследить происхождение ваших деталей трубопроводов.

MLMD предоставляет утилиты для обработки схем и переноса данных между выпусками. Смотрите MLMD Руководство для более подробной информации.