Container Service for Kubernetes (ACK) では、ノードプールを使用してcGPUを制御できます。 これにより、より柔軟なGPU共有およびメモリ分離ポリシーを作成できます。 このトピックでは、ACK Proクラスターに2つのラベル付きノードプールを作成し、ノードプールを使用してcGPUのGPU共有およびメモリ分離機能を制御する方法を示します。
シナリオの使用
GPU高速化ノードを含むACK専用クラスターのみがack-cgpuコンポーネントをサポートしています。 GPU高速化ノードを含むACK管理クラスターは、ack-cgpuコンポーネントをサポートしていません。
ack ProクラスターにACK-cgpuをインストールする場合は、「GPU共有コンポーネントの設定」をご参照ください。
前提条件
開始する前に、次の操作が完了していることを確認してください。
ノードプールが設定されています。
ノードプールの名前をカスタマイズできます。 この例では、cgpuおよびcgpu-no-isolationという名前の2つのノードプールが使用されます。
ノードプール名
GPU共有
メモリ分離
ラベル
cpu
提供済み
Enabled
cppu=true
cgpu.disable.isolation=false
cpu-no-isolation
Enabled
無効
cppu=true
cgpu.disable.isolation=true
背景情報
ACKクラスターでcGPUを使用すると、次のシナリオに遭遇する可能性があります。
ジョブAに割り当てることができるGPUメモリの量は、スクリプトで既に指定されています。 この場合、ACKクラスターはジョブAのGPU共有を有効にするだけで済みます。メモリの分離は必要ありません。
ジョブBに割り当てることができるGPUメモリの量は、スクリプトで指定されていません。 この場合、ACKクラスターは、ジョブBのGPU共有とメモリ分離の両方を有効にする必要があります。
両方のシナリオをサポートするようにACKクラスターを設定するにはどうすればよいですか。
この問題を解決するには、ノードプールを使用してcGPUを制御します。 2つのノードプールを作成するだけで済みます。
GPU共有のみをサポートするノードプールを作成します。 このノードプールはジョブAの実行に使用されます。
GPU共有とメモリ分離の両方をサポートする別のノードプールを作成します。 このノードプールはジョブBの実行に使用されます。
使用上の注意
ノードプールを使用してcGPUを制御する場合、次の制限事項に注意してください。
ノードプールを使用してcGPUを制御する場合、ジョブがノードセレクタで構成されていない場合、ジョブのポッドが他のノードプールにスケジュールされることがあります。 ジョブの実行エラーが発生する可能性があります。
重要ジョブごとにノードセレクタを設定することを推奨します。
ノードのラベルが変更された場合、たとえば、ノードのラベルがcgpu.disable.isolation=falseからcgpu.disable.isolation=trueに変更された場合、設定を有効にするには、ノードでgpushare-device-pluginのポッドを再起動する必要があります。
これを行うには、ノード上のgpushare-device-pluginのポッドを削除する必要があります。 その後、ACKは自動的に新しいポッドを作成します。 以下の操作を実行できます。
次のコマンドを実行して、ACKクラスター内のgpushare-device-pluginのポッドを照会します。
kubectl get po -n kube-system -l name=gpushare-device-plugin-ds -o wide期待される出力:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES gpushare-device-plugin-ds-6r8gs 1/1 Running 0 18h 192.168.7.157 cn-shanghai.192.168.7.157 <none> <none> gpushare-device-plugin-ds-pjrvn 1/1 Running 0 15h 192.168.7.158 cn-shanghai.192.168.7.158 <none> <none>この例では、ノードcn-shanghai.192.168.7.157が使用されます。 次のコマンドを実行して、このノードのgpushare-device-pluginのポッドを削除します。
kubectl delete po gpushare-device-plugin-ds-6r8gs -n kube-system
ステップ1: ノードプールの作成
ACKコンソールにログインします。
ACKコンソールの左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、[操作] 列の [詳細] をクリックします。 クラスターの詳細ページが表示されます。
詳細ページの左側のナビゲーションウィンドウで、 を選択します。
[ノードプールの作成] ダイアログボックスで、パラメーターを設定します。
詳細については、「マネージド Kubernetes クラスターの作成」をご参照ください。 次のリストに、いくつかのパラメーターを示します。
数量: ノードプール内のノードの初期数を指定します。 ノードプールにノードを追加しない場合は、このパラメーターを0に設定します。
オペレーティングシステム: ノードのオペレーティングシステムを選択します。 CentOS 7.xとAlibaba Cloud Linux 2.xがサポートされています。
ノードラベル: ノードにラベルを追加できます。
ECSラベル: Elastic Compute Service (ECS) インスタンスにラベルを追加できます。
カスタムリソースグループ: ノードプール内のノードが属するリソースグループを指定できます。
[ノードラベル] セクションでは、指定したラベルをノードプール内のノードに追加できます。
cgpuノードプール内のノードに、cgpu=trueおよびcgpu.disable.isolation=falseのラベルを追加します。
cgpu-no-isolationノードプールのノードに、cgpu=trueおよびcgpu.disable.isolation=trueのラベルを追加します。
次の図は、cgpu-no-isolationノードプールのノードに追加されるラベルを示しています。

[注文の確認] をクリックします。
[ノードプール] ページで、ノードプールの [ステータス] 列を確認します。 ノードプールが初期化状態の場合、ノードプールが作成中であることを示します。 ノードプールが作成されると、ノードプールの状態は [アクティブ] に変わります。
GPU高速化ノードをノードプールに追加する場合は、ノードプールをスケールアウトできます。 詳細については、「ノードプールの管理」をご参照ください。
ステップ2: ジョブを送信する
cgpu-testとcgpu-test-no-isolationという名前の2つのジョブを送信します。 両方のジョブのYAMLファイルでnodeSelectorを設定する必要があります。
cgpu-test: このジョブに割り当てることができるGPUメモリの量は、ジョブのスクリプトで指定されていません。 したがって、このジョブを実行するにはメモリ分離が必要です。 次のYAMLテンプレートはその例です。
apiVersion: batch/v1 kind: Job metadata: name: cgpu-test spec: parallelism: 1 template: metadata: labels: app: cgpu-test spec: nodeSelector: cgpu.disable.isolation: "false" # Add a node selector to select the cgpu node pool. containers: - name: cgpu-test image: registry.cn-hangzhou.aliyuncs.com/ai-samples/gpushare-sample:tensorflow-1.5 command: - python - tensorflow-sample-code/tfjob/docker/mnist/main.py - --max_steps=100000 - --data_dir=tensorflow-sample-code/data resources: limits: # The pod requests 3 GiB of GPU memory in total. aliyun.com/gpu-mem: 3 workingDir: /root restartPolicy: Never説明nodeSelector: cppuノードプールを選択します。
cgpu.disable.isolation=false: cgpuノードプール内のノードにジョブをスケジュールします。
aliyun.com/gpu-mem: ジョブによって要求されるGPUメモリの量を指定します。
cgpu-test-no-isolation: GPUごとにジョブに割り当てることができるメモリの量は、ジョブのスクリプトで指定されています。 したがって、このジョブを実行するためにメモリ分離は必要ありません。 次のYAMLテンプレートはその例です。
apiVersion: batch/v1 kind: Job metadata: name: cgpu-test-no-isolation spec: parallelism: 1 template: metadata: labels: app: cgpu-test-no-isolation spec: nodeSelector: cgpu.disable.isolation: "true" # Add a node selector to select the cgpu node pool. containers: - name: cgpu-test-no-isolation image: registry.cn-hangzhou.aliyuncs.com/ai-samples/gpushare-sample:tensorflow-1.5 command: - python - tensorflow-sample-code/tfjob/docker/mnist/main.py - --max_steps=100000 - --data_dir=tensorflow-sample-code/data resources: limits: # The pod requests 3 GiB of GPU memory in total. aliyun.com/gpu-mem: 3説明nodeSelector: cgpu-no-isolationノードプールを選択するために使用されるラベルを指定します。
cgpu.disable.isolation=true: cgpu-no-isolationノードプール内のノードにジョブをスケジュールするために使用されるラベル。
aliyun.com/gpu-mem: ジョブによって要求されるGPUメモリの量を指定します。
ステップ3: 結果を確認する
次のコマンドを実行して、ジョブのステータスを照会します。
kubectl get po期待される出力:
NAME READY STATUS RESTARTS AGE cgpu-test-0 1/1 Running 0 5m55s cgpu-test-no-isolation-0 1/1 Running 0 6m42sポッドcgpu-test-0 (メモリ分離が必要) で
nvidia-smiコマンドを実行して、ポッドで使用できるGPUメモリの量を照会します。kubectl exec cgpu-test-0 nvidia-smi期待される出力:
Mon Nov 2 11:33:10 2020 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 418.87.01 Driver Version: 418.87.01 CUDA Version: 10.1 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |===============================+======================+======================| | 0 Tesla V100-SXM2... On | 00000000:00:07.0 Off | 0 | | N/A 34C P0 54W / 300W | 3039MiB / 3226MiB | 1% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| +-----------------------------------------------------------------------------+出力は、GPUメモリの3,226のMiBをコンテナで使用できることを示しています。 GPUメモリの合計は16 GiBです。 これは、GPUメモリの分離が有効になっていることを示します。
ポッドcgpu-test-no-isolation-0で
nvidia-smiコマンドを実行し (GPUメモリの分離は必要ありません) 、ポッド内のコンテナで使用できるGPUメモリの量を照会します。kubectl exec cgpu-test-no-isolation-0 nvidia-smi期待される出力:
Mon Nov 2 11:39:59 2020 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 418.87.01 Driver Version: 418.87.01 CUDA Version: 10.1 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |===============================+======================+======================| | 0 Tesla V100-SXM2... On | 00000000:00:07.0 Off | 0 | | N/A 37C P0 56W / 300W | 1929MiB / 16130MiB | 1% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| +-----------------------------------------------------------------------------+出力は、GPUメモリの16,130のMiBがコンテナによって検出できることを示しています。 GPUメモリの合計は16 GiBです。 これは、GPUメモリの分離が無効になっていることを示します。 この場合、次の環境変数を照会して、ポッド内のコンテナで使用できるGPUメモリの量を確認する必要があります。 次のコマンドを実行して、ポッド内のコンテナーが使用できるGPUメモリの量を確認します。
kubectl exec cgpu-test-no-isolation-0 env | grep ALIYUN期待される出力:
ALIYUN_COM_GPU_MEM_CONTAINER=3 # The amount of GPU memory that can be used by the containers in the pod. The amount is 3 GiB in this example. ALIYUN_COM_GPU_MEM_DEV=15 # The total amount of memory provided by the GPU. ...nvidia-smiコマンドを実行した後、ポッドcgpu-test-no-isolation-0とポッドcgpu-test-0から返された結果を比較します。ポッドcgpu-test-no-isolation-0の結果はGPUメモリの合計量を示し、ポッドcgpu-test-0の結果はポッドによって要求されたGPUメモリの量のみを示します。 これは、ノードプールを使用して、GPU共有とメモリ分離のためにcGPUを制御できることを示しています。