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ế sao cho có thể sử dụng độc lập.

Mỗi lần chạy quy trình 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 quy trình khác nhau, quá trình thực thi của chúng (ví dụ: các lần chạy đào tạo) và các thành phần tạo thành (ví dụ: các mô hình được đào tạo). Trong trường hợp xảy ra lỗi hoặc hoạt động không mong muốn của quy trình, siêu dữ liệu này có thể được tận dụng để phân tích dòng thành phần quy trình 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 vào quá trình 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 trong quy trình ML thay vì phân tích chúng một cách riêng biệt và có thể giúp bạn trả lời các câu hỏi về quy trình ML của bạn, chẳng hạn như:

  • Mô hình đã đào tạo tập dữ liệu nào?
  • Các siêu tham số được sử dụng để huấn luyện mô hình là gì?
  • Đường ống 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 TensorFlow nào đã tạo ra mô hình này?
  • Mô hình thất bại được đẩy lên 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ó tên là Kho siêu dữ liệu .

  1. Siêu dữ liệu về các thành phần lạ được tạo thông qua các thành phần/bước trong quy trình 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 liên quan

Cửa hàng siêu dữ liệu cung cấp các API để ghi và truy xuất siêu dữ liệu đến và 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ợ bộ nhớ trong và đĩa) và MySQL ngay lập tức.

Đồ họa này hiển thị 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ụ 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 sẽ bị xóa khi đối tượng lưu trữ bị 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 tin 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 ( quickstart , connect-overview ), 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)
  • PostgreSQL kết nối với máy chủ PostgreSQL.
connection_config = metadata_store_pb2.ConnectionConfig()
connection_config.postgresql.host = '...'
connection_config.postgresql.port = '...'
connection_config.postgresql.user = '...'
connection_config.postgresql.password = '...'
connection_config.postgresql.dbname = '...'
store = metadata_store.MetadataStore(connection_config)

Tương tự, khi sử dụng phiên bản PostgreSQL với Google CloudSQL ( quickstart , connect-overview ), người ta cũng có thể sử dụng tùy chọn SSL nếu có.

connection_config.postgresql.ssloption.sslmode = '...' # disable, allow, verify-ca, verify-full, etc.
connection_config.postgresql.ssloption.sslcert = '...'
connection_config.postgresql.ssloption.sslkey = '...'
connection_config.postgresql.ssloption.sslpassword = '...'
connection_config.postgresql.ssloption.sslrootcert = '...'
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 của một tạo phẩ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 bằng mã hoặc bạn có thể tải chúng vào cửa hàng từ định dạng được tuần tự hóa. Sau 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à bản ghi về lần chạy thành phần hoặc một bước trong quy trình làm việc ML và các tham số thời gian chạy. Việc thực thi có thể được coi là một thể hiện của ExecutionType . Các lần thực thi được ghi lại khi bạn chạy một quy trình hoặc bước ML.
  • Event là bản ghi về mối quan hệ giữa các tạo phẩm và việc thực thi. Khi quá trình thực thi diễn ra, các sự kiện sẽ ghi lại mọi tạo phẩm được sử dụng trong quá trình thực thi và mọi tạo tác được tạo ra. Những bản ghi này cho phép theo dõi dòng dõi trong suố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 hoạt động thực thi nào đã xảy ra và kết quả là những tạo phẩm nào được tạo ra. MLMD sau đó có thể lặp lại từ bất kỳ tạo phẩm nào đến 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 phẩm và thực thi trong quy trình công việc cũng như 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 phiên bản của ContextType . Nó nắm bắt các 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 .
  • Attribution là bản ghi về mối quan hệ giữa các tạo phẩm và bối cảnh.
  • Association là một bản ghi về mối quan hệ giữa việc thực thi và bối cảnh.

Chức năng MLMD

Việc 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 dõi của chúng cho phép 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 cái nhìn tổng quan chưa đầy đủ về một số lợi ích chính.

  • Liệt kê tất cả các hiện vật thuộc một loại cụ thể. Ví dụ: tất cả các Model đã được đào tạo.
  • Tải hai Cổ vật cùng loại để so sánh. Ví dụ: so sánh kết quả của hai thí nghiệm.
  • Hiển thị DAG của tất cả các lần thực thi có liên quan cũng như các thành phần đầu vào và đầu ra 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 một tạo phẩm được tạo ra như thế nào. Ví dụ: xem dữ liệu nào được đưa vào 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 tạo phẩm được tạo bằng cách sử dụng một tạo phẩm 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 các mô hình dựa trên dữ liệu xấu.
  • Xác định xem trước đó một lệnh thực thi đã được chạy trên cùng một đầu vào 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ự hay 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 bối cảnh của các lần chạy quy trình làm việc. Ví dụ: theo dõi chủ sở hữu và danh sách thay đổi được sử dụng để chạy quy trình công việc; nhóm dòng dõi bằng thí nghiệm; quản lý hiện vật theo dự án.
  • Khả năng lọc các nút khai báo trên các thuộc tính và các nút lân cận 1 bước nhảy. Ví dụ: tìm kiếm các tạo phẩm thuộc một loại và trong một số bối cảnh đường ống; trả về các tạo phẩm đã nhập trong đó giá trị của 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.

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

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 nhằm theo dõi việc thực hiện nhiệm vụ đào tạo. Bạn cũng có thể sử dụng API Python cấp cao hơn trong môi trường sổ tay để ghi lại siêu dữ liệu thử nghiệm.

Luồng mẫu siêu dữ liệu ML

1) Đăng ký các loại tạo tác

# 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 loại 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 phẩm 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 một bản thực thi của cuộc chạy Huấn luyện viên

# 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 phẩm đầ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 các tạo phẩm và thực thi theo ngữ cảnh bằng cách sử dụng các tạo phẩm thuộc tính 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 máy chủ gRPC từ xa như dưới đây:

  • Khởi động một 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 duy trì siêu dữ liệu trong 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 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 ví dụ về tệp MetadataStoreServerConfig ở định dạng văn bản protobuf:

connection_config {
  sqlite {
    filename_uri: '/tmp/test_db'
    connection_mode: READWRITE_OPENCREATE
  }
}
  • Tạo sơ khai ứng dụng khách và sử dụng nó trong 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 lệnh 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ó API cấp cao mà bạn có thể dễ dàng sử dụng với quy trình ML của mình. Xem tài liệu API MLMD để biết thêm chi tiết.

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

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

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