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

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

最終更新日:Nov 14, 2024

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メモリのみを要求するジョブ、またはノード上でGPUメモリと計算能力の両方を要求するジョブのみを作成できます。

  • ジョブの計算能力を要求する場合は、次の制限が適用されます。

    • GPUの計算能力を割り当てるようにパラメーターを設定する場合、指定できる最大値は100です。これは、GPUの計算能力の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. [ノードプール] ページの右上隅にある [ノードプールの作成] をクリックします。

    次の表に、ノードプールの設定に使用されるパラメーターの一部を示します。 詳細については、「ACK Proクラスターの作成」トピックの手順6をご参照ください。

    パラメーター

    説明

    ノードプール名

    ノードプールの名前。 この例では、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ノード <NODE_NAME> -o yaml

期待される出力:

# 関連のないフィールドは省略されます。 
状態:
  # 無関係なフィールドは省略されます。 
  allocatable:
    # ノードには4つのGPUがあり、合計で400% の計算能力を提供します。 各GPUは、100% の計算能力を提供する。 
    aliyun.com/gpu-core.percentage: "400"
    aliyun.com/gpu-count: "4"
    # ノードには4つのGPUがあり、合計で60 GiBのメモリを提供します。 各GPUは15 GiBのメモリを提供します。 
    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: 計算能力割り当て機能を使用する

コンピューティングパワーの割り当てを有効にしない場合、ポッドはGPUの100% のコンピューティングパワーを使用できます。 この例では、GPUのメモリは15 GiBです。 次の手順は、GPUメモリとコンピューティングパワーの両方を要求するジョブを作成する方法を示しています。 ジョブは、2 GiBのGPUメモリとGPUの計算能力の30% を要求します。

  1. 次のYAMLテンプレートを使用して、両方のGPUメモリ計算能力を要求するジョブを作成します。

    apiVersion: batch/v1
    種類: 仕事
    メタデータ:
      名前: cuda-sample
    spec:
      parallelism: 1
      template:
        metadata:
          labels:
            app: cuda-sample
        仕様:
          containers:
          - name: cuda-sample
            画像: 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:
                #2 GiBのGPUメモリを申請します。 
                aliyun.com/gpu-mem: 2
                # GPUの計算能力の30% を申請します。 
                aliyun.com/gpu-core.percentage: 30
            workingDir: /root
          restartPolicy: 決して 
  2. 次のコマンドを実行してcuda-sample.yamlファイルをデプロイし、cuda-sampleジョブを送信します。

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

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

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

    kubectl get po -l app=cuda-sample

    期待される出力:

    の名前準備ができているステータスの履歴書
    cuda-sample-m **** 1/1ランニング0 15s 

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

  4. 次のコマンドを実行して、ジョブ用にプロビジョニングされているポッドで使用されているGPUメモリの量とコンピューティングパワーを照会します。

    kubectl exec -ti cuda-sample-m **** -- nvidia-smi

    期待される出力:

    12月16日木曜日02:53:22 2021
    + ----------------------------------------------------------------------------- +
    | NVIDIA-SMI 450.102.04ドライバのバージョン: 450.102.04 CUDAバージョン: 11.0 |
    | ------------------------------- + ---------------------- + ---------------------- +
    | GPU名永続性-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
    | Fan Temp Perf Pwr: 使用量 /キャップ | メモリ使用量 | GPU-Util Compute M. |
    | | | MIG M. |
    |=============================== + ====================== + ======================|
    | 0 Tesla V100-SXM2... オン | 00000000:00:08.0オフ | 0 |
    | N/A 33C P0 56W / 300W | 337MiB / 2154MiB | 30% のデフォルト |
    | | | N/A |
    + ------------------------------- + ---------------------- + ---------------------- +
    
    + ----------------------------------------------------------------------------- +
    | プロセス: |
    | GPU GI CI PIDタイププロセス名GPUメモリ |
    | ID IDの使用法 |
    |=============================================================================|
    + ----------------------------------------------------------------------------- + 

    出力は次の情報を示します。

    • GPUメモリ: コンピューティング能力の割り当てを有効にする前に、ポッドはGPUが提供するメモリの100% を使用できます。 この例では、GPUによって提供されるメモリの総量は15 GiBである。 ノードでnvidia-smiコマンドを実行して、GPUが提供するメモリの総量を照会できます。 コンピューティングパワーの割り当てを有効にすると、ポッドが使用するメモリの量は337 MiBになり、ポッドが使用できるメモリの合計量は2,154 MiBになります。これは約2 GiBです。 これは、メモリ分離が有効であることを示す。

    • コンピューティングパワー: コンピューティングパワーの割り当てを有効にする前に、ポッドはGPUの100% のコンピューティングパワーを使用できます。 要求された金額を100に設定して、ポッドが100% の計算能力を使用できることを確認できます。 コンピューティングパワーの割り当てを有効にすると、ポッドはGPUのコンピューティングパワーの30% を使用します。 これは、計算電力分離が有効であることを示す。

    説明

    例えば、n個のジョブが作成される。 各ジョブは計算能力の30% を要求し、nの値は3以下である。 ジョブは1つのGPUにスケジュールされます。 ジョブのポッドにログインしてnvidia-smiコマンドを実行すると、ポッドが計算能力のn × 30% を使用していることが出力されます。 nvidia-smiコマンドの出力には、GPUごとのコンピューティングパワー使用率のみが表示されます。 このコマンドには、ジョブごとの計算能力の使用率は表示されません。

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

    kubectl logs cuda-sample-m **** -f

    期待される出力:

    [CUDA帯域幅テスト]-開始...
    実行中...
    
     デバイス0: テスラV100-SXM2-16GB
     クイックモード
    
    time: 2021-12-16/02:50:59、count: 0、memSize: 32000000、ホストからgpuへのデータのコピーに成功
    time: 2021-12-16/02:51:01、count: 1、memSize: 32000000、ホストからgpuへのデータのコピーに成功
    time: 2021-12-16/02:51:02、count: 2、memSize: 32000000、ホストからgpuへのデータのコピーに成功
    time: 2021-12-16/02:51:03、count: 3、memSize: 32000000、ホストからgpu
    へのデータのコピーに成功

    出力は、計算能力の割り当てを有効にした後、ポッドログがより低いレートで生成されることを示しています。 これは、各ポッドがGPUの計算能力の約30% しか使用できないためです。

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

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

    kubectl delete job cuda-sample