تنفيذ مكوّن البرنامج النصي Python

توضح هذه المقالة مكوّن Execute Python Script في مصمم التعلم الآلي من Microsoft Azure.

استخدم هذا المكوّن لتشغيل التعليمات البرمجية على Python. لمزيد من المعلومات حول مبادئ بنية Python وتصميمها، راجع كيفية تشغيل التعليمات البرمجية على Python في مصمم التعلم الآلي من Microsoft Azure.

باستخدام Python، يمكنك تنفيذ مهام لا تدعمها المكوّنات الموجودة، مثل:

  • تصور البيانات باستخدام matplotlib.
  • استخدام مكتبات Python لتعداد مجموعات البيانات والنماذج في مساحة عملك.
  • قراءة البيانات وتحميلها ومعالجتها من مصادر لا يدعمها مكوّن استيراد البيانات.
  • قم بتشغيل التعليمات البرمجية للتعلم العميق الخاص بك.

حزم Python المدعومة

يستخدم التعلم الآلي من Microsoft Azure توزيع Anaconda على Python، والذي يتضمن العديد من الأدوات المساعدة الشائعة لمعالجة البيانات. سنقوم بتحديث إصدار Anaconda تلقائياً. الإصدار الحالي هو:

  • توزيع Anaconda 4.5+ على Python 3.6

للحصول على قائمة كاملة، راجع القسم حزم Python المثبّتة مسبقاً.

لتركيب الحزم غير الموجودة في القائمة المركّبة مسبقاً (على سبيل المثال، scikit-misc)، أضف التعليمات البرمجية التالية إلى برنامجك النصي:

import os
os.system(f"pip install scikit-misc")

استخدم التعليمات البرمجية التالية لتركيب الحزم للحصول على أداء أفضل، خاصةً للاستدلال:

import importlib.util
package_name = 'scikit-misc'
spec = importlib.util.find_spec(package_name)
if spec is None:
    import os
    os.system(f"pip install scikit-misc")

ملاحظة

إذا كان التدفق يحتوي على العديد من مكوّنات Execute Python Script التي تحتاج إلى حزم غير موجودة في القائمة المركّبة مسبقاً، فقم بتثبيت الحزم في كل مكوّن.

تحذير

لا يدعم مكوّن Excute Python Script تركيب الحزم التي تعتمد على مكتبات أصلية إضافية تحتوي على أمر مثل "apt-get"، على سبيل المثال Java وPyODBC وما إلى ذلك. وذلك لأن هذا المكوّن يتم تنفيذه في بيئة بسيطة مع Python مركّب مسبقاً فقط وبإذن غير إداري.

الوصول إلى مساحة العمل الحالية ومجموعات البيانات المسجلة

يمكنك الرجوع إلى عينة التعليمات البرمجية التالية للوصول إلى مجموعات البيانات المسجلة في مساحة عملك:

def azureml_main(dataframe1 = None, dataframe2 = None):

    # Execution logic goes here
    print(f'Input pandas.DataFrame #1: {dataframe1}')
    from azureml.core import Run
    run = Run.get_context(allow_offline=True)
    #access to current workspace
    ws = run.experiment.workspace

    #access to registered dataset of current workspace
    from azureml.core import Dataset
    dataset = Dataset.get_by_name(ws, name='test-register-tabular-in-designer')
    dataframe1 = dataset.to_pandas_dataframe()
     
    # If a zip file is connected to the third input port,
    # it is unzipped under "./Script Bundle". This directory is added
    # to sys.path. Therefore, if your zip file contains a Python file
    # mymodule.py you can import it using:
    # import mymodule

    # Return value must be of a sequence of pandas.DataFrame
    # E.g.
    #   -  Single return value: return dataframe1,
    #   -  Two return values: return dataframe1, dataframe2
    return dataframe1,

تحميل الملفات

يدعم مكوّن Execute Python Script تحميل الملفات باستخدام عدة SDK على Python للتعلم التعلم الآلي من Microsoft Azure.

يوضح المثال التالي كيفية تحميل ملف صورة في مكوّن Execute Python Script:


# The script MUST contain a function named azureml_main,
# which is the entry point for this component.

# Imports up here can be used to
import pandas as pd

# The entry point function must have two input arguments:
#   Param<dataframe1>: a pandas.DataFrame
#   Param<dataframe2>: a pandas.DataFrame
def azureml_main(dataframe1 = None, dataframe2 = None):

    # Execution logic goes here
    print(f'Input pandas.DataFrame #1: {dataframe1}')

    from matplotlib import pyplot as plt
    plt.plot([1, 2, 3, 4])
    plt.ylabel('some numbers')
    img_file = "line.png"
    plt.savefig(img_file)

    from azureml.core import Run
    run = Run.get_context(allow_offline=True)
    run.upload_file(f"graphics/{img_file}", img_file)

    # Return value must be of a sequence of pandas.DataFrame
    # For example:
    #   -  Single return value: return dataframe1,
    #   -  Two return values: return dataframe1, dataframe2
    return dataframe1,

بعد الانتهاء من تشغيل التدفق، يمكنك معاينة الصورة في اللوحة اليمنى للمكوّن.

إصدار أولي للصورة المحملة

يمكنك أيضاً تحميل ملف إلى أي مخزن بيانات باستخدام التعليمات البرمجية التالية. يمكنك فقط معاينة الملف في حساب التخزين الخاص بك.

import pandas as pd

# The entry point function MUST have two input arguments.
# If the input port is not connected, the corresponding
# dataframe argument will be None.
#   Param<dataframe1>: a pandas.DataFrame
#   Param<dataframe2>: a pandas.DataFrame
def azureml_main(dataframe1 = None, dataframe2 = None):

    # Execution logic goes here
    print(f'Input pandas.DataFrame #1: {dataframe1}')

    from matplotlib import pyplot as plt
    import os

    plt.plot([1, 2, 3, 4])
    plt.ylabel('some numbers')
    img_file = "line.png"

    # Set path
    path = "./img_folder"
    os.mkdir(path)
    plt.savefig(os.path.join(path,img_file))

    # Get current workspace
    from azureml.core import Run
    run = Run.get_context(allow_offline=True)
    ws = run.experiment.workspace
    
    # Get a named datastore from the current workspace and upload to specified path
    from azureml.core import Datastore 
    datastore = Datastore.get(ws, datastore_name='workspacefilestore')
    datastore.upload(path)

    return dataframe1,

كيفية تكوين Execute Python Script

يحتوي مكوّن Execute Python Script على عينة التعليمات البرمجية على Python التي يمكنك استخدامها كنقطة بداية. لتكوين مكوّن Execute Python Script، قم بتوفير مجموعة من المدخلات ورمز Python للتشغيل في مربع نص البرنامج النصي Python.

  1. أضف مكوّن تنفيذ البرنامج النصي Python إلى التدفق الخاص بك.

  2. أضف مجموعات البيانات على Dataset1 وقم بتوصيلها من المصمم الذي تريد استخدامه للإدخال. ارجع إلى مجموعة البيانات هذه في برنامج Python النصي الخاص بك باعتبارها DataFrame1.

    يُعد استخدام مجموعة بيانات أمراً اختيارياً. استخدمها إذا كنت تريد إنشاء بيانات باستخدام Python، أو استخدم التعليمات البرمجية Python لاستيراد البيانات مباشرةً إلى المكوّن.

    يدعم هذا المكوّن إضافة مجموعة بيانات ثانية على Dataset2. ارجع إلى مجموعة البيانات الثانية في البرنامج النصي Python الخاص بك باعتبارها DataFrame2.

    يتم تحويل مجموعات البيانات المخزنة في التعلم الآلي من Microsoft Azure تلقائياً إلى إطارات بيانات pandas عند تحميلها مع هذا المكوّن.

    تنفيذ مخطط إدخال Python

  3. لتضمين حزم أو تعليمات برمجية جديدة على Python، قم بتوصيل الملف المضغوط الذي يحتوي على هذه الموارد المخصصة بمنفذ مجموعة البرنامج النصي. أو إذا كان البرنامج النصي الخاص بك أكبر من 16 كيلوبايت، فاستخدم منفذ حزمة البرنامج النصي لتجنب أخطاء مثل CommandLine يتجاوز الحد الأقصى وهو 16597 حرفاً.

    1. قم بتجميع البرنامج النصي والموارد المخصصة الأخرى في ملف مضغوط.
    2. قم بتحميل الملف المضغوط كمجموعة بيانات ملف إلى الاستوديو.
    3. اسحب مكوّن مجموعة البيانات من قائمة Datasets في جزء المكوّن الأيسر في صفحة تأليف المصمم.
    4. قم بتوصيل مكوّن مجموعة البيانات إلى منفذ حزمة البرنامج النصي لمكوّن Execute Python Script.

    يمكن استخدام أي ملف موجود في الأرشيف المضغوط الذي تم تحميله أثناء تنفيذ التدفق. إذا كان الأرشيف يتضمن بنية دليل، يتم الاحتفاظ بالبنية.

    هام

    يرجى استخدام اسم فريد وله معنى للملفات في حزمة البرنامج النصي نظراً لأن بعض الكلمات الشائعة (مثل test وapp وما إلى ذلك) يتم الاحتفاظ بها للخدمات المضمنة.

    فيما يلي مثال على حزمة البرنامج النصي، الذي يحتوي على ملف برنامج نصي Python وملف txt:

    مثال على حزمة البرنامج النصي

    فيما يلي محتوى my_script.py:

    def my_func(dataframe1):
        return dataframe1
    

    فيما يلي نموذج التعليمات البرمجية الذي يوضح كيفية استهلاك الملفات في حزمة البرنامج النصي:

    import pandas as pd
    from my_script import my_func
    
    def azureml_main(dataframe1 = None, dataframe2 = None):
    
        # Execution logic goes here
        print(f'Input pandas.DataFrame #1: {dataframe1}')
    
        # Test the custom defined Python function
        dataframe1 = my_func(dataframe1)
    
        # Test to read custom uploaded files by relative path
        with open('./Script Bundle/my_sample.txt', 'r') as text_file:
            sample = text_file.read()
    
        return dataframe1, pd.DataFrame(columns=["Sample"], data=[[sample]])
    
  4. في مربع نص Python script، اكتب أو الصق البرنامج النصي Python الصالح.

    ملاحظة

    كن حذراً عند كتابة البرنامج النصي الخاص بك. تأكد من عدم وجود أخطاء في بناء الجملة، مثل استخدام متغيّرات غير معلنة أو مكوّنات أو دالات غير محددة. انتبه انتباهاً كبيراً إلى قائمة المكونات المركّبة مسبقاً. لاستيراد المكوّنات غير المدرجة، قم بتركيب الحزم المقابلة في برنامجك النصي، مثل:

    import os
    os.system(f"pip install scikit-misc")
    

    يتم ملء مربع نص Python script مسبقاً ببعض الإرشادات في التعليقات، ونموذج التعليمات البرمجية للوصول إلى البيانات والإخراج. يجب تحرير هذه التعليمة البرمجية أو استبدالها. اتبع قواعد Python للمسافة البادئة والكتابة:

    • يجب أن يحتوي البرنامج النصي على دالة تسمى azureml_main كنقطة إدخال لهذا المكوّن.
    • يجب أن تحتوي دالة نقطة الإدخال على وسيطتي إدخال وParam<dataframe1> وParam<dataframe2> حتى عندما لا يتم استخدام هذه الوسيطات في برنامجك النصي.
    • يتم فك ضغط الملفات المضغوطة المتصلة بمنفذ الإدخال الثالث وتخزينها في الدليل .\Script Bundle، والذي تتم إضافته أيضا إلى sys.path Python.

    إذا كان ملف .zip يحتوي على mymodule.py، فقم باستيراده باستخدام import mymodule.

    يمكن إرجاع مجموعتي بيانات إلى المصمم، والتي يجب أن تكون سلسلة من النوع pandas.DataFrame. يمكنك إنشاء مخرجات أخرى في التعليمات البرمجية Python وكتابتها مباشرةً إلى مساحة تخزين Azure.

    تحذير

    لا يوصى بالتوصيل بقاعدة بيانات أو مخازن خارجية أخرى في مكوّن Execute Python Script. يمكنك استخدام مكوّن استيراد البيانات ومكوّن تصدير البيانات

  5. إرسال المسار.

    إذا تم إكمال المكوّن، فتحقق من الإخراج إذا كان كما هو متوقع.

    إذا فشل المكوّن، فأنت بحاجة إلى القيام ببعض استكشاف الأخطاء وإصلاحها. حدد المكوّن، وافتح Outputs+logs في الجزء الأيمن. افتح 70_driver_log.txt وابحث في azureml_main، ثم يمكنك العثور على السطر الذي تسبب في الخطأ. على سبيل المثال، يشير "ملف "/tmp/tmp01_ID/user_script.py"، السطر 17، في azureml_main" إلى حدوث الخطأ في السطر 17 من البرنامج النصي Python.

النتائج

يجب توفير نتائج أي حسابات بواسطة رمز Python المضمّن باعتباره pandas.DataFrame، والذي يتم تحويله تلقائياً إلى تنسيق مجموعة بيانات التعلم الآلي من Microsoft Azure. يمكنك بعد ذلك استخدام النتائج مع مكوّنات أخرى في التدفق.

يقوم المكوّن بإرجاع مجموعتي بيانات:

  • نتائج مجموعة البيانات 1، المحددة بواسطة أول إطار بيانات pandas تم إرجاعه في برنامج نصي Python.

  • نتيجة مجموعة البيانات 2، المحددة بواسطة ثاني إطار بيانات pandas تم إرجاعه في برنامج نصي Python.

حزم Python المركّبة مسبقاً

الحزم المركّبة مسبقاً هي:

  • adal==1.2.2
  • applicationinsights==0.11.9
  • attrs==19.3.0
  • azure-common==1.1.25
  • azure-core==1.3.0
  • azure-graphrbac==0.61.1
  • azure-identity==1.3.0
  • azure-mgmt-authorization==0.60.0
  • azure-mgmt-containerregistry==2.8.0
  • azure-mgmt-keyvault==2.2.0
  • azure-mgmt-resource==8.0.1
  • azure-mgmt-storage==8.0.0
  • azure-storage-blob==1.5.0
  • azure-storage-common==1.4.2
  • azureml-core==1.1.5.5
  • azureml-dataprep-native==14.1.0
  • azureml-dataprep==1.3.5
  • azureml-defaults==1.1.5.1
  • azureml-designer-classic-modules==0.0.118
  • azureml-designer-core==0.0.31
  • azureml-designer-internal==0.0.18
  • azureml-model-management-sdk==1.0.1b6.post1
  • azureml-pipeline-core==1.1.5
  • azureml-telemetry==1.1.5.3
  • backports.tempfile==1.0
  • backports.weakref==1.0.post1
  • boto3==1.12.29
  • botocore==1.15.29
  • cachetools==4.0.0
  • certifi==2019.11.28
  • cffi==1.12.3
  • chardet==3.0.4
  • click==7.1.1
  • cloudpickle==1.3.0
  • configparser==3.7.4
  • contextlib2==0.6.0.post1
  • cryptography==2.8
  • cycler==0.10.0
  • dill==0.3.1.1
  • distro==1.4.0
  • docker==4.2.0
  • docutils==0.15.2
  • dotnetcore2==2.1.13
  • flask==1.0.3
  • fusepy==3.0.1
  • gensim==3.8.1
  • google-api-core==1.16.0
  • google-auth==1.12.0
  • google-cloud-core==1.3.0
  • google-cloud-storage==1.26.0
  • google-resumable-media==0.5.0
  • googleapis-common-protos==1.51.0
  • gunicorn==19.9.0
  • idna==2.9
  • imbalanced-learn==0.4.3
  • isodate==0.6.0
  • itsdangerous==1.1.0
  • jeepney==0.4.3
  • jinja2==2.11.1
  • jmespath==0.9.5
  • joblib==0.14.0
  • json-logging-py==0.2
  • jsonpickle==1.3
  • jsonschema==3.0.1
  • kiwisolver==1.1.0
  • liac-arff==2.4.0
  • lightgbm==2.2.3
  • markupsafe==1.1.1
  • matplotlib==3.1.3
  • more-itertools==6.0.0
  • msal-extensions==0.1.3
  • msal==1.1.0
  • msrest==0.6.11
  • msrestazure==0.6.3
  • ndg-httpsclient==0.5.1
  • nimbusml==1.6.1
  • numpy==1.18.2
  • oauthlib==3.1.0
  • pandas==0.25.3
  • pathspec==0.7.0
  • pip==20.0.2
  • portalocker==1.6.0
  • protobuf==3.11.3
  • pyarrow==0.16.0
  • pyasn1-modules==0.2.8
  • pyasn1==0.4.8
  • pycparser==2.20
  • pycryptodomex==3.7.3
  • pyjwt==1.7.1
  • pyopenssl==19.1.0
  • pyparsing==2.4.6
  • pyrsistent==0.16.0
  • python-dateutil==2.8.1
  • pytz==2019.3
  • requests-oauthlib==1.3.0
  • requests==2.23.0
  • rsa==4.0
  • ruamel.yaml==0.15.89
  • s3transfer==0.3.3
  • scikit-learn==0.22.2
  • scipy==1.4.1
  • secretstorage==3.1.2
  • setuptools==46.1.1.post20200323
  • six==1.14.0
  • smart-open==1.10.0
  • urllib3==1.25.8
  • websocket-client==0.57.0
  • werkzeug==0.16.1
  • wheel==0.34.2

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

راجع مجموعة المكونات المتوفرة للتعلم الآلي من Azure.