Generic Resource (GRES) Design Guide

Overview

Generic Resources (GRES) are resources associated with a specific node that can be allocated to jobs and steps.
汎用リソース(GRES)は、ジョブおよびステップに割り当てることができる特定のノードに関連付けられたリソースです。
The most obvious example of GRES use would be GPUs.
GRESの使用の最も明白な例はGPUです。
GRES are identified by a specific name and use an optional plugin to provide device-specific support.
GRESは特定の名前で識別され、オプションのプラグインを使用してデバイス固有のサポートを提供します。
This document is meant to provide details about Slurm's implementation of GRES support including the relevant data structures.
このドキュメントは、関連するデータ構造を含む、SlurmによるGRESサポートの実装に関する詳細を提供することを目的としています。
For an overview of GRES configuration and use, see Generic Resource (GRES) Scheduling.
GRESの構成と使用の概要については、Generic Resource(GRES)Schedulingを参照してください。
For details about the APIs provided by GRES plugins, see Slurm Generic Resource (GRES) Plugin API.
GRESプラグインによって提供されるAPIの詳細については、Slurm Generic Resource(GRES)プラグインAPIを参照してください。

Data Structures

GRES are associated with Slurm nodes, jobs and job steps.
GRESは、Slurmノード、ジョブ、およびジョブステップに関連付けられています。
You will find a string variable named gres in those data structures which is used to store the GRES configured on a node or required by a job or step (e.g. "gpu:2,nic:1").
これらのデータ構造には、ノードで構成された、またはジョブやステップで必要なGRESを格納するために使用されるgresという名前の文字列変数があります(例: "gpu:2、nic:1")。
This string is also visible to various Slurm commands viewing information about those data structures (e.g. "scontrol show job").
この文字列は、これらのデータ構造に関する情報を表示するさまざまなSlurmコマンドにも表示されます(「scontrolshowjob」など)。
There is a second variable associated with each of those data structures on the slurmctld daemon named gres_list that is intended for program use only.
プログラムでの使用のみを目的とした、gres_listという名前のslurmctldデーモンの各データ構造に関連付けられた2番目の変数があります。
Each element in the list gres_list provides information about a specific GRES type (e.g. one data structure for "gpu" and a second structure with information about "nic").
リストの各要素gres_listは、特定のGRESタイプに関する情報を提供します(たとえば、「gpu」の1つのデータ構造と、「nic」に関する情報を持つ2番目の構造)。
The structures on gres_list contain an ID number (which is faster to compare than a string) plus a pointer to another structure.
gres_listの構造体には、ID番号(文字列よりも比較が高速)と別の構造体へのポインターが含まれています。
This second structure differs somewhat for nodes, jobs, and steps (see gres_node_state_t, gres_job_state_t, and gres_step_state_t in src/common/gres.h for details), but contains various counters and bitmaps.
この2番目の構造は、ノード、ジョブ、およびステップによって多少異なりますが(詳細については、src / common / gres.hのgres_node_state_t、gres_job_state_t、およびgres_step_state_tを参照)、さまざまなカウンターとビットマップが含まれています。
Since these data structures differ for various entity types, the functions used to work with them are also different.
これらのデータ構造はエンティティタイプごとに異なるため、それらを操作するために使用される関数も異なります。
If no GRES are associated with a node, job or step, then both gres and gres_list will be NULL.
GRESがノード、ジョブ、またはステップに関連付けられていない場合、gresとgres_listの両方がNULLになります。

------------------------
|   Job Information    |
|----------------------|
| gres = "gpu:2,nic:1" |
|      gres_list       |
------------------------
           |
           +---------------------------------
           |                                |
   ------------------               ------------------
   | List Struct    |               | List Struct    |
   |----------------|               |----------------|
   | id = 123 (gpu) |               | id = 124 (nic) |
   |   gres_data    |               |   gres_data    |
   ------------------               ------------------
           |                                |
           |                              ....
           |
           |
------------------------------------------------
| gres_job_state_t                             |
|----------------------------------------------|
| gres_count = 2                               |
| node_count = 3                               |
| gres_bitmap(by node) = 0,1;                  |
|                        2,3;                  |
|                        0,2                   |
| gres_count_allocated_to_steps(by node) = 1;  |
|                                          1;  |
|                                          1   |
| gres_bitmap_allocated_to_steps(by node) = 0; |
|                                           2; |
|                                           0  |
------------------------------------------------

Mode of Operation

After the slurmd daemon reads the configuration files, it calls the function node_config_load() for each configured plugin.
slurmdデーモンは、構成ファイルを読み取った後、構成されたプラグインごとに関数node_config_load()を呼び出します。
This can be used to validate the configuration, for example validate that the appropriate devices actually exist.
これは、構成を検証するために使用できます。たとえば、適切なデバイスが実際に存在することを検証します。
If no GRES plugin exists for that resource type, the information in the configuration file is assumed correct.
そのリソースタイプのGRESプラグインが存在しない場合、構成ファイルの情報は正しいと見なされます。
Each node's GRES information is reported by slurmd to the slurmctld daemon at node registration time.
各ノードのGRES情報は、ノード登録時にslurmdによってslurmctldデーモンに報告されます。

The slurmctld daemon maintains GRES information in the data structures described above for each node, including the number of configured and allocated resources.
slurmctldデーモンは、構成および割り当てられたリソースの数など、ノードごとに上記のデータ構造にGRES情報を保持します。
If those resources are identified with a specific device file rather than just a count, bitmaps are used record which specific resources have been allocated to jobs.
これらのリソースが単なるカウントではなく特定のデバイスファイルで識別される場合、ビットマップが使用され、どの特定のリソースがジョブに割り当てられたかが記録されます。

The slurmctld daemon's GRES information about jobs includes several arrays equal in length to the number of allocated nodes.
ジョブに関するslurmctldデーモンのGRES情報には、割り当てられたノードの数と同じ長さのいくつかの配列が含まれています。
The index into each of the arrays is the sequence number of the node in that's job's allocation (e.g. the first element is node zero of the job allocation).
各配列へのインデックスは、そのジョブの割り当て内のノードのシーケンス番号です(たとえば、最初の要素はジョブ割り当てのノード0です)。
The job step's GRES information is similar to that of a job including the design where the index into arrays is based upon the job's allocation.
ジョブステップのGRES情報は、配列へのインデックスがジョブの割り当てに基づく設計を含むジョブの情報と似ています。
This means when a job step is allocated or terminates, the required bitmap operations are very easy to perform without computing different index values for job and step data structures.
これは、ジョブステップが割り当てられるか終了するときに、ジョブとステップのデータ構造に異なるインデックス値を計算することなく、必要なビットマップ操作を非常に簡単に実行できることを意味します。

The most complex operation on the GRES data structures happens when a job changes size (has nodes added or removed).
GRESデータ構造での最も複雑な操作は、ジョブのサイズが変更されたとき(ノードが追加または削除されたとき)に発生します。
In that case, the array indexed by node index must be rebuilt, with records shifting as appropriate.
その場合、ノードインデックスでインデックス付けされた配列を再構築し、必要に応じてレコードをシフトする必要があります。
Note that the current software is not compatible with having different GRES counts by node (a job can not have 2 GPUs on one node and 1 GPU on a second node), although that might be addressed at a later time.
現在のソフトウェアは、ノードごとに異なるGRESカウントを持つことと互換性がないことに注意してください(ジョブは、1つのノードに2つのGPU、2番目のノードに1つのGPUを持つことはできません)。

When a job or step is initiated, its credential includes allocated GRES information.
ジョブまたはステップが開始されると、その資格情報には割り当てられたGRES情報が含まれます。
This can be used by the slurmd daemon to associate those resources with that job.
これは、slurmdデーモンがそれらのリソースをそのジョブに関連付けるために使用できます。
Our plan is to use the Linux cgroups logic to bind a job and/or its tasks with specific GRES devices, however that logic does not currently exist.
私たちの計画では、Linux cgroupsロジックを使用して、ジョブやそのタスクを特定のGRESデバイスにバインドしますが、そのロジックは現在存在していません。
What does exist today is a pair of plugin APIs, job_set_env() and step_set_env() which can be used to set environment variables for the program directing it to GRES which have been allocated for its use (the CUDA libraries base their GPU selection upon environment variables, so this logic should work for CUDA today if users do not attempt to manipulate the environment variables reserved for CUDA use).
今日存在するのは、プラグインAPIのペアであるjob_set_env()とstep_set_env()であり、プログラムの環境変数を設定して、使用するために割り当てられたGRESにプログラムを送信します(CUDAライブラリは環境に基づいてGPUを選択します)変数であるため、ユーザーがCUDAで使用するために予約されている環境変数を操作しようとしない場合、このロジックは今日のCUDAで機能するはずです。

If you want to see how GRES logic is allocating resources, configure DebugFlags=GRES to log GRES state changes.
GRESロジックがリソースをどのように割り当てているかを確認する場合は、DebugFlags = GRESを構成してGRESの状態変化をログに記録します。
Note the resulting output can be quite verbose, especially for larger clusters.
特に大規模なクラスターの場合、結果の出力は非常に冗長になる可能性があることに注意してください。

Last modified 18 May 2011