Souběžné spouštění úloh pro maximalizaci využití výpočetních uzlů BatchRun tasks concurrently to maximize usage of Batch compute nodes

Využití prostředků na menším počtu výpočetních uzlů ve fondu můžete maximalizovat tak, že na každém uzlu spustíte více než jeden úkol současně.You can maximize resource usage on a smaller number of compute nodes in your pool by running more than one task simultaneously on each node.

I když některé scénáře fungují nejlépe se všemi prostředky uzlu vyhrazenými pro jeden úkol, můžou některé úlohy zobrazovat kratší dobu úloh a snížit náklady, pokud tyto prostředky sdílí několik úkolů:While some scenarios work best with all of a node's resources dedicated to a single task, certain workloads may see shorter job times and lower costs when multiple tasks share those resources:

  • Minimalizujte přenos dat pro úlohy, které můžou sdílet data.Minimize data transfer for tasks that are able to share data. Poplatky za přenos dat můžete výrazně snížit zkopírováním sdílených dat do menšího počtu uzlů a následným spouštěním úloh paralelně na jednotlivých uzlech.You can dramatically reduce data transfer charges by copying shared data to a smaller number of nodes, then executing tasks in parallel on each node. To platí hlavně v případě, že se data, která mají být kopírována do každého uzlu, musí přenášet mezi geografickými oblastmi.This especially applies if the data to be copied to each node must be transferred between geographic regions.
  • Maximalizujte využití paměti pro úlohy, které vyžadují velké množství paměti, ale jenom během krátkých časových období a v určitém časovém intervalu při provádění.Maximize memory usage for tasks which require a large amount of memory, but only during short periods of time, and at variable times during execution. Můžete využít méně, ale větší výpočetní uzel s větší pamětí, abyste mohli efektivně zvládnout takové špičky.You can employ fewer, but larger, compute nodes with more memory to efficiently handle such spikes. Tyto uzly budou mít paralelně spuštěné více úloh na každém uzlu, ale každá úloha by mohla využít plentiful paměti uzlů v různou dobu.These nodes would have multiple tasks running in parallel on each node, but each task would take advantage of the nodes' plentiful memory at different times.
  • Omezte omezení počtu uzlů , pokud se v rámci fondu vyžaduje komunikace mezi uzly.Mitigate node number limits when inter-node communication is required within a pool. V současné době jsou fondy nakonfigurované pro komunikaci mezi uzly omezeny na 50 výpočetních uzlů.Currently, pools configured for inter-node communication are limited to 50 compute nodes. Pokud každý uzel v takovém fondu může spouštět úlohy paralelně, může se spustit větší počet úkolů současně.If each node in such a pool is able to execute tasks in parallel, a greater number of tasks can be executed simultaneously.
  • Replikujte místní výpočetní cluster, například když nejprve přesunete výpočetní prostředí do Azure.Replicate an on-premises compute cluster, such as when you first move a compute environment to Azure. Pokud vaše aktuální místní řešení spouští více úloh na výpočetní uzel, můžete zvýšit maximální počet úloh uzlu, aby se tato konfigurace podrobněji rozrážejí.If your current on-premises solution executes multiple tasks per compute node, you can increase the maximum number of node tasks to more closely mirror that configuration.

Ukázkový scénářExample scenario

Představte si například aplikaci úkolu s požadavky na procesor a paměť, které jsou dostatečné pro standardní uzly _ D1 .As an example, imagine a task application with CPU and memory requirements such that Standard_D1 nodes are sufficient. Aby se ale dokončila úloha v požadované době, 1 000 těchto uzlů je potřeba.However, in order to finish the job in the required time, 1,000 of these nodes are needed.

Místo používání standardních _ uzlů D1 s 1 jádrem procesoru můžete použít standardní uzly _ D14 s 16 jádry každého a povolit paralelní provádění úkolů.Instead of using Standard_D1 nodes that have 1 CPU core, you could use Standard_D14 nodes that have 16 cores each, and enable parallel task execution. To znamená, že se dá použít méně uzlů , než je počet uzlů 1 000, ale bude potřeba jenom 63.This means that 16 times fewer nodes could be used--instead of 1,000 nodes, only 63 would be required. Pokud jsou pro každý uzel požadovány soubory velkých aplikací nebo referenční data, je opět vylepšena doba trvání a účinnost úlohy, protože data jsou zkopírována pouze do 63 uzlů.If large application files or reference data are required for each node, job duration and efficiency are again improved, since the data is copied to only 63 nodes.

Povolit spuštění paralelní úlohyEnable parallel task execution

Výpočetní uzly můžete nakonfigurovat pro provádění paralelních úkolů na úrovni fondu.You configure compute nodes for parallel task execution at the pool level. Pomocí knihovny Batch .NET nastavte při vytváření fondu vlastnost CloudPool. TaskSlotsPerNode .With the Batch .NET library, set the CloudPool.TaskSlotsPerNode property when you create a pool. Pokud používáte REST API dávky, nastavte v textu žádosti během vytváření fondu prvek taskSlotsPerNode .If you're using the Batch REST API, set the taskSlotsPerNode element in the request body during pool creation.

Poznámka

taskSlotsPerNodeVlastnost element a TaskSlotsPerNode lze nastavit pouze v okamžiku vytvoření fondu.You can set the taskSlotsPerNode element and TaskSlotsPerNode property only at pool creation time. Po vytvoření fondu již nelze tyto změny změnit.They can't be modified after a pool has already been created.

Azure Batch umožňuje nastavit sloty úloh na jeden uzel až (4x) na počet jader uzlů.Azure Batch allows you to set task slots per node up to (4x) the number of node cores. Například pokud je fond nakonfigurovaný s uzly o velikosti "velký" (čtyři jádra), taskSlotsPerNode může se nastavit na 16.For example, if the pool is configured with nodes of size "Large" (four cores), then taskSlotsPerNode may be set to 16. Bez ohledu na to, kolik jader má uzel, ale nemůžete mít více než 256 slotů úloh na jeden uzel.However, regardless of how many cores the node has, you can't have more than 256 task slots per node. Podrobnosti o počtu jader pro jednotlivé velikosti uzlů najdete v tématu velikosti pro Cloud Services.For details on the number of cores for each of the node sizes, see Sizes for Cloud Services. Další informace o omezeních služeb najdete v tématu kvóty a omezení pro službu Azure Batch.For more information on service limits, see Quotas and limits for the Azure Batch service.

Tip

Nezapomeňte vzít v úvahu taskSlotsPerNode hodnotu při vytváření vzorce automatického škálování pro váš fond.Be sure to take into account the taskSlotsPerNode value when you construct an autoscale formula for your pool. Například vzorec, který vyhodnocuje, $RunningTasks může výrazně ovlivnit zvýšení počtu úkolů na uzel.For example, a formula that evaluates $RunningTasks could be dramatically affected by an increase in tasks per node. Další informace najdete v tématu Automatické škálování výpočetních uzlů ve fondu Azure Batch.For more information, see Automatically scale compute nodes in an Azure Batch pool.

Zadat distribuci úkoluSpecify task distribution

Při povolování souběžných úloh je důležité určit, jak se mají úlohy distribuovat mezi uzly ve fondu.When enabling concurrent tasks, it's important to specify how you want the tasks to be distributed across the nodes in the pool.

Pomocí vlastnosti CloudPool. TaskSchedulingPolicy můžete určit, že se mají úlohy přiřadit rovnoměrně mezi všechny uzly ve fondu ("rozprostření").By using the CloudPool.TaskSchedulingPolicy property, you can specify that tasks should be assigned evenly across all nodes in the pool ("spreading"). Nebo můžete určit, že k jednotlivým uzlům by se měly přiřadit tolik úkolů, než se úkoly přiřadí do jiného uzlu ve fondu ("balení").Or you can specify that as many tasks as possible should be assigned to each node before tasks are assigned to another node in the pool ("packing").

Můžete například zvážit fond standardních _ D14 uzlů (v předchozím příkladu), který je nakonfigurovaný s hodnotou CloudPool. TaskSlotsPerNode 16.As an example, consider the pool of Standard_D14 nodes (in the example above) that is configured with a CloudPool.TaskSlotsPerNode value of 16. Pokud je CloudPool. TaskSchedulingPolicy nakonfigurovaný s ComputeNodeFillType packem, může maximalizovat využití všech 16 jader každého uzlu a umožňuje fondu automatického škálování odebrat nepoužívané uzly (uzly bez přiřazených úkolů) z fondu.If the CloudPool.TaskSchedulingPolicy is configured with a ComputeNodeFillType of Pack, it would maximize usage of all 16 cores of each node and allow an autoscaling pool to remove unused nodes (nodes without any tasks assigned) from the pool. Tím se minimalizuje využití prostředků a šetří peníze.This minimizes resource usage and saves money.

Definovat proměnné sloty na úlohuDefine variable slots per task

Úkol lze definovat pomocí vlastnosti CloudTask. RequiredSlots , která určuje, kolik slotů vyžaduje spuštění na výpočetním uzlu.A task can be defined with CloudTask.RequiredSlots property, specifying how many slots it requires to run on a compute node. Výchozí hodnota je 1.The default value as 1. Pokud mají vaše úkoly různé váhy týkající se využití prostředků na výpočetním uzlu, můžete nastavit proměnné.You can set variable task slots if your tasks have different weights regarding to resource usage on the compute node. To umožňuje každému výpočetnímu uzlu přiměřený počet souběžně spuštěných úloh bez zahlcení systémových prostředků, jako je CPU nebo paměť.This lets each compute node have a reasonable number of concurrent running tasks without overwhelming system resources like CPU or memory.

Například u fondu s vlastností taskSlotsPerNode = 8 můžete odesílat úlohy s více jádry náročné na procesor s requiredSlots = 8 , zatímco jiné úlohy lze nastavit na requiredSlots = 1 .For example, for a pool with property taskSlotsPerNode = 8, you can submit multi-core required CPU-intensive tasks with requiredSlots = 8, while other tasks can be set to requiredSlots = 1. Po naplánování této smíšené úlohy se úlohy náročné na procesor spustí výhradně na jejich výpočetních uzlech, zatímco jiné úlohy můžou běžet souběžně (až osm úloh najednou) na jiných uzlech.When this mixed workload is scheduled, the CPU-intensive tasks will run exclusively on their compute nodes, while other tasks can run concurrently (up to eight tasks at once) on other nodes. Díky tomu můžete vyrovnávat zatížení napříč výpočetními uzly a zlepšit efektivitu využití prostředků.This helps you balance your workload across compute nodes and improve resource usage efficiency.

Tip

Při použití proměnných úloh proměnné je možné, že velké úlohy s dalšími požadovanými Sloty mohou být dočasně neúspěšné, protože na žádném výpočetním uzlu nejsou k dispozici dostatek slotů, a to ani v případě, že jsou na některých uzlech stále nečinné sloty.When using variable task slots, it's possible that large tasks with more required slots can temporarily fail to be scheduled because not enough slots are available on any compute node, even when there are still idle slots on some nodes. Můžete zvýšit prioritu úlohy pro tyto úlohy a zvýšit tak jejich šanci na soutěž na dostupné sloty na uzlech.You can raise the job priority for these tasks to increase their chance to compete for available slots on nodes.

Služba Batch generuje TaskScheduleFailEvent , když se nepovede naplánovat spuštění úlohy a pokračuje v plánování až do chvíle, kdy budou k dispozici požadované sloty.The Batch service emits the TaskScheduleFailEvent when it fails to schedule a task to run, and keeps retrying the scheduling until required slots become available. Můžete naslouchat této události a zjistit potenciální problémy s plánováním úloh a zmírnit je.You can listen to that event to detect potential task scheduling issues and mitigate accordingly.

Poznámka

Nezadávejte úkol requiredSlots , který by měl být větší než fond taskSlotsPerNode .Do not specify a task's requiredSlots to be greater than the pool's taskSlotsPerNode. Výsledkem bude, že se úloha nebude nikdy moct spustit.This will result in the task never being able to run. Služba Batch aktuálně neověřuje tento konflikt, když odesíláte úkoly, protože v době odeslání se nemusí fond svázat nebo ho můžete změnit na jiný fond tím, že zakážete nebo znovu povolíte.The Batch Service doesn't currently validate this conflict when you submit tasks because a job may not have a pool bound at submission time, or it could be changed to a different pool by disabling/re-enabling.

Příklad dávky .NETBatch .NET example

Následující fragmenty kódu v rozhraní Batch .NET API ukazují, jak vytvořit fond s více sloty úloh na jeden uzel a jak odeslat úkol s požadovanými sloty.The following Batch .NET API code snippets show how to create a pool with multiple task slots per node and how to submit a task with required slots.

Vytvoření fondu s více sloty úloh na jeden uzelCreate a pool with multiple task slots per node

Tento fragment kódu ukazuje požadavek na vytvoření fondu, který obsahuje čtyři uzly se čtyřmi sloty úloh povolenými pro každý uzel.This code snippet shows a request to create a pool that contains four nodes, with four task slots allowed per node. Určuje zásadu plánování úkolů, která před přiřazením úkolů jinému uzlu ve fondu vyplní každý uzel úkoly.It specifies a task scheduling policy that will fill each node with tasks prior to assigning tasks to another node in the pool.

Další informace o přidávání fondů pomocí rozhraní API služby Batch najdete v tématu BatchClient. PoolOperations. CreatePool.For more information on adding pools by using the Batch .NET API, see BatchClient.PoolOperations.CreatePool.

CloudPool pool =
    batchClient.PoolOperations.CreatePool(
        poolId: "mypool",
        targetDedicatedComputeNodes: 4
        virtualMachineSize: "standard_d1_v2",
        cloudServiceConfiguration: new CloudServiceConfiguration(osFamily: "5"));

pool.TaskSlotsPerNode = 4;
pool.TaskSchedulingPolicy = new TaskSchedulingPolicy(ComputeNodeFillType.Pack);
pool.Commit();

Vytvoření úlohy s požadovanými slotyCreate a task with required slots

Tento fragment kódu vytvoří úlohu s jiným než výchozím requiredSlots .This code snippet creates a task with non-default requiredSlots. Tato úloha se spustí pouze v případě, že je na výpočetním uzlu k dispozici dostatek volných slotů.This task will only run when there are enough free slots available on a compute node.

CloudTask task = new CloudTask(taskId, taskCommandLine)
{
    RequiredSlots = 2
};

Vypsání výpočetních uzlů s počty pro spuštěné úlohy a slotyList compute nodes with counts for running tasks and slots

Tento fragment kódu obsahuje seznam všech výpočetních uzlů ve fondu a tiskne počty pro spuštěné úlohy a sloty úloh na uzel.This code snippet lists all compute nodes in the pool, and prints out the counts for running tasks and task slots per node.

ODATADetailLevel nodeDetail = new ODATADetailLevel(selectClause: "id,runningTasksCount,runningTaskSlotsCount");
IPagedEnumerable<ComputeNode> nodes = batchClient.PoolOperations.ListComputeNodes(poolId, nodeDetail);

await nodes.ForEachAsync(node =>
{
    Console.WriteLine(node.Id + " :");
    Console.WriteLine($"RunningTasks = {node.RunningTasksCount}, RunningTaskSlots = {node.RunningTaskSlotsCount}");

}).ConfigureAwait(continueOnCapturedContext: false);

Vypsat počty úloh pro úlohuList task counts for the job

Tento fragment kódu získá počty úloh pro úlohu, která zahrnuje úlohy a počet slotů úloh na stav úkolu.This code snippet gets task counts for the job, which includes both tasks and task slots count per task state.

TaskCountsResult result = await batchClient.JobOperations.GetJobTaskCountsAsync(jobId);

Console.WriteLine("\t\tActive\tRunning\tCompleted");
Console.WriteLine($"TaskCounts:\t{result.TaskCounts.Active}\t{result.TaskCounts.Running}\t{result.TaskCounts.Completed}");
Console.WriteLine($"TaskSlotCounts:\t{result.TaskSlotCounts.Active}\t{result.TaskSlotCounts.Running}\t{result.TaskSlotCounts.Completed}");

Příklad dávky v dávceBatch REST example

Následující fragmenty kódu rozhraní REST API pro Batch ukazují, jak vytvořit fond s více sloty úloh na jeden uzel a jak odeslat úkol s požadovanými sloty.The following Batch REST API code snippets show how to create a pool with multiple task slots per node and how to submit a task with required slots.

Vytvoření fondu s více sloty úloh na jeden uzelCreate a pool with multiple task slots per node

Tento fragment kódu ukazuje požadavek na vytvoření fondu, který obsahuje dva velké uzly s maximálně čtyřmi úkoly na uzel.This snippet shows a request to create a pool that contains two large nodes with a maximum of four tasks per node.

Další informace o přidávání fondů pomocí REST API najdete v tématu Přidání fondu k účtu.For more information on adding pools by using the REST API, see Add a pool to an account.

{
  "odata.metadata":"https://myaccount.myregion.batch.azure.com/$metadata#pools/@Element",
  "id":"mypool",
  "vmSize":"large",
  "cloudServiceConfiguration": {
    "osFamily":"4",
    "targetOSVersion":"*",
  },
  "targetDedicatedComputeNodes":2,
  "taskSlotsPerNode":4,
  "enableInterNodeCommunication":true,
}

Vytvoření úlohy s požadovanými slotyCreate a task with required slots

Tento fragment kódu ukazuje požadavek na přidání úlohy s jiným než výchozím nastavením requiredSlots .This snippet shows a request to add a task with non-default requiredSlots. Tato úloha se spustí pouze v případě, že je na výpočetním uzlu k dispozici dostatek volných slotů.This task will only run when there are enough free slots available on the compute node.

{
  "id": "taskId",
  "commandLine": "bash -c 'echo hello'",
  "userIdentity": {
    "autoUser": {
      "scope": "task",
      "elevationLevel": "nonadmin"
    }
  },
  "requiredSLots": 2
}

Ukázka kódu na GitHubuCode sample on GitHub

Projekt ParallelTasks na GitHubu ilustruje použití vlastnosti CloudPool. TaskSlotsPerNode .The ParallelTasks project on GitHub illustrates the use of the CloudPool.TaskSlotsPerNode property.

Tato Konzolová aplikace v jazyce C# používá knihovnu Batch .NET k vytvoření fondu s jedním nebo více výpočetními uzly.This C# console application uses the Batch .NET library to create a pool with one or more compute nodes. Spustí na těchto uzlech konfigurovatelný počet úloh pro simulaci zatížení proměnné.It executes a configurable number of tasks on those nodes to simulate a variable load. Výstup z aplikace zobrazuje, které uzly provedly jednotlivé úlohy.Output from the application shows which nodes executed each task. Aplikace také poskytuje souhrn parametrů a doby trvání úloh.The application also provides a summary of the job parameters and duration.

Příklad: níže je souhrnná část výstupu ze dvou různých spuštění ukázkové aplikace ParallelTasks.As an example, below is the summary portion of the output from two different runs of the ParallelTasks sample application. Trvání úloh, které jsou zde uvedeny, neobsahují čas vytvoření fondu, protože každá úloha byla odeslána do dříve vytvořeného fondu, jehož výpočetní uzly byly v době odeslání ve stavu nečinnosti .Job durations shown here don't include pool creation time, since each job was submitted to a previously created pool whose compute nodes were in the Idle state at submission time.

První spuštění ukázkové aplikace ukazuje, že s jedním uzlem ve fondu a s výchozím nastavením jednoho úkolu na uzel je doba trvání úlohy více než 30 minut.The first execution of the sample application shows that with a single node in the pool and the default setting of one task per node, the job duration is over 30 minutes.

Nodes: 1
Node size: large
Task slots per node: 1
Max slots per task: 1
Tasks: 32
Duration: 00:30:01.4638023

Druhý běh ukázky ukazuje výrazné snížení doby trvání úlohy.The second run of the sample shows a significant decrease in job duration. Důvodem je to, že fond byl nakonfigurován se čtyřmi úkoly na jeden uzel, což umožňuje paralelní spouštění úkolů dokončit úlohu téměř ve čtvrtletí času.This is because the pool was configured with four tasks per node, allowing for parallel task execution to complete the job in nearly a quarter of the time.

Nodes: 1
Node size: large
Task slots per node: 4
Max slots per task: 1
Tasks: 32
Duration: 00:08:48.2423500

Další krokyNext steps

  • Vyzkoušejte Batch Explorer Heat mapy.Try the Batch Explorer Heat Map. Batch Explorer je bezplatný a samostatný klientský nástroj s bohatými funkcemi, který vám umožní vytvářet, ladit a monitorovat Azure Batch aplikace.Batch Explorer is a free, rich-featured, standalone client tool to help create, debug, and monitor Azure Batch applications. Když spouštíte ukázkovou aplikaci ParallelTasks , funkce Batch Explorer tepelný map vám umožní snadno vizualizovat spouštění paralelních úloh na jednotlivých uzlech.When you're executing the ParallelTasks sample application, the Batch Explorer Heat Map feature lets you easily visualize the execution of parallel tasks on each node.
  • Prozkoumejte Azure Batch ukázky na GitHubu.Explore Azure Batch samples on GitHub.
  • Přečtěte si další informace o závislostech úloh Batch.Learn more about Batch task dependencies.