এমএল মেটাডেটা (এমএলএমডি) হল এমএল ডেভেলপার এবং ডেটা সায়েন্টিস্ট ওয়ার্কফ্লোগুলির সাথে যুক্ত মেটাডেটা রেকর্ডিং এবং পুনরুদ্ধারের জন্য একটি লাইব্রেরি। MLMD হল TensorFlow Extended (TFX) এর একটি অবিচ্ছেদ্য অংশ, কিন্তু ডিজাইন করা হয়েছে যাতে এটি স্বাধীনভাবে ব্যবহার করা যায়।
একটি প্রোডাকশন এমএল পাইপলাইনের প্রতিটি রান বিভিন্ন পাইপলাইনের উপাদান, তাদের সম্পাদন (যেমন প্রশিক্ষণ রান), এবং ফলস্বরূপ শিল্পকর্ম (যেমন প্রশিক্ষিত মডেল) সম্পর্কে তথ্য ধারণকারী মেটাডেটা তৈরি করে। পাইপলাইনের অপ্রত্যাশিত আচরণ বা ত্রুটির ক্ষেত্রে, এই মেটাডেটাটি পাইপলাইনের উপাদানগুলির বংশগতি এবং ডিবাগ সমস্যাগুলি বিশ্লেষণ করতে ব্যবহার করা যেতে পারে। এই মেটাডেটাকে সফটওয়্যার ডেভেলপমেন্টে লগ ইন করার সমতুল্য মনে করুন।
MLMD আপনাকে আপনার ML পাইপলাইনের সমস্ত আন্তঃসংযুক্ত অংশগুলিকে বিচ্ছিন্নভাবে বিশ্লেষণ করার পরিবর্তে বুঝতে এবং বিশ্লেষণ করতে সহায়তা করে এবং আপনার ML পাইপলাইন সম্পর্কে প্রশ্নের উত্তর দিতে সাহায্য করতে পারে যেমন:
- কোন ডেটাসেটটি মডেলটি প্রশিক্ষণ দিয়েছিল?
- মডেল প্রশিক্ষণের জন্য ব্যবহৃত হাইপারপ্যারামিটার কি ছিল?
- কোন পাইপলাইন রান মডেল তৈরি?
- কোন প্রশিক্ষণ এই মডেলের নেতৃত্বে?
- TensorFlow এর কোন সংস্করণটি এই মডেলটি তৈরি করেছে?
- ব্যর্থ মডেলকে কখন ঠেলে দেওয়া হয়েছিল?
মেটাডেটা স্টোর
MLMD মেটাডেটা স্টোর নামে একটি ডাটাবেসে নিম্নলিখিত ধরনের মেটাডেটা নিবন্ধন করে।
- আপনার ML পাইপলাইনের উপাদান/পদক্ষেপের মাধ্যমে তৈরি শিল্পকর্ম সম্পর্কে মেটাডেটা
- এই উপাদান/পদক্ষেপগুলির সম্পাদন সম্পর্কে মেটাডেটা
- পাইপলাইন এবং সম্পর্কিত বংশ তথ্য সম্পর্কে মেটাডেটা
মেটাডেটা স্টোর স্টোরেজ ব্যাকএন্ড থেকে মেটাডেটা রেকর্ড এবং পুনরুদ্ধার করার জন্য API প্রদান করে। স্টোরেজ ব্যাকএন্ড প্লাগযোগ্য এবং প্রসারিত করা যেতে পারে। MLMD SQLite (যা ইন-মেমরি এবং ডিস্ক সমর্থন করে) এবং MySQL-এর জন্য রেফারেন্স বাস্তবায়ন প্রদান করে।
এই গ্রাফিকটি MLMD-এর অংশ এমন বিভিন্ন উপাদানগুলির একটি উচ্চ-স্তরের ওভারভিউ দেখায়।
মেটাডেটা স্টোরেজ ব্যাকএন্ড এবং স্টোর সংযোগ কনফিগারেশন
MetadataStore
অবজেক্ট একটি সংযোগ কনফিগারেশন পায় যা ব্যবহৃত স্টোরেজ ব্যাকএন্ডের সাথে মিলে যায়।
- নকল ডেটাবেস দ্রুত পরীক্ষা এবং স্থানীয় রানের জন্য একটি ইন-মেমরি ডিবি (এসকিউএলিট ব্যবহার করে) প্রদান করে। স্টোর অবজেক্টটি ধ্বংস হয়ে গেলে ডাটাবেস মুছে ফেলা হয়।
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)
একইভাবে, Google CloudSQL ( quickstart , connect-overview ) এর সাথে একটি MySQL উদাহরণ ব্যবহার করার সময়, প্রযোজ্য হলে কেউ 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)
একইভাবে, Google CloudSQL ( quickstart , connect-overview ) এর সাথে PostgreSQL ইন্সট্যান্স ব্যবহার করার সময়, প্রযোজ্য হলে কেউ 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
হল একটি কম্পোনেন্ট রানের রেকর্ড বা একটি এমএল ওয়ার্কফ্লো এবং রানটাইম প্যারামিটারের একটি ধাপ। একটি মৃত্যুদন্ডকে একটিExecutionType
উদাহরণ হিসাবে বিবেচনা করা যেতে পারে। আপনি যখন একটি ML পাইপলাইন বা ধাপ চালান তখন মৃত্যুদন্ড রেকর্ড করা হয়। - একটি
Event
হল শিল্পকর্ম এবং মৃত্যুদন্ডের মধ্যে সম্পর্কের একটি রেকর্ড। যখন একটি মৃত্যুদন্ড ঘটে, ঘটনাগুলি মৃত্যুদন্ড দ্বারা ব্যবহৃত প্রতিটি শিল্পকর্ম এবং উত্পাদিত প্রতিটি শিল্পকর্ম রেকর্ড করে। এই রেকর্ডগুলি একটি ওয়ার্কফ্লো জুড়ে বংশ ট্র্যাকিংয়ের অনুমতি দেয়। সমস্ত ঘটনা দেখে, এমএলএমডি জানে কী মৃত্যুদণ্ড কার্যকর হয়েছিল এবং ফলস্বরূপ কী শিল্পকর্ম তৈরি হয়েছিল। MLMD তারপর যেকোন আর্টিফ্যাক্ট থেকে তার সমস্ত আপস্ট্রিম ইনপুটগুলিতে ফিরে আসতে পারে। - একটি
ContextType
একটি ওয়ার্কফ্লোতে আর্টিফ্যাক্ট এবং এক্সিকিউশনের এক ধরণের ধারণাগত গ্রুপ এবং এর কাঠামোগত বৈশিষ্ট্য বর্ণনা করে। যেমন: প্রকল্প, পাইপলাইন রান, পরীক্ষা, মালিক ইত্যাদি। - একটি
Context
হল একটিContextType
একটি উদাহরণ। এটি গ্রুপের মধ্যে শেয়ার করা তথ্য ক্যাপচার করে। যেমন: প্রজেক্টের নাম, চেঞ্জলিস্ট কমিট আইডি, এক্সপেরিমেন্টের টীকা ইত্যাদি। এটিরContextType
মধ্যে ব্যবহারকারী-সংজ্ঞায়িত অনন্য নাম রয়েছে। - একটি
Attribution
হল শিল্পকর্ম এবং প্রসঙ্গগুলির মধ্যে সম্পর্কের একটি রেকর্ড। - একটি
Association
হল মৃত্যুদন্ড এবং প্রসঙ্গগুলির মধ্যে সম্পর্কের একটি রেকর্ড।
MLMD কার্যকারিতা
একটি ML ওয়ার্কফ্লো এবং তাদের বংশের সমস্ত উপাদান/পদক্ষেপের ইনপুট এবং আউটপুট ট্র্যাক করা ML প্ল্যাটফর্মগুলিকে বেশ কয়েকটি গুরুত্বপূর্ণ বৈশিষ্ট্য সক্ষম করতে দেয়। নিম্নলিখিত তালিকাটি কিছু প্রধান সুবিধার একটি অ-সম্পূর্ণ ওভারভিউ প্রদান করে।
- একটি নির্দিষ্ট ধরণের সমস্ত শিল্পকর্মের তালিকা করুন। উদাহরণ: প্রশিক্ষিত সমস্ত মডেল।
- তুলনা করার জন্য একই ধরনের দুটি শিল্পকর্ম লোড করুন। উদাহরণ: দুটি পরীক্ষার ফলাফলের তুলনা করুন।
- সমস্ত সম্পর্কিত মৃত্যুদন্ডের একটি DAG এবং একটি প্রসঙ্গের তাদের ইনপুট এবং আউটপুট শিল্পকর্ম দেখান। উদাহরণ: ডিবাগিং এবং আবিষ্কারের জন্য একটি পরীক্ষার কার্যপ্রবাহ কল্পনা করুন।
- একটি আর্টিফ্যাক্ট কীভাবে তৈরি করা হয়েছিল তা দেখতে সমস্ত ইভেন্টের মাধ্যমে ফিরে যান। উদাহরণ: একটি মডেলে কি ডেটা চলে গেছে তা দেখুন; ডেটা ধারণ পরিকল্পনা প্রয়োগ করুন।
- প্রদত্ত আর্টিফ্যাক্ট ব্যবহার করে তৈরি করা সমস্ত শিল্পকর্ম সনাক্ত করুন। উদাহরণ: একটি নির্দিষ্ট ডেটাসেট থেকে প্রশিক্ষিত সমস্ত মডেল দেখুন; খারাপ তথ্যের উপর ভিত্তি করে মডেল চিহ্নিত করুন।
- আগে একই ইনপুটগুলিতে একটি এক্সিকিউশন চালানো হয়েছে কিনা তা নির্ধারণ করুন। উদাহরণ: একটি উপাদান/পদক্ষেপ ইতিমধ্যে একই কাজ সম্পন্ন করেছে কিনা তা নির্ধারণ করুন এবং পূর্ববর্তী আউটপুটটি পুনরায় ব্যবহার করা যেতে পারে।
- ওয়ার্কফ্লো রানের রেকর্ড এবং ক্যোয়ারী প্রসঙ্গ। উদাহরণ: ওয়ার্কফ্লো চালানোর জন্য ব্যবহৃত মালিক এবং পরিবর্তন তালিকা ট্র্যাক করুন; পরীক্ষা দ্বারা বংশ গ্রুপ; প্রকল্প দ্বারা শিল্পকর্ম পরিচালনা করুন.
- বৈশিষ্ট্য এবং 1-হপ আশেপাশের নোডগুলিতে ঘোষণামূলক নোড ফিল্টারিং ক্ষমতা। উদাহরণ: একটি ধরনের এবং কিছু পাইপলাইন প্রসঙ্গের নিদর্শনগুলির জন্য দেখুন; টাইপ করা আর্টিফ্যাক্ট ফেরত দিন যেখানে প্রদত্ত সম্পত্তির মান একটি সীমার মধ্যে থাকে; একই ইনপুট সহ একটি প্রসঙ্গে পূর্ববর্তী মৃত্যুদন্ডগুলি সন্ধান করুন।
একটি উদাহরণের জন্য MLMD টিউটোরিয়াল দেখুন যা আপনাকে দেখায় কিভাবে বংশের তথ্য পুনরুদ্ধার করতে MLMD API এবং মেটাডেটা স্টোর ব্যবহার করতে হয়।
আপনার ML ওয়ার্কফ্লোতে ML মেটাডেটা একীভূত করুন
আপনি যদি আপনার সিস্টেমে MLMD সংহত করতে আগ্রহী একজন প্ল্যাটফর্ম ডেভেলপার হন, তাহলে একটি প্রশিক্ষণের কার্য সম্পাদন ট্র্যাক করতে নিম্ন-স্তরের MLMD API ব্যবহার করতে নীচের উদাহরণ কর্মপ্রবাহটি ব্যবহার করুন৷ পরীক্ষার মেটাডেটা রেকর্ড করতে আপনি নোটবুক পরিবেশে উচ্চ-স্তরের পাইথন API ব্যবহার করতে পারেন।
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))))
একটি দূরবর্তী gRPC সার্ভারের সাথে MLMD ব্যবহার করুন
আপনি নীচে দেখানো হিসাবে দূরবর্তী gRPC সার্ভারের সাথে MLMD ব্যবহার করতে পারেন:
- একটি সার্ভার শুরু করুন
bazel run -c opt --define grpc_no_ares=true //ml_metadata/metadata_store:metadata_store_server
ডিফল্টরূপে, সার্ভার প্রতি অনুরোধে একটি নকল ইন-মেমরি ডিবি ব্যবহার করে এবং কল জুড়ে মেটাডেটা বজায় রাখে না। SQLite ফাইল বা MySQL দৃষ্টান্ত ব্যবহার করার জন্য এটি একটি MLMD MetadataStoreServerConfig
এর সাথে কনফিগার করা যেতে পারে। কনফিগারেশনটি একটি টেক্সট প্রোটোবাফ ফাইলে সংরক্ষণ করা যেতে পারে এবং --metadata_store_server_config_file=path_to_the_config_file
এর মাধ্যমে বাইনারিতে পাঠানো যেতে পারে।
একটি উদাহরণ MetadataStoreServerConfig
কনফিগ ফাইল টেক্সট প্রোটোবাফ ফরম্যাটে:
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)
- RPC কলের সাথে MLMD ব্যবহার করুন
# 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 ডকুমেন্টেশন দেখুন।
বৈশিষ্ট্য এবং 1-হপ আশেপাশের নোডগুলিতে MLMD ঘোষণামূলক নোড ফিল্টারিং ক্ষমতাগুলি কীভাবে ব্যবহার করবেন তা শিখতে MLMD ঘোষণামূলক নোড ফিল্টারিং দেখুন।
এছাড়াও আপনার পাইপলাইনের উপাদানগুলির বংশের সন্ধান করতে MLMD কীভাবে ব্যবহার করবেন তা শিখতে MLMD টিউটোরিয়ালটি দেখুন।
MLMD রিলিজ জুড়ে স্কিমা এবং ডেটা মাইগ্রেশন পরিচালনা করার জন্য ইউটিলিটি প্রদান করে। আরো বিস্তারিত জানার জন্য MLMD গাইড দেখুন।