نقل البيانات إلى خطوات تدفقات التعلم الآلي وما بينها (Python)

توفر هذه المقالة تعليمات برمجية لاستيراد البيانات وتحويلها ونقلها بين الخطوات في خط أنابيب Azure التعلم الآلي. للحصول على نظرة عامة حول كيفية عمل البيانات في Azure التعلم الآلي، راجع الوصول إلى البيانات في خدمات تخزين Azure. للحصول على فوائد وبنية خطوط أنابيب Azure التعلم الآلي، راجع ما هي خطوط أنابيب Azure التعلم الآلي؟

ستوضح لك هذه المقالة كيفية:

  • استخدام Dataset الكائنات للبيانات الموجودة مسبقا
  • الوصول إلى البيانات ضمن خطواتك
  • تقسيم Dataset البيانات إلى مجموعات فرعية، مثل المجموعات الفرعية للتدريب والتحقق من الصحة
  • إنشاء OutputFileDatasetConfig كائنات لنقل البيانات إلى خطوة خط الأنابيب التالية
  • استخدام OutputFileDatasetConfig الكائنات كإدخال إلى خطوات خط الأنابيب
  • إنشاء كائنات جديدة Dataset منك OutputFileDatasetConfig ترغب في الاستمرار

المتطلبات الأساسية

ستحتاج إلى:

استخدام 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(). إذا كان البرنامج النصي الخاص بك يعالج جميع الملفات الموجودة في مجموعة البيانات الخاصة بك وكان القرص الموجود على مورد الحوسبة كبيرا بما يكفي لمجموعة البيانات ، فإن وضع الوصول إلى التنزيل هو الخيار الأفضل. سيتجنب وضع الوصول إلى التنزيل النفقات العامة لتدفق البيانات في وقت التشغيل. إذا كان البرنامج النصي الخاص بك يصل إلى مجموعة فرعية من مجموعة البيانات أو كان كبيرا جدا بالنسبة للحوسبة، فاستخدم وضع الوصول إلى التحميل. لمزيد من المعلومات، اقرأ تحميل مقابل تحميل

لتمرير مجموعة بيانات إلى خطوة خط الأنابيب:

  1. استخدام TabularDataset.as_named_input() أو FileDataset.as_named_input() (لا يوجد "s" في النهاية) لإنشاء DatasetConsumptionConfig كائن
  2. استخدام as_mount() وضع الوصول أو as_download() لضبطه
  3. تمرير مجموعات البيانات إلى خطوات خط الأنابيب باستخدام الوسيطة أو الوسيطة 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 التعلم الآلي.

الخطوات التالية