2.15.2. GPU 割り当てオブジェクトと概念について
以下の属性ベースの GPU 割り当てオブジェクトと概念を使用することで、ワークロードが必要とするグラフィックス処理ユニット (GPU) 仕様を備えたノードにワークロードがスケジュールされるようにすることができます。先に進む前に、これらの物体についてよく理解しておく必要があります。
- デバイスクラス
デバイスクラスとは、Pod が要求できるデバイスのカテゴリーのことです。一部のデバイスドライバーには独自のデバイスクラスが含まれています。管理者がデバイスクラスを作成することもできます。デバイスクラスにはデバイスセレクターが含まれています。デバイスセレクターは、デバイスが要求を満たす場合に true と評価される Common Expression Language (CEL) 式です。
次の例の
DeviceClassオブジェクトは、driver.example.comデバイスドライバーによって管理されるすべてのデバイスを選択します。デバイスクラスオブジェクトの例
apiVersion: resource.k8s.io/v1 kind: DeviceClass metadata: name: example-device-class spec: selectors: - cel: expression: |- device.driver == "driver.example.com"各項目の説明:
仕様セレクター- デバイスを選択するための CEL 式を指定します。
- リソーススライス
各ノード上の DRA ドライバーは、そのクラスターで利用可能なリソースを記述する リソーススライス を作成および管理します。リソーススライスは、ノードに割り当てられている 1 つ以上の GPU リソースを表します。リソース要求が作成され、Pod 内で使用されると、OpenShift Container Platform はリソーススライスを使用して、要求されたリソースを持つノードを検索します。リソースクレームに適したリソーススライスが見つかると、OpenShift Container Platform のスケジューラーが、割り当ての詳細を使用してリソースクレームを更新し、リソースクレームにリソースを割り当て、リソースにアクセスできるノードに Pod をスケジュールします。
リソーススライスオブジェクトの例
apiVersion: v1 items: - apiVersion: resource.k8s.io/v1 kind: ResourceSlice # ... spec: driver: driver.example.com nodeName: dra-example-driver pool: generation: 0 name: dra-example-driver resourceSliceCount: 1 devices: - attributes: driverVersion: version: 1.0.0 index: int: 0 model: string: LATEST-GPU-MODEL uuid: string: gpu-18db0e85-99e9-c746-8531-ffeb86328b39 capacity: memory: value: 10Gb name: 2g-10gb # ...各項目の説明:
仕様ドライバー- DRA ドライバーの名前を指定します。この名前はデバイスクラス内で指定できます。
仕様デバイス属性- リソース要求またはリソース要求テンプレートを使用して割り当て可能なデバイスを指定します。
- リソースクレームテンプレート
クラスター管理者とオペレーターは、Pod が必要とする GPU リソースを記述する リソース要求テンプレート を作成できます。管理者またはオペレーターは、リソース要求を Pod 仕様に追加します。OpenShift Container Platform は、リソース要求テンプレートを使用して、Pod のリソース要求を生成します。OpenShift Container Platform のスケジューラーは、要求された GPU を搭載したクラスター内のノードにその Pod をスケジュールします。
OpenShift Container Platform がテンプレートから生成する各リソース要求は、特定の Pod に紐付けられます。そのため、GPU は他のワークロードと同時に使用することはできません。Pod が終了すると、OpenShift Container Platform は対応するリソースクレームを削除します。
スケジューラーが満たすべき特定のデバイスに対する要求を指定するか、スケジューラーが選択するための優先順位付けされたデバイスのリストを提供する必要があります。
以下のリソース要求テンプレートの例には、2 つのサブ要求が含まれています。これらのサブリクエストのうち、スケジューラーによって選択されるのは 1 つだけです。スケジューラーは、サブリクエストがリストされている順序でそれらを処理しようとします。デバイスを選択するためのサブリクエスト内では、CEL 式が使用されます。
リソースクレームテンプレートオブジェクトの例
apiVersion: resource.k8s.io/v1 kind: ResourceClaimTemplate metadata: namespace: gpu-claim name: gpu-devices spec: spec: devices: requests: - name: req-0 firstAvailable: - name: 2g-10gb deviceClassName: example-device-class selectors: - cel: expression: "device.attributes['driver.example.com'].profile == '2g.10gb'" - name: 3g-20gb deviceClassName: example-device-class selectors: - cel: expression: "device.attributes['driver.example.com'].profile == '3g.20gb'"各項目の説明:
仕様.仕様.デバイス.リクエストデバイスに対する 1 つ以上の要求のリストを指定します。サブリクエストには、
exactlyまたはfirstAvailable のいずれかを含める必要があります。-
exactly: 1 台以上の同一デバイスを要求することを指定します。要求が満たされるためには、デバイスが要求内容と完全に一致する必要がある。要求されたデバイスが利用できない場合、スケジューラーは Pod を作成できません。 -
firstAvailable: デバイスに対する複数のリクエストを指定します。スケジューラーがリクエスト元の Pod を作成する前に、そのうちの 1 つのデバイスが利用可能であれば十分です。スケジューラーは、リストに記載されている順序でデバイスの可用性を確認し、最初に利用可能なデバイスを選択します。スケジューラーは、要求されたデバイスが 1 つでも利用可能な場合、Pod を作成できます。
-
spec.devices.requests.exactly.deviceClassNameまたはspec.devices.requests.firstAvailable.deviceClassName- このリクエストで使用するデバイスクラスを指定します。
spec.devices.requests.exactly.selectorsまたはspec.devices.requests.firstAvailable.selectors- 指定されたデバイスクラスから特定のデバイスを要求するための CEL 式を指定します。
- リソースクレーム
管理者とオペレーターは、Pod が必要とする GPU リソースを記述する リソース要求 を作成できます。管理者またはオペレーターは、リソース要求を Pod 仕様に追加します。OpenShift Container Platform のスケジューラーは、要求された GPU を搭載したクラスター内のノードにその Pod をスケジュールします。
リソース要求は複数の Pod 仕様で使用できるため、複数のワークロードで GPU を共有できます。リソース要求は、要求元の Pod が終了しても削除されません。
リソース要求内のデバイス要求については、スケジューラーが満たすべき 1 つ以上のデバイス要求のリストを指定するか、スケジューラーが選択するための優先順位付けされた要求リストを提供する必要があります。
以下のリソース要求の例では、CEL 式を使用して、
example-device-classデバイスクラスのデバイスを 1 つ要求しています。ここで、exactパラメーターは、スケジューラーが Pod を作成する前に、要求された特定のデバイスを備えたノードが利用可能である必要があることを示しています。リソースクレームオブジェクトの例
apiVersion: resource.k8s.io/v1 kind: ResourceClaim metadata: namespace: gpu-claim name: gpu-devices spec: devices: requests: - name: req-0 exactly: name: 2g-10gb deviceClassName: example-device-class selectors: - cel: expression: "device.attributes['driver.example.com'].profile == '2g.10gb'"- 管理者アクセス
クラスター管理者は、他のユーザーが使用しているデバイスに対して特権アクセス権を取得できる。これにより、管理者はデバイスの健全性や状態を監視するなどのタスクを実行できると同時に、ユーザーがこれらのデバイスをワークロードに引き続き使用できることを保証できます。
管理者アクセスを取得するには、管理者は
、resource.kubernetes.io/admin-access: "true"ラベルを含む名前空間で、adminAccess: trueパラメーターを指定したリソースクレームまたはリソースクレームテンプレートを作成する必要があります。管理者以外のユーザーは、このラベルが付いた名前空間にアクセスできません。管理者アクセスラベル付き名前空間の例
apiVersion: v1 kind: Namespace metadata: labels: resource.kubernetes.io/admin-access: "true" # ...次の例では、管理者は
2G-10GBデバイスへのアクセス権を与えられています。管理者権限を持つリソースクレームオブジェクトの例
apiVersion: resource.k8s.io/v1 kind: ResourceClaimTemplate metadata: name: large-black-cat-claim-template spec: devices: requests: - name: req-0 exactly: allocationMode: All adminAccess: true deviceClassName: example-device-class selectors: - cel: expression: "device.attributes['driver.example.com'].profile == '2g.10gb'"各項目の説明:
spec.devices.requests.exactly.adminAccess.trueまたはspec.devices.requests.firstAvailable.adminAccess.true- 指定されたデバイスに対して管理者アクセスモードが有効になっていることを指定します。
Pod にリソースクレームを追加する方法は、「Pod へのリソースクレームの追加」を参照してください。