Oktatóanyag: Párhuzamos számításifeladat-futtatás az Azure Batchben a Python API használatával
Az Azure Batch használatával hatékonyan futtathat nagy méretű párhuzamos és nagy teljesítményű feldolgozási (high-performance computing, HPC) Batch-feladatokat az Azure-ban. Ez az oktatóanyag végigvezeti egy, a Batch segítségével párhuzamos számításifeladat-futtatást bemutató Python-példán. Megismerheti a Batch-alkalmazások általános munkafolyamatát, valamint azt, hogyan kommunikálhat programkódon keresztül a Batch- és Storage-erőforrásokkal.
- Hitelesítés Batch- és Storage-fiókokkal.
- Bemeneti fájlok feltöltése a Tárolóba.
- Számítási csomópontok készletének létrehozása egy alkalmazás futtatásához.
- Hozzon létre egy feladatot és feladatokat a bemeneti fájlok feldolgozásához.
- Tevékenység végrehajtásának figyelése.
- Kimeneti fájlok lekérése.
Ebben az oktatóanyagban mp4-médiafájlokat konvertál mp3 formátumba, párhuzamosan az ffmpeg nyílt forráskódú eszközzel.
Ha nem rendelkezik Azure-előfizetéssel, első lépésként hozzon létre egy ingyenes Azure-fiókot.
Előfeltételek
pip csomagkezelő
Egy Azure Batch-fiók és egy társított Azure Storage-fiók. A fiókok létrehozásához tekintse meg az Azure Portalhoz vagy az Azure CLI-hez készült Batch rövid útmutatóit.
Bejelentkezés az Azure-ba
Jelentkezzen be az Azure Portalra.
Fiók hitelesítő adatainak lekérése
Meg kell adnia például a Batch- és a Storage-fiók hitelesítő adatait. A szükséges hitelesítő adatokat például az Azure Portalon kérheti le egyszerűen. (A hitelesítő adatok az Azure API-k vagy parancssori eszközök használatával is lekérhetők.)
Válassza az Összes szolgáltatás>Batch-fiókja lehetőséget, majd válassza ki a Batch-fiók nevét.
A Batch hitelesítő adatainak megtekintéséhez válassza a Kulcsok lehetőséget. Másolja a Batch-fiók, az URL és az Elsődleges elérési kulcs mező értékét egy szövegszerkesztőbe.
A Tárfiók nevének és kulcsainak megtekintéséhez válassza a Tárfiók lehetőséget. Másolja a Storage-fiók neve és az 1. kulcs mező értékét egy szövegszerkesztőbe.
A mintaalkalmazás letöltése és futtatása
A mintaalkalmazás letöltése
Töltse le vagy klónozza a mintaalkalmazást a GitHubról. A mintaalkalmazás adattárának Git-ügyféllel történő klónozásához használja az alábbi parancsot:
git clone https://github.com/Azure-Samples/batch-python-ffmpeg-tutorial.git
Keresse meg a batch_python_tutorial_ffmpeg.py fájlt tartalmazó könyvtárat.
A Python-környezetében telepítse a szükséges csomagokat a pip
segítségével.
pip install -r requirements.txt
Kódszerkesztővel nyissa meg a fájl config.py. Frissítse a Batch- és Storage-fiók hitelesítési sztringjét a fiókjaira jellemző egyedi értékekkel. Példa:
_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=='
Az alkalmazás futtatása
A szkript futtatása:
python batch_python_tutorial_ffmpeg.py
A mintaalkalmazás futtatásakor a konzol kimenete az alábbihoz hasonló lesz. A futtatás során szünet jelentkezhet a következőnél a készlet számítási csomópontjainak indításakor: 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
A készlet, a számítási csomópontok, a feladat és a tevékenységek monitorozásához lépjen az Azure Portalon a Batch-fiókjába. Ha például látni szeretné a készlet számítási csomópontjainak hőtérképét, válassza a Készletek>LinuxFFmpegPool lehetőséget.
A tevékenységek futásakor a hőtérkép az alábbihoz hasonló:
A jellemző végrehajtási idő körülbelül 5 perc, ha az alapértelmezett konfigurációban futtatja az alkalmazást. A készlet létrehozása veszi igénybe a legtöbb időt.
Kimeneti fájlok lekérése
Az Azure Portallal letöltheti az ffmpeg tevékenységek által létrehozott kimenti MP3-fájlokat.
- Kattintson a Minden szolgáltatás>Storage-fiókok lehetőségre, majd kattintson a Storage-fiók nevére.
- Kattintson a Blobok>Kimenet elemre.
- Kattintson a jobb gombbal az egyik kimeneti MP3-fájlra, majd kattintson a Letöltés gombra. Kövesse a böngészőben megjelenő utasításokat a fájl megnyitásához vagy mentéséhez.
Bár ebben a mintában nem látható, programozott módon is letöltheti a fájlokat a számítási csomópontokról vagy a Storage-tárolóból.
A kód áttekintése
A következő szakaszok a mintaalkalmazást felosztják azokra a lépésekre, amelyeket az alkalmazás végrehajt a számítási feladatok a Batch szolgáltatásban történő feldolgozásához. A cikk további részének olvasása közben használja a Python-kódot, mert a minta nem minden kódsoráról esik szó a cikkben.
Blob- és Batch-ügyfelek hitelesítése
Az alkalmazás az azure-storage-blob csomag használatával létrehozott BlockBlobService objektum segítségével kommunikál a Storage-fiókkal.
blob_client = azureblob.BlockBlobService(
account_name=_STORAGE_ACCOUNT_NAME,
account_key=_STORAGE_ACCOUNT_KEY)
Az alkalmazás létrehoz egy BatchServiceClient objektumot a Batch szolgáltatásban lévő készletek, feladatok és tevékenységek létrehozásához és kezeléséhez. A példákban szereplő Batch-ügyfél megosztott kulcsos hitelesítést használ. A Batch a Microsoft Entra-azonosítón keresztüli hitelesítést is támogatja az egyes felhasználók vagy felügyelet nélküli alkalmazások hitelesítéséhez.
credentials = batchauth.SharedKeyCredentials(_BATCH_ACCOUNT_NAME,
_BATCH_ACCOUNT_KEY)
batch_client = batch.BatchServiceClient(
credentials,
base_url=_BATCH_ACCOUNT_URL)
Bemeneti fájlok feltöltése
Az alkalmazás a blob_client
hivatkozás segítségével hoz létre egy Storage-tárolót a bemeneti MP4-fájlokhoz, valamint egy tárolót a tevékenység kimenetének. Ezután meghívja a upload_file_to_container
függvényt, hogy töltsön fel MP4-fájlokat a helyi InputFiles könyvtárba a tárolóba. A tárolóban lévő fájlokat a rendszer a Batch által később a számítási csomópontra letölthető Batch ResourceFile-objektumként határozza meg.
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]
Számításicsomópont-készlet létrehozása
A következő lépésben a minta létrehozza a számítási csomópontok készletét a Batch-fiókban a create_pool
hívásával. Ez a meghatározott funkció a Batch PoolAddParameter osztályával adja meg a csomópontok számát, a virtuális gép méretét és a készletkonfigurációt. Itt egy VirtualMachineConfiguration objektum az Azure Marketplace-en közzétett Ubuntu Server 20.04 LTS-rendszerkép imageReferenciáját adja meg. A Batch az Azure Marketplace virtuálisgép-rendszerképeinek széles választékát támogatja, de egyéni rendszerképeket is használhat.
A csomópontok száma és a virtuális gépek mérete meghatározott állandókkal van megadva. A Batch támogatja a dedikált csomópontokat és a kihasználatlan csomópontokat, és a készletekben vagy mindkettőt használhatja. A dedikált csomópontok a készlet számára vannak fenntartva. A kihasználatlan csomópontok alacsonyabb áron érhetők el az Azure-beli többlet virtuálisgép-kapacitásból. A kihasználatlan csomópontok elérhetetlenné válnak, ha az Azure nem rendelkezik elegendő kapacitással. A minta alapértelmezés szerint létrehoz egy készletet, amely csak öt, Standard_A1_v2 méretű kihasználatlan csomópontot tartalmaz.
A fizikai csomópont tulajdonságain felül ez a készletkonfiguráció tartalmaz egy StartTask objektumot. A StartTask mindegyik csomóponton fut, amikor a csomópont csatlakozik a készlethez, vagy amikor újraindul. Ebben a példában a StartTask Bash-rendszerhéjparancsokat futtat az ffmpeg csomag és a függőségek csomópontokon való telepítéséhez.
A pool.add metódus elküldi a készletet a Batch szolgáltatásnak.
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)
Feladat létrehozása
Egy Batch-feladat meghatároz egy készletet, amelyen futtathatók tevékenységek, valamint opcionális beállításokat, például a prioritást és az ütemezést a munkához. A minta a create_job
hívásával létrehoz egy feladatot. Ez a meghatározott függvény a JobAddParameter osztály használatával létrehoz egy feladatot a készleten. A job.add metódus elküldi a készletet a Batch szolgáltatásnak. A feladat kezdetben nem tartalmaz tevékenységeket.
job = batch.models.JobAddParameter(
id=job_id,
pool_info=batch.models.PoolInformation(pool_id=pool_id))
batch_service_client.job.add(job)
Feladatok létrehozása
Az alkalmazás az add_tasks
meghívásával hoz létre tevékenységeket a feladatban. Ez a megadott függvény létrehoz egy listát a tevékenységobjektumokról a TaskAddParameter osztály segítségével. Minden feladat az ffmpeg futtatásával dolgoz fel egy bemeneti resource_files
-objektumot egy command_line
paraméter segítségével. Az ffmpeg már korábban, a készlet létrehozásakor telepítve lett minden egyes csomóponton. Itt a parancssor az ffmpeg futtatásával konvertálja az egyes bemeneti MP4-videofájlokat MP3-hangfájllá.
A minta a parancssor futtatása után létrehoz egy OutputFile objektumot az MP3-fájlhoz. A rendszer az összes tevékenység kimeneti fájlját (ebben az esetben egyet) feltölti egy, a társított Storage-fiókban lévő tárolóba a tevékenység output_files
tulajdonsága segítségével.
Ezt követően az alkalmazás tevékenységeket ad a feladathoz a task.add_colection metódussal, amely várólistára helyezi azokat a számítási csomópontokon való futtatáshoz.
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)
Tevékenységek monitorozása
Amikor az alkalmazás tevékenységeket ad egy feladathoz, a Batch automatikusan várólistára helyezi és ütemezi azok végrehajtását a társított készlet számítási csomópontjain. A Batch a megadott beállítások alapján elvégzi a tevékenységek várólistára helyezésével, ütemezésével, újrapróbálásával kapcsolatos összes feladatot, valamint a tevékenységekhez kapcsolódó egyéb rendszergazdai teendőket.
A tevékenységek végrehajtása sokféleképpen megfigyelhető. A példában szereplő wait_for_tasks_to_complete
funkció a TaskState objektum segítségével figyel tevékenységeket egy adott (ebben az esetben a befejezett) állapotra vonatkozóan megadott időkorláton belül.
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)
...
Az erőforrások eltávolítása
A tevékenységek futtatása után az alkalmazás automatikusan törli a létrehozott bemeneti Storage-tárolót, és felkínálja a Batch-készlet és -feladat törlésének lehetőségét. A BatchClient JobOperations és PoolOperations osztálya is rendelkezik törlési metódusokkal, amelyeket a rendszer meghív, ha megerősíti a törlést. Bár magukért a feladatokért és tevékenységekért nem kell fizetnie, a számítási csomópontokért igen. Ezért ajánlott csak szükség szerint lefoglalni a készleteket. A készlet törlésekor a rendszer a csomópont összes tevékenységének kimenetét is törli. A bemeneti és kimeneti fájlok azonban megmaradnak a Storage-fiókban.
Ha már nincs rájuk szükség, törölje az erőforráscsoportot, a Batch-fiókot és a Storage-fiókot. Ehhez az Azure Portalon válassza ki a Batch-fiók erőforráscsoportját, és válassza az Erőforráscsoport törlése lehetőséget.
Következő lépések
Ez az oktatóanyag bemutatta, hogyan végezheti el az alábbi műveleteket:
- Hitelesítés Batch- és Storage-fiókokkal.
- Bemeneti fájlok feltöltése a Tárolóba.
- Számítási csomópontok készletének létrehozása egy alkalmazás futtatásához.
- Hozzon létre egy feladatot és feladatokat a bemeneti fájlok feldolgozásához.
- Tevékenység végrehajtásának figyelése.
- Kimeneti fájlok lekérése.
A Batch-számítási feladatok ütemezésére és feldolgozására a Python API használatával kapcsolatos további példákért tekintse meg a Batch Python-mintákat a GitHubon.