Share via


Zelfstudie: Een parallelle workload uitvoeren met Azure Batch met behulp van de Python API

Met Azure Batch kunt u grootschalige parallelle en HPC-batchrekentaken (High Performance Computing) efficiënt uitvoeren in Azure. Deze zelfstudie leidt u door een Python-voorbeeld van het uitvoeren van een parallelle workload met behulp van Batch. U leert een gangbare Batch-toepassingswerkstroom en leert hoe u via programmacode werkt met Batch- en Storage-bronnen.

  • Verifiëren met Batch- en Storage-accounts.
  • Invoerbestanden uploaden naar Storage.
  • Maak een groep rekenknooppunten om een toepassing uit te voeren.
  • Maak een taak en taken om invoerbestanden te verwerken.
  • Taakuitvoering bewaken.
  • Uitvoerbestanden ophalen.

In deze zelfstudie converteert u MP4-mediabestanden naar mp3-indeling, parallel met behulp van het opensource-hulpprogramma ffmpeg .

Als u geen Azure-abonnement hebt, kunt u een gratis Azure-account maken voordat u begint.

Vereisten

Aanmelden bij Azure

Meld u aan bij het Azure-portaal.

Accountreferenties ophalen

In dit voorbeeld moet u referenties opgeven voor uw Batch- en Storage-accounts. U kunt de referenties eenvoudig ophalen in Azure Portal. (U kunt deze referenties ook ophalen met de Azure-API's of de opdrachtregelprogramma's.)

  1. Selecteer Alle services>Batch-accounts en selecteer vervolgens de naam van uw Batch-account.

  2. Selecteer Sleutels om de Batch-referenties te zien. Kopieer de waarden van Batch-account, URL en Primaire toegangssleutel in een teksteditor.

  3. Selecteer Opslagaccount als u de naam en sleutels van het opslagaccount wilt zien. Kopieer de waarden van Naam van opslagaccount en Key1 in een teksteditor.

De voorbeeld-app downloaden en uitvoeren

De voorbeeld-app downloaden

Download of kloon de voorbeeld-app vanuit GitHub. Als u de opslagplaats van de voorbeeld-app wilt klonen met een Git-client, gebruikt u de volgende opdracht:

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

Navigeer naar de map met het bestand batch_python_tutorial_ffmpeg.py.

Installeer de vereiste pakketten in de Python-omgeving met behulp van pip.

pip install -r requirements.txt

Gebruik een code-editor om het bestand te openen config.py. Werk de referentietekenreeksen van het Batch- en Storage-account bij met waarden die uniek zijn voor uw accounts. Voorbeeld:

_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=='

De app uitvoeren

Het script uitvoeren:

python batch_python_tutorial_ffmpeg.py

Wanneer u de voorbeeldtoepassing uitvoert, ziet de uitvoer van de console er ongeveer als volgt uit. De actieve uitvoering wordt bij Monitoring all tasks for 'Completed' state, timeout in 00:30:00... onderbroken terwijl de rekenknooppunten van de pool worden gestart.

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

Ga naar uw Batch-account in de Azure Portal om de pool, rekenknooppunten, job en taken te controleren. Als u bijvoorbeeld een heatmap van de rekenknooppunten in uw pool wilt zien, selecteert u Pools>LinuxFFmpegPool.

Wanneer taken worden uitgevoerd, ziet de heatmap er bijvoorbeeld als volgt uit:

Screenshot of Pool heat map.

Wanneer u de toepassing uitvoert in de standaardconfiguratie, bedraagt de uitvoeringstijd doorgaans ongeveer 5 minuten. Het maken van de pool kost de meeste tijd.

Uitvoerbestanden ophalen

U kunt in Azure Portal de MP3-uitvoerbestanden downloaden die in de ffmpeg-taken zijn gegenereerd.

  1. Klik op Alle services>Opslagaccounts en klik vervolgens op de naam van uw opslagaccount.
  2. Klik op Blobs>uitvoer.
  3. Klik met de rechtermuisknop op een van de MP3-uitvoerbestanden en klik vervolgens op Downloaden. Volg de aanwijzingen in de browser om het bestand te openen of op te slaan.

Download output file

Hoewel dit niet in dit voorbeeld wordt getoond, kunt u de bestanden ook programmatisch downloaden in de rekenknooppunten of in de opslagcontainer.

De code bekijken

In de volgende secties wordt de voorbeeldtoepassing uitgesplitst in de stappen die ermee worden uitgevoerd om een workload in de Batch-service te verwerken. Raadpleeg de Python-code terwijl u de rest van dit artikel leest omdat niet elke regel in de code van het voorbeeld wordt besproken.

Blob- en Batch-clients verifiëren

Voor het werken met een opslagaccount gebruikt de app het pakket azure-storage-blob om een BlockBlobService-object te maken.

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

De app maakt een BatchServiceClient-object om pools, Batch-taken en taken in de Batch-service te maken en te beheren. De Batch-client in het voorbeeld gebruikt verificatie met gedeelde sleutels. Batch ondersteunt ook verificatie via Microsoft Entra-id om afzonderlijke gebruikers of een toepassing zonder toezicht te verifiëren.

credentials = batchauth.SharedKeyCredentials(_BATCH_ACCOUNT_NAME,
                                             _BATCH_ACCOUNT_KEY)

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

Invoerbestanden uploaden

De app gebruikt de verwijzing blob_client om een opslagcontainer voor de MP4-invoerbestanden en een container voor de taakuitvoer te maken. Vervolgens wordt de functie aangeroepen upload_file_to_container voor het uploaden van MP4-bestanden in de lokale Map InputFiles naar de container. De bestanden in de opslag zijn gedefinieerd als Batch ResourceFile-objecten die later met Batch kunnen worden gedownload op rekenknooppunten.

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]

Een pool met rekenknooppunten maken

Daarna wordt in het voorbeeld met behulp van een aanroep naar create_pool een pool van rekenknooppunten in het Batch-account gemaakt. Deze gedefinieerd functie gebruikt de Batch-klasse PoolAddParameter om het aantal rekenknooppunten, de VM-grootte en een poolconfiguratie in te stellen. Hier geeft een VirtualMachineConfiguration-object een ImageReference op naar een Ubuntu Server 20.04 LTS-installatiekopie die is gepubliceerd in Azure Marketplace. Batch ondersteunt diverse VM-installatiekopieën in de Azure Marketplace, evenals aangepaste VM-installatiekopieën.

Het aantal knooppunten en de VM-grootte worden ingesteld met behulp van gedefinieerde constanten. Batch ondersteunt toegewezen knooppunten en Spot-knooppunten. U kunt beide of beide in uw pools gebruiken. Toegewezen rekenknooppunten zijn gereserveerd voor uw pool. Spot-knooppunten worden aangeboden tegen een gereduceerde prijs van overschot aan VM-capaciteit in Azure. Spot-knooppunten zijn niet beschikbaar als Azure niet voldoende capaciteit heeft. In het voorbeeld wordt standaard een pool gemaakt met slechts vijf spot-knooppunten in grootte Standard_A1_v2.

Naast fysieke eigenschappen van knooppunten bevat deze poolconfiguratie het object StartTask. StartTask wordt in elk knooppunt uitgevoerd wanneer dat knooppunt aan de pool wordt toegevoegd en telkens wanneer dat knooppunt opnieuw wordt opgestart. In dit voorbeeld voert StartTask Bash-shell-opdrachten uit om het ffmpeg-pakket en afhankelijkheden op de knooppunten te installeren.

Met de methode pool.add wordt de pool naar de Batch-service verzonden.

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)

Een taak maken

Een Batch-taak (job) geeft een pool op die taken moet uitvoeren en optionele instellingen, zoals een prioriteit en planning voor het werk. In het voorbeeld wordt een job gemaakt met een aanroep naar create_job. De app gebruikt de klasse JobAddParameter om een taak te maken in de pool. Met de job.add-methode wordt de pool naar de Batch-service verzonden. De Batch-taak heeft in eerste instantie geen taken.

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

batch_service_client.job.add(job)

Taken maken

De app maakt taken in de Batch-taak met een aanroep naar add_tasks. Deze gedefinieerde functie gebruikt de klasse TaskAddParameter om een lijst met taakobjecten te maken. Elke taak voert ffmpeg uit om een resource_files-invoerobject met de parameter command_line verwerken. ffmpeg is eerder op elk knooppunt geïnstalleerd toen de pool werd gemaakt. Hier voert de opdrachtregel ffmpeg uit om elk MP4-invoerbestand (video) te converteren naar een MP3-bestand (audio).

Het voorbeeld maakt een OutputFile-object voor het MP3-bestand nadat de opdrachtregel is uitgevoerd. De uitvoerbestanden van elke taak (één in dit geval) worden geüpload naar een container in het gekoppelde opslagaccount met behulp van de eigenschap output_files van de taak.

Vervolgens worden met de app taken toegevoegd aan de Batch-taak met behulp van de methode task.add_collection. Deze methode plaatst de taken in een wachtrij voor uitvoering op de rekenknooppunten.

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)

Taken controleren

Wanneer taken worden toegevoegd aan een Batch-taak, plaatst Batch ze automatisch in de wachtrij en plant de uitvoering ervan op rekenknooppunten in de gekoppelde pool. Op basis van de instellingen die u opgeeft, zal Batch alle taken in de wachtrij plaatsen, plannen en opnieuw proberen uit te voeren, en ook andere taakbeheertaken uitvoeren.

Er zijn veel manieren om de uitvoering van taken te controleren. De functie wait_for_tasks_to_complete in dit voorbeeld gebruikt het object TaskState om taken te controleren op een bepaalde status, in dit geval de status voltooid, binnen een tijdslimiet.

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)
...

Resources opschonen

Nadat de taken zijn uitgevoerd, verwijdert de app automatisch de gemaakte invoeropslagcontainer en biedt u de mogelijkheid de Batch-pool en -taak te verwijderen. De klassen JobOperations en PoolOperations van BatchClient hebben verwijderingsmethoden, die worden aangeroepen wanneer u de verwijdering bevestigt. Hoewel jobs en taken zelf niet in rekening worden gebracht, worden rekenknooppunten wel in rekening gebracht. Daarom is het raadzaam om pools alleen toe te wijzen als dat nodig is. Wanneer u de pool verwijdert, wordt ook alle taakuitvoer op de knooppunten verwijderd. De invoer- en uitvoerbestanden blijven echter aanwezig in het opslagaccount.

Verwijder de resourcegroep, het Batch-account en het opslagaccount wanneer u deze niet meer nodig hebt. Als u dit wilt doen in Azure Portal, selecteert u de resourcegroep voor het Batch-account en kiest u Resourcegroep verwijderen.

Volgende stappen

In deze zelfstudie heeft u het volgende geleerd:

  • Verifiëren met Batch- en Storage-accounts.
  • Invoerbestanden uploaden naar Storage.
  • Maak een groep rekenknooppunten om een toepassing uit te voeren.
  • Maak een taak en taken om invoerbestanden te verwerken.
  • Taakuitvoering bewaken.
  • Uitvoerbestanden ophalen.

Zie de Batch Python-voorbeelden op GitHub voor meer voorbeelden van het gebruik van de Python-API om Batch-workloads te plannen en te verwerken.