教學課程:使用 Python API 搭配 Azure Batch 執行平行工作負載

使用 Azure Batch 在 Azure 中有效率地執行大規模的平行和高效能運算 (HPC) 批次作業。 本教學課程會逐步解說使用 Batch 執行平行工作負載的 Python 範例。 您將瞭解常見的 Batch 應用程式工作流程,以及如何以程式設計方式與 Batch 和儲存體資源互動。

  • 使用 Batch 和儲存體帳戶進行驗證。
  • 將輸入檔案上傳至儲存體。
  • 建立計算節點集區以執行應用程式。
  • 建立作業和工作來處理輸入檔。
  • 監視工作執行。
  • 擷取輸出檔案。

在本教學課程中,您會使用 ffmpeg 開放原始碼工具,以平行方式將 MP4 媒體檔案轉換成 MP3 格式。

如果您沒有 Azure 訂閱,請在開始之前,先建立 Azure 免費帳戶

必要條件

登入 Azure

登入 Azure 入口網站

取得帳號憑證

在此範例中,您必須提供 Batch 和儲存體帳戶的認證。 取得必要認證的簡單方式是在Azure 入口網站中。 (您也可以使用 Azure API 或命令列工具取得這些認證。

  1. 選取 [所有服務 > Batch 帳戶 ],然後選取 Batch 帳戶的名稱。

  2. 若要查看 Batch 認證,請選取 [金鑰 ]。 將 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 和儲存體帳號憑證字串。 例如:

_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 入口網站中的 Batch 帳戶,以監視集區、計算節點、作業和工作。 例如,若要查看集區中計算節點的熱度圖,請選取 [ > 區 LinuxFFmpegPool]。

當工作正在執行時,熱度圖會如下所示:

Screenshot of Pool heat map.

一般執行時間大約 是 5 分鐘 ,當您在其預設組態中執行應用程式。 集區建立需要最多時間。

擷取輸出檔案

您可以使用 Azure 入口網站 來下載 ffmpeg 工作所產生的輸出 MP3 檔案。

  1. 按一下 [所有服務 > 儲存體帳戶 ],然後按一下儲存體帳戶的名稱。
  2. 按一下 [Blob > 輸出 ]。
  3. 以滑鼠右鍵按一下其中一個輸出 MP3 檔案,然後按一下 [ 下載 ]。 請依照瀏覽器中的提示開啟或儲存檔案。

Download output file

雖然此範例中未顯示,但您也可以從計算節點或儲存體容器以程式設計方式下載檔案。

檢閱程式碼

下列各節會將範例應用程式細分為在 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 式,將本機 InputFiles 目錄中的 MP4 檔案上傳至容器。 儲存體中的檔案會定義為 Batch 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 類別來設定節點數目、VM 大小和集區組態。 在這裡, VirtualMachineConfiguration 物件會 指定在 Azure Marketplace 中發行之 Ubuntu Server 20.04 LTS 映射的 ImageReference 。 Batch 支援 Azure Marketplace 中的各種 VM 映射,以及自訂 VM 映射。

使用定義的常數來設定節點和 VM 大小的數目。 Batch 支援專用節點和 現成節點 ,而且您可以在集區中使用任一或兩者。 專用節點會保留給您的集區。 現成節點會以 Azure 中剩餘 VM 容量的降低價格提供。 如果 Azure 沒有足夠的容量,現成節點將無法使用。 根據預設,此範例會建立集區,其大小 只有五個 spot 節點Standard_A1_v2

除了實體節點屬性之外,此集區組態還包含 StartTask 物件。 StartTask 會在每個節點上執行,因為該節點會聯結集區,並在每次重新開機節點時執行。 在此範例中,StartTask 會執行 Bash 殼層命令,以在節點上安裝 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,以使用 command_line 參數處理輸入 resource_files 物件。 建立集區時,先前會在每個節點上安裝 ffmpeg。 在這裡,命令列會執行 ffmpeg,將每個輸入 MP4 (視訊) 檔案轉換成 MP3 (音訊) 檔案。

此範例會在 執行命令列之後,為 MP3 檔案建立 OutputFile 物件。 每個工作的輸出檔案(在此案例中,一個,在此案例中)都會使用 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 集區和作業的選項。 BatchClient 的 JobOperations PoolOperations 類別都有 delete 方法,如果您確認刪除,則會呼叫此方法。 雖然您不需要支付作業和工作的費用,但您需支付計算節點的費用。 因此,我們建議您只視需要組態集區。 當您刪除集區時,會刪除節點上的所有工作輸出。 不過,輸入和輸出檔案會保留在儲存體帳戶中。

若不再需要,請刪除資源群組、Batch 帳戶和儲存體帳戶。 若要在Azure 入口網站中這樣做,請選取 Batch 帳戶的資源群組,然後選擇 [ 刪除資源群組 ]。

下一步

在本教學課程中,您已了解如何:

  • 使用 Batch 和儲存體帳戶進行驗證。
  • 將輸入檔案上傳至儲存體。
  • 建立計算節點集區以執行應用程式。
  • 建立作業和工作來處理輸入檔。
  • 監視工作執行。
  • 擷取輸出檔案。

如需使用 Python API 排程及處理 Batch 工作負載的更多範例,請參閱 GitHub 上的 Batch Python 範例