Руководство. Запуск параллельной рабочей нагрузки с помощью пакета Azure с использованием Python API

Используйте пакетную службу Azure, чтобы эффективно выполнять пакетные задания для крупномасштабных параллельных и высокопроизводительных вычислений (HPC). В этом руководстве рассматривается пример Python для запуска параллельной рабочей нагрузки с помощью пакетной службы Azure. Вы изучите общий рабочий процесс приложения пакетной службы и узнаете, как программно взаимодействовать с ресурсами пакетной службы и службы хранилища.

  • Проверка подлинности с помощью учетных записей пакетной службы и служба хранилища.
  • Отправьте входные файлы в служба хранилища.
  • Создайте пул вычислительных узлов для запуска приложения.
  • Создайте задание и задачи для обработки входных файлов.
  • Мониторинг выполнения задач.
  • Получение выходных файлов.

В этом руководстве вы преобразуете файлы мультимедиа MP4 в формат MP3 параллельно с помощью средства ffmpeg с открытым исходным кодом.

Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начинать работу.

Необходимые компоненты

  • Python версии 3.8 или более поздней

  • Диспетчер пакетов pip.

  • учетная запись пакетной службы Azure и связанная учетная запись службы хранилища Azure. Чтобы создать эти учетные записи, ознакомьтесь с краткими руководствами по пакетной службе для портал Azure или Azure CLI.

Вход в Azure

Войдите на портал Azure.

Получение учетных данных учетной записи

В этом примере нужно предоставить учетные данные для доступа к учетной записи службы хранилища и пакетной службы. Проще всего получить необходимые учетные данные на портале Azure. (Можно также получить эти учетные данные с помощью API-интерфейсов Azure или средств командной строки.)

  1. Выберите Все службы>Учетные записи пакетной службы и щелкните имя учетной записи пакетной службы.

  2. Для просмотра учетных данных пакетной службы нажмите Ключи. Скопируйте значения учетной записи пакетной службы, 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

Перейдите в учетную запись пакетной службы на портале Azure, чтобы отследить пул, вычислительные узлы, задания и задачи. Например, чтобы просмотреть тепловую карту вычислительных узлов в пуле, выберите Пулы>LinuxFFmpegPool.

Во время выполнения задач тепловая карта выглядит следующим образом:

Screenshot of Pool heat map.

Обычное время выполнения — примерно 5 минут, если для приложения задана конфигурация по умолчанию. Для создания пула потребуется больше всего времени.

Извлечение выходных файлов

Портал Azure можно использовать для скачивания выходных MP3-файлов, созданных задачами ffmpeg.

  1. Выберите Все службы>Учетные записи службы хранилища и щелкните имя учетной записи службы хранилища.
  2. Щелкните Большие двоичные объекты>Вывод.
  3. Щелкните правой кнопкой мыши один из выходных MP3-файлов и нажмите кнопку Загрузить. Следуйте инструкциям в браузере, чтобы открыть или сохранить этот файл.

Download output file

Хотя это не показано в этом примере, файлы можно также скачать программным способом из вычислительных узлов или контейнера хранилищ.

Просмотр кода

В следующих разделах мы разобьем пример приложения на действия, выполняемые для обработки рабочей нагрузки в пакетной службе. Во время работы с оставшейся частью статьи сверяйтесь с кодом Python, так как в примере рассматриваются не все строки кода.

Проверка подлинности клиентов больших двоичных объектов и пакетной службы

Для взаимодействия с учетной записью хранения приложение использует пакет azure-storage-blob для создания объекта BlockBlobService.

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

Приложение создает объект BatchServiceClient для создания пулов, заданий и задач в пакетной службе, а также для управления ими. В примере клиент пакетной службы использует проверку подлинности с общим ключом. Пакет также поддерживает проверку подлинности с помощью идентификатора 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, которые она может впоследствии скачать на вычислительные узлы.

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]

Создание пула вычислительных узлов

Затем в учетной записи пакетной службы создается пул вычислительных узлов с помощью вызова create_pool. Определенная функция использует класс пакетной службы PoolAddParameter для настройки количества узлов, размера виртуальной машины и конфигурации пула. Объект VirtualMachineConfiguration указывает ImageReference в образе Ubuntu Server 20.04 LTS, опубликованном в Azure Marketplace. Пакетная служба Azure поддерживает широкий спектр образов виртуальной машины в Azure Marketplace, а также пользовательских образов виртуальной машины.

Количество узлов и размер виртуальной машины настраиваются с помощью определенных констант. Пакетная служба Azure поддерживает выделенные узлы и точечные узлы. Вы можете использовать их в своих пулах. Выделенные узлы зарезервированы для пула. Точечные узлы предлагаются по сниженной цене с учетом избыточных ресурсов виртуальной машины в Azure. Точечные узлы становятся недоступными, если у Azure недостаточно емкости. Пример по умолчанию создает пул, содержащий только пять точечных узлов в размере Standard_A1_v2.

Кроме свойств физических узлов эта конфигурация пула включает объект StartTask. Задача StartTask выполняется на каждом узле по мере его присоединения к пулу, а также при каждом перезапуске узла. В этом примере StartTask запускает команды оболочки Bash для установки пакета ffmpeg и зависимостей с узлами.

Метод pool.add отправляет пул в пакетную службу.

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)

Создание задания

Пакетное задание указывает пул для запуска задач и дополнительные параметры, такие как приоритет и расписание работы. Пример создает задание путем вызова create_job. Определенная функция использует класс JobAddParameter для создания задания в пуле. Метод job.add отправляет пул в пакетную службу. Изначально у задания нет задач.

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)

Мониторинг задач

После добавления задач к заданию пакетная служба автоматически ставит в очередь и назначает их для выполнения на вычислительных узлах в связанном пуле. Пакетная служба обрабатывает постановку задач в очередь, их планирование, повтор и другие задачи администрирования с учетом указанных параметров.

Есть несколько подходов к отслеживанию выполнения задач. В этом примере функция 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)
...

Очистка ресурсов

После выполнения задач приложение автоматически удаляет созданный входной контейнер хранилища, а также предоставляет возможность удалить пул и задания пакетной службы. Классы JobOperations и PoolOperations BatchClient предусматривают методы удаления, которые вызываются, если подтвердить удаление. Вы не оплачиваете задания и задачи, но платите за используемые вычислительные узлы. Поэтому рекомендуется выделять пулы только при необходимости. При удалении пула удаляются все выходные данные задачи на узлах. Однако входные и выходные файлы сохраняются в учетной записи хранения.

Ставшие ненужными группу ресурсов, учетную запись пакетной службы и учетную запись хранения можно удалить. Чтобы сделать это в портал Azure, выберите группу ресурсов для учетной записи пакетной службы и выберите команду "Удалить группу ресурсов".

Следующие шаги

Из этого руководства вы узнали, как:

  • Проверка подлинности с помощью учетных записей пакетной службы и служба хранилища.
  • Отправьте входные файлы в служба хранилища.
  • Создайте пул вычислительных узлов для запуска приложения.
  • Создайте задание и задачи для обработки входных файлов.
  • Мониторинг выполнения задач.
  • Получение выходных файлов.

Дополнительные примеры использования API Python для планирования и обработки рабочих нагрузок пакетной службы см. в примерах пакетной службы Python на GitHub.