Tárolóalkalmazások futtatása Azure Batch

Azure Batch lehetővé teszi nagy mennyiségű kötegelt számítási feladat futtatását és méretezését az Azure-ban. A Batch-tevékenységek futtathatók közvetlenül a Batch-készletben lévő virtuális gépeken (csomópontokon), de beállíthat egy Batch-készletet is, amely docker-kompatibilis tárolókban futtatja a feladatokat a csomópontokon. Ez a cikk bemutatja, hogyan hozhat létre olyan számítási csomópontkészletet, amely támogatja a tárolófeladatok futtatását, majd hogyan futtathat tárolófeladatokat a készleten.

Az itt látható példakódok a Batch .NET-et és Python SDK-kat használják. Más Batch SDK-k és -eszközök , köztük a Azure Portal is használhatók tárolóbarát Batch-készletek létrehozásához és tárolófeladatok futtatásához.

Miért érdemes tárolókat használni?

A tárolók használatával egyszerűen futtathatja a Batch-feladatokat anélkül, hogy kezelnie kellene egy környezetet és függőségeket az alkalmazások futtatásához. A tárolók egyszerű, hordozható, önellátó egységekként helyezik üzembe az alkalmazásokat, amelyek több különböző környezetben is futtathatók. Létrehozhat és tesztelhet például egy tárolót helyileg, majd feltöltheti a tárolórendszerképet egy azure-beli vagy más tárolóregisztrációs adatbázisba. A tárolótelepítési modell biztosítja, hogy az alkalmazás futtatókörnyezete mindig megfelelően legyen telepítve és konfigurálva, bárhol is üzemelteti az alkalmazást. A Batch tárolóalapú tevékenységei a nem tárolóalapú feladatok funkcióit is kihasználhatják, beleértve az alkalmazáscsomagokat, valamint az erőforrásfájlok és a kimeneti fájlok kezelését.

Előfeltételek

Ismernie kell a tárolóval kapcsolatos fogalmakat, valamint a Batch-készlet és -feladatok létrehozását.

  • SDK-verziók: A Batch SDK-k a következő verziókban támogatják a tárolórendszerképeket:

    • Batch REST API 2017-09-01.6.0-s verzió
    • Batch .NET SDK 8.0.0-s verzió
    • Batch Python SDK 4.0-s verzió
    • Batch Java SDK 3.0-s verzió
    • Batch Node.js SDK 3.0-s verzió
  • Fiókok: Az Azure-előfizetésben létre kell hoznia egy Batch-fiókot és opcionálisan egy Azure Storage-fiókot.

  • Támogatott virtuálisgép-rendszerkép: A tárolókat csak a virtuálisgép-konfigurációval létrehozott készletek támogatják egy támogatott rendszerképből (a következő szakaszban látható). Ha egyéni rendszerképet ad meg, tekintse meg a következő szakaszban található szempontokat, valamint a felügyelt egyéni rendszerképek használata virtuális gépek készletének létrehozására vonatkozó követelményeit.

Tartsa szem előtt a következő korlátozásokat:

  • A Batch csak Linux-készleteken futó tárolók esetében nyújt RDMA-támogatást.
  • Windows-tároló számítási feladatok esetén azt javasoljuk, hogy válasszon egy többmagos virtuálisgép-méretet a készlethez.

Támogatott virtuálisgép-rendszerképek

A következő támogatott Windows- vagy Linux-rendszerképek egyikével hozzon létre virtuálisgép-számítási csomópontok készletét a tároló számítási feladataihoz. A Batch-szel kompatibilis Marketplace-rendszerképekről további információt a virtuálisgép-rendszerképek listájában talál.

Windows-támogatás

A Batch támogatja a Tárolótámogatási jelöléssel rendelkező Windows-kiszolgáló lemezképeit. Ezek a rendszerkép-termékváltozatok nevei általában a vagy -with-containers-smalldiska -with-containers . Emellett a Batchben az összes támogatott rendszerképet listázó API egy képességet DockerCompatible jelöl, ha a rendszerkép támogatja a Docker-tárolókat.

Egyéni rendszerképeket windowsos Dockert futtató virtuális gépekről is létrehozhat.

Linux-támogatás

Linux-tároló számítási feladatok esetén a Batch jelenleg a Microsoft Azure Batch által a Azure Marketplace közzétett alábbi Linux-rendszerképeket támogatja egyéni rendszerképek nélkül.

Virtuálisgép-méretek RDMA nélkül

  • Publisher: microsoft-azure-batch
    • Ajánlat: centos-container
    • Ajánlat: ubuntu-server-container

Virtuálisgép-méretek RDMA-val

  • Publisher: microsoft-azure-batch
    • Ajánlat: centos-container-rdma
    • Ajánlat: ubuntu-server-container-rdma

Ezek a rendszerképek csak Azure Batch készletekben használhatók, és a Docker-tárolók végrehajtására vannak összhangban. Ezek a funkciók:

  • Előre telepített Docker-kompatibilis Moby-tároló-futtatókörnyezet
  • Előre telepített NVIDIA GPU-illesztőprogramok és NVIDIA tároló-futtatókörnyezet az Azure N sorozatú virtuális gépeken való üzembe helyezés leegyszerűsítése érdekében
  • Az "-rdma" utótaggal rendelkező virtuálisgép-rendszerképek előre konfigurálva vannak az InfiniBand RDMA virtuálisgép-méretek támogatásával. Ezeket a virtuálisgép-rendszerképeket nem szabad olyan virtuálisgép-méretekkel használni, amelyek nem rendelkeznek InfiniBand-támogatással.

Egyéni rendszerképeket a Dockert futtató virtuális gépekről is létrehozhat a Batchdel kompatibilis Linux-disztribúciók egyikén. Ha úgy dönt, hogy saját egyéni Linux-rendszerképet ad meg, tekintse meg a Felügyelt egyéni rendszerkép használata virtuális gépek készletének létrehozásához című témakör utasításait.

Egyéni lemezkép docker-támogatásához telepítse a Docker Community Editiont (CE) vagy a Docker Enterprise kiadás (EE).

További szempontok az egyéni Linux-rendszerképek használatához:

  • Ha egyéni rendszerképek használatakor szeretné kihasználni az Azure N sorozatú méretek GPU-teljesítményét, telepítse előre az NVIDIA-illesztőprogramokat. Emellett telepítenie kell az NVIDIA GPU-khoz készült Docker Engine Utility segédprogramot, az NVIDIA Dockert.
  • Az Azure RDMA-hálózat eléréséhez használjon RDMA-kompatibilis virtuálisgép-méretet. A szükséges RDMA-illesztőprogramok a CentOS HPC-ben és a Batch által támogatott Ubuntu-lemezképekben vannak telepítve. Az MPI-számítási feladatok futtatásához további konfigurációra lehet szükség. Lásd: RDMA-kompatibilis vagy GPU-kompatibilis példányok használata a Batch-készletben.

A Batch-készlet tárolókonfigurációja

Ha engedélyezni szeretné egy Batch-készlet számára a tároló számítási feladatainak futtatását, meg kell adnia a ContainerConfiguration beállításait a készlet VirtualMachineConfiguration objektumában. (Ez a cikk a Batch .NET API-referenciára mutató hivatkozásokat tartalmaz. A megfelelő beállítások a Batch Python API-ban találhatók.)

Az alábbi példákban látható módon létrehozhat egy tárolóbarát készletet előre beszúrt tárolórendszerképekkel vagy anélkül. A lekérési (vagy előbetöltési) folyamat lehetővé teszi, hogy előre betöltse a tárolórendszerképeket Docker Hub vagy egy másik tárolóregisztrációs adatbázisból az interneten. A legjobb teljesítmény érdekében használjon azure-tárolóregisztrációs adatbázist ugyanabban a régióban, mint a Batch-fiók.

A tárolórendszerképek előkezelésének az az előnye, hogy amikor a feladatok először futnak, nem kell megvárniuk a tárolólemezkép letöltését. A tárolókonfiguráció a készlet létrehozásakor lekéri a tárolórendszerképeket a virtuális gépekre. A készleten futó feladatok ezután hivatkozhatnak a tárolólemezképek listájára és a tároló futtatási beállításaira.

Készlet előre előkészített tárolórendszerképek nélkül

Ha tárolóbarát készletet szeretne konfigurálni előre előkészített tárolórendszerképek nélkül, definiáljon ContainerConfiguration és VirtualMachineConfiguration objektumokat az alábbi példákban látható módon. Ezek a példák az Ubuntu Servert használják a Marketplace-ről származó tárolókészletek rendszerképének Azure Batch.

Megjegyzés: A példában használt Ubuntu-kiszolgáló verziója illusztrációs célokra szolgál. Nyugodtan módosítsa a node_agent_sku_id a használt verzióra.

image_ref_to_use = batch.models.ImageReference(
    publisher='microsoft-azure-batch',
    offer='ubuntu-server-container',
    sku='16-04-lts',
    version='latest')

"""
Specify container configuration. This is required even though there are no prefetched images.
"""

container_conf = batch.models.ContainerConfiguration()

new_pool = batch.models.PoolAddParameter(
    id=pool_id,
    virtual_machine_configuration=batch.models.VirtualMachineConfiguration(
        image_reference=image_ref_to_use,
        container_configuration=container_conf,
        node_agent_sku_id='batch.node.ubuntu 16.04'),
    vm_size='STANDARD_D1_V2',
    target_dedicated_nodes=1)
...
ImageReference imageReference = new ImageReference(
    publisher: "microsoft-azure-batch",
    offer: "ubuntu-server-container",
    sku: "16-04-lts",
    version: "latest");

// Specify container configuration. This is required even though there are no prefetched images.
ContainerConfiguration containerConfig = new ContainerConfiguration();

// VM configuration
VirtualMachineConfiguration virtualMachineConfiguration = new VirtualMachineConfiguration(
    imageReference: imageReference,
    nodeAgentSkuId: "batch.node.ubuntu 16.04");
virtualMachineConfiguration.ContainerConfiguration = containerConfig;

// Create pool
CloudPool pool = batchClient.PoolOperations.CreatePool(
    poolId: poolId,
    targetDedicatedComputeNodes: 1,
    virtualMachineSize: "STANDARD_D1_V2",
    virtualMachineConfiguration: virtualMachineConfiguration);

Előzetes rendszerképek tárolókonfigurációhoz

A tárolórendszerképek készleten való előkezeléséhez adja hozzá a tárolórendszerképek listáját (container_image_namesPython) a ContainerConfigurationkészlethez.

Az alábbi alapszintű Python példa bemutatja, hogyan lehet elővenni egy standard Ubuntu tárolórendszerképet Docker Hub.

image_ref_to_use = batch.models.ImageReference(
    publisher='microsoft-azure-batch',
    offer='ubuntu-server-container',
    sku='16-04-lts',
    version='latest')

"""
Specify container configuration, fetching the official Ubuntu container image from Docker Hub.
"""

container_conf = batch.models.ContainerConfiguration(
    container_image_names=['ubuntu'])

new_pool = batch.models.PoolAddParameter(
    id=pool_id,
    virtual_machine_configuration=batch.models.VirtualMachineConfiguration(
        image_reference=image_ref_to_use,
        container_configuration=container_conf,
        node_agent_sku_id='batch.node.ubuntu 16.04'),
    vm_size='STANDARD_D1_V2',
    target_dedicated_nodes=1)
...

Az alábbi C#-példa feltételezi, hogy egy TensorFlow-rendszerképet szeretne elővenni Docker Hub. Ez a példa egy indítási feladatot tartalmaz, amely a készletcsomópontok virtuálisgép-gazdagépén fut. Futtathat egy indítási feladatot a gazdagépen, például a tárolókból elérhető fájlkiszolgáló csatlakoztatásához.

ImageReference imageReference = new ImageReference(
    publisher: "microsoft-azure-batch",
    offer: "ubuntu-server-container",
    sku: "16-04-lts",
    version: "latest");

ContainerRegistry containerRegistry = new ContainerRegistry(
    registryServer: "https://hub.docker.com",
    userName: "UserName",
    password: "YourPassword"                
);

// Specify container configuration, prefetching Docker images
ContainerConfiguration containerConfig = new ContainerConfiguration();
containerConfig.ContainerImageNames = new List<string> { "tensorflow/tensorflow:latest-gpu" };
containerConfig.ContainerRegistries = new List<ContainerRegistry> { containerRegistry };

// VM configuration
VirtualMachineConfiguration virtualMachineConfiguration = new VirtualMachineConfiguration(
    imageReference: imageReference,
    nodeAgentSkuId: "batch.node.ubuntu 16.04");
virtualMachineConfiguration.ContainerConfiguration = containerConfig;

// Set a native host command line start task
StartTask startTaskContainer = new StartTask( commandLine: "<native-host-command-line>" );

// Create pool
CloudPool pool = batchClient.PoolOperations.CreatePool(
    poolId: poolId,
    virtualMachineSize: "Standard_NC6",
    virtualMachineConfiguration: virtualMachineConfiguration);

// Start the task in the pool
pool.StartTask = startTaskContainer;
...

Rendszerképek előkezelése privát tárolóregisztrációs adatbázisból

A tárolórendszerképeket egy privát tárolóregisztrációs adatbázis-kiszolgálóra való hitelesítéssel is előveheti. Az alábbi példákban az ContainerConfiguration and VirtualMachineConfiguration objects elővesz egy privát TensorFlow-rendszerképet egy privát Azure-tárolóregisztrációs adatbázisból. A képhivatkozás ugyanaz, mint az előző példában.

image_ref_to_use = batch.models.ImageReference(
        publisher='microsoft-azure-batch',
        offer='ubuntu-server-container',
        sku='16-04-lts',
        version='latest')

# Specify a container registry
container_registry = batch.models.ContainerRegistry(
        registry_server="myRegistry.azurecr.io",
        user_name="myUsername",
        password="myPassword")

# Create container configuration, prefetching Docker images from the container registry
container_conf = batch.models.ContainerConfiguration(
        container_image_names = ["myRegistry.azurecr.io/samples/myImage"],
        container_registries =[container_registry])

new_pool = batch.models.PoolAddParameter(
            id="myPool",
            virtual_machine_configuration=batch.models.VirtualMachineConfiguration(
                image_reference=image_ref_to_use,
                container_configuration=container_conf,
                node_agent_sku_id='batch.node.ubuntu 16.04'),
            vm_size='STANDARD_D1_V2',
            target_dedicated_nodes=1)
// Specify a container registry
ContainerRegistry containerRegistry = new ContainerRegistry(
    registryServer: "myContainerRegistry.azurecr.io",
    userName: "myUserName",
    password: "myPassword");

// Create container configuration, prefetching Docker images from the container registry
ContainerConfiguration containerConfig = new ContainerConfiguration();
containerConfig.ContainerImageNames = new List<string> {
        "myContainerRegistry.azurecr.io/tensorflow/tensorflow:latest-gpu" };
containerConfig.ContainerRegistries = new List<ContainerRegistry> { containerRegistry } );

// VM configuration
VirtualMachineConfiguration virtualMachineConfiguration = new VirtualMachineConfiguration(
    imageReference: imageReference,
    nodeAgentSkuId: "batch.node.ubuntu 16.04");
virtualMachineConfiguration.ContainerConfiguration = containerConfig;

// Create pool
CloudPool pool = batchClient.PoolOperations.CreatePool(
    poolId: poolId,
    targetDedicatedComputeNodes: 4,
    virtualMachineSize: "Standard_NC6",
    virtualMachineConfiguration: virtualMachineConfiguration);
...

Felügyelt identitás támogatása az ACR-hez

A Azure Container Registry tárolt tárolók elérésekor felhasználónév/jelszó vagy felügyelt identitás használható a szolgáltatással való hitelesítéshez. Felügyelt identitás használatához először győződjön meg arról, hogy az identitás hozzá van rendelve a készlethez , és hogy az identitáshoz hozzá van rendelve az AcrPull elérni kívánt tárolóregisztrációs adatbázis szerepköre. Ezután egyszerűen adja meg a Batchnek, hogy melyik identitást használja az ACR-hitelesítéshez.

ContainerRegistry containerRegistry = new ContainerRegistry(
    registryServer: "myContainerRegistry.azurecr.io",
    identityReference: new ComputeNodeIdentityReference() { ResourceId = "/subscriptions/SUB/resourceGroups/RG/providers/Microsoft.ManagedIdentity/userAssignedIdentities/identity-name" }
);

// Create container configuration, prefetching Docker images from the container registry
ContainerConfiguration containerConfig = new ContainerConfiguration();
containerConfig.ContainerImageNames = new List<string> {
        "myContainerRegistry.azurecr.io/tensorflow/tensorflow:latest-gpu" };
containerConfig.ContainerRegistries = new List<ContainerRegistry> { containerRegistry } );

// VM configuration
VirtualMachineConfiguration virtualMachineConfiguration = new VirtualMachineConfiguration(
    imageReference: imageReference,
    nodeAgentSkuId: "batch.node.ubuntu 16.04");
virtualMachineConfiguration.ContainerConfiguration = containerConfig;

// Create pool
CloudPool pool = batchClient.PoolOperations.CreatePool(
    poolId: poolId,
    targetDedicatedComputeNodes: 4,
    virtualMachineSize: "Standard_NC6",
    virtualMachineConfiguration: virtualMachineConfiguration);
...

A feladat tárolóbeállításai

Tárolófeladat tárolóalapú készleten való futtatásához adja meg a tárolóspecifikus beállításokat. A beállítások közé tartozik a használni kívánt rendszerkép, a beállításjegyzék és a tároló futtatási beállításai.

  • ContainerSettings A feladatosztályok tulajdonságával konfigurálhatja a tárolóspecifikus beállításokat. Ezeket a beállításokat a TaskContainerSettings osztály határozza meg. Vegye figyelembe, hogy a --rm tárolóbeállításhoz nincs szükség további --runtime beállításra, mivel a Batch gondoskodik róla.

  • Ha a feladatokat tárolórendszerképeken futtatja, a felhőbeli feladathoz és a feladatkezelő feladathoz tárolóbeállításokra van szükség. Az indítási,feladat-előkészítési és feladatkiadási tevékenységhez azonban nincs szükség tárolóbeállításokra (azaz futtathatók tárolókörnyezetben vagy közvetlenül a csomóponton).

  • Windows rendszeren a tevékenységeket olyan jogosultságszint-szinttel kell futtatni, amely a következőre adminvan állítva: .

  • Linux esetén a Batch leképezi a felhasználó/csoport engedélyét a tárolóra. Ha a tároló bármelyik mappájához rendszergazdai engedély szükséges, előfordulhat, hogy a feladatot készlethatókörként kell futtatnia rendszergazdai jogosultságszinttel. Ez biztosítja, hogy a Batch gyökérként futtassa a feladatot a tárolókörnyezetben. Ellenkező esetben előfordulhat, hogy egy nem rendszergazdai felhasználó nem rendelkezik hozzáféréssel ezekhez a mappákhoz.

  • GPU-kompatibilis hardverrel rendelkező tárolókészletek esetében a Batch automatikusan engedélyezi a GPU-t a tárolófeladatokhoz, ezért ne foglalja bele az –gpus argumentumot.

Tárolótevékenység parancssora

Tárolófeladat futtatásakor a Batch automatikusan a docker create paranccsal hoz létre egy tárolót a feladatban megadott rendszerkép használatával. A Batch ezután szabályozza a feladat végrehajtását a tárolóban.

A nem tárolóalapú Batch-tevékenységekhez hasonlóan egy tárolófeladathoz is beállíthat egy parancssort. Mivel a Batch automatikusan létrehozza a tárolót, a parancssor csak a tárolóban futtatandó parancsokat vagy parancsokat határozza meg.

Ha egy Batch-feladat tárolólemezképe ENTRYPOINT-szkripttel van konfigurálva, beállíthatja a parancssort úgy, hogy az alapértelmezett ENTRYPOINT-ot használja, vagy felülbírálja azt:

  • A tárolólemezkép alapértelmezett ENTRYPOINT elemének használatához állítsa a feladat parancssorát az üres sztringre "".

  • Az alapértelmezett ENTRYPOINT felülbírálásához, vagy ha a rendszerkép nem rendelkezik ENTRYPOINT-tal, állítson be egy, a tárolónak megfelelő parancssort, például/app/myapp./bin/sh -c python myscript.py

Az opcionális ContainerRunOptions argumentumok további argumentumok, amelyeket a docker create Batch a tároló létrehozásához és futtatásához használ. Ha például egy munkakönyvtárat szeretne beállítani a tárolóhoz, adja meg a --workdir <directory> beállítást. További lehetőségekért tekintse meg a Docker létrehozási referenciaanyagát.

Tárolófeladat munkakönyvtára

A Batch-tárolófeladatok egy olyan munkakönyvtárban futnak a tárolóban, amely nagyon hasonló ahhoz a könyvtárhoz, amelyet a Batch egy normál (nem tárolós) feladathoz állít be. Vegye figyelembe, hogy ez a munkakönyvtár eltér a WORKDIR könyvtártól, ha a rendszerképben van konfigurálva, vagy az alapértelmezett tároló munkakönyvtárától (C:\ Windows-tárolón vagy / Linux-tárolón).

Batch-tárolófeladat esetén:

  • A gazdacsomópont alatt AZ_BATCH_NODE_ROOT_DIR található összes könyvtár rekurzív módon (Azure Batch könyvtárak gyökere) a tárolóba van leképezve
  • A rendszer minden tevékenységkörnyezeti változót leképez a tárolóba
  • A csomópont feladat-munkakönyvtára AZ_BATCH_TASK_WORKING_DIR ugyanúgy van beállítva, mint egy normál tevékenység esetében, és le van képezve a tárolóba.

Ezek a leképezések lehetővé teszik, hogy a tárolófeladatokkal ugyanúgy dolgozzon, mint a nem tárolófeladatok. Például alkalmazásokat telepíthet alkalmazáscsomagok használatával, erőforrásfájlokat érhet el az Azure Storage-ból, feladatkörnyezeti beállításokat használhat, és a tároló leállása után is megőrizheti a feladat kimeneti fájljait.

Tárolófeladatok hibaelhárítása

Ha a tárolófeladat nem a várt módon fut, előfordulhat, hogy a tárolólemezkép WORKDIR vagy ENTRYPOINT konfigurációjáról kell információt kapnia. A konfiguráció megtekintéséhez futtassa a Docker-lemezkép vizsgálatára szolgáló parancsot.

Szükség esetén módosítsa a tárolófeladat beállításait a rendszerkép alapján:

  • Adjon meg egy abszolút elérési utat a feladat parancssorában. Ha a rendszerkép alapértelmezett ENTRYPOINT-ját használja a feladat parancssorához, győződjön meg arról, hogy az abszolút elérési út be van állítva.
  • A feladat tárolófuttatási beállításai között módosítsa a munkakönyvtárat úgy, hogy az megfeleljen a képen lévő WORKDIR-nek. Például állítsa be a következőt --workdir /app: .

Példa tárolófeladatokra

Az alábbi Python kódrészlet egy olyan alapszintű parancssort mutat be, amely egy Docker Hub lekért fiktív rendszerképből létrehozott tárolóban fut. Itt a --rm tárolóbeállítás eltávolítja a tárolót a feladat befejezése után, és a --workdir beállítás beállít egy munkakönyvtárat. A parancssor felülbírálja az ENTRYPOINT tárolót egy egyszerű rendszerhéj-paranccsal, amely egy kis fájlt ír a feladat munkakönyvtárába a gazdagépen.

task_id = 'sampletask'
task_container_settings = batch.models.TaskContainerSettings(
    image_name='myimage',
    container_run_options='--rm --workdir /')
task = batch.models.TaskAddParameter(
    id=task_id,
    command_line='/bin/sh -c \"echo \'hello world\' > $AZ_BATCH_TASK_WORKING_DIR/output.txt\"',
    container_settings=task_container_settings
)

Az alábbi C#-példa egy felhőalapú feladat alapvető tárolóbeállításaiból ad képet:

// Simple container task command
string cmdLine = "c:\\app\\myApp.exe";

TaskContainerSettings cmdContainerSettings = new TaskContainerSettings (
    imageName: "myimage",
    containerRunOptions: "--rm --workdir c:\\app"
    );

CloudTask containerTask = new CloudTask (
    id: "Task1",
    commandline: cmdLine);
containerTask.ContainerSettings = cmdContainerSettings;

Következő lépések