نقل البيانات إلى خطوات تدفقات التعلم الآلي وما بينها (Python)
توفر هذه المقالة تعليمات برمجية لاستيراد البيانات وتحويلها ونقلها بين الخطوات في خط أنابيب Azure التعلم الآلي. للحصول على نظرة عامة حول كيفية عمل البيانات في Azure التعلم الآلي، راجع الوصول إلى البيانات في خدمات تخزين Azure. للحصول على فوائد وبنية خطوط أنابيب Azure التعلم الآلي، راجع ما هي خطوط أنابيب Azure التعلم الآلي؟
ستوضح لك هذه المقالة كيفية:
- استخدام
Datasetالكائنات للبيانات الموجودة مسبقا - الوصول إلى البيانات ضمن خطواتك
- تقسيم
Datasetالبيانات إلى مجموعات فرعية، مثل المجموعات الفرعية للتدريب والتحقق من الصحة - إنشاء
OutputFileDatasetConfigكائنات لنقل البيانات إلى خطوة خط الأنابيب التالية - استخدام
OutputFileDatasetConfigالكائنات كإدخال إلى خطوات خط الأنابيب - إنشاء كائنات جديدة
DatasetمنكOutputFileDatasetConfigترغب في الاستمرار
المتطلبات الأساسية
ستحتاج إلى:
اشتراك Azure. إذا لم يكن لديك اشتراك Azure، فأنشئ حساباً مجانياً قبل أن تبدأ. جرب الإصدار المجاني أو المدفوع من Azure التعلم الآلي.
Azure التعلم الآلي SDK ل Python، أو الوصول إلى Azure التعلم الآلي studio.
مساحة عمل Azure التعلم الآلي.
إما إنشاء مساحة عمل Azure التعلم الآلي أو استخدام مساحة عمل موجودة عبر Python SDK. قم باستيراد الفئة والفئة ، وقم بتحميل
Workspaceمعلومات اشتراكك من الملفconfig.jsonباستخدام الوظيفةfrom_config().Datastoreتبحث هذه الوظيفة عن ملف JSON في الدليل الحالي بشكل افتراضي ، ولكن يمكنك أيضا تحديد معلمة مسار للإشارة إلى الملف باستخدامfrom_config(path="your/file/path").import azureml.core from azureml.core import Workspace, Datastore ws = Workspace.from_config()بعض البيانات الموجودة مسبقا. توضح هذه المقالة بإيجاز استخدام حاوية نقطة Azure.
اختياري: خط أنابيب موجود للتعلم الآلي، مثل ذلك الموضح في إنشاء خطوط أنابيب التعلم الآلي وتشغيلها باستخدام Azure التعلم الآلي SDK.
استخدام Dataset الكائنات للبيانات الموجودة مسبقا
الطريقة المفضلة لاستيعاب البيانات في خط أنابيب هي استخدام كائن مجموعة بيانات . Dataset تمثل الكائنات البيانات الثابتة المتوفرة في جميع أنحاء مساحة العمل.
هناك العديد من الطرق لإنشاء الكائنات وتسجيلها Dataset . مجموعات البيانات الجدولية مخصصة للبيانات المحددة المتوفرة في ملف واحد أو أكثر. مجموعات بيانات الملفات مخصصة للبيانات الثنائية (مثل الصور) أو للبيانات التي ستقوم بتحليلها. تتمثل أبسط الطرق البرمجية لإنشاء Dataset كائنات في استخدام النقاط الموجودة في مساحة تخزين مساحة العمل أو عناوين URL العامة:
datastore = Datastore.get(workspace, 'training_data')
iris_dataset = Dataset.Tabular.from_delimited_files(DataPath(datastore, 'iris.csv'))
datastore_path = [
DataPath(datastore, 'animals/dog/1.jpg'),
DataPath(datastore, 'animals/dog/2.jpg'),
DataPath(datastore, 'animals/cat/*.jpg')
]
cats_dogs_dataset = Dataset.File.from_files(path=datastore_path)
لمزيد من الخيارات حول إنشاء مجموعات بيانات بخيارات مختلفة ومن مصادر مختلفة، وتسجيلها ومراجعتها في واجهة مستخدم Azure التعلم الآلي، وفهم كيفية تفاعل حجم البيانات مع سعة الحوسبة، وتعيين إصداراتها، راجع إنشاء مجموعات بيانات Azure التعلم الآلي.
تمرير مجموعات البيانات إلى البرنامج النصي
لتمرير مسار مجموعة البيانات إلى البرنامج النصي، استخدم Dataset طريقة الكائن as_named_input() . يمكنك إما تمرير الكائن الناتج DatasetConsumptionConfig إلى البرنامج النصي الخاص بك كوسيطة أو باستخدام الوسيطة inputs إلى البرنامج النصي لخط الأنابيب الخاص بك ، يمكنك استرداد مجموعة البيانات باستخدام Run.get_context().input_datasets[].
بمجرد إنشاء إدخال مسمى ، يمكنك اختيار وضع الوصول الخاص به: as_mount() أو as_download(). إذا كان البرنامج النصي الخاص بك يعالج جميع الملفات الموجودة في مجموعة البيانات الخاصة بك وكان القرص الموجود على مورد الحوسبة كبيرا بما يكفي لمجموعة البيانات ، فإن وضع الوصول إلى التنزيل هو الخيار الأفضل. سيتجنب وضع الوصول إلى التنزيل النفقات العامة لتدفق البيانات في وقت التشغيل. إذا كان البرنامج النصي الخاص بك يصل إلى مجموعة فرعية من مجموعة البيانات أو كان كبيرا جدا بالنسبة للحوسبة، فاستخدم وضع الوصول إلى التحميل. لمزيد من المعلومات، اقرأ تحميل مقابل تحميل
لتمرير مجموعة بيانات إلى خطوة خط الأنابيب:
- استخدام
TabularDataset.as_named_input()أوFileDataset.as_named_input()(لا يوجد "s" في النهاية) لإنشاءDatasetConsumptionConfigكائن - استخدام
as_mount()وضع الوصول أوas_download()لضبطه - تمرير مجموعات البيانات إلى خطوات خط الأنابيب باستخدام الوسيطة أو الوسيطة
argumentsinputs
يعرض المقتطف التالي النمط الشائع لدمج هذه الخطوات داخل المنشئ PythonScriptStep :
train_step = PythonScriptStep(
name="train_data",
script_name="train.py",
compute_target=cluster,
inputs=[iris_dataset.as_named_input('iris').as_mount()]
)
ملاحظة
ستحتاج إلى استبدال قيم كل هذه الوسيطات (أي ، ، ، ، "train_data""train.py"clusterوiris_dataset) ببياناتك الخاصة.
يعرض المقتطف أعلاه فقط شكل المكالمة وليس جزءا من عينة Microsoft.
يمكنك أيضا استخدام طرق مثل random_split()take_sample() إنشاء مدخلات متعددة أو تقليل كمية البيانات التي يتم تمريرها إلى خطوة خط الأنابيب:
seed = 42 # PRNG seed
smaller_dataset = iris_dataset.take_sample(0.1, seed=seed) # 10%
train, test = smaller_dataset.random_split(percentage=0.8, seed=seed)
train_step = PythonScriptStep(
name="train_data",
script_name="train.py",
compute_target=cluster,
inputs=[train.as_named_input('train').as_download(), test.as_named_input('test').as_download()]
)
الوصول إلى مجموعات البيانات داخل البرنامج النصي
تتوفر المدخلات المسماة إلى البرنامج النصي لخطوة خط الأنابيب كقاموس داخل Run الكائن. استرداد الكائن النشط Run باستخدام ثم استرداد قاموس المدخلات المسماة باستخدام Run.get_context()input_datasets. إذا مررت الكائن باستخدام الوسيطة بدلا من الوسيطة، فقم بالوصول إلى البيانات باستخدام التعليمات البرمجية DatasetConsumptionConfiginputsarguments.ArgParser يتم عرض كلتا التقنيتين في المقتطف التالي.
# In pipeline definition script:
# Code for demonstration only: It would be very confusing to split datasets between `arguments` and `inputs`
train_step = PythonScriptStep(
name="train_data",
script_name="train.py",
compute_target=cluster,
arguments=['--training-folder', train.as_named_input('train').as_download()],
inputs=[test.as_named_input('test').as_download()]
)
# In pipeline script
parser = argparse.ArgumentParser()
parser.add_argument('--training-folder', type=str, dest='train_folder', help='training data folder mounting point')
args = parser.parse_args()
training_data_folder = args.train_folder
testing_data_folder = Run.get_context().input_datasets['test']
ستكون القيمة التي تم تمريرها هي المسار إلى ملف (ملفات) مجموعة البيانات.
من الممكن أيضا الوصول إلى مسجل Dataset مباشرة. نظرا لأن مجموعات البيانات المسجلة ثابتة ومشتركة عبر مساحة عمل، يمكنك استردادها مباشرة:
run = Run.get_context()
ws = run.experiment.workspace
ds = Dataset.get_by_name(workspace=ws, name='mnist_opendataset')
ملاحظة
تعرض المقتطفات السابقة شكل المكالمات وليست جزءا من عينة Microsoft. يجب عليك استبدال الوسيطات المختلفة بقيم من مشروعك الخاص.
الاستخدام OutputFileDatasetConfig للبيانات الوسيطة
بينما Dataset تمثل الكائنات البيانات الثابتة فقط، OutputFileDatasetConfig يمكن استخدام الكائن (الكائنات) لإخراج البيانات المؤقتة من خطوات خط الأنابيب وبيانات الإخراج الثابتة. OutputFileDatasetConfig يدعم كتابة البيانات إلى تخزين blob أو fileshare أو adlsgen1 أو adlsgen2. وهو يدعم كل من وضع التحميل ووضع التحميل. في وضع التحميل، يتم تخزين الملفات المكتوبة إلى الدليل المثبت بشكل دائم عند إغلاق الملف. في وضع التحميل، يتم تحميل الملفات المكتوبة إلى دليل الإخراج في نهاية المهمة. إذا فشلت المهمة أو تم إلغاؤها، فلن يتم تحميل دليل الإخراج.
OutputFileDatasetConfig السلوك الافتراضي للكائن هو الكتابة إلى مخزن البيانات الافتراضي لمساحة العمل. مرر الكائنات الخاصة بك OutputFileDatasetConfig إلى الخاص بك PythonScriptStep باستخدام المعلمة arguments .
from azureml.data import OutputFileDatasetConfig
dataprep_output = OutputFileDatasetConfig()
input_dataset = Dataset.get_by_name(workspace, 'raw_data')
dataprep_step = PythonScriptStep(
name="prep_data",
script_name="dataprep.py",
compute_target=cluster,
arguments=[input_dataset.as_named_input('raw_data').as_mount(), dataprep_output]
)
ملاحظة
الكتابة المتزامنة OutputFileDatasetConfig إلى إرادة تفشل. لا تحاول استخدام واحدة OutputFileDatasetConfig في وقت واحد. لا تشارك واحدة OutputFileDatasetConfig في حالة معالجة متعددة، كما هو الحال عند استخدام التدريب الموزع.
استخدامها OutputFileDatasetConfig كمخرجات لخطوة تدريبية
داخل خط الأنابيب PythonScriptStepالخاص بك ، يمكنك استرداد مسارات الإخراج المتاحة باستخدام وسيطات البرنامج. إذا كانت هذه الخطوة هي الأولى وستقوم بتهيئة بيانات الإخراج ، فيجب عليك إنشاء الدليل في المسار المحدد. يمكنك بعد ذلك كتابة أي ملفات ترغب في احتوائها في OutputFileDatasetConfigملف .
parser = argparse.ArgumentParser()
parser.add_argument('--output_path', dest='output_path', required=True)
args = parser.parse_args()
# Make directory for file
os.makedirs(os.path.dirname(args.output_path), exist_ok=True)
with open(args.output_path, 'w') as f:
f.write("Step 1's output")
القراءة OutputFileDatasetConfig كمدخلات للخطوات غير الأولية
بعد أن تكتب خطوة خط الأنابيب الأولية بعض البيانات إلى المسار وتصبح ناتجا لتلك الخطوة الأولية ، يمكن استخدامها كإدخال إلى OutputFileDatasetConfig خطوة لاحقة.
في التعليمة البرمجية التالية:
step1_output_dataيشير إلى أن إخراج PythonScriptStep، مكتوب إلى مخزن بيانات ADLS Gen 2،step1my_adlsgen2في وضع الوصول إلى التحميل. تعرف على المزيد حول كيفية إعداد أذونات الدور لكتابة البيانات مرة أخرى إلى مخازن بيانات ADLS Gen 2.بعد
step1الانتهاء وكتابة الإخراج إلى الوجهة المشار إليها بواسطةstep1_output_data، ثم الخطوة 2 جاهزة للاستخدامstep1_output_dataكمدخل.
# get adls gen 2 datastore already registered with the workspace
datastore = workspace.datastores['my_adlsgen2']
step1_output_data = OutputFileDatasetConfig(name="processed_data", destination=(datastore, "mypath/{run-id}/{output-name}")).as_upload()
step1 = PythonScriptStep(
name="generate_data",
script_name="step1.py",
runconfig = aml_run_config,
arguments = ["--output_path", step1_output_data]
)
step2 = PythonScriptStep(
name="read_pipeline_data",
script_name="step2.py",
compute_target=compute,
runconfig = aml_run_config,
arguments = ["--pd", step1_output_data.as_input()]
)
pipeline = Pipeline(workspace=ws, steps=[step1, step2])
تسجيل OutputFileDatasetConfig الكائنات لإعادة استخدامها
إذا كنت ترغب في إتاحة تجربتك لفترة أطول من مدة تجربتك OutputFileDatasetConfig ، فقم بتسجيلها في مساحة العمل لمشاركتها وإعادة استخدامها عبر التجارب.
step1_output_ds = step1_output_data.register_on_complete(name='processed_data',
description = 'files from step1`)
حذف المحتويات OutputFileDatasetConfig عند عدم الحاجة إليها
لا يقوم Azure تلقائيا بحذف البيانات الوسيطة المكتوبة باستخدام OutputFileDatasetConfig. لتجنب رسوم التخزين لكميات كبيرة من البيانات غير الضرورية، يجب عليك إما:
- حذف البيانات الوسيطة برمجيا في نهاية تشغيل خط الأنابيب، عندما لا تكون هناك حاجة إليها
- استخدام التخزين الكتلي مع نهج تخزين قصير الأجل للبيانات الوسيطة (راجع تحسين التكاليف عن طريق أتمتة طبقات الوصول إلى Azure Blob Storage)
- مراجعة البيانات التي لم تعد هناك حاجة إليها وحذفها بانتظام
لمزيد من المعلومات، راجع تخطيط وإدارة تكاليف Azure التعلم الآلي.