Siêu dữ liệu ML

Siêu dữ liệu ML (MLMD) là một thư viện để ghi và truy xuất siêu dữ liệu được liên kết với quy trình làm việc của nhà phát triển ML và nhà khoa học dữ liệu. MLMD là một phần không thể thiếu của TensorFlow Extended (TFX) , nhưng được thiết kế để nó có thể được sử dụng độc lập.

Mỗi lần chạy đường ống ML sản xuất sẽ tạo ra siêu dữ liệu chứa thông tin về các thành phần đường ống khác nhau, quá trình thực thi của chúng (ví dụ: chạy đào tạo) và kết quả tạo tác (ví dụ: mô hình được đào tạo). Trong trường hợp có lỗi hoặc hành vi đường ống không mong muốn, siêu dữ liệu này có thể được tận dụng để phân tích nguồn gốc của các thành phần đường ống và các vấn đề gỡ lỗi. Hãy coi siêu dữ liệu này tương đương với việc đăng nhập phát triển phần mềm.

MLMD giúp bạn hiểu và phân tích tất cả các phần được kết nối với nhau của đường ống ML của bạn thay vì phân tích chúng một cách riêng lẻ và có thể giúp bạn trả lời các câu hỏi về đường ống ML của bạn chẳng hạn như:

  • Mô hình đào tạo trên tập dữ liệu nào?
  • Các siêu tham số được sử dụng để đào tạo mô hình là gì?
  • Đường ống chạy nào đã tạo ra mô hình?
  • Quá trình đào tạo nào đã dẫn đến mô hình này?
  • Phiên bản nào của TensorFlow đã tạo ra mô hình này?
  • Mô hình thất bại được đẩy khi nào?

Kho siêu dữ liệu

MLMD đăng ký các loại siêu dữ liệu sau trong cơ sở dữ liệu được gọi là Cửa hàng siêu dữ liệu .

  1. Siêu dữ liệu về các tạo tác được tạo thông qua các thành phần / bước của đường ống ML của bạn
  2. Siêu dữ liệu về việc thực thi các thành phần / bước này
  3. Siêu dữ liệu về đường ống và thông tin dòng dõi liên quan

Cửa hàng siêu dữ liệu cung cấp các API để ghi lại và truy xuất siêu dữ liệu đến và đi từ phần phụ trợ lưu trữ. Phần phụ trợ lưu trữ có thể cắm được và có thể mở rộng. MLMD cung cấp các triển khai tham chiếu cho SQLite (hỗ trợ trong bộ nhớ trong và đĩa) và MySQL bên ngoài.

Hình ảnh này cho thấy tổng quan cấp cao về các thành phần khác nhau là một phần của MLMD.

Tổng quan về siêu dữ liệu ML

Phần phụ trợ lưu trữ siêu dữ liệu và cấu hình kết nối cửa hàng

Đối tượng MetadataStore nhận được cấu hình kết nối tương ứng với phần phụ trợ lưu trữ được sử dụng.

  • Cơ sở dữ liệu giả cung cấp DB trong bộ nhớ (sử dụng SQLite) để thử nghiệm nhanh và chạy cục bộ. Cơ sở dữ liệu bị xóa khi đối tượng lưu trữ bị phá hủy.
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 đọc và ghi tệp từ đĩa.
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 kết nối với máy chủ 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)

Tương tự, khi sử dụng phiên bản MySQL với Google CloudSQL (khởi động nhanh, tổng quan về kết nối ), người ta cũng có thể sử dụng tùy chọn SSL nếu có.

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)

Mô hình dữ liệu

Cửa hàng siêu dữ liệu sử dụng mô hình dữ liệu sau để ghi và truy xuất siêu dữ liệu từ phần phụ trợ lưu trữ.

  • ArtifactType mô tả loại phần mềm và các thuộc tính của nó được lưu trữ trong kho siêu dữ liệu. Bạn có thể đăng ký các loại này một cách nhanh chóng với kho siêu dữ liệu ở dạng mã hoặc bạn có thể tải chúng trong cửa hàng từ định dạng được tuần tự hóa. Khi bạn đăng ký một loại, định nghĩa của nó sẽ có sẵn trong suốt thời gian tồn tại của cửa hàng.
  • Một Artifact mô tả một phiên bản cụ thể của ArtifactType và các thuộc tính của nó được ghi vào kho siêu dữ liệu.
  • ExecutionType mô tả một loại thành phần hoặc bước trong quy trình làm việc và các tham số thời gian chạy của nó.
  • Execution là một bản ghi của một thành phần chạy hoặc một bước trong dòng công việc ML và các tham số thời gian chạy. Một thực thi có thể được coi là một phiên bản của ExecutionType . Các lần thực thi được ghi lại khi bạn chạy đường ống hoặc bước ML.
  • Event là một bản ghi về mối quan hệ giữa tạo tác và việc thực thi. Khi một cuộc thực hiện xảy ra, các sự kiện ghi lại mọi hiện vật đã được sử dụng bởi cuộc thực hiện và mọi hiện vật đã được tạo ra. Những hồ sơ này cho phép theo dõi dòng dõi trong suốt một quy trình làm việc. Bằng cách xem xét tất cả các sự kiện, MLMD biết những gì đã xảy ra và kết quả là tạo tác nào được tạo ra. MLMD sau đó có thể đệ quy trở lại từ bất kỳ tạo tác nào tới tất cả các đầu vào ngược dòng của nó.
  • ContextType mô tả một loại nhóm khái niệm gồm các tạo tác và thực thi trong một quy trình làm việc và các thuộc tính cấu trúc của nó. Ví dụ: dự án, chạy đường ống, thử nghiệm, chủ sở hữu, v.v.
  • Context là một ví dụ của ContextType . Nó nắm bắt thông tin được chia sẻ trong nhóm. Ví dụ: tên dự án, id cam kết danh sách thay đổi, chú thích thử nghiệm, v.v. Nó có tên duy nhất do người dùng xác định trong ContextType của nó.
  • Attribution là một bản ghi về mối quan hệ giữa hiện vật và bối cảnh.
  • Association là một bản ghi về mối quan hệ giữa các lần thực thi và bối cảnh.

Chức năng MLMD

Theo dõi đầu vào và đầu ra của tất cả các thành phần / bước trong quy trình làm việc ML và dòng của chúng cho phép các nền tảng ML kích hoạt một số tính năng quan trọng. Danh sách sau đây cung cấp một cái nhìn tổng quan không đầy đủ về một số lợi ích chính.

  • Liệt kê tất cả các Đồ tạo tác của một loại cụ thể. Ví dụ: tất cả các Mô hình đã được đào tạo.
  • Tải hai Tạo tác cùng loại để so sánh. Ví dụ: so sánh kết quả từ hai thí nghiệm.
  • Hiển thị một DAG của tất cả các lần thực thi liên quan và các tạo tác đầu vào và đầu ra của chúng của một ngữ cảnh. Ví dụ: trực quan hóa quy trình làm việc của một thử nghiệm để gỡ lỗi và khám phá.
  • Lặp lại tất cả các sự kiện để xem cách tạo tác phẩm được tạo ra. Ví dụ: xem dữ liệu nào được đưa vào một mô hình; thực thi các kế hoạch lưu giữ dữ liệu.
  • Xác định tất cả các hiện vật đã được tạo ra bằng cách sử dụng một hiện vật nhất định. Ví dụ: xem tất cả các Mô hình được đào tạo từ một tập dữ liệu cụ thể; đánh dấu mô hình dựa trên dữ liệu xấu.
  • Xác định xem một thực thi đã được chạy trên cùng các đầu vào trước đó hay chưa. Ví dụ: xác định xem một thành phần / bước đã hoàn thành công việc tương tự chưa và kết quả đầu ra trước đó có thể được sử dụng lại hay không.
  • Ghi lại và truy vấn ngữ cảnh của dòng công việc chạy. Ví dụ: theo dõi chủ sở hữu và danh sách thay đổi được sử dụng để chạy dòng công việc; nhóm dòng dõi bằng các thí nghiệm; quản lý hiện vật theo dự án.
  • Khả năng lọc các nút so sánh trên các thuộc tính và các nút lân cận 1 bước. Ví dụ: tìm kiếm các tạo tác của một loại và trong một số ngữ cảnh đường ống; trả về các tạo tác đã nhập trong đó giá trị của một thuộc tính nhất định nằm trong một phạm vi; tìm các lần thực thi trước đó trong ngữ cảnh có cùng đầu vào.

Hãy xem hướng dẫn MLMD để biết ví dụ cho bạn biết cách sử dụng API MLMD và kho siêu dữ liệu để truy xuất thông tin dòng dõi.

Tích hợp Siêu dữ liệu ML vào Quy trình làm việc ML của bạn

Nếu bạn là nhà phát triển nền tảng quan tâm đến việc tích hợp MLMD vào hệ thống của mình, hãy sử dụng quy trình làm việc mẫu bên dưới để sử dụng API MLMD cấp thấp để theo dõi việc thực hiện nhiệm vụ đào tạo. Bạn cũng có thể sử dụng các API Python cấp cao hơn trong môi trường sổ ghi chép để ghi lại siêu dữ liệu thử nghiệm.

Luồng ví dụ về siêu dữ liệu ML

1) Đăng ký các loại hiện vật

# 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) Đăng ký các kiểu thực thi cho tất cả các bước trong quy trình 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) Tạo một tạo tác của 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)
artifacts_with_conditions = store.get_artifacts(
      list_options=mlmd.ListOptions(
          filter_query='uri LIKE "%/data" AND properties.day.int_value > 0'))

4) Tạo quá trình chạy 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])
# 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) Xác định sự kiện đầu vào và đọc dữ liệu

# 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) Khai báo tạo tác đầu ra

# 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) Ghi lại sự kiện đầu ra

# 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) Đánh dấu việc thực hiện là hoàn thành

trainer_run.id = run_id
trainer_run.properties["state"].string_value = "COMPLETED"
store.put_executions([trainer_run])

9) Nhóm tạo tác và thực thi trong bối cảnh sử dụng tạo tác quy kết và xác nhận

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

Sử dụng MLMD với máy chủ gRPC từ xa

Bạn có thể sử dụng MLMD với các máy chủ gRPC từ xa như hình dưới đây:

  • Khởi động máy chủ
bazel run -c opt --define grpc_no_ares=true  //ml_metadata/metadata_store:metadata_store_server

Theo mặc định, máy chủ sử dụng db trong bộ nhớ giả cho mỗi yêu cầu và không lưu giữ siêu dữ liệu qua các cuộc gọi. Nó cũng có thể được cấu hình bằng MLMD MetadataStoreServerConfig để sử dụng các tệp SQLite hoặc các phiên bản MySQL. Cấu hình có thể được lưu trữ trong tệp protobuf văn bản và được chuyển sang tệp nhị phân với --metadata_store_server_config_file=path_to_the_config_file .

Một tệp MetadataStoreServerConfig mẫu ở định dạng văn bản protobuf:

connection_config {
  sqlite {
    filename_uri: '/tmp/test_db'
    connection_mode: READWRITE_OPENCREATE
  }
}
  • Tạo sơ khai máy khách và sử dụng nó bằng 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)
  • Sử dụng MLMD với các cuộc gọi 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)

Tài nguyên

Thư viện MLMD có một API cấp cao mà bạn có thể dễ dàng sử dụng với các đường ống ML của mình. Xem tài liệu API MLMD để biết thêm chi tiết.

Kiểm tra Lọc các nút khai báo MLMD để tìm hiểu cách sử dụng khả năng lọc các nút khai báo MLMD trên các thuộc tính và các nút lân cận 1 bước.

Ngoài ra, hãy xem hướng dẫn MLMD để tìm hiểu cách sử dụng MLMD để theo dõi nguồn gốc của các thành phần đường ống của bạn.

MLMD cung cấp các tiện ích để xử lý lược đồ và di chuyển dữ liệu giữa các bản phát hành. Xem Hướng dẫn MLMD để biết thêm chi tiết.