ML Metadata (MLMD) هي مكتبة لتسجيل واسترداد البيانات الوصفية المرتبطة بسير عمل مطور ML وعالم البيانات. يعد MLMD جزءًا لا يتجزأ من TensorFlow Extended (TFX) ، ولكنه مصمم بحيث يمكن استخدامه بشكل مستقل.
تقوم كل عملية تشغيل لخط أنابيب ML بإنتاج البيانات الوصفية التي تحتوي على معلومات حول مكونات خطوط الأنابيب المختلفة ، وتنفيذها (مثل عمليات التدريب) ، والقطع الأثرية الناتجة (مثل النماذج المدربة). في حالة حدوث أخطاء أو سلوك غير متوقع في خطوط الأنابيب ، يمكن الاستفادة من هذه البيانات الوصفية لتحليل نسب مكونات خطوط الأنابيب ومشكلات تصحيح الأخطاء. فكر في هذه البيانات الوصفية كمكافئ لتسجيل الدخول في تطوير البرامج.
يساعدك MLMD على فهم وتحليل جميع الأجزاء المترابطة لخط أنابيب ML الخاص بك بدلاً من تحليلها بشكل منفصل ويمكن أن تساعدك في الإجابة عن أسئلة حول خط أنابيب ML الخاص بك مثل:
- ما مجموعة البيانات التي تدرب عليها النموذج؟
- ما هي المعلمات الفائقة المستخدمة لتدريب النموذج؟
- ما هو مسار خط الأنابيب الذي أنشأ النموذج؟
- ما هو مسار التدريب الذي أدى إلى هذا النموذج؟
- ما هو إصدار TensorFlow الذي أنشأ هذا النموذج؟
- متى تم دفع النموذج الفاشل؟
مخزن البيانات الوصفية
يسجل MLMD الأنواع التالية من البيانات الوصفية في قاعدة بيانات تسمى مخزن البيانات الوصفية .
- البيانات الوصفية حول القطع الأثرية التي تم إنشاؤها من خلال مكونات / خطوات خطوط أنابيب ML الخاصة بك
- بيانات وصفية حول عمليات تنفيذ هذه المكونات / الخطوات
- البيانات الوصفية حول خطوط الأنابيب ومعلومات النسب المرتبطة بها
يوفر متجر البيانات الوصفية واجهات برمجة تطبيقات لتسجيل واسترداد البيانات الوصفية من وإلى الواجهة الخلفية للتخزين. الواجهة الخلفية للتخزين قابلة للتوصيل ويمكن تمديدها. يوفر MLMD تطبيقات مرجعية لـ SQLite (التي تدعم الذاكرة الداخلية والقرص) و MySQL خارج الصندوق.
يُظهر هذا الرسم نظرة عامة عالية المستوى على المكونات المختلفة التي تشكل جزءًا من MLMD.
خلفيات تخزين البيانات الوصفية وتخزين تكوين الاتصال
يتلقى كائن 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)
- سكليتي يقرأ ويكتب الملفات من القرص.
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 (التشغيل السريع ، نظرة عامة على الاتصال ) ، يمكن أيضًا استخدام خيار 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
نوع الأداة وخصائصها المخزنة في مخزن البيانات الأولية. يمكنك تسجيل هذه الأنواع أثناء التنقل باستخدام مخزن البيانات الوصفية في رمز ، أو يمكنك تحميلها في المتجر من تنسيق متسلسل. بمجرد تسجيل نوع ، يكون تعريفه متاحًا طوال عمر المتجر. - يصف العنصر الاصطناعي
ArtifactType
Artifact
المكتوبة في مخزن البيانات الأولية. - يصف
ExecutionType
نوع المكون أو الخطوة في سير العمل ، ومعلمات وقت التشغيل الخاصة به. -
Execution
هو سجل تشغيل مكون أو خطوة في سير عمل ML ومعلمات وقت التشغيل. يمكن اعتبار التنفيذ كمثيل لـExecutionType
. يتم تسجيل عمليات التنفيذ عند تشغيل خط أنابيب أو خطوة ML. -
Event
هو سجل للعلاقة بين القطع الأثرية وعمليات التنفيذ. عندما يحدث التنفيذ ، تسجل الأحداث كل قطعة أثرية استخدمها التنفيذ ، وكل قطعة أثرية تم إنتاجها. تسمح هذه السجلات بتتبع النسب خلال سير العمل. من خلال النظر في جميع الأحداث ، يعرف MLMD عمليات الإعدام التي حدثت وما هي القطع الأثرية التي تم إنشاؤها نتيجة لذلك. يمكن أن يتكرر MLMD مرة أخرى من أي قطعة أثرية إلى كافة مدخلات المنبع. - يصف
ContextType
نوعًا من المجموعة المفاهيمية للعناصر والتنفيذات في سير العمل ، وخصائصه الهيكلية. على سبيل المثال: المشاريع ، خطوط الأنابيب ، التجارب ، الملاك ، إلخ. -
Context
هو مثيل من نوعContextType
. يلتقط المعلومات المشتركة داخل المجموعة. على سبيل المثال: اسم المشروع ، معرّف الالتزام بقائمة التغيير ، والتعليقات التوضيحية للتجربة وما إلى ذلك ، وله اسم فريد يحدده المستخدم ضمن نوعContextType
الخاص به. -
Attribution
هو سجل للعلاقة بين المصنوعات والسياقات. -
Association
هي سجل للعلاقة بين عمليات الإعدام والسياقات.
وظائف MLMD
يتيح تتبع مدخلات ومخرجات جميع المكونات / الخطوات في سير عمل ML ونسبها لمنصات التعلم الآلي تمكين العديد من الميزات المهمة. توفر القائمة التالية نظرة عامة غير شاملة على بعض الفوائد الرئيسية.
- قائمة بجميع القطع الأثرية من نوع معين. مثال: جميع العارضين الذين تم تدريبهم.
- قم بتحميل قطعتين من نفس النوع للمقارنة. مثال: قارن نتائج تجربتين.
- اعرض DAG لجميع عمليات التنفيذ ذات الصلة ومدخلاتها ومخرجاتها من السياق. مثال: تصور سير عمل تجربة لتصحيح الأخطاء والاكتشاف.
- كرر مرة أخرى خلال جميع الأحداث لترى كيف تم إنشاء قطعة أثرية. أمثلة: انظر إلى البيانات التي تم إدخالها في النموذج ؛ فرض خطط الاحتفاظ بالبيانات.
- حدد كل القطع الأثرية التي تم إنشاؤها باستخدام قطعة أثرية معينة. أمثلة: راجع جميع النماذج المدربة من مجموعة بيانات محددة ؛ نماذج علامة على أساس البيانات السيئة.
- تحديد ما إذا كان قد تم تنفيذ التنفيذ على نفس المدخلات من قبل. مثال: حدد ما إذا كان المكون / الخطوة قد أكمل بالفعل نفس العمل ويمكن إعادة استخدام المخرجات السابقة.
- سجل واستعلام سياق سير العمل يعمل. أمثلة: تعقب المالك وقائمة التغيير المستخدمة لتشغيل سير العمل ؛ جمع النسب بالتجارب ؛ إدارة القطع الأثرية من خلال المشاريع.
- إمكانات ترشيح العقد التقريرية على الخصائص وعقد الجوار ذات القفزة الأولى. أمثلة: ابحث عن المصنوعات اليدوية من نوع وتحت بعض سياق خطوط الأنابيب ؛ إرجاع القطع الأثرية المكتوبة حيث تكون قيمة خاصية معينة داخل نطاق ؛ العثور على عمليات الإعدام السابقة في سياق بنفس المدخلات.
راجع البرنامج التعليمي MLMD للحصول على مثال يوضح لك كيفية استخدام MLMD API ومخزن البيانات الوصفية لاسترداد معلومات النسب.
دمج البيانات الوصفية ML في مهام سير عمل ML الخاصة بك
إذا كنت مطور نظام أساسي مهتم بدمج MLMD في نظامك ، فاستخدم مثال سير العمل أدناه لاستخدام واجهات برمجة تطبيقات MLMD منخفضة المستوى لتتبع تنفيذ مهمة تدريبية. يمكنك أيضًا استخدام واجهات برمجة تطبيقات Python ذات المستوى الأعلى في بيئات دفتر الملاحظات لتسجيل البيانات الأولية للتجربة.
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) إنشاء تنفيذ لمسار المدرب
# 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 على واجهة برمجة تطبيقات عالية المستوى يمكنك استخدامها بسهولة مع خطوط أنابيب ML الخاصة بك. راجع وثائق MLMD API لمزيد من التفاصيل.
تحقق من MLMD Declarative Nodes Filtering لمعرفة كيفية استخدام إمكانيات تصفية العقد التعريفية لـ MLMD على الخصائص وعقد الجوار 1-hop.
تحقق أيضًا من البرنامج التعليمي MLMD لمعرفة كيفية استخدام MLMD لتتبع نسب مكونات خط الأنابيب الخاص بك.
يوفر MLMD أدوات مساعدة للتعامل مع عمليات ترحيل البيانات والمخططات عبر الإصدارات. راجع دليل MLMD لمزيد من التفاصيل.