مشاركة عبر


البرنامج التعليمي: تشغيل حمل عمل متوازي باستخدام Azure Batch باستخدام واجهة برمجة تطبيقات Python

استخدم Azure Batch لتشغيل مهام الحوسبة المتوازية وعالية الأداء (HPC) على نطاق واسع بكفاءة في Azure. يستعرض هذا البرنامج التعليمي مثالا على Python لتشغيل حمل عمل متوازي باستخدام Batch. ستتعلم سير العمل الشائع لتطبيق Batch وطريقة التفاعل برمجياً مع موارد Batch وStorage.

  • المصادقة باستخدام حسابات الدفعات والتخزين.
  • تحميل ملفات الإدخال إلى التخزين.
  • إنشاء تجمع من عقد الحوسبة لتشغيل تطبيق.
  • إنشاء وظيفة ومهام لمعالجة ملفات الإدخال.
  • مراقبة تنفيذ المهمة.
  • استرداد ملفات الإخراج.

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

إذا لم يكن لديك حساب Azure، فأنشئ حساباً مجانياً قبل أن تبدأ.

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

تسجيل الدخول إلى Azure

قم بتسجيل الدخول إلى بوابة Azure.

الحصول على بيانات اعتماد الحساب

لهذا المثال، تحتاج إلى توفير بيانات اعتماد لحسابات "الدفعة" و"التخزين". طريقة مباشرة للحصول على بيانات الاعتماد الضرورية في مدخل Azure. (يمكنك أيضًا الحصول على بيانات الاعتماد هذه باستخدام واجهات برمجة تطبيقات Azure أو أدوات سطر الأوامر.)

  1. حدد All services>Batch accounts، ثم حدد اسم حساب Batch الخاص بك.

  2. لمشاهدة بيانات اعتماد Batch، حدد Keys. انسخ قيم حساب Batch وعنوان URL ومفتاح الوصول الأساسي إلى محرر نص.

  3. لمشاهدة اسم حساب التخزين ومفاتيحه، حدد حساب التخزين. انسخ قيم اسم حساب التخزين وKey1إلى محرر نص.

تنزيل عينة التطبيق وتشغيلها

تنزيل التطبيق النموذج

قم بتنزيل أو نسخ نموذج التطبيق من GitHub. لنسخ نموذج مستودع التطبيق باستخدام عميل Git، استخدم الأمر التالي:

git clone https://github.com/Azure-Samples/batch-python-ffmpeg-tutorial.git

انتقل إلى الدليل الذي يحتوي على batch_python_tutorial_ffmpeg.py الملف.

في بيئة Python الخاصة بك، قم بتثبيت الحزم المطلوبة باستخدام pip.

pip install -r requirements.txt

استخدم محرر التعليمات البرمجية لفتح الملف config.py. قم بتحديث سلاسل بيانات اعتماد حساب الدفعة والتخزين بالقيم الفريدة لحساباتك. على سبيل المثال:

_BATCH_ACCOUNT_NAME = 'yourbatchaccount'
_BATCH_ACCOUNT_KEY = 'xxxxxxxxxxxxxxxxE+yXrRvJAqT9BlXwwo1CwF+SwAYOxxxxxxxxxxxxxxxx43pXi/gdiATkvbpLRl3x14pcEQ=='
_BATCH_ACCOUNT_URL = 'https://yourbatchaccount.yourbatchregion.batch.azure.com'
_STORAGE_ACCOUNT_NAME = 'mystorageaccount'
_STORAGE_ACCOUNT_KEY = 'xxxxxxxxxxxxxxxxy4/xxxxxxxxxxxxxxxxfwpbIC5aAWA8wDu+AFXZB827Mt9lybZB1nUcQbQiUrkPtilK5BQ=='

تشغيل التطبيق

لتشغيل البرنامج النصي:

python batch_python_tutorial_ffmpeg.py

عند تشغيل التطبيق النموذجي، يكون إخراج وحدة التحكم مشابهاً لما يلي. أثناء التنفيذ، تواجه توقفاً مؤقتاً عند Monitoring all tasks for 'Completed' state, timeout in 00:30:00... أثناء بدء عقد حساب التجمع.

Sample start: 11/28/2018 3:20:21 PM

Container [input] created.
Container [output] created.
Uploading file LowPriVMs-1.mp4 to container [input]...
Uploading file LowPriVMs-2.mp4 to container [input]...
Uploading file LowPriVMs-3.mp4 to container [input]...
Uploading file LowPriVMs-4.mp4 to container [input]...
Uploading file LowPriVMs-5.mp4 to container [input]...
Creating pool [LinuxFFmpegPool]...
Creating job [LinuxFFmpegJob]...
Adding 5 tasks to job [LinuxFFmpegJob]...
Monitoring all tasks for 'Completed' state, timeout in 00:30:00...
Success! All tasks completed successfully within the specified timeout period.
Deleting container [input]....

Sample end: 11/28/2018 3:29:36 PM
Elapsed time: 00:09:14.3418742

الانتقال إلى حساب Batch في مدخل Microsoft Azure لمراقبة المجموعة وعقد الحساب والوظيفة والمهام. على سبيل المثال، لمشاهدة خريطة التمثيل اللوني لعقد الحوسبة في التجمع الخاص بك، حدد Pools>LinuxFFmpegPool.

عند تشغيل المهام، تكون خريطة التمثيل اللوني مشابهة لما يلي:

لقطة شاشة لخريطة التمثيل اللوني للتجمع.

وقت التنفيذ النموذجي هو حوالي 5 دقائق عند تشغيل التطبيق في تكوينه الافتراضي. يستغرق إنشاء المجموعة معظم الوقت.

استرجاع ملفات الإخراج

يمكنك استخدام مدخل Azure لتنزيل ملفات MP3 الناتجة عن مهام ffmpeg.

  1. انقر فوق جميع حسابات تخزين الخدمات>، ثم انقر فوق اسم حساب التخزين الخاص بك.
  2. انقر فوق >
  3. انقر بزر الماوس الأيمن فوق أحد ملفات MP3 الناتجة ثم انقر فوق تنزيل. اتبع المطالبات في المستعرض لفتح الملف أو حفظه.

قم بتحميل ملف الإخراج

على الرغم من عدم عرضها في هذه العينة، فإنه يمكنك أيضًا تنزيل الملفات برمجيًا من عقد الحوسبة أو من حاوية التخزين.

مراجعة الرمز

تُقسم الأقسام التالية التطبيق النموذجي إلى الخطوات التي ينفذها لمعالجة عبء العمل في خدمة Batch. راجع تعليمة Python البرمجية أثناء قراءة بقية هذه المقالة، حيث لا تتم مناقشة كل سطر من التعليمات البرمجية في العينة.

مصادقة عملاء Blob وBatch

للتفاعل مع حساب تخزين، يستخدم التطبيق حزمة azure-storage-blob لإنشاء كائن BlockBlobService .

blob_client = azureblob.BlockBlobService(
    account_name=_STORAGE_ACCOUNT_NAME,
    account_key=_STORAGE_ACCOUNT_KEY)

ينشئ التطبيق كائن BatchServiceClient لإنشاء وإدارة التجمعات والوظائف والمهام في خدمة Batch. يستخدم عميل Batch في العينة مصادقة المفتاح المشترك. يدعم Batch أيضا المصادقة من خلال معرف Microsoft Entra، لمصادقة المستخدمين الفرديين أو تطبيق غير مراقب.

credentials = batchauth.SharedKeyCredentials(_BATCH_ACCOUNT_NAME,
                                             _BATCH_ACCOUNT_KEY)

batch_client = batch.BatchServiceClient(
    credentials,
    base_url=_BATCH_ACCOUNT_URL)

تحميل ملفات الإدخال

يستخدم blob_client التطبيق المرجع إنشاء حاوية تخزين لملفات إدخال MP4 وحاوية لإخراج المهمة. ثم يستدعي الدالة upload_file_to_container لتحميل ملفات MP4 في دليل InputFiles المحلي إلى الحاوية. يتم تعريف الملفات المخزنة على أنها كائنات مجمعة ResourceFile والتي يمكن لـ Batch تنزيلها لاحقاً إلى عقد الحساب.

blob_client.create_container(input_container_name, fail_on_exist=False)
blob_client.create_container(output_container_name, fail_on_exist=False)
input_file_paths = []

for folder, subs, files in os.walk(os.path.join(sys.path[0], './InputFiles/')):
    for filename in files:
        if filename.endswith(".mp4"):
            input_file_paths.append(os.path.abspath(
                os.path.join(folder, filename)))

# Upload the input files. This is the collection of files that are to be processed by the tasks.
input_files = [
    upload_file_to_container(blob_client, input_container_name, file_path)
    for file_path in input_file_paths]

قم بإنشاء مجموعة من العقد الحسابية

بعد ذلك، يُنشئ النموذج مجموعة من عُقد الحساب في حساب Batch مع استدعاء create_pool. تستخدم هذه الدالة المعرفة فئة Batch PoolAddParameter لتعيين عدد العقد وحجم الجهاز الظاهري وتكوين التجمع. هنا، يحدد كائن VirtualMachineConfigurationImageReference إلى صورة Ubuntu Server 20.04 LTS المنشورة في Azure Marketplace. Batch يدعم مجموعة كبيرة من صور VM في Azure Marketplace، بالإضافة إلى صور VM المخصصة.

يتم تحديد عدد العقد وحجم VM باستخدام ثوابت محددة. تدعم المجموعة العقد المخصصة والعقد الموضعية، ويمكنك استخدام أحدهما أو كليهما في مجموعاتك. تُحجز العقد المخصصة للمجموعة الخاص بك. يتم تقديم العقد الموضعية بسعر مخفض من سعة VM الزائدة في Azure. تصبح العقد الموضعية غير متوفرة إذا لم يكن لدى Azure سعة كافية. ينشئ النموذج بشكل افتراضي تجمعا يحتوي على خمس عقد Spot فقط في الحجم Standard_A1_v2.

بالإضافة إلى خصائص العقدة الفعلية، يتضمن تكوين التجمع هذا كائن StartTask . يتم تنفيذ StartTask على كل عقدة حيث تنضم تلك العقدة إلى التجمع، وفي كل مرة يتم فيها إعادة تشغيل عقدة. في هذا المثال، يقوم StartTask بتشغيل أوامر Bash shell لتثبيت حزمة ffmpeg والتبعيات على العقد.

يرسل أسلوب pool.add التجمع إلى خدمة Batch.

new_pool = batch.models.PoolAddParameter(
    id=pool_id,
    virtual_machine_configuration=batchmodels.VirtualMachineConfiguration(
        image_reference=batchmodels.ImageReference(
            publisher="Canonical",
            offer="UbuntuServer",
            sku="20.04-LTS",
            version="latest"
        ),
        node_agent_sku_id="batch.node.ubuntu 20.04"),
    vm_size=_POOL_VM_SIZE,
    target_dedicated_nodes=_DEDICATED_POOL_NODE_COUNT,
    target_low_priority_nodes=_LOW_PRIORITY_POOL_NODE_COUNT,
    start_task=batchmodels.StartTask(
        command_line="/bin/bash -c \"apt-get update && apt-get install -y ffmpeg\"",
        wait_for_success=True,
        user_identity=batchmodels.UserIdentity(
            auto_user=batchmodels.AutoUserSpecification(
                scope=batchmodels.AutoUserScope.pool,
                elevation_level=batchmodels.ElevationLevel.admin)),
    )
)
batch_service_client.pool.add(new_pool)

قم بإنشاء وظيفة

تحدد وظيفة Batch مخزناً لتشغيل المهام عليه وإعدادات اختيارية مثل الأولوية والجدول الزمني للعمل. يُنشئ النموذج وظيفة باستدعاء create_job. تستخدم هذه الدالة المعرفة فئة JobAddParameter لإنشاء وظيفة على التجمع الخاص بك. ترسل طريقة job.add التجمع إلى خدمة Batch. في البداية لا توجد مهام للوظيفة.

job = batch.models.JobAddParameter(
    id=job_id,
    pool_info=batch.models.PoolInformation(pool_id=pool_id))

batch_service_client.job.add(job)

إنشاء مهام

ينشئ التطبيق مهاما في الوظيفة مع استدعاء إلى add_tasks. تنشئ هذه الدالة المعرفة قائمة بعناصر المهام باستخدام فئة TaskAddParameter . تقوم كل مهمة بتشغيل ffmpeg لمعالجة كائن إدخال resource_files باستخدام معلمة command_line . سبق تثبيت ffmpeg على كل عقدة عند إنشاء المجموعة. هنا، يقوم سطر الأوامر بتشغيل ffmpeg لتحويل كل ملف إدخال MP4 (فيديو) إلى ملف MP3 (صوتي).

يقوم النموذج بإنشاء كائن OutputFile لملف MP3 بعد تشغيل سطر الأوامر. يتم تحميل ملفات إخراج كل مهمة (واحدة، في هذه الحالة) إلى حاوية في حساب التخزين المرتبط، باستخدام خاصية المهمة output_files .

ثم يضيف التطبيق المهام إلى المهمة باستخدام أسلوب task.add_collection ، الذي يقوم بقوائم الانتظار لتشغيلها على عقد الحوسبة.

tasks = list()

for idx, input_file in enumerate(input_files):
    input_file_path = input_file.file_path
    output_file_path = "".join((input_file_path).split('.')[:-1]) + '.mp3'
    command = "/bin/bash -c \"ffmpeg -i {} {} \"".format(
        input_file_path, output_file_path)
    tasks.append(batch.models.TaskAddParameter(
        id='Task{}'.format(idx),
        command_line=command,
        resource_files=[input_file],
        output_files=[batchmodels.OutputFile(
            file_pattern=output_file_path,
            destination=batchmodels.OutputFileDestination(
                container=batchmodels.OutputFileBlobContainerDestination(
                    container_url=output_container_sas_url)),
            upload_options=batchmodels.OutputFileUploadOptions(
                upload_condition=batchmodels.OutputFileUploadCondition.task_success))]
    )
    )
batch_service_client.task.add_collection(job_id, tasks)

مراقبة المهام

عند إضافة المهام إلى مهمة، يقوم Batch تلقائيا بقوائم الانتظار وجدولتها للتنفيذ على عقد الحساب في التجمع المقترن. استنادا إلى الإعدادات التي تحددها، تعالج Batch جميع مهام وضع المهام في قائمة الانتظار والجدولة وإعادة المحاولة وواجبات إدارة المهام الأخرى.

هناك العديد من الأساليب لمراقبة تنفيذ المهام. wait_for_tasks_to_complete تستخدم الدالة في هذا المثال كائن TaskState لمراقبة المهام لحالة معينة، وفي هذه الحالة الحالة المكتملة، ضمن حد زمني.

while datetime.datetime.now() < timeout_expiration:
    print('.', end='')
    sys.stdout.flush()
    tasks = batch_service_client.task.list(job_id)

    incomplete_tasks = [task for task in tasks if
                        task.state != batchmodels.TaskState.completed]
    if not incomplete_tasks:
        print()
        return True
    else:
        time.sleep(1)
...

تنظيف الموارد

بعد تشغيل المهام، يحذف التطبيق تلقائياً حاوية تخزين الإدخال التي أنشأها، ويمنحك خيار حذف مجموعة Batch والوظيفة. لكل من فئتي JobOperations و PoolOperations في BatchClient أساليب حذف، والتي يتم استدعاؤها إذا قمت بتأكيد الحذف. على الرغم من أنك لا تتكلف رسوماً مقابل الأعمال والمهام نفسها، إلا أنك تتحمل تكلفة العقد الحسابية. وبالتالي، نوصي بتخصيص تجمعات حسب الحاجة فقط. عند حذف التجمع، يتم حذف كافة إخراج المهام على العقد. ومع ذلك، تظل ملفات الإدخال والإخراج في حساب التخزين.

عند عدم الحاجة، احذف مجموعة الموارد وحساب الدفعة وحساب التخزين. للقيام بذلك في مدخل Microsoft Azure، حدد مجموعة الموارد لحساب Batch واختر Delete resource group.

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

في هذا البرنامج التعليمي، نتعلم طريقة القيام بما يأتي:

  • المصادقة باستخدام حسابات الدفعات والتخزين.
  • تحميل ملفات الإدخال إلى التخزين.
  • إنشاء تجمع من عقد الحوسبة لتشغيل تطبيق.
  • إنشاء وظيفة ومهام لمعالجة ملفات الإدخال.
  • مراقبة تنفيذ المهمة.
  • استرداد ملفات الإخراج.

لمزيد من الأمثلة على استخدام واجهة برمجة تطبيقات Python لجدولة أحمال عمل Batch ومعالجتها، راجع نماذج Batch Python على GitHub.