Megosztás a következőn keresztül:


Oktatóanyag: Párhuzamos számítási feladat futtatása az Azure Batchtel 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égigvezet egy Python-példán, amely egy párhuzamos számítási feladatot futtat a Batch használatával. 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 még nem rendelkezik Azure-fiókkal, első lépésként hozzon létre egy ingyenes fiókot.

Előfeltételek

Bejelentkezés az Azure-ba

Jelentkezzen be a 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.)

  1. Válassza az Összes szolgáltatás>Batch-fiókja lehetőséget, majd válassza ki a Batch-fiók nevét.

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

  3. 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örnyezetben a pip használatával telepítse a szükséges csomagokat.

pip install -r requirements.txt

Kódszerkesztővel nyissa meg a fájl config.py. Frissítse a Batch- és tárfiók hitelesítőadat-sztringeit a fiókokra egyedi értékekkel. Például:

_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ásához:

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ünetet tapasztalhat Monitoring all tasks for 'Completed' state, timeout in 00:30:00...-nál, miközben a készlet számítási csomópontjai elindulnak.

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ó:

Képernyőkép a medence hőtérképéről.

A végrehajtási idő általában körülbelül 5 perc , amikor az alkalmazást az alapértelmezett konfigurációban futtatja. A legtöbb időt a tár létrehozása veszi igénybe.

Kimeneti fájlok lekérése

Az Azure Portallal letöltheti az ffmpeg tevékenységek által létrehozott kimenti MP3-fájlokat.

  1. Kattintson a Minden szolgáltatás>Storage-fiókok lehetőségre, majd kattintson a Storage-fiók nevére.
  2. Kattintson a Blobok>Kimenet elemre.
  3. 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.

Kimeneti fájl letöltése

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észeinek elolvasása közben tekintse meg a Python-kódot, mivel a minta nem minden kódsorát tárgyalja.

Blob- és Batch-ügyfelek hitelesítése

A tárfiókok használatához az alkalmazás az azure-storage-blobcsomag használatával hoz létre egy BlockBlobService objektumot.

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

Az alkalmazás létrehoz egy BatchServiceClient objektumot, amely készleteket, feladatokat és feladatokat hoz létre és kezel a Batch szolgáltatásban. A mintában szereplő Batch-ügyfél megosztott kulcsú 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 referencia segítségével létrehoz egy tárolót a bemeneti MP4-fájlokhoz és egy tárolót a feladat kimenetéhez. 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 definiált függvény a Batch PoolAddParameter osztályt használja a csomópontok számának, a virtuális gép méretének és a készletkonfigurációnak a beállításához. 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 Spot csomópontokat, és vagy mindkettőt használhatja a készletekben. A dedikált csomópontok ki vannak jelölve a készlet számára. A spot csomópontok alacsonyabb áron érhetők el a többlet virtuálisgép-kapacitásból az Azure-ban. A kihasználatlan csomópontok elérhetetlenné válnak, ha az Azure nem rendelkezik elegendő kapacitással. A minta alapértelmezés szerint egy készletet hoz létre, amely csak öt darab, Standard_A1_v2 méretű Spot csomópontot tartalmaz.

A fizikai csomópont tulajdonságai mellett ez a készletkonfiguráció egy StartTask-objektumot is tartalmaz. A StartTask minden csomóponton fut, amikor a csomópont csatlakozik a készlethez, és minden alkalommal, amikor egy csomópont újraindul. Ebben a példában a StartTask Bash-rendszerhéj-parancsokat futtat az ffmpeg-csomag és a csomópontok függőségeinek 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 definiált függvény a JobAddParameter osztály használatával hoz létre feladatot a csoportban. A job.add metódus elküldi a készletet a Batch szolgáltatásnak. A feladat kezdetben nem rendelkezik feladatokkal.

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 feladatokat hoz létre a munkában egy hívással add_tasks. Ez a definiált függvény létrehozza a tevékenységobjektumok listáját a TaskAddParameter osztály használatával. Minden tevékenység ffmpeg futtatásával feldolgoz egy bemeneti resource_files objektumot egy command_line paraméter használatával. 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. Az egyes tevékenységek kimeneti fájljai (ebben az esetben az egyik) a csatolt tárfiók egyik tárolójába kerülnek a tevékenység tulajdonságának output_files használatával.

Ezután az alkalmazás hozzáadja a feladathoz a task.add_collection metódust, amely várólistára állítja őket 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 figyelése

Amikor tevékenységeket ad hozzá egy feladathoz, a Batch automatikusan várólistára állítja és ütemezi őket a kapcsolódó készlet számítási csomópontjain való végrehajtásra. A megadott beállítások alapján a Batch kezeli az összes feladatsorolást, ütemezést, újrapróbálkozást és egyéb feladatfelügyeleti feladatot.

A feladatvégrehajtás monitorozásának számos módszere van. A wait_for_tasks_to_complete példában szereplő függvény a TaskState objektummal figyeli egy adott állapot tevékenységeit, ebben az esetben a befejezett állapotot egy 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)
...

Erőforrások tisztí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ályai egyaránt rendelkeznek törlési metódusokkal, amelyeket a rendszer meghív, ha megerősíti a törlést. Habár magukért a munkákért és feladatokért nem kell fizetnie, a számítási csomópontokért igen. Éppen ezért javasoljuk, hogy csak szükség esetén ossza ki a készleteket. Amikor a készletet törli, a csomópontokon lévő összes feladat kimenete is törlődik. A bemeneti és kimeneti fájlok azonban a tárfiókban maradnak.

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.