Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Azure Batch umožňuje efektivně spouštět rozsáhlé paralelní a vysokovýkonné výpočetní úlohy (HPC) v Azure. 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 nemáte účet Azure, vytvořte si bezplatný účet před tím, než začnete.
Požadavky
Účet Azure Batch a propojený účet Azure Storage. Pokud chcete tyto účty vytvořit, prohlédni si příručky pro rychlý start služby Batch pro Azure Portal nebo Azure CLI.
Udělte přístup ke svým účtům Batch a Storage
Tento tutoriál ukazuje, jak se autentizovat do Azure Batch a Azure Storage pomocí Microsoft Entra ID s DefaultAzureCredential. Aplikace nepoužívá klíče k účtu. Před spuštěním aplikace se ujistěte, že identita, kterou používáte, má požadované role na obou účtech.
Přihlaste se pomocí Azure CLI.
DefaultAzureCredentialautomaticky zachytí toto přihlášení:az loginPřiřaďte svému uživatelskému účtu roli, která umožňuje operace v datové rovině na Batch účtu, například Azure Batch Data Contributor. Tato role je potřeba k vytváření poolů, pracovních pozic a úkolů. Roli můžete přiřadit na stránce řízení přístupu (IAM) účtu Batch v portálu Azure, nebo použít Azure CLI:
az role assignment create \ --assignee "<your-user-principal-name>" \ --role "Azure Batch Data Contributor" \ --scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.Batch/batchAccounts/<batch-account-name>"Přiřaďte svému uživatelskému účtu roli Storage Blob Data Contributor na úložném účtu. Tato role je potřeba k vytváření kontejnerů, nahrávání vstupních souborů a žádosti o uživatelský delegační klíč, který podepisuje URL sdílených přístupových podpisů (SAS) používaných úkoly:
az role assignment create \ --assignee "<your-user-principal-name>" \ --role "Storage Blob Data Contributor" \ --scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account-name>"Všimněte si následujících hodnot, které přidáte do config.py souboru vzorku v další sekci. Najdeš je na stránce Přehledu každého účtu v portálu Azure:
- Název účtu Batch
- URL dávkového účtu, například
https://mybatchaccount.westus2.batch.azure.com - Název účtu úložiště
Note
Může trvat několik minut, než se přiřazení rolí projeví. Pokud aplikace selže s chybou autorizace hned po přiřazení rolí, počkejte pár minut a zkuste to znovu.
Stažení a spuštění ukázkové aplikace
Important
Stahovatelný vzorek v batch-python-ffmpeg-tutorial repozitáři je aktualizován, aby odpovídal tomuto tutoriálu. Dokud tato aktualizace nebude zveřejněna, může repozitář stále obsahovat dřívější autentizaci založenou na klíči a kód Ubuntu 20.04. Kód v tomto článku je zdrojem pravdy. Pokud stažený vzorek neodpovídá úryvkům zde, řiďte se kódem uvedeným v tomto článku.
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.
V prostředí Pythonu nainstalujte požadované balíčky pomocí pip.
pip install -r requirements.txt
Pomocí editoru kódu otevřete soubor config.py. Aktualizujte hodnoty účtu Batch a účtu úložiště na názvy jedinečné pro vaše účty. Ukázka k ověření používá defaultAzureCredential , takže klíče účtu se už nevyžadují. Například:
_BATCH_ACCOUNT_NAME = 'yourbatchaccount'
_BATCH_ACCOUNT_URL = 'https://yourbatchaccount.yourbatchregion.batch.azure.com'
_STORAGE_ACCOUNT_NAME = 'mystorageaccount'
Ujistěte se, že jste přihlášeni pomocí az login a že vaše identita má role popsané v části Udělení přístupu k vašim účtům Batch a Storage.
DefaultAzureCredentialmohou také objevit další zdroje přihlašovacích údajů, jako je spravovaná identita, Visual Studio Code nebo proměnné prostředí.
Spuštění aplikace
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í u Monitoring all tasks for 'Completed' state, timeout in 00:30:00... při spouštění výpočetních uzlů 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 reached the 'Completed' state 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 tepelnou mapu výpočetních uzlů ve vašem fondu, vyberte Fondy>LinuxFFmpegPool.
Když se úkoly provádějí, teplotní mapa vypadá přibližně takto:
Typická doba provádění je přibližně 5 minut , když aplikaci spustíte ve své výchozí konfiguraci. 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.
- Klikněte na Všechny služby>Účty úložiště a potom klikněte na název vašeho účtu úložiště.
- Klikněte na Bloby>výstup.
- 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.
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í zbytku tohoto článku si přečtěte kód Pythonu, protože není popsán každý řádek kódu v ukázce.
Ověřte klienty služby Blob a Batch
Ukázka se ověřuje v úložišti i službě Batch pomocí defaultAzureCredential z balíčku azure-identity .
DefaultAzureCredential zkouší postupně více typů přihlašovacích údajů (proměnné prostředí, spravovanou identitu, přihlášení přes Azure CLI atd.), díky čemuž stejný kód funguje při místním vývoji i v produkčním prostředí, aniž by bylo nutné ukládat klíče k účtu.
K interakci s účtem úložiště používá aplikace balíček azure-storage-blob k vytvoření objektu BlobServiceClient , který používá přihlašovací údaje.
Vzorek importuje následující typy identit a úložiště a přečte názvy účtů z config.py:
import config
from azure.identity import DefaultAzureCredential
from azure.storage.blob import (
BlobServiceClient,
BlobSasPermissions,
ContainerSasPermissions,
generate_blob_sas,
generate_container_sas,
)
credential = DefaultAzureCredential()
blob_service_client = BlobServiceClient(
account_url=f"https://{config._STORAGE_ACCOUNT_NAME}.blob.core.windows.net/",
credential=credential)
Aplikace vytvoří objekt BatchClient, který slouží k vytváření a správě fondů, úloh a úkolů ve službě Batch. Klient Batch používá stejný DefaultAzureCredential k ověřování prostřednictvím Microsoft Entra ID.
batch_client = BatchClient(
endpoint=config._BATCH_ACCOUNT_URL,
credential=credential)
Dávkové výpočetní uzly přistupují ke vstupním a výstupním kontejnerům pomocí URL adres sdíleného přístupového podpisu (SAS). Protože aplikace nepoužívá klíč k úložnému účtu, nemůže s ním podepisovat SAS tokeny. Místo toho aplikace požaduje delegační klíč uživatele od služby Blob, která je podepsána přihlašovacími údaji Microsoft Entra aplikace, a používá tento klíč k generování SAS tokenů. Další informace najdete v tématu Vytvoření SAS delegování uživatele.
start = datetime.datetime.now(datetime.timezone.utc)
expiry = start + datetime.timedelta(hours=4)
user_delegation_key = blob_service_client.get_user_delegation_key(
key_start_time=start, key_expiry_time=expiry)
# Sign the SAS tokens with the same expiry as the user delegation key.
sas_expiry = expiry
Note
Klíč pro delegaci uživatele v tomto vzorku je platný čtyři hodiny. Token SAS podepsaný pomocí delegačního klíče uživatele nemůže být platný déle než tento klíč a delegační klíč uživatele může být platný nejdéle sedm dní. U dlouhodobě běžících pracovních zátěží požadujte nový klíč a znovu generujte SAS URL dříve, než vyprší.
Nahrání vstupních souborů
Po vytvoření vstupních a výstupních kontejnerů s blob_service_client, aplikace nahraje každý lokální MP4 soubor ze složky InputFiles do vstupního kontejneru. Následující upload_file_to_container pomocník nahraje jeden soubor, vygeneruje pro něj SAS token pouze pro čtení, který je podepsán uživatelským delegačním klíčem, a vrátí objekt Batch ResourceFile , jehož URL obsahuje SAS token, aby Batch mohl později soubor stáhnout do výpočetního uzlu. Aplikace volá tento pomocný nástroj jednou pro každý vstupní soubor:
def upload_file_to_container(blob_service_client, user_delegation_key,
sas_expiry, container_name, file_path):
blob_name = os.path.basename(file_path)
blob_client = blob_service_client.get_blob_client(container_name, blob_name)
with open(file_path, "rb") as data:
blob_client.upload_blob(data, overwrite=True)
sas_token = generate_blob_sas(
account_name=config._STORAGE_ACCOUNT_NAME,
container_name=container_name,
blob_name=blob_name,
user_delegation_key=user_delegation_key,
permission=BlobSasPermissions(read=True),
expiry=sas_expiry)
sas_url = f"{blob_client.url}?{sas_token}"
return models.ResourceFile(http_url=sas_url, file_path=blob_name)
Aplikace také generuje SAS URL pro výstupní kontejner, která umožňuje zápis. Úlohy používají tuto URL k nahrání svých výstupních souborů na úložiště:
sas_token = generate_container_sas(
account_name=config._STORAGE_ACCOUNT_NAME,
container_name=output_container_name,
user_delegation_key=user_delegation_key,
permission=ContainerSasPermissions(write=True, create=True, list=True),
expiry=sas_expiry)
output_container_sas_url = (
f"https://{config._STORAGE_ACCOUNT_NAME}.blob.core.windows.net/"
f"{output_container_name}?{sas_token}")
Vytvoření fondu výpočetních uzlů
Následně vzorek vytvoří pool výpočetních uzlů v Batch účtu voláním create_pool. Tato definovaná funkce používá třídu Batch BatchPoolCreateOptions k nastavení počtu uzlů, velikosti virtuálního počítače a konfigurace fondu. V této konfiguraci objekt VirtualMachineConfiguration určuje odkaz BatchVmImageReference na image Ubuntu Server 22.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.
Kromě vlastností fyzického uzlu zahrnuje tato konfigurace fondu objekt BatchStartTask . Úloha BatchStartTask se spustí na každém uzlu při připojení daného uzlu do fondu a při každém restartování uzlu. V tomto příkladu BatchStartTask spouští příkazy prostředí Bash pro instalaci balíčku ffmpeg a závislostí na uzlech.
Metoda create_pool odešle fond do služby Batch.
new_pool = models.BatchPoolCreateOptions(
id=pool_id,
virtual_machine_configuration=models.VirtualMachineConfiguration(
image_reference=models.BatchVmImageReference(
publisher="canonical",
offer="0001-com-ubuntu-server-jammy",
sku="22_04-lts",
version="latest"
),
node_agent_sku_id="batch.node.ubuntu 22.04"),
vm_size=_POOL_VM_SIZE,
target_dedicated_nodes=_DEDICATED_POOL_NODE_COUNT,
target_low_priority_nodes=_LOW_PRIORITY_POOL_NODE_COUNT,
start_task=models.BatchStartTask(
command_line="/bin/bash -c \"apt-get update && apt-get install -y ffmpeg\"",
wait_for_success=True,
user_identity=models.UserIdentity(
auto_user=models.AutoUserSpecification(
scope=models.AutoUserScope.POOL,
elevation_level=models.ElevationLevel.ADMIN)),
)
)
batch_client.create_pool(pool=new_pool)
Note
Image virtuálních počítačů z Marketplace a agenti uzlů Batch mají stanovená data ukončení podpory. Ubuntu Server 20.04 LTS obrazy a node batch.node.ubuntu 20.04 agent již nejsou podporovány pro nové dávkové pooly. Pro seznam odkazů na obrázky a SKU agentů uzlů, které váš Batch účet aktuálně podporuje, zavolejte metodu list_supported_images .
Vytvořit pracovní pozici
Úloha Batch nastaví fond, na kterém se budou spouštět úkoly, a volitelná nastavení, jako je nastavení priority a harmonogram pro práci. Ukázka vytvoří úkol voláním create_job. Tato definovaná funkce používá třídu BatchJobCreateOptions k vytvoření úlohy ve fondu. Metoda create_job odešle úkol do dávkové služby. Zpočátku úloha nemá žádné úkoly.
job = models.BatchJobCreateOptions(
id=job_id,
pool_info=models.BatchPoolInfo(pool_id=pool_id))
batch_client.create_job(job=job)
Vytvoření úkolů
Aplikace vytváří úkoly v práci voláním add_tasks. Tato definovaná funkce vytvoří seznam objektů úkolů pomocí Třídy BatchTaskCreateOptions . Každá úloha spustí ffmpeg ke zpracování vstupního resource_files objektu pomocí parametru command_line . ffmpeg byl již dříve nainstalován na každý uzel, když byl fond vytvořen. 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 každého úkolu (v tomto případě jeden) se nahrají do kontejneru v propojeném účtu úložiště pomocí vlastnosti úkolu output_files .
Aplikace pak do úlohy přidá úkoly pomocí metody create_tasks , která je zařadí do fronty pro spuštění na 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(models.BatchTaskCreateOptions(
id='Task{}'.format(idx),
command_line=command,
resource_files=[input_file],
output_files=[models.OutputFile(
file_pattern=output_file_path,
destination=models.OutputFileDestination(
container=models.OutputFileBlobContainerDestination(
container_url=output_container_sas_url)),
upload_options=models.OutputFileUploadConfiguration(
upload_condition=models.OutputFileUploadCondition.TASK_SUCCESS))]
)
)
batch_client.create_tasks(job_id=job_id, task_collection=tasks)
Monitorování úkolů
Když se úkoly přidají do úlohy, Služba Batch je automaticky zařadí do fronty a naplánuje jejich spouštění na výpočetních uzlech v přidruženém fondu. Na základě nastavení, která zadáte, služba Batch zpracovává všechny úlohy řízení front, plánování, opakování a další povinnosti správy úkolů.
Existuje mnoho přístupů k monitorování provádění úloh.
wait_for_tasks_to_complete Funkce v tomto příkladu používá Objekt BatchTaskState k monitorování úkolů pro určitý 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_client.list_tasks(job_id=job_id)
incomplete_tasks = [task for task in tasks if
task.state != models.BatchTaskState.COMPLETED]
if not incomplete_tasks:
print()
return True
else:
time.sleep(5)
...
Čištění zdrojů
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. Metody begin_delete_job a begin_delete_pool této třídy BatchClient zahajují odpovídající operaci mazání, jakmile potvrdíte výzvu. Přestože se za samotné zakázky a úlohy nic neúčtuje, jsou vám účtovány výpočetní uzly. Proto přidělujte pooly pouze podle potřeby. Při odstranění fondu se odstraní všechny výstupy úkolů na uzlech. Výstupní soubory ale 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:
- 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.