ML Metadata

ML Metadata (MLMD) คือไลบรารีสำหรับบันทึกและดึงข้อมูลเมตาที่เกี่ยวข้องกับเวิร์กโฟลว์นักพัฒนา ML และนักวิทยาศาสตร์ข้อมูล MLMD เป็นส่วนสำคัญของ TensorFlow Extended (TFX) แต่ได้รับการออกแบบเพื่อให้สามารถใช้งานได้อย่างอิสระ

การดำเนินการไปป์ไลน์ ML ที่ใช้งานจริงทุกครั้งจะสร้างข้อมูลเมตาที่มีข้อมูลเกี่ยวกับส่วนประกอบไปป์ไลน์ต่างๆ การดำเนินการ (เช่น การเรียกใช้การฝึก) และอาร์ติแฟกต์ผลลัพธ์ (เช่น โมเดลที่ได้รับการฝึก) ในกรณีที่เกิดพฤติกรรมหรือข้อผิดพลาดไปป์ไลน์ที่ไม่คาดคิด คุณสามารถใช้ประโยชน์จากข้อมูลเมตานี้เพื่อวิเคราะห์ความเป็นมาของส่วนประกอบไปป์ไลน์และปัญหาการแก้ไขจุดบกพร่อง คิดว่าข้อมูลเมตานี้เทียบเท่ากับการเข้าสู่ระบบการพัฒนาซอฟต์แวร์

MLMD ช่วยให้คุณเข้าใจและวิเคราะห์ส่วนที่เชื่อมต่อถึงกันทั้งหมดของไปป์ไลน์ ML ของคุณ แทนที่จะวิเคราะห์แยกส่วน และสามารถช่วยคุณตอบคำถามเกี่ยวกับไปป์ไลน์ ML ของคุณได้ เช่น:

  • โมเดลเทรนบนชุดข้อมูลใด
  • ไฮเปอร์พารามิเตอร์ที่ใช้ในการฝึกโมเดลคืออะไร
  • การรันไปป์ไลน์ใดที่สร้างโมเดลขึ้นมา
  • การวิ่งฝึกซ้อมใดที่นำไปสู่โมเดลนี้
  • TensorFlow เวอร์ชันใดที่สร้างโมเดลนี้
  • แบบจำลองที่ล้มเหลวถูกผลักเมื่อใด

ที่เก็บข้อมูลเมตา

MLMD จะลงทะเบียนเมตาดาต้าประเภทต่อไปนี้ในฐานข้อมูลที่เรียกว่า Metadata Store

  1. ข้อมูลเมตาเกี่ยวกับอาร์ติแฟกต์ที่สร้างขึ้นผ่านส่วนประกอบ/ขั้นตอนของไปป์ไลน์ ML ของคุณ
  2. ข้อมูลเมตาเกี่ยวกับการดำเนินการของส่วนประกอบ/ขั้นตอนเหล่านี้
  3. ข้อมูลเมตาเกี่ยวกับไปป์ไลน์และข้อมูลเชื้อสายที่เกี่ยวข้อง

ที่เก็บข้อมูลเมตามี API เพื่อบันทึกและดึงข้อมูลเมตาเข้าและออกจากแบ็กเอนด์พื้นที่จัดเก็บข้อมูล แบ็กเอนด์ที่เก็บข้อมูลสามารถเสียบปลั๊กได้และสามารถขยายได้ MLMD จัดให้มีการใช้งานอ้างอิงสำหรับ SQLite (ซึ่งรองรับหน่วยความจำในและดิสก์) และ MySQL ทันที

กราฟิกนี้แสดงภาพรวมระดับสูงขององค์ประกอบต่างๆ ที่เป็นส่วนหนึ่งของ MLMD

ภาพรวมข้อมูลเมตา ML

แบ็คเอนด์ที่จัดเก็บข้อมูลเมตาและการกำหนดค่าการเชื่อมต่อร้านค้า

วัตถุ MetadataStore ได้รับการกำหนดค่าการเชื่อมต่อที่สอดคล้องกับแบ็กเอนด์ที่เก็บข้อมูลที่ใช้

  • ฐานข้อมูลปลอม จัดเตรียมฐานข้อมูลในหน่วยความจำ (โดยใช้ 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-Overview ) เราสามารถใช้ตัวเลือก 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)
  • PostgreSQL เชื่อมต่อกับเซิร์ฟเวอร์ 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)

ในทำนองเดียวกัน เมื่อใช้อินสแตนซ์ PostgreSQL กับ Google CloudSQL ( Quickstart , Connect-overview ) เราสามารถใช้ตัวเลือก SSL ได้ หากมี

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)

แบบจำลองข้อมูล

ที่เก็บข้อมูลเมตาใช้โมเดลข้อมูลต่อไปนี้เพื่อบันทึกและดึงข้อมูลเมตาจากแบ็กเอนด์พื้นที่จัดเก็บข้อมูล

  • ArtifactType อธิบายประเภทของสิ่งประดิษฐ์และคุณสมบัติที่จัดเก็บไว้ในที่เก็บข้อมูลเมตา คุณสามารถลงทะเบียนประเภทเหล่านี้ได้ทันทีด้วยที่เก็บข้อมูลเมตาในโค้ด หรือคุณสามารถโหลดในร้านค้าจากรูปแบบซีเรียลไลซ์ เมื่อคุณลงทะเบียนประเภท คำจำกัดความจะพร้อมใช้งานตลอดอายุของร้านค้า
  • Artifact อธิบายอินสแตนซ์เฉพาะของ ArtifactType และคุณสมบัติของมันที่เขียนไปยังที่เก็บข้อมูลเมตา
  • ExecutionType อธิบายประเภทของส่วนประกอบหรือขั้นตอนในเวิร์กโฟลว์ และพารามิเตอร์รันไทม์
  • Execution คือบันทึกของการรันส่วนประกอบหรือขั้นตอนในเวิร์กโฟลว์ ML และพารามิเตอร์รันไทม์ การดำเนินการสามารถถือเป็นอินสแตนซ์ของ ExecutionType การดำเนินการจะถูกบันทึกเมื่อคุณรันไปป์ไลน์หรือขั้นตอน ML
  • Event คือบันทึกความสัมพันธ์ระหว่างสิ่งประดิษฐ์และการดำเนินการ เมื่อการดำเนินการเกิดขึ้น เหตุการณ์จะบันทึกทุกส่วนที่ใช้ในการดำเนินการ และทุกส่วนที่สร้างขึ้น บันทึกเหล่านี้ช่วยให้สามารถติดตามเชื้อสายได้ตลอดขั้นตอนการทำงาน เมื่อดูเหตุการณ์ทั้งหมดแล้ว MLMD จะรู้ว่าการดำเนินการใดเกิดขึ้น และผลที่ตามมาคืออาร์ติแฟกต์ใดที่ถูกสร้างขึ้น MLMD จึงสามารถเรียกกลับจากสิ่งประดิษฐ์ใดๆ ไปยังอินพุตอัปสตรีมทั้งหมดได้
  • ContextType อธิบายประเภทของกลุ่มแนวคิดของส่วนต่างๆ และการดำเนินการในเวิร์กโฟลว์ และคุณสมบัติเชิงโครงสร้างของมัน ตัวอย่างเช่น โปรเจ็กต์ การรันไปป์ไลน์ การทดลอง เจ้าของ ฯลฯ
  • Context เป็นอินสแตนซ์ของ ContextType มันรวบรวมข้อมูลที่ใช้ร่วมกันภายในกลุ่ม ตัวอย่างเช่น ชื่อโปรเจ็กต์ รหัสคอมมิตรายการการเปลี่ยนแปลง คำอธิบายประกอบการทดลอง ฯลฯ โดยมีชื่อเฉพาะที่ผู้ใช้กำหนดภายใน ContextType
  • Attribution คือบันทึกความสัมพันธ์ระหว่างส่วนต่างๆ และบริบท
  • Association คือบันทึกความสัมพันธ์ระหว่างการดำเนินการและบริบท

ฟังก์ชั่น MLMD

การติดตามอินพุตและเอาท์พุตของส่วนประกอบ/ขั้นตอนทั้งหมดในเวิร์กโฟลว์ ML และสายเลือดช่วยให้แพลตฟอร์ม ML สามารถเปิดใช้งานคุณสมบัติที่สำคัญหลายประการได้ รายการต่อไปนี้แสดงภาพรวมโดยสังเขปของคุณประโยชน์หลักบางประการ

  • แสดงรายการสิ่งประดิษฐ์ทั้งหมดตามประเภทที่ระบุ ตัวอย่าง: โมเดลทั้งหมดที่ได้รับการฝึกอบรม
  • โหลดสิ่งประดิษฐ์ประเภทเดียวกันสองชิ้นเพื่อเปรียบเทียบ ตัวอย่าง: เปรียบเทียบผลลัพธ์จากการทดลองสองครั้ง
  • แสดง DAG ของการดำเนินการที่เกี่ยวข้องทั้งหมด รวมถึงอินพุตและเอาท์พุตของบริบท ตัวอย่าง: แสดงภาพขั้นตอนการทำงานของการทดสอบสำหรับการดีบักและการค้นพบ
  • ย้อนรอยเหตุการณ์ทั้งหมดเพื่อดูว่าสิ่งประดิษฐ์ถูกสร้างขึ้นอย่างไร ตัวอย่าง: ดูว่าข้อมูลใดเข้าสู่โมเดล บังคับใช้แผนการเก็บรักษาข้อมูล
  • ระบุสิ่งประดิษฐ์ทั้งหมดที่สร้างขึ้นโดยใช้สิ่งประดิษฐ์ที่กำหนด ตัวอย่าง: ดูโมเดลทั้งหมดที่ได้รับการฝึกจากชุดข้อมูลเฉพาะ ทำเครื่องหมายโมเดลตามข้อมูลที่ไม่ถูกต้อง
  • ตรวจสอบว่าเคยมีการเรียกใช้การดำเนินการบนอินพุตเดียวกันมาก่อนหรือไม่ ตัวอย่าง: พิจารณาว่าส่วนประกอบ/ขั้นตอนได้ทำงานเดียวกันเสร็จสิ้นแล้วหรือไม่ และสามารถนำเอาต์พุตก่อนหน้ากลับมาใช้ใหม่ได้
  • บันทึกและสอบถามบริบทของการรันเวิร์กโฟลว์ ตัวอย่าง: ติดตามเจ้าของและรายการการเปลี่ยนแปลงที่ใช้สำหรับการรันเวิร์กโฟลว์ จัดกลุ่มเชื้อสายตามการทดลอง จัดการสิ่งประดิษฐ์ตามโครงการ
  • ความสามารถในการกรองโหนดที่ประกาศเกี่ยวกับคุณสมบัติและโหนดละแวกใกล้เคียง 1-hop ตัวอย่าง: ค้นหาสิ่งประดิษฐ์ประเภทและภายใต้บริบทไปป์ไลน์บางอย่าง ส่งคืนสิ่งประดิษฐ์ที่พิมพ์โดยที่ค่าของคุณสมบัติที่กำหนดอยู่ในช่วง ค้นหาการดำเนินการก่อนหน้านี้ในบริบทที่มีอินพุตเดียวกัน

ดู บทช่วยสอน MLMD สำหรับตัวอย่างที่แสดงวิธีใช้ MLMD API และที่เก็บข้อมูลเมตาเพื่อดึงข้อมูลเชื้อสาย

รวมข้อมูลเมตา ML เข้ากับเวิร์กโฟลว์ ML ของคุณ

หากคุณเป็นนักพัฒนาแพลตฟอร์มที่สนใจรวม MLMD เข้ากับระบบของคุณ ให้ใช้เวิร์กโฟลว์ตัวอย่างด้านล่างเพื่อใช้ MLMD API ระดับต่ำเพื่อติดตามการดำเนินการของงานการฝึกอบรม คุณยังสามารถใช้ Python API ระดับสูงกว่าในสภาพแวดล้อมโน้ตบุ๊กเพื่อบันทึกเมตาดาต้าการทดลองได้

ตัวอย่างโฟลว์ข้อมูลเมตาของ 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) ลงทะเบียนประเภทการดำเนินการสำหรับทุกขั้นตอนในเวิร์กโฟลว์ 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) สร้างสิ่งประดิษฐ์ของ 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) สร้างการดำเนินการของการรัน 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) กำหนดเหตุการณ์อินพุตและอ่านข้อมูล

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

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

ใช้ 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 ของคุณได้อย่างง่ายดาย ดู เอกสารประกอบ MLMD API สำหรับรายละเอียดเพิ่มเติม

ตรวจสอบ การกรองโหนดประกาศ MLMD เพื่อเรียนรู้วิธีใช้ความสามารถในการกรองโหนดประกาศ MLMD บนคุณสมบัติและโหนดละแวกใกล้เคียง 1-hop

นอกจากนี้ โปรดดู บทแนะนำสอนการใช้งาน MLMD เพื่อเรียนรู้วิธีใช้ MLMD เพื่อติดตามความเป็นมาของส่วนประกอบไปป์ไลน์ของคุณ

MLMD จัดเตรียมยูทิลิตี้เพื่อจัดการสคีมาและการย้ายข้อมูลข้ามรุ่นต่างๆ ดู คู่มือ MLMD สำหรับรายละเอียดเพิ่มเติม