Sdílet prostřednictvím


Kurz: Spuštění paralelní úlohy pomocí služby Azure Batch s využitím rozhraní Python API

Azure Batch umožňuje efektivně spouštět v Azure rozsáhlé paralelní dávkové úlohy a úlohy vysokovýkonného výpočetního prostředí (HPC). Tento kurz vás provede příkladem spuštění paralelní úlohy pomocí služby Batch v Pythonu. Seznámíte se s běžným pracovním postupem aplikace Batch a způsobem práce s prostředky služby Batch a Storage prostřednictvím kódu programu.

  • Ověřování pomocí účtů Batch a Storage
  • Nahrajte vstupní soubory do úložiště.
  • Vytvořte fond výpočetních uzlů pro spuštění aplikace.
  • Vytvořte úlohu a úkoly pro zpracování vstupních souborů.
  • Monitorování provádění úkolů
  • Načtěte výstupní soubory.

V tomto kurzu převedete multimediální soubory MP4 na formát MP3 paralelně pomocí opensourcového nástroje ffmpeg .

Pokud ještě nemáte předplatné Azure, vytvořte si bezplatný účet Azure před tím, než začnete.

Požadavky

Přihlášení k Azure

Přihlaste se k portálu Azure.

Získání přihlašovacích údajů k účtu

V tomto příkladu musíte zadat přihlašovací údaje pro účty služeb Batch a Storage. Na webu Azure Portal je snadný způsob, jak získat potřebné přihlašovací údaje. (Tyto přihlašovací údaje můžete také získat pomocí rozhraní API Azure nebo nástrojů příkazového řádku.)

  1. Vyberte Všechny služby>Batch a pak vyberte název vašeho účtu Batch.

  2. Pokud chcete zobrazit přihlašovací údaje služby Batch, vyberte Klíče. Zkopíruje hodnoty Účet Batch, URL a Primární přístupová klíč do textového editoru.

  3. Pokud chcete zobrazit název a klíče účtu úložiště, vyberte Účet úložiště. Zkopírujte hodnoty Název účtu úložiště a Klíč1 do textového editoru.

Stažení a spuštění ukázkové aplikace

Stažení ukázkové aplikace

Stáhněte nebo naklonujte ukázkovou aplikaci z GitHubu. K naklonování úložiště ukázkové aplikace pomocí klienta Git použijte následující příkaz:

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

Přejděte do adresáře, který obsahuje soubor batch_python_tutorial_ffmpeg.py.

Ve prostředí Pythonu nainstalujte vyžadované balíčky pomocí pip.

pip install -r requirements.txt

Pomocí editoru kódu otevřete soubor config.py. Aktualizujte řetězce přihlašovacích údajů účtu Batch a účtu úložiště s jedinečnými hodnotami pro vaše účty. Příklad:

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

Spustit aplikaci

Spuštění skriptu:

python batch_python_tutorial_ffmpeg.py

Po spuštění ukázkové aplikace vypadá výstup konzoly zhruba následovně. Během provádění dojde k pozastavení na řádku Monitoring all tasks for 'Completed' state, timeout in 00:30:00... a mezitím se spustí výpočetní uzly fondu.

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

Fond, výpočetní uzly, úlohy a úkoly můžete sledovat ve svém účtu služby Batch na webu Azure Portal. Pokud například chcete zobrazit heat mapu výpočetních uzlů ve vašem fondu, vyberte Fondy>LinuxFFmpegPool.

Když jsou úkoly spuštěné, heat mapa vypadá přibližně takto:

Screenshot of Pool heat map.

Když aplikaci spouštíte v její výchozí konfiguraci, je obvyklá doba provádění přibližně 5 minut. Vytvoření fondu trvá nejdéle.

Načtení výstupních souborů

Můžete použít web Azure Portal ke stažení výstupních souborů MP3 vygenerovaných úlohami ffmpeg.

  1. Klikněte na Všechny služby>Účty úložiště a potom klikněte na název vašeho účtu úložiště.
  2. Klikněte na Objekty blob>výstup.
  3. Klikněte pravým tlačítkem na jeden z výstupních souborů MP3 a potom klikněte na Stáhnout. Podle pokynů v prohlížeči soubor otevřete nebo uložte.

Download output file

Ačkoli to v tomto případě není ukázáno, můžete si také stáhnout soubory prostřednictvím kódu programu z výpočetních uzlů nebo z kontejneru úložiště.

Kontrola kódu

Následující části ukázkovou aplikaci rozdělují do kroků, které aplikace provádí při zpracování úloh ve službě Batch. Při čtení zbývajících částí tohoto článku nahlížejte do kódu Pythonu, protože tady nezvládneme probrat každý jednotlivý řádek kódu.

Ověřování klientů objektů blob a služby Batch

K práci s účtem úložiště aplikace používá balíček azure-storage-blob k vytvoření objektu BlockBlobService.

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

K vytváření a správě fondů, úloh a úkolů ve službě Batch aplikace vytvoří objekt BatchServiceClient. Klient služby Batch v ukázce používá ověření pomocí sdíleného klíče. Batch také podporuje ověřování prostřednictvím Microsoft Entra ID pro ověřování jednotlivých uživatelů nebo bezobslužné aplikace.

credentials = batchauth.SharedKeyCredentials(_BATCH_ACCOUNT_NAME,
                                             _BATCH_ACCOUNT_KEY)

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

Nahrání vstupních souborů

Aplikace používá odkaz blob_client k vytvoření kontejneru úložiště pro vstup souborů MP4 a kontejner pro výstup úlohy. Potom zavolá upload_file_to_container funkci pro nahrání souborů MP4 do místního adresáře InputFiles do kontejneru. Soubory v úložišti jsou definované jako objekty ResourceFile služby Batch, které může služba Batch později stáhnout do výpočetních uzlů.

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]

Vytvoření fondu výpočetních uzlů

Na účtu Batch potom příklad pomocí volání create_pool vytvoří fond výpočetních uzlů. Tato definovaná funkce používá třídu služby Batch PoolAddParameter k nastavení počtu uzlů, velikosti virtuálního počítače a konfigurace fondu. V této části objekt VirtualMachineConfiguration určuje ImageReference na image Ubuntu Server 20.04 LTS publikovanou na Azure Marketplace. Batch podporuje širokou škálu imagí virtuálních počítačů v Azure Marketplace, ale i vlastní image virtuálních počítačů.

Počet uzlů a velikost virtuálních počítačů jsou definované konstanty. Batch podporuje vyhrazené uzly a spotové uzly a můžete použít buď nebo obojí ve fondech. Vyhrazené uzly jsou rezervované pro váš fond. Spotové uzly se nabízejí za sníženou cenu z nadbytečné kapacity virtuálních počítačů v Azure. Spotové uzly přestanou být dostupné, pokud Azure nemá dostatečnou kapacitu. Ukázka ve výchozím nastavení vytvoří fond obsahující pouze pět spotových uzlů ve velikosti Standard_A1_v2.

Spolu s fyzickými vlastnostmi uzlu tato konfigurace fondu také zahrnuje objekt StartTask. StartTask se spustí na každém uzlu, když se takový uzel připojí k fondu, a taky pokaždé, když se uzel restartuje. V tomto příkladě StartTask spouští příkazy prostředí Bash pro instalaci balíčku ffmpeg a závislostí na uzlech.

Metoda pool.add odešle fond do služby 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)

Vytvoření úlohy

Úloha služby Batch určí fond, ve kterém se budou spouštět úkoly, a volitelná nastavení, jako je priorita a plán práce. Ukázka vytvoří úlohu zavoláním metody create_job. Tato definovaná funkce používá třídu JobAddParameter k vytvoření úlohy ve vašem fondu. Metoda job.add odešle fond do služby Batch. Na začátku úloha neobsahuje žádné úkoly.

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

batch_service_client.job.add(job)

Vytvoření úkolů

Aplikace vytvoří úkoly pro úlohu pomocí volání add_tasks. Tato definovaná funkce vytvoří seznam objektů úlohy pomocí třídy TaskAddParameter. Každá úloha spouští ffmpeg pro zpracování vstupního objektu resource_files pomocí parametru command_line. Aplikace ffmpeg se na každý uzel nainstalovala dříve při vytváření fondu. Tady příkazový řádek spouští aplikaci ffmpeg kvůli převodu jednotlivých vstupních souborů MP4 (video) na soubory MP3 (zvuk).

Ukázka po spuštění příkazového řádku vytvoří pro soubor MP3 objekt OutputFile. Výstupní soubory všech úkolů (v tomto případě jednoho) se pomocí vlastnosti output_files nahrají do kontejneru v propojeném účtu úložiště.

Potom aplikace přidá úkoly do úlohy pomocí metody task.add_collection a ta je zařadí do fronty ke spuštění ve výpočetních uzlech.

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)

Sledování úkolů

Když služba Batch přidá do úlohy úkoly, automaticky je zařadí do fronty a naplánuje jejich spuštění ve výpočetních uzlech v přidruženém fondu. Na základě vámi zadaných nastavení služba Batch zpracuje veškeré řazení úkolů do fronty, plánování úkolů, opakované spouštění a další povinnosti spojené se správou úkolů.

Ke sledování provádění úkolů existuje mnoho přístupů. Funkce wait_for_tasks_to_complete v tomto příkladu používá objekt TaskState k monitorování úloh pro konkrétní stav (v tomto případě dokončený stav) v rámci časového limitu.

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

Vyčištění prostředků

Aplikace po spuštění úkolů automaticky odstraní kontejner vstupního úložiště, který vytvořila, a dá vám možnost odstranit fond a úlohu služby Batch. Třídy JobOperations a PoolOperations v BatchClient obsahují metody pro odstranění, které se zavolají, pokud potvrdíte odstranění. I když se vám neúčtují poplatky za úlohy a úlohy samotné, účtují se vám poplatky za výpočetní uzly. Proto doporučujeme, abyste fondy přidělovali, jen když je to potřeba. Při odstranění fondu se odstraní veškeré výstupy úkolů v uzlech. Vstupní a výstupní soubory však zůstanou v účtu úložiště.

Pokud už je nepotřebujete, odstraňte skupinu prostředků, účet Batch a účet úložiště. Provedete to na webu Azure Portal tak, že vyberete skupinu prostředků pro účet Batch a zvolíte Odstranit skupinu prostředků.

Další kroky

V tomto kurzu jste se naučili, jak:

  • Ověřování pomocí účtů Batch a Storage
  • Nahrajte vstupní soubory do úložiště.
  • Vytvořte fond výpočetních uzlů pro spuštění aplikace.
  • Vytvořte úlohu a úkoly pro zpracování vstupních souborů.
  • Monitorování provádění úkolů
  • Načtěte výstupní soubory.

Další příklady použití rozhraní Python API k plánování a zpracování úloh Služby Batch najdete v ukázkách Batch Pythonu na GitHubu.