Container Service for Kubernetes (ACK) ProクラスターのアプリケーションのGPUメモリとコンピューティングパワーをリクエストできます。 この機能により、GPUメモリと計算能力をより細かく使用できます。 このトピックでは、共有GPUをスケジュールして計算能力を割り当てる方法について説明します。
前提条件
Kubernetes 1.20以降を実行するACK Proクラスターが作成されます。 詳細については、「ACK管理クラスターの作成」をご参照ください。 kube-schedulerのバージョンは、クラスターバージョンに基づく要件を満たしています。 各kube-schedulerバージョンでサポートされている機能の詳細については、「kube-scheduler」をご参照ください。
ACKクラスターバージョン
スケジューラのバージョン
1.28
1.28.1-aliyun-5.6-998282b9以降
1.26
v1.26.3-aliyun-4.1-a520c096またはそれ以降
1.24
1.24.3-ack-2.0またはそれ以降
1.22
1.22.15-ack-2.0以降
1.20
1.20.4-ack-8.0以降
GPU共有コンポーネントがインストールされ、インストールされているHelmチャートのバージョンは1.2.0以降です。 GPU共有コンポーネントのインストール方法の詳細については、「GPU共有コンポーネントのインストール」をご参照ください。
cGPU 1.0.5以降がインストールされています。 cGPUバージョンの更新方法の詳細については、「ノードのcGPUバージョンの更新」をご参照ください。
制限事項
GPU共有は、GPUメモリのみを要求するジョブと、GPUメモリとコンピューティングパワーの両方を要求するジョブをサポートします。 ただし、両方のタイプのジョブを同時にノードにデプロイすることはできません。
ジョブの計算能力を要求する場合は、次の制限が適用されます。
各GPUによって提供される計算能力は、100% 計算能力を表す100のスケールで測定される。 例えば、要求20は、GPUによって提供される計算能力の20% を使用することを示す。
指定できる計算能力値は5の倍数で、最小値は5です。 指定した値が5の倍数でない場合、ジョブを送信できません。
次の表に示すリージョンのみが、GPUメモリとコンピューティングパワーの割り当てをサポートしています。 GPUメモリとコンピューティングパワーを割り当てる場合は、クラスターが次のいずれかのリージョンにあることを確認してください。
リージョン
リージョン ID
中国 (北京)
cn-beijing
中国 (上海)
cn-shanghai
中国 (杭州)
cn-hangzhou
中国 (張家口)
cn-zhangjiakou
中国 (深セン)
cn-shenzhen
中国 (成都)
cn-chengdu
中国 (河源)
cn-heyuan
中国 (香港)
cn-hongkong
インドネシア (ジャカルタ)
ap-southeast-5
シンガポール
ap-southeast-1
タイ (バンコク)
ap-southeast-7
米国 (バージニア)
us-east-1
米国 (シリコンバレー)
us-west-1
日本 (東京)
ap-northeast-1
中国東部 2 Finance
cn-shanghai-finance-1
コンピューティングパワー割り当てをサポートするスケジューラーバージョンは、2022年3月1日にリリースされました。 2022年3月1日以降に作成されたクラスターは、最新のスケジューラーバージョンを使用します。 3月1日より前に作成されたクラスターで使用されているスケジューラーのバージョンは自動更新できません。2022 スケジューラのバージョンを手動で更新する必要があります。 クラスターが2022 3月1日より前に作成された場合は、次の手順を実行します。
チケットを起票し、最新バージョンの共有GPUスケジューリングのプライベートプレビューへの参加を申請します。
古いバージョンのGPU共有コンポーネントをアンインストールする
インストールされているGPU共有コンポーネントのHelmチャートバージョンが1.2.0以前の場合、GPU共有コンポーネントのバージョンは古く、メモリ共有のみをサポートしています。 次の手順を実行して、古いバージョンをアンインストールします。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
Helmページで、ack-ai-installerを見つけ、[操作] 列の [削除] をクリックします。 [削除] ダイアログボックスで、[OK] をクリックします。
最新バージョンのGPU共有コンポーネントをインストールします。 詳細については、「GPU共有コンポーネントのインストール」をご参照ください。
ステップ1: 計算能力の割り当てをサポートするノードプールを作成する
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
[ノードプール] ページで、[ノードプールの作成] をクリックします。
次の表に、ノードプールの設定に使用されるパラメーターの一部を示します。 詳細については、「ノードプールの作成と管理」をご参照ください。
パラメーター
説明
ノードプール名
ノードプールの名前。 この例では、gpu-coreが使用されています。
期待されるノード
ノードプール内の初期ノード数。 ノードプールにノードを作成しない場合は、このパラメーターを0に設定します。
ECSタグ
ノードプール内のElastic Compute Service (ECS) インスタンスに追加するラベル。
ノードラベル
ノードプール内のノードに追加するラベル。 このトピックでは次の設定を使用します。 ノードラベルの詳細については、「GPUスケジューリングポリシーを有効にするためのラベル」をご参照ください。
GPUメモリの分離と計算能力の分離を有効にするには、
アイコンをクリックし、キーをack.node.gpu.scheduleに設定し、valueをcore_memに設定します。
binpackアルゴリズムを使用してポッドのgpuを選択するには、
アイコンをクリックし、キーをack.node.gpu.placementに設定し、valueをbinpackに設定します。
重要クラスター内の既存のGPU高速化ノードのコンピューティング能力の分離を有効にする場合は、まずクラスターからノードを削除してから、コンピューティング能力の分離をサポートするノードプールにノードを追加する必要があります。
kubectl label nodes <NODE_NAME> ack.node.gpu.schedule=core_mem
コマンドを直接実行して、既存のGPUアクセラレーションノードのコンピューティングパワーの分離を有効にすることはできません。
ステップ2: ノードプールの計算能力割り当てが有効かどうかを確認する
次のコマンドを実行して、ノードプール内のノードに対して計算能力の割り当てが有効になっているかどうかを確認します。
kubectl get nodes <NODE_NAME> -o yaml
期待される出力:
# Irrelevant fields are omitted.
status:
# Irrelevant fields are omitted.
allocatable:
# The nodes have 4 GPUs, which provide 400% of computing power in total. Each GPU provides 100% of computing power.
aliyun.com/gpu-core.percentage: "400"
aliyun.com/gpu-count: "4"
# The nodes have 4 GPUs, which provide 60 GiB of memory in total. Each GPU provides 15 GiB of memory.
aliyun.com/gpu-mem: "60"
capacity:
aliyun.com/gpu-core.percentage: "400"
aliyun.com/gpu-count: "4"
aliyun.com/gpu-mem: "60"
出力にはaliyun.com/gpu-core.percentage
フィールドが含まれており、計算能力の割り当てが有効になっていることを示します。
ステップ3: 計算能力割り当て機能を使用する
コンピューティングパワーの割り当てを有効にしない場合、ポッドは、合計15 GiBのメモリを持つGPUが提供するコンピューティングパワーの100% を使用できます。 次の手順は、GPUメモリとコンピューティングパワーの両方を要求するジョブを作成する方法を示しています。 ジョブは、2 GiBのGPUメモリとGPUの計算能力の30% を要求します。
次のYAMLテンプレートを使用して、両方のGPUメモリ計算能力を要求するジョブを作成します。
apiVersion: batch/v1 kind: Job metadata: name: cuda-sample spec: parallelism: 1 template: metadata: labels: app: cuda-sample spec: containers: - name: cuda-sample image: registry.cn-beijing.aliyuncs.com/ai-samples/gpushare-sample:benchmark-tensorflow-2.2.3 command: - bash - run.sh - --num_batches=500000000 - --batch_size=8 resources: limits: # Apply for 2 GiB of GPU memory. aliyun.com/gpu-mem: 2 # Apply for 30% of the computing power of the GPU. aliyun.com/gpu-core.percentage: 30 workingDir: /root restartPolicy: Never
次のコマンドを実行して、cuda-sampleジョブをデプロイします。
kubectl apply -f /tmp/cuda-sample.yaml
説明ジョブで使用される画像のサイズが大きい。 したがって、引っ張りプロセスには時間がかかることがある。
次のコマンドを実行して、cuda-sampleジョブを照会します。
kubectl get po -l app=cuda-sample
期待される出力:
NAME READY STATUS RESTARTS AGE cuda-sample-m**** 1/1 Running 0 15s
出力では、
[ステータス]
列に[実行中]
が表示され、ジョブがデプロイされていることを示します。次のコマンドを実行して、ジョブ用にプロビジョニングされているポッドで使用されているGPUメモリの量とコンピューティングパワーを照会します。
kubectl exec -ti cuda-sample-m**** -- nvidia-smi
期待される出力:
Thu Dec 16 02:53:22 2021 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 450.102.04 Driver Version: 450.102.04 CUDA Version: 11.0 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 Tesla V100-SXM2... On | 00000000:00:08.0 Off | 0 | | N/A 33C P0 56W / 300W | 337MiB / 2154MiB | 30% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| +-----------------------------------------------------------------------------+
出力は次の情報を示します。
GPUメモリ: コンピューティング能力の割り当てを有効にする前に、ポッドはGPUが提供するすべてのメモリ (15 GiB) を使用できます。 この機能を有効にすると、ポッドが使用するメモリの量は337 MiBになり、ポッドが使用できるメモリの合計量は2,154 MiBになり、約2 GiBになります。 これは、メモリ分離が適用されたことを示す。
コンピューティングパワー: コンピューティングパワーの割り当てを有効にする前に、ポッドはGPUが提供するコンピューティングパワーの100% を使用できます。 この機能を有効にすると、ポッドは30% の計算能力を使用します。 これは、コンピューティング電力分離が適用されたことを示します。
説明例えば、n個のジョブが作成される。 各ジョブは計算能力の30% を要求し、nの値は3以下である。 ジョブは1つのGPUにスケジュールされます。 ジョブのポッドにログインして
nvidia-smi
コマンドを実行すると、ポッドが計算能力のn × 30% を使用していることが出力されます。nvidia-smi
コマンドの出力には、GPUごとのコンピューティングパワー使用率のみが表示されます。次のコマンドを実行して、ポッドログを表示します。
kubectl logs cuda-sample-m**** -f
期待される出力:
[CUDA Bandwidth Test] - Starting... Running on... Device 0: Tesla V100-SXM2-16GB Quick Mode time: 2021-12-16/02:50:59,count: 0,memSize: 32000000,succeed to copy data from host to gpu time: 2021-12-16/02:51:01,count: 1,memSize: 32000000,succeed to copy data from host to gpu time: 2021-12-16/02:51:02,count: 2,memSize: 32000000,succeed to copy data from host to gpu time: 2021-12-16/02:51:03,count: 3,memSize: 32000000,succeed to copy data from host to gpu
出力は、計算能力の割り当てを有効にした後、ポッドログがより低いレートで生成されることを示しています。 これは、各ポッドがGPUの計算能力の約30% しか使用できないためです。
オプション: 次のコマンドを実行して、cuda-sampleジョブを削除します。
コンピューティング能力の割り当てが期待どおりに機能することを確認したら、ジョブを削除できます。
kubectl delete job cuda-sample