Dela via


Självstudie: Köra en parallell arbetsbelastning med Azure Batch med hjälp av Python API

Använd Azure Batch till att effektivt köra storskaliga parallella program och HPC-program (databehandling med höga prestanda) i Azure. I den här självstudien går vi igenom ett Python-exempel på att köra en parallell arbetsbelastning med Batch. Du lär dig ett vanligt arbetsflöde för Batch-program och hur du interagerar programmatiskt med Batch- och Storage-resurser.

  • Autentisera med Batch- och Storage-konton.
  • Ladda upp indatafiler till Storage.
  • Skapa en pool med beräkningsnoder för att köra ett program.
  • Skapa ett jobb och uppgifter för att bearbeta indatafiler.
  • Övervaka aktivitetskörning.
  • Hämta utdatafiler.

I den här självstudien konverterar du MP4-mediefiler till MP3-format parallellt med hjälp av verktyget ffmpeg med öppen källkod.

Om du inte har en Azure-prenumeration skapar du ett kostnadsfritt Azure-konto innan du börjar.

Förutsättningar

Logga in på Azure

Logga in på Azure-portalen.

Hämta kontouppgifter

Du måste ange autentiseringsuppgifter för dina Batch- och Storage-konton i det här exemplet. Ett enkelt sätt att hämta de autentiseringsuppgifter som behövs är i Azure-portalen. (Du kan också hämta autentiseringsuppgifterna via Azures API:er och kommandoradsverktyg.)

  1. Välj Alla tjänster>Batch-konton och välj sedan namnet på ditt Batch-konto.

  2. Om du vill se Batch-autentiseringsuppgifterna väljer du Nycklar. Kopiera värdena för Batch-konto, URL och Primär åtkomstnyckel till en textredigerare.

  3. Om du vill se lagringskontots namn och nycklar väljer du Lagringskonto. Kopiera värdena för Lagringskontonamn och Key1 till en textredigerare.

Ladda ned och kör exempelappen

Ladda ned exempelprogrammet

Ladda ned eller klona exempelappen från GitHub. Om du vill klona lagringsplatsen för exempelappen med en Git-klient använder du följande kommando:

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

Navigera till katalogen som innehåller filen batch_python_tutorial_ffmpeg.py.

I Python-miljön installerar du de nödvändiga paketen med pip.

pip install -r requirements.txt

Använd en kodredigerare för att öppna filen config.py. Uppdatera autentiseringssträngarna med Batch- och lagringskontouppgifter med de värden som är unika för dina konton. Till exempel:

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

Kör appen

Kör skriptet så här:

python batch_python_tutorial_ffmpeg.py

När du kör exempelappen ser konsolens utdata ut ungefär så här. Under körningen uppstår det en paus vid Monitoring all tasks for 'Completed' state, timeout in 00:30:00... medan poolens beräkningsnoder startas.

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

Gå till Batch-kontot på Azure-portalen för att övervaka poolen, beräkningsnoderna, jobbet och aktiviteterna. Om du till exempel vill se en värmekarta över beräkningsnoderna i poolen väljer du Pooler>LinuxFFmpegPool.

När uppgifter körs ser den termiska kartan ut ungefär så här:

Screenshot of Pool heat map.

Körningen tar normalt runt 5 minuter om du kör programmet med standardkonfigurationen. Att skapa poolen är det som tar mest tid.

hämta utdatafilerna.

Du kan använda Azure-portalen till att hämta de utdatafiler i MP3-format som genereras av ffmpeg-uppgifter.

  1. Klicka på Alla tjänster>Lagringskonton och sedan på namnet på lagringskontot.
  2. Klicka på Blobbar>Utdata.
  3. Högerklicka på en av MP3-utdatafilerna och klicka sedan på Ladda ned. Följ anvisningarna i webbläsaren för att öppna eller spara filen.

Download output file

Även om det inte visas i det här exemplet kan du också ladda ned filerna programmatiskt från beräkningsnoderna eller från lagringscontainern.

Granska koden

I följande avsnitt bryter vi ned exempelprogrammet i de steg som utförs när en arbetsbelastning bearbetas i Batch-tjänsten. Följ med i Python-koden medan du läser resten av den här artikeln eftersom inte alla kodrader i exemplet beskrivs.

Autentisera Blob- och Batch-klienter

För att interagera med ett lagringskonto använder appen paketet azure-storage-blob för att skapa ett BlockBlobService-objekt.

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

Appen skapar ett BatchServiceClient-objekt för att skapa och hantera pooler, jobb och aktiviteter i Batch-tjänsten. Batch-klienten i exemplet använder autentisering med delad nyckel. Batch stöder även autentisering via Microsoft Entra-ID för att autentisera enskilda användare eller ett obevakat program.

credentials = batchauth.SharedKeyCredentials(_BATCH_ACCOUNT_NAME,
                                             _BATCH_ACCOUNT_KEY)

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

Ladda upp indatafiler

Appen använder referensen blob_client för att skapa en lagringscontainer för MP4-indatafilerna och en container för uppgiftsutdata. Sedan anropas upload_file_to_container funktionen för att ladda upp MP4-filer i den lokala Katalogen InputFiles till containern. De lagrade filerna har definierats som Batch ResourceFile-objekt som Batch senare kan hämta till beräkningsnoder.

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]

Skapa en pool med beräkningsnoder

Därefter skapar exempelkoden en pool med beräkningsnoder i Batch-kontot med ett anrop till create_pool. Den här definierade funktionen använder Batch-klassen PoolAddParameter för att ange antalet noder, VM-storlek och en poolkonfiguration. Här anger ett VirtualMachineConfiguration-objekt en ImageReference till en Ubuntu Server 20.04 LTS-avbildning som publicerats på Azure Marketplace. Batch har stöd för ett stort antal Linux- och Windows Server-avbildningar på Azure Marketplace samt för anpassade VM-avbildningar.

Antalet noder och VM-storleken anges med definierade konstanter. Batch har stöd för dedikerade noder och spotnoder, och du kan använda antingen eller båda i dina pooler. Dedikerade noder är reserverade för din pool. Spotnoder erbjuds till ett reducerat pris från överskott av VM-kapacitet i Azure. Dekornoder blir otillgängliga om Azure inte har tillräckligt med kapacitet. Exemplet skapar som standard en pool som bara innehåller fem oanvända noder i storlek Standard_A1_v2.

Förutom fysiska nodegenskaper innehåller den här poolkonfigurationen ett StartTask-objekt. StartTask körs på varje nod när noden ansluter till poolen och varje gång en nod startas om. I det här exemplet kör StartTask Bash shell-kommandon för att installera paketet ffmpeg och beroenden på noderna.

Metoden pool.add skickar poolen till Batch-tjänsten.

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)

Skapa ett jobb

Ett Batch-jobb anger en pool för körning av uppgifter, samt valfria inställningar som en prioritet och ett schema för arbetet. I exemplet skapas ett jobb med ett anrop till create_job. Den här definierade funktionen använder klassen JobAddParameter för att skapa ett jobb på din pool. Metoden job.add skickar poolen till Batch-tjänsten. Från början har jobbet inga aktiviteter.

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

batch_service_client.job.add(job)

Skapa uppgifter

Appen skapar aktiviteter i jobbet med ett anrop till add_tasks. Den här definierade funktionen skapar en lista med aktivitetsobjekt med hjälp av klassen TaskAddParameter. Varje aktivitet kör ffmpeg för bearbetning av ett resource_files-indataobjekt med en command_line-parameter. ffmpeg installerades tidigare på varje nod när poolen skapades. Här kör kommandoraden ffmpeg för att konvertera varje MP4-indatafil (video) till en MP3-fil (ljud).

I exemplet skapas ett OutputFile-objekt för MP3-filen när du kör kommandoraden. Varje uppgifts utdatafiler (i det här fallet en) laddas upp till en container i länkade lagringskontot med uppgiftsegenskapen output_files.

Sedan lägger appen till aktiviteter i jobbet med metoden task.add_collection som köar dem för att köras på beräkningsnoderna.

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)

Övervaka aktiviteter

När aktiviteter läggs till i ett jobb placerar Batch dem automatiskt i kö och schemalägger dem för körning vid beräkningsnoder i den associerade poolen. Baserat på de inställningar du anger sköter Batch all köhantering, all schemaläggning, alla omförsök och all annan uppgiftsadministration åt dig.

Du kan övervaka aktivitetskörningen på många sätt. Funktionen wait_for_tasks_to_complete i det här exemplet använder objektet TaskState för att övervaka aktiviteter för ett visst tillstånd, i det här fallet tillståndet slutfört, inom en tidsgräns.

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

Rensa resurser

När uppgifterna har körts tar appen automatiskt bort den lagringscontainer som skapades och du får möjlighet att ta bort Batch-poolen och jobbet. Klasserna JobOperations och PoolOperations i BatchClient har båda borttagningsmetoder som anropas om du bekräftar borttagningen. Även om du inte debiteras för själva jobben och aktiviteterna debiteras du för beräkningsnoder. Vi rekommenderar därför att du endast allokerar pooler efter behov. När du tar bort poolen raderas alla aktivitetsutdata på noderna. In- och utdatafilerna ligger däremot kvar i lagringskontot.

När de inte längre behövs tar du bort resursgruppen, Batch-kontot och lagringskontot. Om du vill göra det i Azure-portalen väljer du resursgruppen för Batch-kontot och väljer Ta bort resursgrupp.

Nästa steg

I den här självstudiekursen lärde du dig att:

  • Autentisera med Batch- och Storage-konton.
  • Ladda upp indatafiler till Storage.
  • Skapa en pool med beräkningsnoder för att köra ett program.
  • Skapa ett jobb och uppgifter för att bearbeta indatafiler.
  • Övervaka aktivitetskörning.
  • Hämta utdatafiler.

Fler exempel på hur du använder Python API för att schemalägga och bearbeta Batch-arbetsbelastningar finns i Batch Python-exempel på GitHub.