すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:共有GPUのスケジューリングによる計算能力の割り当て

最終更新日:Jan 21, 2025

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日より前に作成された場合は、次の手順を実行します。

    1. チケットを起票し、最新バージョンの共有GPUスケジューリングのプライベートプレビューへの参加を申請します。

    2. 古いバージョンのGPU共有コンポーネントをアンインストールする

      インストールされているGPU共有コンポーネントのHelmチャートバージョンが1.2.0以前の場合、GPU共有コンポーネントのバージョンは古く、メモリ共有のみをサポートしています。 次の手順を実行して、古いバージョンをアンインストールします。

      1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

      2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、[アプリケーション] > [ヘルム] を選択します。

      3. Helmページで、ack-ai-installerを見つけ、[操作] 列の [削除] をクリックします。 [削除] ダイアログボックスで、[OK] をクリックします。

    3. 最新バージョンのGPU共有コンポーネントをインストールします。 詳細については、「GPU共有コンポーネントのインストール」をご参照ください。

ステップ1: 計算能力の割り当てをサポートするノードプールを作成する

  1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、[ノード] > [ノードプール] を選択します。

  3. [ノードプール] ページで、[ノードプールの作成] をクリックします。

    次の表に、ノードプールの設定に使用されるパラメーターの一部を示します。 詳細については、「ノードプールの作成と管理」をご参照ください。

    パラメーター

    説明

    ノードプール名

    ノードプールの名前。 この例では、gpu-coreが使用されています。

    期待されるノード

    ノードプール内の初期ノード数。 ノードプールにノードを作成しない場合は、このパラメーターを0に設定します。

    ECSタグ

    ノードプール内のElastic Compute Service (ECS) インスタンスに追加するラベル。

    ノードラベル

    ノードプール内のノードに追加するラベル。 このトピックでは次の設定を使用します。 ノードラベルの詳細については、「GPUスケジューリングポリシーを有効にするためのラベル」をご参照ください。

    • GPUメモリの分離と計算能力の分離を有効にするには、添加节点标签アイコンをクリックし、キーack.node.gpu.scheduleに設定し、valuecore_memに設定します。

    • binpackアルゴリズムを使用してポッドのgpuを選択するには、添加节点标签アイコンをクリックし、キーack.node.gpu.placementに設定し、valuebinpackに設定します。

    重要

    クラスター内の既存の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% を要求します。

  1. 次の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
  2. 次のコマンドを実行して、cuda-sampleジョブをデプロイします。

    kubectl apply -f /tmp/cuda-sample.yaml
    説明

    ジョブで使用される画像のサイズが大きい。 したがって、引っ張りプロセスには時間がかかることがある。

  3. 次のコマンドを実行して、cuda-sampleジョブを照会します。

    kubectl get po -l app=cuda-sample

    期待される出力:

    NAME                READY   STATUS    RESTARTS   AGE
    cuda-sample-m****   1/1     Running   0          15s

    出力では、[ステータス] 列に [実行中] が表示され、ジョブがデプロイされていることを示します。

  4. 次のコマンドを実行して、ジョブ用にプロビジョニングされているポッドで使用されている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ごとのコンピューティングパワー使用率のみが表示されます。

  5. 次のコマンドを実行して、ポッドログを表示します。

    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% しか使用できないためです。

  6. オプション: 次のコマンドを実行して、cuda-sampleジョブを削除します。

    コンピューティング能力の割り当てが期待どおりに機能することを確認したら、ジョブを削除できます。

    kubectl delete job cuda-sample