البيانات الوصفية لتعلم الآلة (MLMD) هي مكتبة لتسجيل واسترجاع البيانات التعريفية المرتبطة بسير عمل مطور تعلم الآلة وعالم البيانات. يعد MLMD جزءًا لا يتجزأ من TensorFlow Extended (TFX) ، ولكنه مصمم بحيث يمكن استخدامه بشكل مستقل.
تولد كل عملية تشغيل لخط أنابيب ML للإنتاج بيانات وصفية تحتوي على معلومات حول مكونات خط الأنابيب المختلفة وعمليات تنفيذها (مثل عمليات التدريب) والعناصر الناتجة (مثل النماذج المدربة). في حالة حدوث سلوك أو أخطاء غير متوقعة في خط الأنابيب، يمكن الاستفادة من بيانات التعريف هذه لتحليل سلسلة مكونات خط الأنابيب وتصحيح الأخطاء. فكر في هذه البيانات الوصفية على أنها تعادل تسجيل الدخول في تطوير البرمجيات.
يساعدك MLMD على فهم وتحليل جميع الأجزاء المترابطة من مسار ML الخاص بك بدلاً من تحليلها بشكل منفصل ويمكن أن يساعدك في الإجابة على الأسئلة حول مسار ML الخاص بك مثل:
- ما هي مجموعة البيانات التي تدرب عليها النموذج؟
- ما هي المعلمات الفائقة المستخدمة لتدريب النموذج؟
- ما هو مسار خط الأنابيب الذي أنشأ النموذج؟
- ما هو التدريب الذي أدى إلى هذا النموذج؟
- ما هو إصدار TensorFlow الذي أنشأ هذا النموذج؟
- متى تم دفع النموذج الفاشل؟
مخزن البيانات الوصفية
يقوم MLMD بتسجيل الأنواع التالية من البيانات التعريفية في قاعدة بيانات تسمى مخزن البيانات الوصفية .
- البيانات الوصفية حول العناصر التي تم إنشاؤها من خلال مكونات/خطوات مسارات تعلم الآلة الخاصة بك
- البيانات الوصفية حول عمليات تنفيذ هذه المكونات/الخطوات
- البيانات الوصفية حول خطوط الأنابيب ومعلومات النسب المرتبطة بها
يوفر مخزن البيانات التعريفية واجهات برمجة التطبيقات (API) لتسجيل واسترجاع البيانات التعريفية من وإلى الواجهة الخلفية للتخزين. الواجهة الخلفية للتخزين قابلة للتوصيل ويمكن تمديدها. يوفر 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)
- يقوم 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 ( بدء التشغيل السريع ، نظرة عامة على الاتصال )، يمكن للمرء أيضًا استخدام خيار 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 ( بدء التشغيل السريع ، نظرة عامة على الاتصال )، يمكن للمرء أيضًا استخدام خيار 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 لجميع عمليات التنفيذ ذات الصلة وعناصر الإدخال والإخراج الخاصة بالسياق. مثال: تصور سير عمل تجربة لتصحيح الأخطاء والاكتشاف.
- عد مرة أخرى خلال جميع الأحداث لترى كيف تم إنشاء القطعة الأثرية. أمثلة: معرفة البيانات التي تم إدخالها في النموذج؛ فرض خطط الاحتفاظ بالبيانات.
- تحديد جميع القطع الأثرية التي تم إنشاؤها باستخدام قطعة أثرية معينة. أمثلة: الاطلاع على جميع النماذج التي تم تدريبها من مجموعة بيانات محددة؛ وضع علامة على النماذج بناءً على بيانات سيئة.
- تحديد ما إذا كان قد تم تنفيذ التنفيذ على نفس المدخلات من قبل. مثال: تحديد ما إذا كان المكون/الخطوة قد أكمل بالفعل نفس العمل ويمكن إعادة استخدام المخرجات السابقة.
- تسجيل سياق سير العمل والاستعلام عنه. أمثلة: تتبع المالك وقائمة التغيير المستخدمة لتشغيل سير العمل؛ تجميع النسب عن طريق التجارب؛ إدارة القطع الأثرية من خلال المشاريع.
- إمكانات تصفية العقد التعريفية على الخصائص والعقد المجاورة ذات القفزة الواحدة. أمثلة: ابحث عن القطع الأثرية من نوع ما وفي سياق بعض خطوط الأنابيب؛ إرجاع العناصر المكتوبة حيث تكون قيمة خاصية معينة ضمن نطاق؛ ابحث عن عمليات التنفيذ السابقة في سياق بنفس المدخلات.
راجع البرنامج التعليمي MLMD للحصول على مثال يوضح لك كيفية استخدام MLMD API ومخزن البيانات التعريفية لاسترداد معلومات النسب.
قم بدمج البيانات التعريفية لتعلم الآلة في مسارات عمل تعلم الآلة الخاصة بك
إذا كنت أحد مطوري الأنظمة الأساسية المهتمين بدمج 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) تسجيل أنواع التنفيذ لجميع الخطوات في سير عمل تعلم الآلة
# 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
}
}
- قم بإنشاء كعب روتين العميل واستخدامه في بايثون
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 لمعرفة كيفية استخدام إمكانات تصفية العقد التعريفية MLMD على الخصائص والعقد المجاورة ذات القفزة الواحدة.
تحقق أيضًا من البرنامج التعليمي MLMD لمعرفة كيفية استخدام MLMD لتتبع نسب مكونات خط الأنابيب الخاص بك.
يوفر MLMD أدوات مساعدة للتعامل مع عمليات ترحيل المخطط والبيانات عبر الإصدارات. راجع دليل MLMD لمزيد من التفاصيل.